1 /*
2 * "Real" compatible muxer.
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
26
31 /* codec related output */
39
43 int data_pos;
/* position of the data after the header */
45
46 /* in ms */
47 #define BUFFER_DURATION 0
48 /* the header needs at most 7 + 4 + 12 B */
49 #define MAX_HEADER_SIZE (7 + 4 + 12)
50 /* UINT16_MAX is the maximal chunk size */
51 #define MAX_PACKET_SIZE (UINT16_MAX - MAX_HEADER_SIZE)
52
53
55 {
59 }
60 }
61
63 {
67 }
68 }
69
71 int data_size, int index_pos)
72 {
76 const char *
desc, *mimetype;
77 int nb_packets, packet_total_size, packet_max_size,
size, packet_avg_size,
i;
79 int data_offset;
81
87
91 packet_max_size = 0;
92 packet_total_size = 0;
93 nb_packets = 0;
94 bit_rate = 0;
103 /* select maximum duration */
107 }
110 avio_wb32(
s, packet_max_size);
/* max packet size */
111 if (nb_packets > 0)
112 packet_avg_size = packet_total_size / nb_packets;
113 else
114 packet_avg_size = 0;
115 avio_wb32(
s, packet_avg_size);
/* avg packet size */
120 /* computation of data the data offset */
122 avio_wb32(
s, 0);
/* data offset : will be patched after */
124 flags = 1 | 2;
/* save allowed & perfect play */
126 flags |= 4;
/* live broadcast */
128
129 /* comments */
130
136 }
142 }
143
145 int codec_data_size;
146
148
150 desc =
"The Audio Stream";
151 mimetype = "audio/x-pn-realaudio";
152 codec_data_size = 73;
153 } else {
154 desc =
"The Video Stream";
155 mimetype = "video/x-pn-realvideo";
156 codec_data_size = 34;
157 }
158
160 size = 10 + 9 * 4 + strlen(
desc) + strlen(mimetype) + codec_data_size;
163
171 else
172 packet_avg_size = 0;
173 avio_wb32(
s, packet_avg_size);
/* avg packet size */
176 /* duration */
179 else
184
186 int coded_frame_size, fscode, sample_rate;
191 /* audio codec info */
199
200 switch(sample_rate) {
201 case 48000:
202 case 24000:
203 case 12000:
204 fscode = 1;
205 break;
206 default:
207 case 44100:
208 case 22050:
209 case 11025:
210 fscode = 2;
211 break;
212 case 32000:
213 case 16000:
214 case 8000:
215 fscode = 3;
216 }
217 avio_wb16(
s, fscode);
/* codec additional info, for AC-3, seems
218 to be a frequency code */
219 /* special hack to compensate rounding errors... */
220 if (coded_frame_size == 557)
221 coded_frame_size--;
222 avio_wb32(
s, coded_frame_size);
/* frame length */
227 /* frame length : seems to be very important */
237 } else {
239 return -1;
240 }
245 } else {
246 /* video codec info */
251 else
255
259 }
260
266 /* Seems to be the codec version: only use basic H.263. The next
267 versions seems to add a differential DC coding as in
268 MPEG... nothing new under the sun. */
271 else
273 //avio_wb32(s,0x10003000);
274 }
275 }
276
277 /* patch data offset field */
279 if (
avio_seek(
s, data_offset, SEEK_SET) >= 0) {
282 }
283
284 /* data stream */
288
289 avio_wb32(
s, nb_packets);
/* number of packets */
291 return 0;
292 }
293
295 int length, int key_frame)
296 {
297 int timestamp;
299
304
311 avio_w8(
s, key_frame ? 2 : 0);
/* flags */
312 }
313
315 {
318 int n;
320
321 if (
s->nb_streams > 2) {
324 }
325
326 for(n=0;n<
s->nb_streams;n++) {
329
330 s->streams[n]->id = n;
331 par =
s->streams[n]->codecpar;
337
343 /* XXX: dummy values */
347 break;
350 // TODO: should be avg_frame_rate
352 /* XXX: dummy values */
356 break;
357 default:
358 return -1;
359 }
360 }
361
364 return 0;
365 }
366
368 {
373
375
377 /* for AC-3, the words seem to be reversed */
378 for (
i = 0;
i <
size;
i += 2) {
381 }
382 } else {
384 }
386 return 0;
387 }
388
390 {
395
396 /* XXX: this is incorrect: should be a parameter */
397
398 /* Well, I spent some time finding the meaning of these bits. I am
399 not sure I understood everything, but it works !! */
403 }
405 /* bit 7: '1' if final packet of a frame converted in several packets */
407 /* bit 7: '1' if I-frame. bits 6..0 : sequence number in current
408 frame starting from 1 */
409 if (key_frame) {
411 } else {
413 }
417 }else{
419 avio_wb16(pb, 0x4000 |
size);
/* offset from the start or the end */
420 }
422
424
426 return 0;
427 }
428
430 {
434 else
436 }
437
439 {
441 int data_size, index_pos,
i;
443
445 /* end of file: finish to write header */
447 data_size = index_pos - rm->
data_pos;
448
449 /* FIXME: write index */
450
451 /* undocumented end header */
454
456 for(
i=0;
i<
s->nb_streams;
i++)
459 } else {
460 /* undocumented end header */
463 }
464
465 return 0;
466 }
467
468
472 .p.mime_type = "application/vnd.rn-realmedia",
473 .p.extensions = "rm,ra",
481 };