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