1#ifndef _VIDEO_PRODUCER_H
2#define _VIDEO_PRODUCER_H
3
4#include <kernel/OS.h>
5#include <media/BufferProducer.h>
6#include <media/Controllable.h>
7#include <media/MediaDefs.h>
8#include <media/MediaEventLooper.h>
9#include <media/MediaNode.h>
10#include <support/Locker.h>
11
12#include "../FinePixUSBKit/FinePix.h"
13
14extern "C"{
15#include "../FinePixJpeg/finepix-jpeg.h"
16}
17
18class FinePixProducer :
19	public virtual BMediaEventLooper,
20	public virtual BBufferProducer,
21	public virtual BControllable
22{
23public:
24						FinePixProducer(BMediaAddOn *addon,
25								const char *name, int32 internal_id);
26virtual					~FinePixProducer();
27
28virtual	status_t		InitCheck() const { return fInitStatus; }
29
30/* BMediaNode */
31public:
32virtual port_id		ControlPort() const;
33virtual	BMediaAddOn	*AddOn(int32 * internal_id) const;
34virtual	status_t 	HandleMessage(int32 message, const void *data,
35							size_t size);
36protected:
37virtual	void 		Preroll();
38virtual void		SetTimeSource(BTimeSource * time_source);
39virtual status_t	RequestCompleted(const media_request_info & info);
40
41/* BMediaEventLooper */
42protected:
43virtual	void 		NodeRegistered();
44virtual void		Start(bigtime_t performance_time);
45virtual void		Stop(bigtime_t performance_time, bool immediate);
46virtual void		Seek(bigtime_t media_time, bigtime_t performance_time);
47virtual void		TimeWarp(bigtime_t at_real_time,
48							bigtime_t to_performance_time);
49virtual status_t	AddTimer(bigtime_t at_performance_time, int32 cookie);
50virtual void		SetRunMode(run_mode mode);
51virtual void		HandleEvent(const media_timed_event *event,
52							bigtime_t lateness, bool realTimeEvent = false);
53virtual void		CleanUpEvent(const media_timed_event *event);
54virtual bigtime_t	OfflineTime();
55virtual void		ControlLoop();
56virtual status_t	DeleteHook(BMediaNode * node);
57
58/* BBufferProducer */
59protected:
60virtual	status_t	FormatSuggestionRequested(media_type type, int32 quality,
61							media_format * format);
62virtual	status_t 	FormatProposal(const media_source &output,
63							media_format *format);
64virtual	status_t	FormatChangeRequested(const media_source &source,
65							const media_destination &destination,
66							media_format *io_format, int32 *_deprecated_);
67virtual	status_t 	GetNextOutput(int32 * cookie, media_output * out_output);
68virtual	status_t	DisposeOutputCookie(int32 cookie);
69virtual	status_t	SetBufferGroup(const media_source &for_source,
70							BBufferGroup * group);
71virtual	status_t 	VideoClippingChanged(const media_source &for_source,
72							int16 num_shorts, int16 *clip_data,
73							const media_video_display_info &display,
74							int32 * _deprecated_);
75virtual	status_t	GetLatency(bigtime_t * out_latency);
76virtual	status_t	PrepareToConnect(const media_source &what,
77							const media_destination &where,
78							media_format *format,
79							media_source *out_source, char *out_name);
80virtual	void		Connect(status_t error, const media_source &source,
81							const media_destination &destination,
82							const media_format & format, char *io_name);
83virtual	void 		Disconnect(const media_source & what,
84							const media_destination & where);
85virtual	void 		LateNoticeReceived(const media_source & what,
86							bigtime_t how_much, bigtime_t performance_time);
87virtual	void 		EnableOutput(const media_source & what, bool enabled,
88							int32 * _deprecated_);
89virtual	status_t	SetPlayRate(int32 numer,int32 denom);
90virtual	void 		AdditionalBufferRequested(const media_source & source,
91							media_buffer_id prev_buffer, bigtime_t prev_time,
92							const media_seek_tag * prev_tag);
93virtual	void		LatencyChanged(const media_source & source,
94							const media_destination & destination,
95							bigtime_t new_latency, uint32 flags);
96
97/* BControllable */
98protected:
99virtual status_t	GetParameterValue(int32 id, bigtime_t *last_change,
100							void *value, size_t *size);
101virtual void		SetParameterValue(int32 id, bigtime_t when,
102							const void *value, size_t size);
103virtual status_t	StartControlPanel(BMessenger *out_messenger);
104
105/* state */
106private:
107		void				HandleStart(bigtime_t performance_time);
108		void				HandleStop();
109		void				HandleTimeWarp(bigtime_t performance_time);
110		void				HandleSeek(bigtime_t performance_time);
111
112static	int32				fInstances;
113
114		status_t			fInitStatus;
115
116		int32				fInternalID;
117		BMediaAddOn			*fAddOn;
118
119		BLocker				fLock;
120			BBufferGroup	*fBufferGroup;
121
122		thread_id			fThread;
123		sem_id				fFrameSync;
124static	int32				_frame_generator_(void *data);
125		int32				FrameGenerator();
126
127		/* The remaining variables should be declared volatile, but they
128		 * are not here to improve the legibility of the sample code. */
129		uint32				fFrame;
130		uint32				fFrameBase;
131		bigtime_t			fPerformanceTimeBase;
132		bigtime_t			fProcessingLatency;
133		media_output		fOutput;
134		media_raw_video_format	fConnectedFormat;
135		bool				fRunning;
136		bool				fConnected;
137		bool				fEnabled;
138
139		FinePix				*fCam;			//camera
140		uint8				*fDeltaBuffer; 	//in buffer
141		int 				frame_size;		//size of jpeg in bytes
142		uint8				*tempInBuffer; 	//for 24 bit bitmap
143		// V4l : jpeg decoder data (not used here, needed as parameter in jpeg_decode())
144		struct jpeg_decdata decdata;
145};
146
147#endif
148