1/* 2 * Copyright 2004-2008, François Revol, <revol@free.fr>. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _CAM_DEFRAMER_H 6#define _CAM_DEFRAMER_H 7 8#include <OS.h> 9#include <DataIO.h> 10#include <Locker.h> 11#include <List.h> 12#include "CamFilterInterface.h" 13class CamDevice; 14 15#define CAMDEFRAMER_MAX_TAG_LEN 16 16#define CAMDEFRAMER_MAX_QUEUED_FRAMES 50 17 18enum { 19ST_SYNC, /* waiting for start of frame */ 20ST_FRAME 21}; 22 23 24/* should have a real Frame class someday */ 25class CamFrame : public BMallocIO { 26public: 27 CamFrame() : BMallocIO() { fStamp = system_time(); }; 28virtual ~CamFrame() {}; 29bigtime_t Stamp() const { return fStamp; }; 30bigtime_t fStamp; 31}; 32 33class CamDeframer : public CamFilterInterface { 34public: 35 CamDeframer(CamDevice *device); 36virtual ~CamDeframer(); 37 // BPositionIO interface 38 // read from translators/cs transforms 39virtual ssize_t Read(void *buffer, size_t size); 40virtual ssize_t ReadAt(off_t pos, void *buffer, size_t size); 41virtual off_t Seek(off_t position, uint32 seek_mode); 42virtual off_t Position() const; 43virtual status_t SetSize(off_t size); 44 // write from usb transfers 45virtual ssize_t Write(const void *buffer, size_t size); 46virtual ssize_t WriteAt(off_t pos, const void *buffer, size_t size); 47 48virtual status_t WaitFrame(bigtime_t timeout); 49virtual status_t GetFrame(CamFrame **frame, bigtime_t *stamp); // caller deletes 50virtual status_t DropFrame(); 51 52status_t RegisterSOFTags(const uint8 **tags, int count, size_t len, size_t skip); 53status_t RegisterEOFTags(const uint8 **tags, int count, size_t len, size_t skip); 54 55protected: 56 57int FindTags(const uint8 *buf, size_t buflen, const uint8 **tags, int tagcount, size_t taglen, size_t skiplen, int *which=NULL); 58int FindSOF(const uint8 *buf, size_t buflen, int *which=NULL); 59int FindEOF(const uint8 *buf, size_t buflen, int *which=NULL); 60 61CamFrame *AllocFrame(); 62 63CamDevice *fDevice; 64size_t fMinFrameSize; 65size_t fMaxFrameSize; 66int fState; 67sem_id fFrameSem; 68BList fFrames; 69BLocker fLocker; 70CamFrame *fCurrentFrame; /* the one we write to*/ 71 72/* tags */ 73const uint8 **fSOFTags; 74const uint8 **fEOFTags; 75int fNumSOFTags; 76int fNumEOFTags; 77size_t fLenSOFTags; 78size_t fLenEOFTags; 79size_t fSkipSOFTags; 80size_t fSkipEOFTags; 81 82 83 84}; 85 86 87#endif /* _CAM_DEFRAMER_H */ 88