3 // Andrew Bachmann, 2002
5 // A MediaWriter is a node that
6 // implements FileInterface and BBufferConsumer.
7 // It consumes on input, which is a multistream,
8 // and writes the stream to a file. It has a rather
9 // unique interpretation of time. Time is
10 // distance in the file. So the duration is the
11 // file length. (in bytes)
13 #if !defined(_MEDIA_WRITER_H)
14 #define _MEDIA_WRITER_H
16 #include <MediaDefs.h>
17 #include <MediaNode.h>
18 #include <FileInterface.h>
19 #include <BufferConsumer.h>
20 #include <Controllable.h>
21 #include <MediaEventLooper.h>
24 #include <BufferGroup.h>
26 #include "../AbstractFileInterfaceNode.h"
29 public BBufferConsumer
,
30 public AbstractFileInterfaceNode
33 virtual ~MediaWriter(void);
38 size_t defaultChunkSize
= 8192, // chunk size = 8 KB
39 float defaultBitRate
= 800000, // bit rate = 100.000 KB/sec = 5.85 MB/minute
40 const flavor_info
* info
= 0, // buffer period = 80 milliseconds
41 BMessage
* config
= 0,
42 BMediaAddOn
* addOn
= 0);
44 /*************************/
45 /* begin from BMediaNode */
47 /* These don't return errors; instead, they use the global error condition reporter. */
48 /* A node is required to have a queue of at least one pending command (plus TimeWarp) */
49 /* and is recommended to allow for at least one pending command of each type. */
50 /* Allowing an arbitrary number of outstanding commands might be nice, but apps */
51 /* cannot depend on that happening. */
52 virtual void Preroll(void);
55 virtual status_t
HandleMessage(
61 virtual void NodeRegistered(void); /* reserved 2 */
63 /* end from BMediaNode */
64 /***********************/
66 /*****************************/
67 /* begin from BFileInterface */
70 using AbstractFileInterfaceNode::SetRef
;
72 virtual status_t
SetRef(
73 const entry_ref
& file
,
75 bigtime_t
* out_time
);
77 /* end from BFileInterface */
78 /***************************/
80 // provided for BMediaWriterAddOn
82 static status_t
StaticSniffRef(
83 const entry_ref
& file
,
84 char * out_mime_type
, /* 256 bytes */
87 /******************************/
88 /* begin from BBufferConsumer */
90 //included from BMediaAddOn
91 //virtual status_t HandleMessage(
96 /* Someone, probably the producer, is asking you about this format. Give */
97 /* your honest opinion, possibly modifying *format. Do not ask upstream */
98 /* producer about the format, since he's synchronously waiting for your */
100 virtual status_t
AcceptFormat(
101 const media_destination
& dest
,
102 media_format
* format
);
103 virtual status_t
GetNextInput(
105 media_input
* out_input
);
106 virtual void DisposeInputCookie(
108 virtual void BufferReceived(
110 virtual void ProducerDataStatus(
111 const media_destination
& for_whom
,
113 bigtime_t at_performance_time
);
114 virtual status_t
GetLatencyFor(
115 const media_destination
& for_whom
,
116 bigtime_t
* out_latency
,
117 media_node_id
* out_timesource
);
118 virtual status_t
Connected(
119 const media_source
& producer
, /* here's a good place to request buffer group usage */
120 const media_destination
& where
,
121 const media_format
& with_format
,
122 media_input
* out_input
);
123 virtual void Disconnected(
124 const media_source
& producer
,
125 const media_destination
& where
);
126 /* The notification comes from the upstream producer, so he's already cool with */
127 /* the format; you should not ask him about it in here. */
128 virtual status_t
FormatChanged(
129 const media_source
& producer
,
130 const media_destination
& consumer
,
132 const media_format
& format
);
134 /* Given a performance time of some previous buffer, retrieve the remembered tag */
135 /* of the closest (previous or exact) performance time. Set *out_flags to 0; the */
136 /* idea being that flags can be added later, and the understood flags returned in */
138 virtual status_t
SeekTagRequested(
139 const media_destination
& destination
,
140 bigtime_t in_target_time
,
142 media_seek_tag
* out_seek_tag
,
143 bigtime_t
* out_tagged_time
,
146 /* end from BBufferConsumer */
147 /****************************/
153 /*********************/
154 /* BMediaEventLooper */
155 /*********************/
159 virtual status_t
HandleBuffer(
160 const media_timed_event
*event
,
162 bool realTimeEvent
= false);
163 virtual status_t
HandleDataStatus(
164 const media_timed_event
*event
,
166 bool realTimeEvent
= false);
170 static void GetFlavor(flavor_info
* outInfo
, int32 id
);
171 static void GetFormat(media_format
* outFormat
);
172 static void GetFileFormat(media_file_format
* outFileFormat
);
176 virtual status_t
WriteFileBuffer(BBuffer
* buffer
);
180 MediaWriter( /* private unimplemented */
181 const MediaWriter
& clone
);
182 MediaWriter
& operator=(
183 const MediaWriter
& clone
);
187 BBufferGroup
* fBufferGroup
;
188 bigtime_t fInternalLatency
;
189 // this is computed from the real (negotiated) chunk size and bit rate,
190 // not the defaults that are in the parameters
191 bigtime_t fBufferPeriod
;
193 /* Mmmh, stuffing! */
194 virtual status_t
_Reserved_MediaWriter_0(void *);
195 virtual status_t
_Reserved_MediaWriter_1(void *);
196 virtual status_t
_Reserved_MediaWriter_2(void *);
197 virtual status_t
_Reserved_MediaWriter_3(void *);
198 virtual status_t
_Reserved_MediaWriter_4(void *);
199 virtual status_t
_Reserved_MediaWriter_5(void *);
200 virtual status_t
_Reserved_MediaWriter_6(void *);
201 virtual status_t
_Reserved_MediaWriter_7(void *);
202 virtual status_t
_Reserved_MediaWriter_8(void *);
203 virtual status_t
_Reserved_MediaWriter_9(void *);
204 virtual status_t
_Reserved_MediaWriter_10(void *);
205 virtual status_t
_Reserved_MediaWriter_11(void *);
206 virtual status_t
_Reserved_MediaWriter_12(void *);
207 virtual status_t
_Reserved_MediaWriter_13(void *);
208 virtual status_t
_Reserved_MediaWriter_14(void *);
209 virtual status_t
_Reserved_MediaWriter_15(void *);
211 uint32 _reserved_media_writer_
[16];
215 #endif /* _MEDIA_WRITER_H */