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