1 // A MediaFileProducer is a node that 2 // implements FileInterface and BBufferProducer. 3 // it produces one output, a multistream 4 5 #if !defined(_MEDIA_FILE_PRODUCER_H) 6 #define _MEDIA_FILE_PRODUCER_H 7 8 #include <MediaDefs.h> 9 #include <MediaNode.h> 10 #include <FileInterface.h> 11 #include <BufferProducer.h> 12 13 class MediaFileProducer : 14 public BFileInterface, 15 public BBufferProducer 16 { 17 protected: 18 MediaFileProducer(); 19 virtual ~MediaFileProducer(); 20 21 /*************************/ 22 /* begin from BMediaNode */ 23 public: 24 /* this port is what a media node listens to for commands */ 25 virtual port_id ControlPort() const; 26 27 virtual BMediaAddOn* AddOn( 28 int32 * internal_id) const = 0; /* Who instantiated you -- or NULL for app class */ 29 30 protected: 31 /* These don't return errors; instead, they use the global error condition reporter. */ 32 /* A node is required to have a queue of at least one pending command (plus TimeWarp) */ 33 /* and is recommended to allow for at least one pending command of each type. */ 34 /* Allowing an arbitrary number of outstanding commands might be nice, but apps */ 35 /* cannot depend on that happening. */ 36 virtual void Start( 37 bigtime_t performance_time); 38 virtual void Stop( 39 bigtime_t performance_time, 40 bool immediate); 41 virtual void Seek( 42 bigtime_t media_time, 43 bigtime_t performance_time); 44 virtual void SetRunMode( 45 run_mode mode); 46 virtual void TimeWarp( 47 bigtime_t at_real_time, 48 bigtime_t to_performance_time); 49 virtual void Preroll(); 50 virtual void SetTimeSource( 51 BTimeSource * time_source); 52 53 public: 54 virtual status_t HandleMessage( 55 int32 message, 56 const void * data, 57 size_t size); 58 59 protected: 60 /* Called when requests have completed, or failed. */ 61 virtual status_t RequestCompleted( /* reserved 0 */ 62 const media_request_info & info); 63 64 protected: 65 virtual status_t DeleteHook(BMediaNode * node); /* reserved 1 */ 66 67 virtual void NodeRegistered(); /* reserved 2 */ 68 69 public: 70 71 /* fill out your attributes in the provided array, returning however many you have. */ 72 virtual status_t GetNodeAttributes( /* reserved 3 */ 73 media_node_attribute * outAttributes, 74 size_t inMaxCount); 75 76 virtual status_t AddTimer( 77 bigtime_t at_performance_time, 78 int32 cookie); 79 80 /* end from BMediaNode */ 81 /***********************/ 82 83 /*****************************/ 84 /* begin from BFileInterface */ 85 protected: 86 //included from BMediaNode 87 //virtual status_t HandleMessage( 88 // int32 message, 89 // const void * data, 90 // size_t size); 91 92 virtual status_t GetNextFileFormat( 93 int32 * cookie, 94 media_file_format * out_format) = 0; 95 virtual void DisposeFileFormatCookie( 96 int32 cookie) = 0; 97 98 virtual status_t GetDuration( 99 bigtime_t * out_time) = 0; 100 virtual status_t SniffRef( 101 const entry_ref & file, 102 char * out_mime_type, /* 256 bytes */ 103 float * out_quality) = 0; 104 virtual status_t SetRef( 105 const entry_ref & file, 106 bool create, 107 bigtime_t * out_time) = 0; 108 virtual status_t GetRef( 109 entry_ref * out_ref, 110 char * out_mime_type) = 0; 111 /* end from BFileInterface */ 112 /***************************/ 113 114 /******************************/ 115 /* begin from BBufferProducer */ 116 protected: 117 /* functionality of BBufferProducer */ 118 virtual status_t FormatSuggestionRequested( 119 media_type type, 120 int32 quality, 121 media_format * format) = 0; 122 virtual status_t FormatProposal( 123 const media_source & output, 124 media_format * format) = 0; 125 /* If the format isn't good, put a good format into *io_format and return error */ 126 /* If format has wildcard, specialize to what you can do (and change). */ 127 /* If you can change the format, return OK. */ 128 /* The request comes from your destination sychronously, so you cannot ask it */ 129 /* whether it likes it -- you should assume it will since it asked. */ 130 virtual status_t FormatChangeRequested( 131 const media_source & source, 132 const media_destination & destination, 133 media_format * io_format, 134 int32 * _deprecated_) = 0; 135 virtual status_t GetNextOutput( /* cookie starts as 0 */ 136 int32 * cookie, 137 media_output * out_output) = 0; 138 virtual status_t DisposeOutputCookie( 139 int32 cookie) = 0; 140 /* In this function, you should either pass on the group to your upstream guy, */ 141 /* or delete your current group and hang on to this group. Deleting the previous */ 142 /* group (unless you passed it on with the reclaim flag set to false) is very */ 143 /* important, else you will 1) leak memory and 2) block someone who may want */ 144 /* to reclaim the buffers living in that group. */ 145 virtual status_t SetBufferGroup( 146 const media_source & for_source, 147 BBufferGroup * group) = 0; 148 /* Format of clipping is (as int16-s): <from line> <npairs> <startclip> <endclip>. */ 149 /* Repeat for each line where the clipping is different from the previous line. */ 150 /* If <npairs> is negative, use the data from line -<npairs> (there are 0 pairs after */ 151 /* a negative <npairs>. Yes, we only support 32k*32k frame buffers for clipping. */ 152 /* Any non-0 field of 'display' means that that field changed, and if you don't support */ 153 /* that change, you should return an error and ignore the request. Note that the buffer */ 154 /* offset values do not have wildcards; 0 (or -1, or whatever) are real values and must */ 155 /* be adhered to. */ 156 virtual status_t VideoClippingChanged( 157 const media_source & for_source, 158 int16 num_shorts, 159 int16 * clip_data, 160 const media_video_display_info & display, 161 int32 * _deprecated_); 162 /* Iterates over all outputs and maxes the latency found */ 163 virtual status_t GetLatency( 164 bigtime_t * out_lantency); 165 virtual status_t PrepareToConnect( 166 const media_source & what, 167 const media_destination & where, 168 media_format * format, 169 media_source * out_source, 170 char * out_name) = 0; 171 virtual void Connect( 172 status_t error, 173 const media_source & source, 174 const media_destination & destination, 175 const media_format & format, 176 char * io_name) = 0; 177 virtual void Disconnect( 178 const media_source & what, 179 const media_destination & where) = 0; 180 virtual void LateNoticeReceived( 181 const media_source & what, 182 bigtime_t how_much, 183 bigtime_t performance_time) = 0; 184 virtual void EnableOutput( 185 const media_source & what, 186 bool enabled, 187 int32 * _deprecated_) = 0; 188 virtual status_t SetPlayRate( 189 int32 numer, 190 int32 denom); 191 192 virtual status_t HandleMessage( /* call this from the thread that listens to the port */ 193 int32 message, 194 const void * data, 195 size_t size); 196 197 virtual void AdditionalBufferRequested( // used to be Reserved 0 198 const media_source & source, 199 media_buffer_id prev_buffer, 200 bigtime_t prev_time, 201 const media_seek_tag * prev_tag); // may be NULL 202 203 virtual void LatencyChanged( // used to be Reserved 1 204 const media_source & source, 205 const media_destination & destination, 206 bigtime_t new_latency, 207 uint32 flags); 208 209 /* end from BBufferProducer */ 210 /****************************/ 211 212 private: 213 214 MediaFileProducer( /* private unimplemented */ 215 const MediaFileProducer & clone); 216 MediaFileProducer & operator=( 217 const MediaFileProducer & clone); 218 219 /* Mmmh, stuffing! */ 220 virtual status_t _Reserved_MediaFileProducer_0(void *); 221 virtual status_t _Reserved_MediaFileProducer_1(void *); 222 virtual status_t _Reserved_MediaFileProducer_2(void *); 223 virtual status_t _Reserved_MediaFileProducer_3(void *); 224 virtual status_t _Reserved_MediaFileProducer_4(void *); 225 virtual status_t _Reserved_MediaFileProducer_5(void *); 226 virtual status_t _Reserved_MediaFileProducer_6(void *); 227 virtual status_t _Reserved_MediaFileProducer_7(void *); 228 virtual status_t _Reserved_MediaFileProducer_8(void *); 229 virtual status_t _Reserved_MediaFileProducer_9(void *); 230 virtual status_t _Reserved_MediaFileProducer_10(void *); 231 virtual status_t _Reserved_MediaFileProducer_11(void *); 232 virtual status_t _Reserved_MediaFileProducer_12(void *); 233 virtual status_t _Reserved_MediaFileProducer_13(void *); 234 virtual status_t _Reserved_MediaFileProducer_14(void *); 235 virtual status_t _Reserved_MediaFileProducer_15(void *); 236 237 uint32 _reserved_media_file_node_[16]; 238 239 }; 240 241 #endif /* _MEDIA_FILE_PRODUCER_H */ 242