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