1/****************************************************************************** 2/ 3/ File: RadeonProducer.h 4/ 5/ Description: ATI Radeon Video Producer media node. 6/ 7/ Copyright 2001, Carlos Hasan 8/ 9*******************************************************************************/ 10 11#ifndef __RADEON_PRODUCER_H__ 12#define __RADEON_PRODUCER_H__ 13 14#include <kernel/OS.h> 15#include <media/BufferProducer.h> 16#include <media/Controllable.h> 17#include <media/MediaDefs.h> 18#include <media/MediaEventLooper.h> 19#include <media/MediaNode.h> 20#include <support/Locker.h> 21#include "VideoIn.h" 22 23class CRadeonAddOn; 24 25class CRadeonProducer : 26 public virtual BMediaEventLooper, 27 public virtual BBufferProducer, 28 public virtual BControllable 29{ 30public: 31 CRadeonProducer(CRadeonAddOn *addon, const char *name, const char *device_name, 32 int32 internal_id, BMessage *config ); 33 virtual ~CRadeonProducer(); 34 35 void setupWeb(); 36 virtual status_t InitCheck() const { return fInitStatus; } 37 38/* BMediaNode */ 39public: 40 virtual port_id ControlPort() const; 41 virtual BMediaAddOn *AddOn(int32 * internal_id) const; 42 virtual status_t HandleMessage(int32 message, const void *data, 43 size_t size); 44protected: 45 virtual void Preroll(); 46 virtual void SetTimeSource(BTimeSource * time_source); 47 virtual status_t RequestCompleted(const media_request_info & info); 48 49/* BMediaEventLooper */ 50protected: 51 virtual void NodeRegistered(); 52 virtual void Start(bigtime_t performance_time); 53 virtual void Stop(bigtime_t performance_time, bool immediate); 54 virtual void Seek(bigtime_t media_time, bigtime_t performance_time); 55 virtual void TimeWarp(bigtime_t at_real_time, 56 bigtime_t to_performance_time); 57 virtual status_t AddTimer(bigtime_t at_performance_time, int32 cookie); 58 virtual void SetRunMode(run_mode mode); 59 virtual void HandleEvent(const media_timed_event *event, 60 bigtime_t lateness, bool realTimeEvent = false); 61 virtual void CleanUpEvent(const media_timed_event *event); 62 virtual bigtime_t OfflineTime(); 63 virtual void ControlLoop(); 64 virtual status_t DeleteHook(BMediaNode * node); 65 66/* BBufferProducer */ 67protected: 68 virtual status_t FormatSuggestionRequested(media_type type, int32 quality, 69 media_format * format); 70 virtual status_t FormatProposal(const media_source &output, 71 media_format *format); 72 virtual status_t FormatChangeRequested(const media_source &source, 73 const media_destination &destination, 74 media_format *io_format, int32 *_deprecated_); 75 virtual status_t GetNextOutput(int32 * cookie, media_output * out_output); 76 virtual status_t DisposeOutputCookie(int32 cookie); 77 virtual status_t SetBufferGroup(const media_source &for_source, 78 BBufferGroup * group); 79 virtual status_t VideoClippingChanged(const media_source &for_source, 80 int16 num_shorts, int16 *clip_data, 81 const media_video_display_info &display, 82 int32 * _deprecated_); 83 virtual status_t GetLatency(bigtime_t * out_latency); 84 virtual status_t PrepareToConnect(const media_source &what, 85 const media_destination &where, 86 media_format *format, 87 media_source *out_source, char *out_name); 88 virtual void Connect(status_t error, const media_source &source, 89 const media_destination &destination, 90 const media_format & format, char *io_name); 91 virtual void Disconnect(const media_source & what, 92 const media_destination & where); 93 virtual void LateNoticeReceived(const media_source & what, 94 bigtime_t how_much, bigtime_t performance_time); 95 virtual void EnableOutput(const media_source & what, bool enabled, 96 int32 * _deprecated_); 97 virtual status_t SetPlayRate(int32 numer,int32 denom); 98 virtual void AdditionalBufferRequested(const media_source & source, 99 media_buffer_id prev_buffer, bigtime_t prev_time, 100 const media_seek_tag * prev_tag); 101 virtual void LatencyChanged(const media_source & source, 102 const media_destination & destination, 103 bigtime_t new_latency, uint32 flags); 104 105/* BControllable */ 106protected: 107 virtual status_t GetParameterValue(int32 id, bigtime_t *last_change, 108 void *value, size_t *size); 109 virtual void SetParameterValue(int32 id, bigtime_t when, 110 const void *value, size_t size); 111 virtual status_t StartControlPanel(BMessenger *out_messenger); 112 113public: 114 enum { 115 C_GET_CONFIGURATION = BTimedEventQueue::B_USER_EVENT, 116 C_GET_CONFIGURATION_REPLY 117 }; 118 119 struct configuration_msg { 120 port_id reply_port; 121 }; 122 123 struct configuration_msg_reply { 124 status_t res; 125 size_t config_size; 126 char config; 127 }; 128 129/* state */ 130private: 131 void HandleStart(bigtime_t performance_time); 132 void HandleStop(); 133 void HandleTimeWarp(bigtime_t performance_time); 134 void HandleSeek(bigtime_t performance_time); 135 void HandleHardware(); 136 137 // home-brewed extension 138 status_t GetConfiguration( BMessage *out ); 139 140 CVideoIn fVideoIn; 141 142 status_t fInitStatus; 143 144 int32 fInternalID; 145 CRadeonAddOn *fAddOn; 146 147 BBufferGroup *fBufferGroup; 148 //BBufferGroup *fUsedBufferGroup; 149 150 static int32 _frame_generator_(void *data); 151 int32 FrameGenerator(); 152 153 /* The remaining variables should be declared volatile, but they 154 * are not here to improve the legibility of the sample code. */ 155 //uint32 fFrame; 156 uint32 fFieldSequenceBase; 157 //bigtime_t fPerformanceTimeBase; 158 bigtime_t fProcessingLatency; 159 media_output fOutput; 160 //media_raw_video_format fConnectedFormat; 161 //bool fConnected; 162 bool fEnabled; 163 164 // use fixed names as they are used in settings file 165 enum EOptions { 166 P_SOURCE = 'VSRC', 167 P_AUDIO_SOURCE = 'ASRC', 168 P_AUDIO_FORMAT = 'AFMT', 169 P_VOLUME = 'VOL ', 170 P_STANDARD = 'TVST', 171 P_MODE = 'CMOD', 172 P_FORMAT = 'VFMT', 173 P_RESOLUTION = 'RES ', 174 P_TUNER = 'TUNR', 175 P_BRIGHTNESS = 'BRGT', 176 P_CONTRAST = 'CONT', 177 P_SATURATION = 'SATU', 178 P_HUE = 'HUE ', 179 P_SHARPNESS = 'SHRP' 180 }; 181 182 enum { C_RESOLUTION_MAX = 6 }; 183 enum { C_CHANNEL_MAX = 125 }; 184 185 int32 fSource; 186 int32 fStandard; 187 int32 fMode; 188 int32 fCurMode; // mode, overwritten by application 189 int32 fFormat; 190 int32 fResolution; 191 int32 fTuner; 192 int32 fBrightness; 193 int32 fContrast; 194 int32 fSaturation; 195 int32 fHue; 196 int32 fSharpness; 197 bigtime_t fSourceLastChange; 198 bigtime_t fStandardLastChange; 199 bigtime_t fModeLastChange; 200 bigtime_t fFormatLastChange; 201 bigtime_t fResolutionLastChange; 202 bigtime_t fTunerLastChange; 203 bigtime_t fBrightnessLastChange; 204 bigtime_t fContrastLastChange; 205 bigtime_t fSaturationLastChange; 206 bigtime_t fHueLastChange; 207 bigtime_t fSharpnessLastChange; 208 209 status_t AddInt32( 210 BMessage *msg, EOptions option, int32 value ); 211 212 status_t FindInt32( 213 BMessage *config, EOptions option, int32 min_value, int32 max_value, 214 int32 default_value, int32 *value ); 215 216 // format negotiation helpers 217 status_t verifySetMode( media_format *format ); 218 int32 extractCaptureMode( const media_format *format ); 219 status_t verifySetPixelAspect( media_format *format ); 220 status_t verifyActiveRange( media_format *format ); 221 void setActiveRange( media_format *format ); 222 status_t verifyOrientation( media_format *format ); 223 void setOrientation( media_format *format ); 224 status_t verifyPixelFormat( media_format *format ); 225 void setPixelFormat( media_format *format ); 226 status_t verifySetSize( media_format *format, int32 mode, bool set_bytes_per_row ); 227 status_t verifyFormatOffsets( media_format *format ); 228 void setFormatOffsets( media_format *format ); 229 status_t verifyFormatFlags( media_format *format ); 230 void setFormatFlags( media_format *format ); 231 232 status_t finalizeFormat( media_format *format ); 233 234 void startCapturing(); 235 void captureField( bigtime_t *capture_time ); 236 void setDefaultBufferGroup(); 237 void instantFormatChange( media_format *new_format ); 238}; 239 240#endif 241