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
33
35
41
42 #define MAX_PAYLOAD_SIZE 4096
43
51
67
76 int mux_rate;
/* bitrate in units of 50 bytes/s */
77 /* stream info */
85
88
91
96
99 {
102
104
108 else
110 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
112 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
114 put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
117 /* clock extension */
124 put_bits(&pb, 5, 0x1f);
/* reserved */
125 put_bits(&pb, 3, 0);
/* stuffing length */
126 }
129 }
130
132 int only_for_stream_id)
133 {
135 int size,
i, private_stream_coded,
id;
137
139
143
144 /* maximum bit rate of the multiplexed stream */
147 if (
s->is_vcd && only_for_stream_id ==
VIDEO_ID) {
148 /* This header applies only to the video stream
149 * (see VCD standard p. IV-7) */
151 } else
153
155 /* see VCD standard, p. IV-7 */
158 } else {
159 put_bits(&pb, 1, 0);
/* variable bitrate */
160 put_bits(&pb, 1, 0);
/* nonconstrained bitstream */
161 }
162
163 if (
s->is_vcd ||
s->is_dvd) {
164 /* see VCD standard p IV-7 */
165 put_bits(&pb, 1, 1);
/* audio locked */
166 put_bits(&pb, 1, 1);
/* video locked */
167 } else {
168 put_bits(&pb, 1, 0);
/* audio locked */
169 put_bits(&pb, 1, 0);
/* video locked */
170 }
171
173
174 if (
s->is_vcd && (only_for_stream_id & 0xe0) ==
AUDIO_ID) {
175 /* This header applies only to the audio stream
176 * (see VCD standard p. IV-7) */
178 } else
180
182 put_bits(&pb, 1, 0);
/* packet_rate_restriction_flag */
183 put_bits(&pb, 7, 0x7f);
/* reserved byte */
184 } else
185 put_bits(&pb, 8, 0xff);
/* reserved byte */
186
187 /* DVD-Video Stream_bound entries
188 * id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
189 * 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)
190 * id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
191 * id (0xBF) private stream 2, NAV packs, set to 2x1024. */
193
194 int P_STD_max_video = 0;
195 int P_STD_max_mpeg_audio = 0;
196 int P_STD_max_mpeg_PS1 = 0;
197
200
204 } else if (id >= 0xc0 && id <= 0xc7 &&
207 } else if (id == 0xe0 &&
210 }
211 }
212
213 /* video */
214 put_bits(&pb, 8, 0xb9);
/* stream ID */
217 put_bits(&pb, 13, P_STD_max_video / 1024);
218
219 /* audio */
220 if (P_STD_max_mpeg_audio == 0)
221 P_STD_max_mpeg_audio = 4096;
222 put_bits(&pb, 8, 0xb8);
/* stream ID */
225 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
226
227 /* private stream 1 */
228 put_bits(&pb, 8, 0xbd);
/* stream ID */
231 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
232
233 /* private stream 2 */
234 put_bits(&pb, 8, 0xbf);
/* stream ID */
238 } else {
239 /* audio stream info */
240 private_stream_coded = 0;
243
244 /* For VCDs, only include the stream info for the stream
245 * that the pack which contains this system belongs to.
246 * (see VCD standard p. IV-7) */
247 if (!
s->is_vcd || stream->
id == only_for_stream_id ||
248 only_for_stream_id == 0) {
250 if (id < 0xc0) {
251 /* special case for private streams (AC-3 uses that) */
252 if (private_stream_coded)
253 continue;
254 private_stream_coded = 1;
255 id = 0xbd;
256 }
257 put_bits(&pb, 8,
id);
/* stream ID */
259 if (id < 0xe0) {
260 /* audio */
263 } else {
264 /* video */
267 }
268 }
269 }
270 }
271
274 /* patch packet size */
276
278 }
279
281 {
282 int buf_index,
i, private_stream_coded;
285
287 return 18; // DVD-Video system headers are 18 bytes fixed length.
288
289 buf_index = 12;
290 private_stream_coded = 0;
293 if (stream->
id < 0xc0) {
294 if (private_stream_coded)
295 continue;
296 private_stream_coded = 1;
297 }
298 buf_index += 3;
299 }
300 return buf_index;
301 }
302
304 {
306 int bitrate,
i, mpa_id, mpv_id, h264_id, mps_id, ac3_id, dts_id, lpcm_id, j;
309 int audio_bitrate;
310 int video_bitrate;
311
312 s->packet_number = 0;
319
325 }
327 } else
328 s->packet_size = 2048;
331
332 s->vcd_padding_bytes_written = 0;
333 s->vcd_padding_bitrate_num = 0;
334
337
345
349 if (!stream)
352
354
363 "%s in MPEG-1 system streams is not widely supported, "
364 "consider using the vob or the dvd muxer "
365 "to force a MPEG-2 program stream.\n",
368 stream->
id = ac3_id++;
370 stream->
id = dts_id++;
372 stream->
id = lpcm_id++;
373 for (j = 0; j < 4; j++) {
375 break;
376 }
377 if (j == 4) {
378 int sr;
381 for (sr = 0; sr < 4; sr++)
385 }
389 }
395 int freq;
396
398 case 48000: freq = 0; break;
399 case 96000: freq = 1; break;
400 case 44100: freq = 2; break;
401 case 32000: freq = 3; break;
402 default:
405 }
406
412 stream->
id = lpcm_id++;
422 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");
424 } else {
425 stream->
id = mpa_id++;
426 }
427
428 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
429 * Right now it is also used for everything else. */
432 break;
437 stream->
id = h264_id++;
438 else
439 stream->
id = mpv_id++;
440
444 if (sd)
448 else {
450 "VBV buffer size not set, using default size of 230KB\n"
451 "If you want the mpeg file to be compliant to some specification\n"
452 "Like DVD, VCD or others, make sure you set the correct buffer size\n");
453 // FIXME: this is probably too small as default
455 }
459 }
461 break;
462 }
464 stream->
id = mps_id++;
466 break;
467 default:
471 }
475 }
477 audio_bitrate = 0;
478 video_bitrate = 0;
482 int codec_rate;
485
489 if (sd)
493 else
495
496 if (!codec_rate)
498
500
502 audio_bitrate += codec_rate;
504 video_bitrate += codec_rate;
505 }
506
507 if (
s->user_mux_rate) {
508 s->mux_rate = (
s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
509 } else {
510 /* we increase slightly the bitrate to take into account the
511 * headers. XXX: compute it exactly */
514 s->mux_rate = (
bitrate + (8 * 50) - 1) / (8 * 50);
515 if (
s->mux_rate >= (1<<22)) {
517 s->mux_rate = (1<<22) - 1;
518 }
519 }
520
523
524 /* The VCD standard mandates that the mux_rate field is 3528
525 * (see standard p. IV-6).
526 * The value is actually "wrong", i.e. if you calculate
527 * it using the normal formula and the 75 sectors per second transfer
528 * rate you get a different value because the real pack size is 2324,
529 * not 2352. But the standard explicitly specifies that the mux_rate
530 * field in the header must have this value. */
531 // s->mux_rate = 2352 * 75 / 50; /* = 3528 */
532
533 /* The VCD standard states that the muxed stream must be
534 * exactly 75 packs / second (the data rate of a single speed cdrom).
535 * Since the video bitrate (probably 1150000 bits/sec) will be below
536 * the theoretical maximum we have to add some padding packets
537 * to make up for the lower data rate.
538 * (cf. VCD standard p. IV-6 ) */
539
540 /* Add the header overhead to the data rate.
541 * 2279 data bytes per audio pack, 2294 data bytes per video pack */
542 overhead_rate = audio_bitrate * 2294LL * (2324 - 2279);
543 overhead_rate += video_bitrate * 2279LL * (2324 - 2294);
544
545 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
546 s->vcd_padding_bitrate_num = (2324LL * 75 * 8 -
bitrate) * 2279 * 2294 - overhead_rate;
547 #define VCD_PADDING_BITRATE_DEN (2279 * 2294)
548 }
549
550 if (
s->is_vcd ||
s->is_mpeg2)
551 /* every packet */
552 s->pack_header_freq = 1;
553 else
554 /* every 2 seconds */
555 s->pack_header_freq = 2 *
bitrate /
s->packet_size / 8;
556
557 /* the above seems to make pack_header_freq zero sometimes */
558 if (
s->pack_header_freq == 0)
559 s->pack_header_freq = 1;
560
562 /* every 200 packets. Need to look at the spec. */
563 s->system_header_freq =
s->pack_header_freq * 40;
565 /* the standard mandates that there are only two system headers
566 * in the whole file: one in the first packet of each stream.
567 * (see standard p. IV-7 and IV-8) */
568 s->system_header_freq = 0x7fffffff;
569 else
570 s->system_header_freq =
s->pack_header_freq * 5;
571
575 }
578 return 0;
579 }
580
582 {
583 avio_w8(pb, (
id << 4) | (((timestamp >> 30) & 0x07) << 1) | 1);
584 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
585 avio_wb16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
586 }
587
588 /* return the number of padding bytes that should be inserted into
589 * the multiplexed stream. */
591 {
593 int pad_bytes = 0;
594
597
598 // FIXME: this is wrong
599 full_pad_bytes =
601 pad_bytes = (int)(full_pad_bytes -
s->vcd_padding_bytes_written);
602
603 if (pad_bytes < 0)
604 /* might happen if we have already padded to a later timestamp. This
605 * can occur if another stream has already advanced further. */
606 pad_bytes = 0;
607 }
608
609 return pad_bytes;
610 }
611
612 /* Write an MPEG padding packet header. */
614 int packet_bytes)
615 {
617
622 packet_bytes -= 7;
623 } else
624 packet_bytes -= 6;
625
627 }
628
630 {
631 int nb_frames = 0;
633
636 nb_frames++;
638 pkt_desc = pkt_desc->
next;
639 }
640
641 return nb_frames;
642 }
643
645 {
647 return 0;
648 }
649
650 /* flush the packet on stream stream_index */
653 {
656 uint8_t *buf_ptr;
657 int size, payload_size, startcode,
id, stuffing_size, header_len;
658 int packet_size;
660 int zero_trail_bytes = 0;
661 int pad_packet_bytes = 0;
662 int pes_flags;
663 /* "general" pack without data specific to one stream? */
664 int general_pack = 0;
665 int nb_frames;
666
668
670
672
673 if ((
s->packet_number %
s->pack_header_freq) == 0 ||
s->last_scr != scr) {
674 /* output pack and systems header if needed */
678
680 /* there is exactly one system header for each stream in a VCD MPEG,
681 * One in the very first video packet and one in the very first
682 * audio packet (see VCD standard p. IV-7 and IV-8). */
683
687 }
688 }
else if (
s->is_dvd) {
690 int PES_bytes_to_fill =
s->packet_size -
size - 10;
691
694 PES_bytes_to_fill -= 5 + 5;
695 else
696 PES_bytes_to_fill -= 5;
697 }
698
704
709
714
719 // FIXME: rounding and first few bytes of each packet
720 scr +=
s->packet_size * 90000LL /
721 (
s->mux_rate * 50LL);
725 /* GOP Start */
727 pad_packet_bytes = PES_bytes_to_fill -
729 }
730 }
731 } else {
732 if ((
s->packet_number %
s->system_header_freq) == 0) {
735 }
736 }
737 }
740
741 packet_size =
s->packet_size -
size;
742
743 if (
s->is_vcd && (
id & 0xe0) ==
AUDIO_ID)
744 /* The VCD standard demands that 20 zero bytes follow
745 * each audio pack (see standard p. IV-8). */
746 zero_trail_bytes += 20;
747
749 (
s->is_svcd &&
s->packet_number == 0)) {
750 /* for VCD the first pack of each stream contains only the pack header,
751 * the system header and lots of padding (see VCD standard p. IV-6).
752 * In the case of an audio pack, 20 zero bytes are also added at
753 * the end. */
754 /* For SVCD we fill the very first pack to increase compatibility with
755 * some DVD players. Not mandated by the standard. */
757 /* the system header refers to both streams and no stream data */
758 general_pack = 1;
759 pad_packet_bytes = packet_size - zero_trail_bytes;
760 }
761
762 packet_size -= pad_packet_bytes + zero_trail_bytes;
763
764 if (packet_size > 0) {
765 size_t fifo_data;
766 /* packet header size */
767 packet_size -= 6;
768
769 /* packet header */
771 header_len = 3;
773 header_len += 3; /* PES extension */
774 header_len += 1; /* obligatory stuffing byte */
775 } else {
776 header_len = 0;
777 }
780 header_len += 5 + 5;
781 else
782 header_len += 5;
783 } else {
785 header_len++;
786 }
787
788 payload_size = packet_size - header_len;
789 if (id < 0xc0) {
791 payload_size -= 1;
792 if (id >= 0x40) {
793 payload_size -= 3;
794 if (id >= 0xa0)
795 payload_size -= 3;
796 }
797 } else {
798 startcode = 0x100 +
id;
799 }
800
802
803 // first byte does not fit -> reset pts/dts + stuffing
805 int timestamp_len = 0;
807 timestamp_len += 5;
809 timestamp_len +=
s->is_mpeg2 ? 5 : 4;
812 header_len -= timestamp_len;
814 pad_packet_bytes += timestamp_len;
815 packet_size -= timestamp_len;
816 } else {
817 payload_size += timestamp_len;
818 }
819 stuffing_size += timestamp_len;
820 if (payload_size > trailer_size)
821 stuffing_size += payload_size - trailer_size;
822 }
823
824 // can't use padding, so use stuffing
825 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) {
826 packet_size += pad_packet_bytes;
827 payload_size += pad_packet_bytes; // undo the previous adjustment
828 if (stuffing_size < 0)
829 stuffing_size = pad_packet_bytes;
830 else
831 stuffing_size += pad_packet_bytes;
832 pad_packet_bytes = 0;
833 }
834
835 if (stuffing_size < 0)
836 stuffing_size = 0;
837
840 stuffing_size += payload_size % stream->
lpcm_align;
841 }
842
843 if (stuffing_size > 16) { /* <=16 for MPEG-1, <=32 for MPEG-2 */
844 pad_packet_bytes += stuffing_size;
845 packet_size -= stuffing_size;
846 payload_size -= stuffing_size;
847 stuffing_size = 0;
848 }
849
851
853
855
858
861
862 pes_flags = 0;
863
865 pes_flags |= 0x80;
867 pes_flags |= 0x40;
868 }
869
870 /* Both the MPEG-2 and the SVCD standards demand that the
871 * P-STD_buffer_size field be included in the first packet of
872 * every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
873 * and MPEG-2 standard 2.7.7) */
875 pes_flags |= 0x01;
876
879
880 if (pes_flags & 0x80) /* write pts */
882 if (pes_flags & 0x40) /* write dts */
884
885 if (pes_flags & 0x01) { /* write pes extension */
887
888 /* P-STD buffer info */
891 else
893 }
894 } else {
899 } else {
901 }
902 } else {
904 }
905 }
906
908 /* special stuffing byte that is always written
909 * to prevent accidental generation of start codes. */
911
913 }
914
917 if (id >= 0xa0) {
918 /* LPCM (XXX: check nb_frames) */
924 } else if (id >= 0x40) {
925 /* AC-3 */
928 }
929 }
930
931 /* output data */
932 fifo_data = payload_size - stuffing_size;
936 } else {
937 payload_size =
938 stuffing_size = 0;
939 }
940
941 if (pad_packet_bytes > 0)
943
945
947
949
950 /* only increase the stream packet number if this pack actually contains
951 * something that is specific to this stream! I.e. a dedicated header
952 * or some data. */
953 if (!general_pack)
955
956 return payload_size - stuffing_size;
957 }
958
960 {
961 /* There are two ways to do this padding: writing a sector/pack
962 * of 0 values, or writing an MPEG padding pack. Both seem to
963 * work with most decoders, BUT the VCD standard only allows a 0-sector
964 * (see standard p. IV-4, IV-5).
965 * So a 0-sector it is... */
966
968
970
971 s->vcd_padding_bytes_written +=
s->packet_size;
972
974
975 /* increasing the packet number is correct. The SCR of the following packs
976 * is calculated from the packet_number and it has to include the padding
977 * sector (it represents the sector index, not the MPEG pack index)
978 * (see VCD standard p. IV-6) */
980 }
981
983 {
985
990
992 scr > pkt_desc->
dts) {
// FIXME: > vs >=
996 "buffer underflow st=%d bufi=%d size=%d\n",
998 break;
999 }
1005 }
1006 }
1007
1008 return 0;
1009 }
1010
1012 {
1016 int i, avail_space = 0, es_size, trailer_size;
1017 int best_i = -1;
1018 int best_score = INT_MIN;
1019 int ignore_constraints = 0;
1020 int ignore_delay = 0;
1024
1025 retry:
1033
1034 /* for subtitle, a single PES packet must be generated,
1035 * so we flush after every single subtitle packet */
1036 if (
s->packet_size > avail_data && !
flush
1038 return 0;
1039 if (avail_data == 0)
1040 continue;
1042
1043 if (space < s->packet_size && !ignore_constraints)
1044 continue;
1045
1046 if (next_pkt && next_pkt->
dts - scr > max_delay && !ignore_delay)
1047 continue;
1050 rel_space += 1<<28;
1051 if (rel_space > best_score) {
1052 best_score = rel_space;
1054 avail_space =
space;
1055 }
1056 }
1057
1058 if (best_i < 0) {
1060 int has_premux = 0;
1061
1066 if (pkt_desc && pkt_desc->
dts < best_dts)
1067 best_dts = pkt_desc->
dts;
1069 }
1070
1071 if (best_dts < INT64_MAX) {
1073 scr / 90000.0, best_dts / 90000.0);
1074
1075 if (scr >= best_dts + 1 && !ignore_constraints) {
1077 "packet too large, ignoring buffer limits to mux it\n");
1078 ignore_constraints = 1;
1079 }
1080 scr =
FFMAX(best_dts + 1, scr);
1082 return -1;
1083 }
else if (has_premux &&
flush) {
1085 "delay too large, ignoring ...\n");
1086 ignore_delay = 1;
1087 ignore_constraints = 1;
1088 } else
1089 return 0;
1090
1091 goto retry;
1092 }
1093
1095
1098
1100
1101 av_assert0(avail_space >=
s->packet_size || ignore_constraints);
1102
1105 trailer_size = 0;
1106 } else {
1108 timestamp_packet = timestamp_packet->
next;
1109 }
1110
1111 if (timestamp_packet) {
1113 timestamp_packet->
dts / 90000.0,
1114 timestamp_packet->
pts / 90000.0,
1115 scr / 90000.0, best_i);
1117 timestamp_packet->
dts, scr, trailer_size);
1118 } else {
1121 trailer_size);
1122 }
1123
1125 /* Write one or more padding sectors, if necessary, to reach
1126 * the constant overall bitrate. */
1127 int vcd_pad_bytes;
1128
1129 // FIXME: pts cannot be correct here
1132 // FIXME: rounding and first few bytes of each packet
1133 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1134 }
1135 }
1136
1138 // FIXME: rounding and first few bytes of each packet
1139 s->last_scr +=
s->packet_size * 90000LL / (
s->mux_rate * 50LL);
1140
1145 }
1146 if (es_size) {
1149 }
1150
1152 return -1;
1153
1154 return 1;
1155 }
1156
1158 {
1161 const uint8_t *buf =
pkt->
data;
1168 size_t can_write;
1171
1173
1176
1178 if (dts ==
AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) ||
s->is_dvd) {
1182 } else {
1183 s->last_scr = dts - preload;
1185 }
1188 }
1189
1192
1196
1201 }
1202
1203 /* Skip first 3 bytes of packet data, which comprise PCM header
1204 and will be written fresh by this muxer. */
1205 buf += 3;
1207 }
1208
1209 /* Enlarge the FIFO before adding a new PacketDesc
1210 * in order to avoid inconsistencies on failure. */
1212 if (can_write <
size) {
1216 }
1218 if (!pkt_desc)
1222 } else
1228 pkt_desc->
dts = dts;
1231
1233 // min VOBU length 0.4 seconds (mpucoder)
1234 if (is_iframe &&
1240 }
1241 }
1242
1244
1245 for (;;) {
1249 }
1250 }
1251
1253 {
1256
1257 for (;;) {
1262 break;
1263 }
1264
1265 /* End header according to MPEG-1 systems standard. We do not write
1266 * it as it is usually not needed by decoders and because it
1267 * complicates MPEG stream concatenation. */
1268 // avio_wb32(ctx->pb, ISO_11172_END_CODE);
1269
1272
1274 }
1275 return 0;
1276 }
1277
1279 {
1282 if (!stream)
1283 continue;
1288 }
1290 }
1291 }
1292
1293 #define OFFSET(x) offsetof(MpegMuxContext, x)
1294 #define E AV_OPT_FLAG_ENCODING_PARAM
1296 {
"muxrate",
"mux rate as bits/s",
OFFSET(user_mux_rate),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, ((1<<22) - 1) * (8 * 50),
E },
1297 {
"preload",
"initial demux-decode delay in microseconds",
OFFSET(preload),
AV_OPT_TYPE_INT, { .i64 = 500000 }, 0, INT_MAX,
E },
1299 };
1300
1306 };
1307
1308 #if CONFIG_MPEG1SYSTEM_MUXER
1312 .p.mime_type = "video/mpeg",
1313 .p.extensions = "mpg,mpeg",
1322 };
1323 #endif
1324
1325 #if CONFIG_MPEG1VCD_MUXER
1329 .p.mime_type = "video/mpeg",
1338 };
1339 #endif
1340
1341 #if CONFIG_MPEG2VOB_MUXER
1345 .p.mime_type = "video/mpeg",
1346 .p.extensions = "vob",
1355 };
1356 #endif
1357
1358 /* Same as mpeg2vob_mux except that the pack size is 2324 */
1359 #if CONFIG_MPEG2SVCD_MUXER
1363 .p.mime_type = "video/mpeg",
1364 .p.extensions = "vob",
1373 };
1374 #endif
1375
1376 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
1377 #if CONFIG_MPEG2DVD_MUXER
1381 .p.mime_type = "video/mpeg",
1382 .p.extensions = "dvd",
1391 };
1392 #endif