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