xref: /haiku/docs/develop/media/MediaFileProducer.h (revision 830f67ef991407f287dbc1238aa5f5906d90c991)
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