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