3rdparty/licenseReport: Add seperate LGPL checks
[haiku.git] / src / add-ons / media / media-add-ons / usb_webcam / Producer.h
blob0340feff19a909d7467dbdee73281558775909e5
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
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>
17 class CamDevice;
18 class BParameter;
19 class BTextParameter;
21 class VideoProducer :
22 public virtual BMediaEventLooper,
23 public virtual BBufferProducer,
24 public virtual BControllable {
25 public:
26 VideoProducer(BMediaAddOn *addon, CamDevice *dev,
27 const char *name, int32 internal_id);
28 virtual ~VideoProducer();
30 virtual status_t InitCheck() const { return fInitStatus; }
33 /* BMediaNode */
34 public:
35 virtual port_id ControlPort() const;
36 virtual BMediaAddOn *AddOn(int32 * internal_id) const;
37 virtual status_t HandleMessage(int32 message, const void *data,
38 size_t size);
39 protected:
40 virtual void Preroll();
41 virtual void SetTimeSource(BTimeSource * time_source);
42 virtual status_t RequestCompleted(const media_request_info & info);
44 /* BMediaEventLooper */
45 protected:
46 virtual void NodeRegistered();
47 virtual void Start(bigtime_t performance_time);
48 virtual void Stop(bigtime_t performance_time, bool immediate);
49 virtual void Seek(bigtime_t media_time, bigtime_t performance_time);
50 virtual void TimeWarp(bigtime_t at_real_time,
51 bigtime_t to_performance_time);
52 virtual status_t AddTimer(bigtime_t at_performance_time, int32 cookie);
53 virtual void SetRunMode(run_mode mode);
54 virtual void HandleEvent(const media_timed_event *event,
55 bigtime_t lateness, bool realTimeEvent = false);
56 virtual void CleanUpEvent(const media_timed_event *event);
57 virtual bigtime_t OfflineTime();
58 virtual void ControlLoop();
59 virtual status_t DeleteHook(BMediaNode * node);
61 /* BBufferProducer */
62 protected:
63 virtual status_t FormatSuggestionRequested(media_type type, int32 quality,
64 media_format * format);
65 virtual status_t FormatProposal(const media_source &output,
66 media_format *format);
67 virtual status_t FormatChangeRequested(const media_source &source,
68 const media_destination &destination,
69 media_format *io_format, int32 *_deprecated_);
70 virtual status_t GetNextOutput(int32 * cookie, media_output * out_output);
71 virtual status_t DisposeOutputCookie(int32 cookie);
72 virtual status_t SetBufferGroup(const media_source &for_source,
73 BBufferGroup * group);
74 virtual 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_);
78 virtual status_t GetLatency(bigtime_t * out_latency);
79 virtual status_t PrepareToConnect(const media_source &what,
80 const media_destination &where,
81 media_format *format,
82 media_source *out_source, char *out_name);
83 virtual void Connect(status_t error, const media_source &source,
84 const media_destination &destination,
85 const media_format & format, char *io_name);
86 virtual void Disconnect(const media_source & what,
87 const media_destination & where);
88 virtual void LateNoticeReceived(const media_source & what,
89 bigtime_t how_much, bigtime_t performance_time);
90 virtual void EnableOutput(const media_source & what, bool enabled,
91 int32 * _deprecated_);
92 virtual status_t SetPlayRate(int32 numer,int32 denom);
93 virtual void AdditionalBufferRequested(const media_source & source,
94 media_buffer_id prev_buffer, bigtime_t prev_time,
95 const media_seek_tag * prev_tag);
96 virtual void LatencyChanged(const media_source & source,
97 const media_destination & destination,
98 bigtime_t new_latency, uint32 flags);
100 /* BControllable */
101 protected:
102 virtual status_t GetParameterValue(int32 id, bigtime_t *last_change,
103 void *value, size_t *size);
104 virtual void SetParameterValue(int32 id, bigtime_t when,
105 const void *value, size_t size);
106 virtual status_t StartControlPanel(BMessenger *out_messenger);
108 /* state */
109 private:
110 void HandleStart(bigtime_t performance_time);
111 void HandleStop();
112 void HandleTimeWarp(bigtime_t performance_time);
113 void HandleSeek(bigtime_t performance_time);
115 void _UpdateStats();
117 static int32 fInstances;
119 status_t fInitStatus;
121 int32 fInternalID;
122 BMediaAddOn *fAddOn;
123 CamDevice *fCamDevice;
125 BLocker fLock;
126 BBufferGroup *fBufferGroup;
128 thread_id fThread;
129 sem_id fFrameSync;
130 static int32 _frame_generator_(void *data);
131 int32 FrameGenerator();
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;
145 enum {
146 P_COLOR,
147 P_INFO,
148 P_LAST // first available for addons
150 uint32 fColor;
151 BString fInfoString;
152 bigtime_t fLastColorChange; // TODO: rename
154 struct {
155 uint32 frames;
156 uint32 actual;
157 uint32 missed;
158 bigtime_t stamp;
159 } fStats[2];
162 #endif