1 /*
2 * MPEG-1/2 muxer
3 * Copyright (c) 2000, 2001, 2002 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 */
21
22 #include "config_components.h"
23
24 #include <stdint.h>
25
32
34
40
41 #define MAX_PAYLOAD_SIZE 4096
42
50
66
75 int mux_rate;
/* bitrate in units of 50 bytes/s */
76 /* stream info */
84
87
90
95
98 {
101
103
107 else
109 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
111 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
113 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
116 /* clock extension */
123 put_bits(&pb, 5, 0x1f);
/* reserved */
124 put_bits(&pb, 3, 0);
/* stuffing length */
125 }
128 }
129
131 int only_for_stream_id)
132 {
134 int size,
i, private_stream_coded,
id;
136
138
142
143 /* maximum bit rate of the multiplexed stream */
146 if (
s->is_vcd && only_for_stream_id ==
VIDEO_ID) {
147 /* This header applies only to the video stream
148 * (see VCD standard p. IV-7) */
150 } else
152
154 /* see VCD standard, p. IV-7 */
157 } else {
158 put_bits(&pb, 1, 0);
/* variable bitrate */
159 put_bits(&pb, 1, 0);
/* nonconstrained bitstream */
160 }
161
162 if (
s->is_vcd ||
s->is_dvd) {
163 /* see VCD standard p IV-7 */
164 put_bits(&pb, 1, 1);
/* audio locked */
165 put_bits(&pb, 1, 1);
/* video locked */
166 } else {
167 put_bits(&pb, 1, 0);
/* audio locked */
168 put_bits(&pb, 1, 0);
/* video locked */
169 }
170
172
173 if (
s->is_vcd && (only_for_stream_id & 0xe0) ==
AUDIO_ID) {
174 /* This header applies only to the audio stream
175 * (see VCD standard p. IV-7) */
177 } else
179
181 put_bits(&pb, 1, 0);
/* packet_rate_restriction_flag */
182 put_bits(&pb, 7, 0x7f);
/* reserved byte */
183 } else
184 put_bits(&pb, 8, 0xff);
/* reserved byte */
185
186 /* DVD-Video Stream_bound entries
187 * id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
188 * id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
189 * id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
190 * id (0xBF) private stream 2, NAV packs, set to 2x1024. */
192
193 int P_STD_max_video = 0;
194 int P_STD_max_mpeg_audio = 0;
195 int P_STD_max_mpeg_PS1 = 0;
196
199
203 } else if (id >= 0xc0 && id <= 0xc7 &&
206 } else if (id == 0xe0 &&
209 }
210 }
211
212 /* video */
213 put_bits(&pb, 8, 0xb9);
/* stream ID */
216 put_bits(&pb, 13, P_STD_max_video / 1024);
217
218 /* audio */
219 if (P_STD_max_mpeg_audio == 0)
220 P_STD_max_mpeg_audio = 4096;
221 put_bits(&pb, 8, 0xb8);
/* stream ID */
224 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
225
226 /* private stream 1 */
227 put_bits(&pb, 8, 0xbd);
/* stream ID */
230 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
231
232 /* private stream 2 */
233 put_bits(&pb, 8, 0xbf);
/* stream ID */
237 } else {
238 /* audio stream info */
239 private_stream_coded = 0;
242
243 /* For VCDs, only include the stream info for the stream
244 * that the pack which contains this system belongs to.
245 * (see VCD standard p. IV-7) */
246 if (!
s->is_vcd || stream->
id == only_for_stream_id ||
247 only_for_stream_id == 0) {
249 if (id < 0xc0) {
250 /* special case for private streams (AC-3 uses that) */
251 if (private_stream_coded)
252 continue;
253 private_stream_coded = 1;
254 id = 0xbd;
255 }
256 put_bits(&pb, 8,
id);
/* stream ID */
258 if (id < 0xe0) {
259 /* audio */
262 } else {
263 /* video */
266 }
267 }
268 }
269 }
270
273 /* patch packet size */
275
277 }
278
280 {
281 int buf_index,
i, private_stream_coded;
284
286 return 18; // DVD-Video system headers are 18 bytes fixed length.
287
288 buf_index = 12;
289 private_stream_coded = 0;
292 if (stream->
id < 0xc0) {
293 if (private_stream_coded)
294 continue;
295 private_stream_coded = 1;
296 }
297 buf_index += 3;
298 }
299 return buf_index;
300 }
301
303 {
305 int bitrate,
i, mpa_id, mpv_id, h264_id, mps_id, ac3_id, dts_id, lpcm_id, j;
308 int audio_bitrate;
309 int video_bitrate;
310
311 s->packet_number = 0;
318
324 }
326 } else
327 s->packet_size = 2048;
330
331 s->vcd_padding_bytes_written = 0;
332 s->vcd_padding_bitrate_num = 0;
333
336
344
348 if (!stream)
351
353
362 "%s in MPEG-1 system streams is not widely supported, "
363 "consider using the vob or the dvd muxer "
364 "to force a MPEG-2 program stream.\n",
367 stream->
id = ac3_id++;
369 stream->
id = dts_id++;
371 stream->
id = lpcm_id++;
372 for (j = 0; j < 4; j++) {
374 break;
375 }
376 if (j == 4) {
377 int sr;
380 for (sr = 0; sr < 4; sr++)
384 }
388 }
394 int freq;
395
397 case 48000: freq = 0; break;
398 case 96000: freq = 1; break;
399 case 44100: freq = 2; break;
400 case 32000: freq = 3; break;
401 default:
404 }
405
411 stream->
id = lpcm_id++;
421 av_log(
ctx,
AV_LOG_ERROR,
"Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts.\n");
423 } else {
424 stream->
id = mpa_id++;
425 }
426
427 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
428 * Right now it is also used for everything else. */
431 break;
436 stream->
id = h264_id++;
437 else
438 stream->
id = mpv_id++;
439
443 if (sd)
447 else {
449 "VBV buffer size not set, using default size of 230KB\n"
450 "If you want the mpeg file to be compliant to some specification\n"
451 "Like DVD, VCD or others, make sure you set the correct buffer size\n");
452 // FIXME: this is probably too small as default
454 }
458 }
460 break;
461 }
463 stream->
id = mps_id++;
465 break;
466 default:
470 }
474 }
476 audio_bitrate = 0;
477 video_bitrate = 0;
481 int codec_rate;
484
488 if (sd)
492 else
494
495 if (!codec_rate)
497
499
501 audio_bitrate += codec_rate;
503 video_bitrate += codec_rate;
504 }
505
506 if (
s->user_mux_rate) {
507 s->mux_rate = (
s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
508 } else {
509 /* we increase slightly the bitrate to take into account the
510 * headers. XXX: compute it exactly */
513 s->mux_rate = (
bitrate + (8 * 50) - 1) / (8 * 50);
514 if (
s->mux_rate >= (1<<22)) {
516 s->mux_rate = (1<<22) - 1;
517 }
518 }
519
522
523 /* The VCD standard mandates that the mux_rate field is 3528
524 * (see standard p. IV-6).
525 * The value is actually "wrong", i.e. if you calculate
526 * it using the normal formula and the 75 sectors per second transfer
527 * rate you get a different value because the real pack size is 2324,
528 * not 2352. But the standard explicitly specifies that the mux_rate
529 * field in the header must have this value. */
530 // s->mux_rate = 2352 * 75 / 50; /* = 3528 */
531
532 /* The VCD standard states that the muxed stream must be
533 * exactly 75 packs / second (the data rate of a single speed cdrom).
534 * Since the video bitrate (probably 1150000 bits/sec) will be below
535 * the theoretical maximum we have to add some padding packets
536 * to make up for the lower data rate.
537 * (cf. VCD standard p. IV-6 ) */
538
539 /* Add the header overhead to the data rate.
540 * 2279 data bytes per audio pack, 2294 data bytes per video pack */
541 overhead_rate = audio_bitrate * 2294LL * (2324 - 2279);
542 overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
543
544 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
545 s->vcd_padding_bitrate_num = (2324LL * 75 * 8 -
bitrate) * 2279 * 2294 - overhead_rate;
546 #define VCD_PADDING_BITRATE_DEN (2279 * 2294)
547 }
548
549 if (
s->is_vcd ||
s->is_mpeg2)
550 /* every packet */
551 s->pack_header_freq = 1;
552 else
553 /* every 2 seconds */
554 s->pack_header_freq = 2 *
bitrate /
s->packet_size / 8;
555
556 /* the above seems to make pack_header_freq zero sometimes */
557 if (
s->pack_header_freq == 0)
558 s->pack_header_freq = 1;
559
561 /* every 200 packets. Need to look at the spec. */
562 s->system_header_freq =
s->pack_header_freq * 40;
564 /* the standard mandates that there are only two system headers
565 * in the whole file: one in the first packet of each stream.
566 * (see standard p. IV-7 and IV-8) */
567 s->system_header_freq = 0x7fffffff;
568 else
569 s->system_header_freq =
s->pack_header_freq * 5;
570
574 }
577 return 0;
578 }
579
581 {
582 avio_w8(pb, (
id << 4) | (((timestamp >> 30) & 0x07) << 1) | 1);
583 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
584 avio_wb16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
585 }
586
587 /* return the number of padding bytes that should be inserted into
588 * the multiplexed stream. */
590 {
592 int pad_bytes = 0;
593
596
597 // FIXME: this is wrong
598 full_pad_bytes =
600 pad_bytes = (int)(full_pad_bytes -
s->vcd_padding_bytes_written);
601
602 if (pad_bytes < 0)
603 /* might happen if we have already padded to a later timestamp. This
604 * can occur if another stream has already advanced further. */
605 pad_bytes = 0;
606 }
607
608 return pad_bytes;
609 }
610
611 /* Write an MPEG padding packet header. */
613 int packet_bytes)
614 {
616
621 packet_bytes -= 7;
622 } else
623 packet_bytes -= 6;
624
626 }
627
629 {
630 int nb_frames = 0;
632
635 nb_frames++;
637 pkt_desc = pkt_desc->
next;
638 }
639
640 return nb_frames;
641 }
642
644 {
646 return 0;
647 }
648
649 /* flush the packet on stream stream_index */
652 {
655 uint8_t *buf_ptr;
656 int size, payload_size, startcode,
id, stuffing_size, header_len;
657 int packet_size;
659 int zero_trail_bytes = 0;
660 int pad_packet_bytes = 0;
661 int pes_flags;
662 /* "general" pack without data specific to one stream? */
663 int general_pack = 0;
664 int nb_frames;
665
667
669
671
672 if ((
s->packet_number %
s->pack_header_freq) == 0 ||
s->last_scr != scr) {
673 /* output pack and systems header if needed */
677
679 /* there is exactly one system header for each stream in a VCD MPEG,
680 * One in the very first video packet and one in the very first
681 * audio packet (see VCD standard p. IV-7 and IV-8). */
682
686 }
687 }
else if (
s->is_dvd) {
689 int PES_bytes_to_fill =
s->packet_size -
size - 10;
690
693 PES_bytes_to_fill -= 5 + 5;
694 else
695 PES_bytes_to_fill -= 5;
696 }
697
703
708
713
718 // FIXME: rounding and first few bytes of each packet
719 scr +=
s->packet_size * 90000LL /
720 (
s->mux_rate * 50LL);
724 /* GOP Start */
726 pad_packet_bytes = PES_bytes_to_fill -
728 }
729 }
730 } else {
731 if ((
s->packet_number %
s->system_header_freq) == 0) {
734 }
735 }
736 }
739
740 packet_size =
s->packet_size -
size;
741
742 if (
s->is_vcd && (
id & 0xe0) ==
AUDIO_ID)
743 /* The VCD standard demands that 20 zero bytes follow
744 * each audio pack (see standard p. IV-8). */
745 zero_trail_bytes += 20;
746
748 (
s->is_svcd &&
s->packet_number == 0)) {
749 /* for VCD the first pack of each stream contains only the pack header,
750 * the system header and lots of padding (see VCD standard p. IV-6).
751 * In the case of an audio pack, 20 zero bytes are also added at
752 * the end. */
753 /* For SVCD we fill the very first pack to increase compatibility with
754 * some DVD players. Not mandated by the standard. */
756 /* the system header refers to both streams and no stream data */
757 general_pack = 1;
758 pad_packet_bytes = packet_size - zero_trail_bytes;
759 }
760
761 packet_size -= pad_packet_bytes + zero_trail_bytes;
762
763 if (packet_size > 0) {
764 size_t fifo_data;
765 /* packet header size */
766 packet_size -= 6;
767
768 /* packet header */
770 header_len = 3;
772 header_len += 3; /* PES extension */
773 header_len += 1; /* obligatory stuffing byte */
774 } else {
775 header_len = 0;
776 }
779 header_len += 5 + 5;
780 else
781 header_len += 5;
782 } else {
784 header_len++;
785 }
786
787 payload_size = packet_size - header_len;
788 if (id < 0xc0) {
790 payload_size -= 1;
791 if (id >= 0x40) {
792 payload_size -= 3;
793 if (id >= 0xa0)
794 payload_size -= 3;
795 }
796 } else {
797 startcode = 0x100 +
id;
798 }
799
801
802 // first byte does not fit -> reset pts/dts + stuffing
804 int timestamp_len = 0;
806 timestamp_len += 5;
808 timestamp_len +=
s->is_mpeg2 ? 5 : 4;
811 header_len -= timestamp_len;
813 pad_packet_bytes += timestamp_len;
814 packet_size -= timestamp_len;
815 } else {
816 payload_size += timestamp_len;
817 }
818 stuffing_size += timestamp_len;
819 if (payload_size > trailer_size)
820 stuffing_size += payload_size - trailer_size;
821 }
822
823 // can't use padding, so use stuffing
824 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
825 packet_size += pad_packet_bytes;
826 payload_size += pad_packet_bytes; // undo the previous adjustment
827 if (stuffing_size < 0)
828 stuffing_size = pad_packet_bytes;
829 else
830 stuffing_size += pad_packet_bytes;
831 pad_packet_bytes = 0;
832 }
833
834 if (stuffing_size < 0)
835 stuffing_size = 0;
836
839 stuffing_size += payload_size % stream->
lpcm_align;
840 }
841
842 if (stuffing_size > 16) { /* <=16 for MPEG-1, <=32 for MPEG-2 */
843 pad_packet_bytes += stuffing_size;
844 packet_size -= stuffing_size;
845 payload_size -= stuffing_size;
846 stuffing_size = 0;
847 }
848
850
852
854
857
860
861 pes_flags = 0;
862
864 pes_flags |= 0x80;
866 pes_flags |= 0x40;
867 }
868
869 /* Both the MPEG-2 and the SVCD standards demand that the
870 * P-STD_buffer_size field be included in the first packet of
871 * every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
872 * and MPEG-2 standard 2.7.7) */
874 pes_flags |= 0x01;
875
878
879 if (pes_flags & 0x80) /* write pts */
881 if (pes_flags & 0x40) /* write dts */
883
884 if (pes_flags & 0x01) { /* write pes extension */
886
887 /* P-STD buffer info */
890 else
892 }
893 } else {
898 } else {
900 }
901 } else {
903 }
904 }
905
907 /* special stuffing byte that is always written
908 * to prevent accidental generation of start codes. */
910
912 }
913
916 if (id >= 0xa0) {
917 /* LPCM (XXX: check nb_frames) */
923 } else if (id >= 0x40) {
924 /* AC-3 */
927 }
928 }
929
930 /* output data */
931 fifo_data = payload_size - stuffing_size;
935 } else {
936 payload_size =
937 stuffing_size = 0;
938 }
939
940 if (pad_packet_bytes > 0)
942
944
946
948
949 /* only increase the stream packet number if this pack actually contains
950 * something that is specific to this stream! I.e. a dedicated header
951 * or some data. */
952 if (!general_pack)
954
955 return payload_size - stuffing_size;
956 }
957
959 {
960 /* There are two ways to do this padding: writing a sector/pack
961 * of 0 values, or writing an MPEG padding pack. Both seem to
962 * work with most decoders, BUT the VCD standard only allows a 0-sector
963 * (see standard p. IV-4, IV-5).
964 * So a 0-sector it is... */
965
967
969
970 s->vcd_padding_bytes_written +=
s->packet_size;
971
973
974 /* increasing the packet number is correct. The SCR of the following packs
975 * is calculated from the packet_number and it has to include the padding
976 * sector (it represents the sector index, not the MPEG pack index)
977 * (see VCD standard p. IV-6) */
979 }
980
982 {
984
989
991 scr > pkt_desc->
dts) {
// FIXME: > vs >=
995 "buffer underflow st=%d bufi=%d size=%d\n",
997 break;
998 }
1004 }
1005 }
1006
1007 return 0;
1008 }
1009
1011 {
1015 int i, avail_space = 0, es_size, trailer_size;
1016 int best_i = -1;
1017 int best_score = INT_MIN;
1018 int ignore_constraints = 0;
1019 int ignore_delay = 0;
1023
1024 retry:
1032
1033 /* for subtitle, a single PES packet must be generated,
1034 * so we flush after every single subtitle packet */
1035 if (
s->packet_size > avail_data && !
flush
1037 return 0;
1038 if (avail_data == 0)
1039 continue;
1041
1042 if (space < s->packet_size && !ignore_constraints)
1043 continue;
1044
1045 if (next_pkt && next_pkt->
dts - scr > max_delay && !ignore_delay)
1046 continue;
1049 rel_space += 1<<28;
1050 if (rel_space > best_score) {
1051 best_score = rel_space;
1053 avail_space =
space;
1054 }
1055 }
1056
1057 if (best_i < 0) {
1059 int has_premux = 0;
1060
1065 if (pkt_desc && pkt_desc->
dts < best_dts)
1066 best_dts = pkt_desc->
dts;
1068 }
1069
1070 if (best_dts < INT64_MAX) {
1072 scr / 90000.0, best_dts / 90000.0);
1073
1074 if (scr >= best_dts + 1 && !ignore_constraints) {
1076 "packet too large, ignoring buffer limits to mux it\n");
1077 ignore_constraints = 1;
1078 }
1079 scr =
FFMAX(best_dts + 1, scr);
1081 return -1;
1082 }
else if (has_premux &&
flush) {
1084 "delay too large, ignoring ...\n");
1085 ignore_delay = 1;
1086 ignore_constraints = 1;
1087 } else
1088 return 0;
1089
1090 goto retry;
1091 }
1092
1094
1097
1099
1100 av_assert0(avail_space >=
s->packet_size || ignore_constraints);
1101
1104 trailer_size = 0;
1105 } else {
1107 timestamp_packet = timestamp_packet->
next;
1108 }
1109
1110 if (timestamp_packet) {
1112 timestamp_packet->
dts / 90000.0,
1113 timestamp_packet->
pts / 90000.0,
1114 scr / 90000.0, best_i);
1116 timestamp_packet->
dts, scr, trailer_size);
1117 } else {
1120 trailer_size);
1121 }
1122
1124 /* Write one or more padding sectors, if necessary, to reach
1125 * the constant overall bitrate. */
1126 int vcd_pad_bytes;
1127
1128 // FIXME: pts cannot be correct here
1131 // FIXME: rounding and first few bytes of each packet
1132 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1133 }
1134 }
1135
1137 // FIXME: rounding and first few bytes of each packet
1138 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1139
1144 }
1145 if (es_size) {
1148 }
1149
1151 return -1;
1152
1153 return 1;
1154 }
1155
1157 {
1160 const uint8_t *buf =
pkt->
data;
1167 size_t can_write;
1170
1172
1175
1177 if (dts ==
AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) ||
s->is_dvd) {
1181 } else {
1182 s->last_scr = dts - preload;
1184 }
1187 }
1188
1191
1195
1200 }
1201
1202 /* Skip first 3 bytes of packet data, which comprise PCM header
1203 and will be written fresh by this muxer. */
1204 buf += 3;
1206 }
1207
1208 /* Enlarge the FIFO before adding a new PacketDesc
1209 * in order to avoid inconsistencies on failure. */
1211 if (can_write <
size) {
1215 }
1217 if (!pkt_desc)
1221 } else
1227 pkt_desc->
dts = dts;
1230
1232 // min VOBU length 0.4 seconds (mpucoder)
1233 if (is_iframe &&
1239 }
1240 }
1241
1243
1244 for (;;) {
1248 }
1249 }
1250
1252 {
1255
1256 for (;;) {
1261 break;
1262 }
1263
1264 /* End header according to MPEG-1 systems standard. We do not write
1265 * it as it is usually not needed by decoders and because it
1266 * complicates MPEG stream concatenation. */
1267 // avio_wb32(ctx->pb, ISO_11172_END_CODE);
1268
1271
1273 }
1274 return 0;
1275 }
1276
1278 {
1281 if (!stream)
1282 continue;
1287 }
1289 }
1290 }
1291
1292 #define OFFSET(x) offsetof(MpegMuxContext, x)
1293 #define E AV_OPT_FLAG_ENCODING_PARAM
1295 {
"muxrate",
"mux rate as bits/s",
OFFSET(user_mux_rate),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, ((1<<22) - 1) * (8 * 50),
E },
1296 {
"preload",
"initial demux-decode delay in microseconds",
OFFSET(preload),
AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX,
E },
1298 };
1299
1305 };
1306
1307 #if CONFIG_MPEG1SYSTEM_MUXER
1311 .p.mime_type = "video/mpeg",
1312 .p.extensions = "mpg,mpeg",
1321 };
1322 #endif
1323
1324 #if CONFIG_MPEG1VCD_MUXER
1328 .p.mime_type = "video/mpeg",
1337 };
1338 #endif
1339
1340 #if CONFIG_MPEG2VOB_MUXER
1344 .p.mime_type = "video/mpeg",
1345 .p.extensions = "vob",
1354 };
1355 #endif
1356
1357 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1358 #if CONFIG_MPEG2SVCD_MUXER
1362 .p.mime_type = "video/mpeg",
1363 .p.extensions = "vob",
1372 };
1373 #endif
1374
1375 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1376 #if CONFIG_MPEG2DVD_MUXER
1380 .p.mime_type = "video/mpeg",
1381 .p.extensions = "dvd",
1390 };
1391 #endif