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