Mercurial > libavformat.hg
comparison mpeg.c @ 366:cbcbaeff1f2c libavformat
improved VCD support patch by ("Hauke Duden" <H.NS.Duden at gmx dot net>)
- the first audio and video packs now contain only a system header and lots
of padding.
- no system headers in any packs other than the first ones
- the two system headers only contain information about "their" stream
- fixed some header values (muxrate, some flags, ...) so that they have the
values specified by the standard
- padding packs are inserted if the mux rate would be below 75 packs per
second (the rate must not be below or above that value).
- fixed the SCR of the packs
- 20 zero bytes are now inserted at the end of each audio pack, after the
data packet
| author | michael |
|---|---|
| date | Thu, 19 Feb 2004 22:34:13 +0000 |
| parents | f4f573c7dc56 |
| children | 845f9de2c883 |
comparison
equal
deleted
inserted
replaced
| 365:4ae9fac22a5d | 366:cbcbaeff1f2c |
|---|---|
| 48 /* stream info */ | 48 /* stream info */ |
| 49 int audio_bound; | 49 int audio_bound; |
| 50 int video_bound; | 50 int video_bound; |
| 51 int is_mpeg2; | 51 int is_mpeg2; |
| 52 int is_vcd; | 52 int is_vcd; |
| 53 int is_svcd; | |
| 53 int scr_stream_index; /* stream from which the system clock is | 54 int scr_stream_index; /* stream from which the system clock is |
| 54 computed (VBR case) */ | 55 computed (VBR case) */ |
| 55 int64_t last_scr; /* current system clock */ | 56 int64_t last_scr; /* current system clock */ |
| 57 | |
| 58 double vcd_padding_bitrate; | |
| 59 int64_t vcd_padding_bytes_written; | |
| 60 | |
| 56 } MpegMuxContext; | 61 } MpegMuxContext; |
| 57 | 62 |
| 58 #define PACK_START_CODE ((unsigned int)0x000001ba) | 63 #define PACK_START_CODE ((unsigned int)0x000001ba) |
| 59 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb) | 64 #define SYSTEM_HEADER_START_CODE ((unsigned int)0x000001bb) |
| 60 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7) | 65 #define SEQUENCE_END_CODE ((unsigned int)0x000001b7) |
| 78 | 83 |
| 79 #ifdef CONFIG_ENCODERS | 84 #ifdef CONFIG_ENCODERS |
| 80 extern AVOutputFormat mpeg1system_mux; | 85 extern AVOutputFormat mpeg1system_mux; |
| 81 extern AVOutputFormat mpeg1vcd_mux; | 86 extern AVOutputFormat mpeg1vcd_mux; |
| 82 extern AVOutputFormat mpeg2vob_mux; | 87 extern AVOutputFormat mpeg2vob_mux; |
| 88 extern AVOutputFormat mpeg2svcd_mux; | |
| 83 | 89 |
| 84 static int put_pack_header(AVFormatContext *ctx, | 90 static int put_pack_header(AVFormatContext *ctx, |
| 85 uint8_t *buf, int64_t timestamp) | 91 uint8_t *buf, int64_t timestamp) |
| 86 { | 92 { |
| 87 MpegMuxContext *s = ctx->priv_data; | 93 MpegMuxContext *s = ctx->priv_data; |
| 115 } | 121 } |
| 116 flush_put_bits(&pb); | 122 flush_put_bits(&pb); |
| 117 return pbBufPtr(&pb) - pb.buf; | 123 return pbBufPtr(&pb) - pb.buf; |
| 118 } | 124 } |
| 119 | 125 |
| 120 static int put_system_header(AVFormatContext *ctx, uint8_t *buf) | 126 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id) |
| 121 { | 127 { |
| 122 MpegMuxContext *s = ctx->priv_data; | 128 MpegMuxContext *s = ctx->priv_data; |
| 123 int size, rate_bound, i, private_stream_coded, id; | 129 int size, rate_bound, i, private_stream_coded, id; |
| 124 PutBitContext pb; | 130 PutBitContext pb; |
| 125 | 131 |
| 130 put_bits(&pb, 1, 1); | 136 put_bits(&pb, 1, 1); |
| 131 | 137 |
| 132 rate_bound = s->mux_rate; /* maximum bit rate of the multiplexed stream */ | 138 rate_bound = s->mux_rate; /* maximum bit rate of the multiplexed stream */ |
| 133 put_bits(&pb, 22, rate_bound); | 139 put_bits(&pb, 22, rate_bound); |
| 134 put_bits(&pb, 1, 1); /* marker */ | 140 put_bits(&pb, 1, 1); /* marker */ |
| 135 put_bits(&pb, 6, s->audio_bound); | 141 if (s->is_vcd && only_for_stream_id==VIDEO_ID) { |
| 136 | 142 /* This header applies only to the video stream (see VCD standard p. IV-7)*/ |
| 137 put_bits(&pb, 1, 1); /* variable bitrate */ | 143 put_bits(&pb, 6, 0); |
| 144 } else | |
| 145 put_bits(&pb, 6, s->audio_bound); | |
| 146 | |
| 147 if (s->is_vcd) | |
| 148 put_bits(&pb, 1, 0); /* see VCD standard, p. IV-7*/ | |
| 149 else | |
| 150 put_bits(&pb, 1, 1); /* variable bitrate*/ | |
| 138 put_bits(&pb, 1, 1); /* non constrainted bit stream */ | 151 put_bits(&pb, 1, 1); /* non constrainted bit stream */ |
| 139 | 152 |
| 140 put_bits(&pb, 1, 0); /* audio locked */ | 153 if (s->is_vcd) { |
| 141 put_bits(&pb, 1, 0); /* video locked */ | 154 /* see VCD standard p IV-7 */ |
| 155 put_bits(&pb, 1, 1); /* audio locked */ | |
| 156 put_bits(&pb, 1, 1); /* video locked */ | |
| 157 } else { | |
| 158 put_bits(&pb, 1, 0); /* audio locked */ | |
| 159 put_bits(&pb, 1, 0); /* video locked */ | |
| 160 } | |
| 161 | |
| 142 put_bits(&pb, 1, 1); /* marker */ | 162 put_bits(&pb, 1, 1); /* marker */ |
| 143 | 163 |
| 144 put_bits(&pb, 5, s->video_bound); | 164 if (s->is_vcd && only_for_stream_id==AUDIO_ID) { |
| 165 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/ | |
| 166 put_bits(&pb, 5, 0); | |
| 167 } else | |
| 168 put_bits(&pb, 5, s->video_bound); | |
| 169 | |
| 145 put_bits(&pb, 8, 0xff); /* reserved byte */ | 170 put_bits(&pb, 8, 0xff); /* reserved byte */ |
| 146 | 171 |
| 147 /* audio stream info */ | 172 /* audio stream info */ |
| 148 private_stream_coded = 0; | 173 private_stream_coded = 0; |
| 149 for(i=0;i<ctx->nb_streams;i++) { | 174 for(i=0;i<ctx->nb_streams;i++) { |
| 150 StreamInfo *stream = ctx->streams[i]->priv_data; | 175 StreamInfo *stream = ctx->streams[i]->priv_data; |
| 151 id = stream->id; | 176 |
| 152 if (id < 0xc0) { | 177 /* For VCDs, only include the stream info for the stream |
| 153 /* special case for private streams (AC3 use that) */ | 178 that the pack which contains this system belongs to. |
| 154 if (private_stream_coded) | 179 (see VCD standard p. IV-7) */ |
| 155 continue; | 180 if ( !s->is_vcd || stream->id==only_for_stream_id |
| 156 private_stream_coded = 1; | 181 || only_for_stream_id==0) { |
| 157 id = 0xbd; | 182 |
| 158 } | 183 id = stream->id; |
| 159 put_bits(&pb, 8, id); /* stream ID */ | 184 if (id < 0xc0) { |
| 160 put_bits(&pb, 2, 3); | 185 /* special case for private streams (AC3 use that) */ |
| 161 if (id < 0xe0) { | 186 if (private_stream_coded) |
| 162 /* audio */ | 187 continue; |
| 163 put_bits(&pb, 1, 0); | 188 private_stream_coded = 1; |
| 164 put_bits(&pb, 13, stream->max_buffer_size / 128); | 189 id = 0xbd; |
| 165 } else { | 190 } |
| 166 /* video */ | 191 put_bits(&pb, 8, id); /* stream ID */ |
| 167 put_bits(&pb, 1, 1); | 192 put_bits(&pb, 2, 3); |
| 168 put_bits(&pb, 13, stream->max_buffer_size / 1024); | 193 if (id < 0xe0) { |
| 194 /* audio */ | |
| 195 put_bits(&pb, 1, 0); | |
| 196 put_bits(&pb, 13, stream->max_buffer_size / 128); | |
| 197 } else { | |
| 198 /* video */ | |
| 199 put_bits(&pb, 1, 1); | |
| 200 put_bits(&pb, 13, stream->max_buffer_size / 1024); | |
| 201 } | |
| 169 } | 202 } |
| 170 } | 203 } |
| 171 flush_put_bits(&pb); | 204 flush_put_bits(&pb); |
| 172 size = pbBufPtr(&pb) - pb.buf; | 205 size = pbBufPtr(&pb) - pb.buf; |
| 173 /* patch packet size */ | 206 /* patch packet size */ |
| 200 { | 233 { |
| 201 MpegMuxContext *s = ctx->priv_data; | 234 MpegMuxContext *s = ctx->priv_data; |
| 202 int bitrate, i, mpa_id, mpv_id, ac3_id, lpcm_id, j; | 235 int bitrate, i, mpa_id, mpv_id, ac3_id, lpcm_id, j; |
| 203 AVStream *st; | 236 AVStream *st; |
| 204 StreamInfo *stream; | 237 StreamInfo *stream; |
| 238 int audio_bitrate; | |
| 239 int video_bitrate; | |
| 205 | 240 |
| 206 s->packet_number = 0; | 241 s->packet_number = 0; |
| 207 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux); | 242 s->is_vcd = (ctx->oformat == &mpeg1vcd_mux); |
| 208 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux); | 243 s->is_svcd = (ctx->oformat == &mpeg2svcd_mux); |
| 209 | 244 s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux); |
| 210 if (s->is_vcd) | 245 |
| 211 s->packet_size = 2324; /* VCD packet size */ | 246 if (s->is_vcd || s->is_svcd) |
| 247 s->packet_size = 2324; /* VCD/SVCD packet size */ | |
| 212 else | 248 else |
| 213 s->packet_size = 2048; | 249 s->packet_size = 2048; |
| 250 | |
| 251 s->vcd_padding_bytes_written = 0; | |
| 252 s->vcd_padding_bitrate=0; | |
| 214 | 253 |
| 215 s->audio_bound = 0; | 254 s->audio_bound = 0; |
| 216 s->video_bound = 0; | 255 s->video_bound = 0; |
| 217 mpa_id = AUDIO_ID; | 256 mpa_id = AUDIO_ID; |
| 218 ac3_id = AC3_ID; | 257 ac3_id = AC3_ID; |
| 264 } | 303 } |
| 265 /* if no SCR, use first stream (audio) */ | 304 /* if no SCR, use first stream (audio) */ |
| 266 if (s->scr_stream_index == -1) | 305 if (s->scr_stream_index == -1) |
| 267 s->scr_stream_index = 0; | 306 s->scr_stream_index = 0; |
| 268 | 307 |
| 269 /* we increase slightly the bitrate to take into account the | 308 bitrate = 0; |
| 270 headers. XXX: compute it exactly */ | 309 audio_bitrate = 0; |
| 271 bitrate = 2000; | 310 video_bitrate = 0; |
| 272 for(i=0;i<ctx->nb_streams;i++) { | 311 for(i=0;i<ctx->nb_streams;i++) { |
| 273 st = ctx->streams[i]; | 312 st = ctx->streams[i]; |
| 313 stream = (StreamInfo*) st->priv_data; | |
| 314 | |
| 274 bitrate += st->codec.bit_rate; | 315 bitrate += st->codec.bit_rate; |
| 275 } | 316 |
| 276 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); | 317 if (stream->id==AUDIO_ID) |
| 318 audio_bitrate += st->codec.bit_rate; | |
| 319 else if (stream->id==VIDEO_ID) | |
| 320 video_bitrate += st->codec.bit_rate; | |
| 321 } | |
| 322 | |
| 323 if (s->is_vcd) { | |
| 324 double overhead_rate; | |
| 325 | |
| 326 /* The VCD standard mandates that the mux_rate field is 3528 | |
| 327 (see standard p. IV-6). | |
| 328 The value is actually "wrong", i.e. if you calculate | |
| 329 it using the normal formula and the 75 sectors per second transfer | |
| 330 rate you get a different value because the real pack size is 2324, | |
| 331 not 2352. But the standard explicitly specifies that the mux_rate | |
| 332 field in the header must have this value.*/ | |
| 333 s->mux_rate=2352 * 75 / 50; /* = 3528*/ | |
| 334 | |
| 335 /* The VCD standard states that the muxed stream must be | |
| 336 exactly 75 packs / second (the data rate of a single speed cdrom). | |
| 337 Since the video bitrate (probably 1150000 bits/sec) will be below | |
| 338 the theoretical maximum we have to add some padding packets | |
| 339 to make up for the lower data rate. | |
| 340 (cf. VCD standard p. IV-6 )*/ | |
| 341 | |
| 342 /* Add the header overhead to the data rate. | |
| 343 2279 data bytes per audio pack, 2294 data bytes per video pack*/ | |
| 344 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279); | |
| 345 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294); | |
| 346 overhead_rate *= 8; | |
| 347 | |
| 348 /* Add padding so that the full bitrate is 2324*75 bytes/sec */ | |
| 349 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate); | |
| 350 | |
| 351 } else { | |
| 352 /* we increase slightly the bitrate to take into account the | |
| 353 headers. XXX: compute it exactly */ | |
| 354 bitrate += 2000; | |
| 355 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); | |
| 356 } | |
| 277 | 357 |
| 278 if (s->is_vcd || s->is_mpeg2) | 358 if (s->is_vcd || s->is_mpeg2) |
| 279 /* every packet */ | 359 /* every packet */ |
| 280 s->pack_header_freq = 1; | 360 s->pack_header_freq = 1; |
| 281 else | 361 else |
| 288 | 368 |
| 289 if (s->is_mpeg2) | 369 if (s->is_mpeg2) |
| 290 /* every 200 packets. Need to look at the spec. */ | 370 /* every 200 packets. Need to look at the spec. */ |
| 291 s->system_header_freq = s->pack_header_freq * 40; | 371 s->system_header_freq = s->pack_header_freq * 40; |
| 292 else if (s->is_vcd) | 372 else if (s->is_vcd) |
| 293 /* every 40 packets, this is my invention */ | 373 /* the standard mandates that there are only two system headers |
| 294 s->system_header_freq = s->pack_header_freq * 40; | 374 in the whole file: one in the first packet of each stream. |
| 375 (see standard p. IV-7 and IV-8) */ | |
| 376 s->system_header_freq = 0x7fffffff; | |
| 295 else | 377 else |
| 296 s->system_header_freq = s->pack_header_freq * 5; | 378 s->system_header_freq = s->pack_header_freq * 5; |
| 297 | 379 |
| 298 for(i=0;i<ctx->nb_streams;i++) { | 380 for(i=0;i<ctx->nb_streams;i++) { |
| 299 stream = ctx->streams[i]->priv_data; | 381 stream = ctx->streams[i]->priv_data; |
| 321 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1)); | 403 put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1)); |
| 322 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1)); | 404 put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1)); |
| 323 } | 405 } |
| 324 | 406 |
| 325 | 407 |
| 408 /* return the number of padding bytes that should be inserted into | |
| 409 the multiplexed stream.*/ | |
| 410 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts) | |
| 411 { | |
| 412 MpegMuxContext *s = ctx->priv_data; | |
| 413 int pad_bytes = 0; | |
| 414 | |
| 415 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE) | |
| 416 { | |
| 417 int64_t full_pad_bytes; | |
| 418 | |
| 419 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); | |
| 420 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written); | |
| 421 | |
| 422 if (pad_bytes<0) | |
| 423 /* might happen if we have already padded to a later timestamp. This | |
| 424 can occur if another stream has already advanced further.*/ | |
| 425 pad_bytes=0; | |
| 426 } | |
| 427 | |
| 428 return pad_bytes; | |
| 429 } | |
| 430 | |
| 431 | |
| 326 /* return the exact available payload size for the next packet for | 432 /* return the exact available payload size for the next packet for |
| 327 stream 'stream_index'. 'pts' and 'dts' are only used to know if | 433 stream 'stream_index'. 'pts' and 'dts' are only used to know if |
| 328 timestamps are needed in the packet header. */ | 434 timestamps are needed in the packet header. */ |
| 329 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index, | 435 static int get_packet_payload_size(AVFormatContext *ctx, int stream_index, |
| 330 int64_t pts, int64_t dts) | 436 int64_t pts, int64_t dts) |
| 331 { | 437 { |
| 332 MpegMuxContext *s = ctx->priv_data; | 438 MpegMuxContext *s = ctx->priv_data; |
| 333 int buf_index; | 439 int buf_index; |
| 334 StreamInfo *stream; | 440 StreamInfo *stream; |
| 441 | |
| 442 stream = ctx->streams[stream_index]->priv_data; | |
| 335 | 443 |
| 336 buf_index = 0; | 444 buf_index = 0; |
| 337 if (((s->packet_number % s->pack_header_freq) == 0)) { | 445 if (((s->packet_number % s->pack_header_freq) == 0)) { |
| 338 /* pack header size */ | 446 /* pack header size */ |
| 339 if (s->is_mpeg2) | 447 if (s->is_mpeg2) |
| 340 buf_index += 14; | 448 buf_index += 14; |
| 341 else | 449 else |
| 342 buf_index += 12; | 450 buf_index += 12; |
| 343 if ((s->packet_number % s->system_header_freq) == 0) | 451 |
| 344 buf_index += s->system_header_size; | 452 if (s->is_vcd) { |
| 345 } | 453 /* there is exactly one system header for each stream in a VCD MPEG, |
| 346 | 454 One in the very first video packet and one in the very first |
| 347 /* packet header size */ | 455 audio packet (see VCD standard p. IV-7 and IV-8).*/ |
| 348 buf_index += 6; | 456 |
| 349 if (s->is_mpeg2) | 457 if (stream->packet_number==0) |
| 350 buf_index += 3; | 458 /* The system headers refer only to the stream they occur in, |
| 351 if (pts != AV_NOPTS_VALUE) { | 459 so they have a constant size.*/ |
| 352 if (dts != pts) | 460 buf_index += 15; |
| 353 buf_index += 5 + 5; | 461 |
| 354 else | 462 } else { |
| 355 buf_index += 5; | 463 if ((s->packet_number % s->system_header_freq) == 0) |
| 356 } else { | 464 buf_index += s->system_header_size; |
| 357 if (!s->is_mpeg2) | 465 } |
| 358 buf_index++; | 466 } |
| 359 } | 467 |
| 360 | 468 if (s->is_vcd && stream->packet_number==0) |
| 361 stream = ctx->streams[stream_index]->priv_data; | 469 /* the first pack of each stream contains only the pack header, |
| 362 if (stream->id < 0xc0) { | 470 the system header and some padding (see VCD standard p. IV-6) |
| 363 /* AC3/LPCM private data header */ | 471 Add the padding size, so that the actual payload becomes 0.*/ |
| 364 buf_index += 4; | 472 buf_index += s->packet_size - buf_index; |
| 365 if (stream->id >= 0xa0) { | 473 else { |
| 366 int n; | 474 /* packet header size */ |
| 475 buf_index += 6; | |
| 476 if (s->is_mpeg2) | |
| 367 buf_index += 3; | 477 buf_index += 3; |
| 368 /* NOTE: we round the payload size to an integer number of | 478 if (pts != AV_NOPTS_VALUE) { |
| 369 LPCM samples */ | 479 if (dts != pts) |
| 370 n = (s->packet_size - buf_index) % stream->lpcm_align; | 480 buf_index += 5 + 5; |
| 371 if (n) | 481 else |
| 372 buf_index += (stream->lpcm_align - n); | 482 buf_index += 5; |
| 373 } | 483 |
| 484 } else { | |
| 485 if (!s->is_mpeg2) | |
| 486 buf_index++; | |
| 487 } | |
| 488 | |
| 489 if (stream->id < 0xc0) { | |
| 490 /* AC3/LPCM private data header */ | |
| 491 buf_index += 4; | |
| 492 if (stream->id >= 0xa0) { | |
| 493 int n; | |
| 494 buf_index += 3; | |
| 495 /* NOTE: we round the payload size to an integer number of | |
| 496 LPCM samples */ | |
| 497 n = (s->packet_size - buf_index) % stream->lpcm_align; | |
| 498 if (n) | |
| 499 buf_index += (stream->lpcm_align - n); | |
| 500 } | |
| 501 } | |
| 502 | |
| 503 if (s->is_vcd && stream->id == AUDIO_ID) | |
| 504 /* The VCD standard demands that 20 zero bytes follow | |
| 505 each audio packet (see standard p. IV-8).*/ | |
| 506 buf_index+=20; | |
| 374 } | 507 } |
| 375 return s->packet_size - buf_index; | 508 return s->packet_size - buf_index; |
| 376 } | 509 } |
| 510 | |
| 511 /* Write an MPEG padding packet header. */ | |
| 512 static int put_padding_header(AVFormatContext *ctx,uint8_t* buf, int full_padding_size) | |
| 513 { | |
| 514 MpegMuxContext *s = ctx->priv_data; | |
| 515 int size = full_padding_size - 6; /* subtract header length */ | |
| 516 | |
| 517 buf[0] = (uint8_t)(PADDING_STREAM >> 24); | |
| 518 buf[1] = (uint8_t)(PADDING_STREAM >> 16); | |
| 519 buf[2] = (uint8_t)(PADDING_STREAM >> 8); | |
| 520 buf[3] = (uint8_t)(PADDING_STREAM); | |
| 521 buf[4] = (uint8_t)(size >> 8); | |
| 522 buf[5] = (uint8_t)(size & 0xff); | |
| 523 | |
| 524 if (!s->is_mpeg2) { | |
| 525 buf[6] = 0x0f; | |
| 526 return 7; | |
| 527 } else | |
| 528 return 6; | |
| 529 } | |
| 530 | |
| 531 static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes) | |
| 532 { | |
| 533 uint8_t buffer[7]; | |
| 534 int size, i; | |
| 535 | |
| 536 size = put_padding_header(ctx,buffer, packet_bytes); | |
| 537 put_buffer(pb, buffer, size); | |
| 538 packet_bytes -= size; | |
| 539 | |
| 540 for(i=0;i<packet_bytes;i++) | |
| 541 put_byte(pb, 0xff); | |
| 542 } | |
| 543 | |
| 377 | 544 |
| 378 /* flush the packet on stream stream_index */ | 545 /* flush the packet on stream stream_index */ |
| 379 static void flush_packet(AVFormatContext *ctx, int stream_index, | 546 static void flush_packet(AVFormatContext *ctx, int stream_index, |
| 380 int64_t pts, int64_t dts, int64_t scr) | 547 int64_t pts, int64_t dts, int64_t scr) |
| 381 { | 548 { |
| 383 StreamInfo *stream = ctx->streams[stream_index]->priv_data; | 550 StreamInfo *stream = ctx->streams[stream_index]->priv_data; |
| 384 uint8_t *buf_ptr; | 551 uint8_t *buf_ptr; |
| 385 int size, payload_size, startcode, id, stuffing_size, i, header_len; | 552 int size, payload_size, startcode, id, stuffing_size, i, header_len; |
| 386 int packet_size; | 553 int packet_size; |
| 387 uint8_t buffer[128]; | 554 uint8_t buffer[128]; |
| 555 int zero_trail_bytes = 0; | |
| 556 int pad_packet_bytes = 0; | |
| 388 | 557 |
| 389 id = stream->id; | 558 id = stream->id; |
| 390 | 559 |
| 391 #if 0 | 560 #if 0 |
| 392 printf("packet ID=%2x PTS=%0.3f\n", | 561 printf("packet ID=%2x PTS=%0.3f\n", |
| 393 id, pts / 90000.0); | 562 id, pts / 90000.0); |
| 394 #endif | 563 #endif |
| 395 | 564 |
| 396 buf_ptr = buffer; | 565 buf_ptr = buffer; |
| 566 | |
| 397 if (((s->packet_number % s->pack_header_freq) == 0)) { | 567 if (((s->packet_number % s->pack_header_freq) == 0)) { |
| 398 /* output pack and systems header if needed */ | 568 /* output pack and systems header if needed */ |
| 399 size = put_pack_header(ctx, buf_ptr, scr); | 569 size = put_pack_header(ctx, buf_ptr, scr); |
| 400 buf_ptr += size; | 570 buf_ptr += size; |
| 401 if ((s->packet_number % s->system_header_freq) == 0) { | 571 |
| 402 size = put_system_header(ctx, buf_ptr); | 572 if (s->is_vcd) { |
| 403 buf_ptr += size; | 573 /* there is exactly one system header for each stream in a VCD MPEG, |
| 574 One in the very first video packet and one in the very first | |
| 575 audio packet (see VCD standard p. IV-7 and IV-8).*/ | |
| 576 | |
| 577 if (stream->packet_number==0) { | |
| 578 size = put_system_header(ctx, buf_ptr, id); | |
| 579 buf_ptr += size; | |
| 580 } | |
| 581 } else { | |
| 582 if ((s->packet_number % s->system_header_freq) == 0) { | |
| 583 size = put_system_header(ctx, buf_ptr, 0); | |
| 584 buf_ptr += size; | |
| 585 } | |
| 404 } | 586 } |
| 405 } | 587 } |
| 406 size = buf_ptr - buffer; | 588 size = buf_ptr - buffer; |
| 407 put_buffer(&ctx->pb, buffer, size); | 589 put_buffer(&ctx->pb, buffer, size); |
| 408 | 590 |
| 409 /* packet header */ | 591 packet_size = s->packet_size - size; |
| 410 if (s->is_mpeg2) { | 592 |
| 411 header_len = 3; | 593 if (s->is_vcd && id == AUDIO_ID) |
| 412 } else { | 594 /* The VCD standard demands that 20 zero bytes follow |
| 413 header_len = 0; | 595 each audio pack (see standard p. IV-8).*/ |
| 414 } | 596 zero_trail_bytes += 20; |
| 415 if (pts != AV_NOPTS_VALUE) { | 597 |
| 416 if (dts != pts) | 598 if (s->is_vcd && stream->packet_number==0) { |
| 417 header_len += 5 + 5; | 599 /* the first pack of each stream contains only the pack header, |
| 418 else | 600 the system header and lots of padding (see VCD standard p. IV-6). |
| 419 header_len += 5; | 601 In the case of an audio pack, 20 zero bytes are also added at |
| 420 } else { | 602 the end.*/ |
| 603 pad_packet_bytes = packet_size - zero_trail_bytes; | |
| 604 } | |
| 605 | |
| 606 packet_size -= pad_packet_bytes + zero_trail_bytes; | |
| 607 | |
| 608 if (packet_size > 0) { | |
| 609 | |
| 610 /* packet header size */ | |
| 611 packet_size -= 6; | |
| 612 | |
| 613 /* packet header */ | |
| 614 if (s->is_mpeg2) { | |
| 615 header_len = 3; | |
| 616 } else { | |
| 617 header_len = 0; | |
| 618 } | |
| 619 if (pts != AV_NOPTS_VALUE) { | |
| 620 if (dts != pts) | |
| 621 header_len += 5 + 5; | |
| 622 else | |
| 623 header_len += 5; | |
| 624 } else { | |
| 625 if (!s->is_mpeg2) | |
| 626 header_len++; | |
| 627 } | |
| 628 | |
| 629 payload_size = packet_size - header_len; | |
| 630 if (id < 0xc0) { | |
| 631 startcode = PRIVATE_STREAM_1; | |
| 632 payload_size -= 4; | |
| 633 if (id >= 0xa0) | |
| 634 payload_size -= 3; | |
| 635 } else { | |
| 636 startcode = 0x100 + id; | |
| 637 } | |
| 638 | |
| 639 stuffing_size = payload_size - stream->buffer_ptr; | |
| 640 if (stuffing_size < 0) | |
| 641 stuffing_size = 0; | |
| 642 put_be32(&ctx->pb, startcode); | |
| 643 | |
| 644 put_be16(&ctx->pb, packet_size); | |
| 645 | |
| 421 if (!s->is_mpeg2) | 646 if (!s->is_mpeg2) |
| 422 header_len++; | 647 for(i=0;i<stuffing_size;i++) |
| 423 } | 648 put_byte(&ctx->pb, 0xff); |
| 424 | 649 |
| 425 packet_size = s->packet_size - (size + 6); | 650 if (s->is_mpeg2) { |
| 426 payload_size = packet_size - header_len; | 651 put_byte(&ctx->pb, 0x80); /* mpeg2 id */ |
| 427 if (id < 0xc0) { | 652 |
| 428 startcode = PRIVATE_STREAM_1; | 653 if (pts != AV_NOPTS_VALUE) { |
| 429 payload_size -= 4; | 654 if (dts != pts) { |
| 430 if (id >= 0xa0) | 655 put_byte(&ctx->pb, 0xc0); /* flags */ |
| 431 payload_size -= 3; | 656 put_byte(&ctx->pb, header_len - 3 + stuffing_size); |
| 432 } else { | 657 put_timestamp(&ctx->pb, 0x03, pts); |
| 433 startcode = 0x100 + id; | 658 put_timestamp(&ctx->pb, 0x01, dts); |
| 434 } | 659 } else { |
| 435 | 660 put_byte(&ctx->pb, 0x80); /* flags */ |
| 436 stuffing_size = payload_size - stream->buffer_ptr; | 661 put_byte(&ctx->pb, header_len - 3 + stuffing_size); |
| 437 if (stuffing_size < 0) | 662 put_timestamp(&ctx->pb, 0x02, pts); |
| 438 stuffing_size = 0; | 663 } |
| 439 put_be32(&ctx->pb, startcode); | 664 } else { |
| 440 | 665 put_byte(&ctx->pb, 0x00); /* flags */ |
| 441 put_be16(&ctx->pb, packet_size); | |
| 442 | |
| 443 if (!s->is_mpeg2) | |
| 444 for(i=0;i<stuffing_size;i++) | |
| 445 put_byte(&ctx->pb, 0xff); | |
| 446 | |
| 447 if (s->is_mpeg2) { | |
| 448 put_byte(&ctx->pb, 0x80); /* mpeg2 id */ | |
| 449 | |
| 450 if (pts != AV_NOPTS_VALUE) { | |
| 451 if (dts != pts) { | |
| 452 put_byte(&ctx->pb, 0xc0); /* flags */ | |
| 453 put_byte(&ctx->pb, header_len - 3 + stuffing_size); | 666 put_byte(&ctx->pb, header_len - 3 + stuffing_size); |
| 454 put_timestamp(&ctx->pb, 0x03, pts); | |
| 455 put_timestamp(&ctx->pb, 0x01, dts); | |
| 456 } else { | |
| 457 put_byte(&ctx->pb, 0x80); /* flags */ | |
| 458 put_byte(&ctx->pb, header_len - 3 + stuffing_size); | |
| 459 put_timestamp(&ctx->pb, 0x02, pts); | |
| 460 } | 667 } |
| 461 } else { | 668 } else { |
| 462 put_byte(&ctx->pb, 0x00); /* flags */ | 669 if (pts != AV_NOPTS_VALUE) { |
| 463 put_byte(&ctx->pb, header_len - 3 + stuffing_size); | 670 if (dts != pts) { |
| 464 } | 671 put_timestamp(&ctx->pb, 0x03, pts); |
| 465 } else { | 672 put_timestamp(&ctx->pb, 0x01, dts); |
| 466 if (pts != AV_NOPTS_VALUE) { | 673 } else { |
| 467 if (dts != pts) { | 674 put_timestamp(&ctx->pb, 0x02, pts); |
| 468 put_timestamp(&ctx->pb, 0x03, pts); | 675 } |
| 469 put_timestamp(&ctx->pb, 0x01, dts); | |
| 470 } else { | 676 } else { |
| 471 put_timestamp(&ctx->pb, 0x02, pts); | 677 put_byte(&ctx->pb, 0x0f); |
| 472 } | 678 } |
| 473 } else { | 679 } |
| 474 put_byte(&ctx->pb, 0x0f); | 680 |
| 475 } | 681 if (startcode == PRIVATE_STREAM_1) { |
| 476 } | 682 put_byte(&ctx->pb, id); |
| 477 | 683 if (id >= 0xa0) { |
| 478 if (startcode == PRIVATE_STREAM_1) { | 684 /* LPCM (XXX: check nb_frames) */ |
| 479 put_byte(&ctx->pb, id); | 685 put_byte(&ctx->pb, 7); |
| 480 if (id >= 0xa0) { | 686 put_be16(&ctx->pb, 4); /* skip 3 header bytes */ |
| 481 /* LPCM (XXX: check nb_frames) */ | 687 put_byte(&ctx->pb, stream->lpcm_header[0]); |
| 482 put_byte(&ctx->pb, 7); | 688 put_byte(&ctx->pb, stream->lpcm_header[1]); |
| 483 put_be16(&ctx->pb, 4); /* skip 3 header bytes */ | 689 put_byte(&ctx->pb, stream->lpcm_header[2]); |
| 484 put_byte(&ctx->pb, stream->lpcm_header[0]); | 690 } else { |
| 485 put_byte(&ctx->pb, stream->lpcm_header[1]); | 691 /* AC3 */ |
| 486 put_byte(&ctx->pb, stream->lpcm_header[2]); | 692 put_byte(&ctx->pb, stream->nb_frames); |
| 487 } else { | 693 put_be16(&ctx->pb, stream->frame_start_offset); |
| 488 /* AC3 */ | 694 } |
| 489 put_byte(&ctx->pb, stream->nb_frames); | 695 } |
| 490 put_be16(&ctx->pb, stream->frame_start_offset); | 696 |
| 491 } | 697 if (s->is_mpeg2) |
| 492 } | 698 for(i=0;i<stuffing_size;i++) |
| 493 | 699 put_byte(&ctx->pb, 0xff); |
| 494 if (s->is_mpeg2) | 700 |
| 495 for(i=0;i<stuffing_size;i++) | 701 /* output data */ |
| 496 put_byte(&ctx->pb, 0xff); | 702 put_buffer(&ctx->pb, stream->buffer, payload_size - stuffing_size); |
| 497 | 703 } |
| 498 /* output data */ | 704 |
| 499 put_buffer(&ctx->pb, stream->buffer, payload_size - stuffing_size); | 705 if (pad_packet_bytes > 0) |
| 706 put_padding_packet(ctx,&ctx->pb, pad_packet_bytes); | |
| 707 | |
| 708 for(i=0;i<zero_trail_bytes;i++) | |
| 709 put_byte(&ctx->pb, 0x00); | |
| 710 | |
| 500 put_flush_packet(&ctx->pb); | 711 put_flush_packet(&ctx->pb); |
| 501 | 712 |
| 502 s->packet_number++; | 713 s->packet_number++; |
| 503 stream->packet_number++; | 714 stream->packet_number++; |
| 504 stream->nb_frames = 0; | 715 stream->nb_frames = 0; |
| 505 stream->frame_start_offset = 0; | 716 stream->frame_start_offset = 0; |
| 717 } | |
| 718 | |
| 719 static void put_vcd_padding_sector(AVFormatContext *ctx) | |
| 720 { | |
| 721 /* There are two ways to do this padding: writing a sector/pack | |
| 722 of 0 values, or writing an MPEG padding pack. Both seem to | |
| 723 work with most decoders, BUT the VCD standard only allows a 0-sector | |
| 724 (see standard p. IV-4, IV-5). | |
| 725 So a 0-sector it is...*/ | |
| 726 | |
| 727 MpegMuxContext *s = ctx->priv_data; | |
| 728 int i; | |
| 729 | |
| 730 for(i=0;i<s->packet_size;i++) | |
| 731 put_byte(&ctx->pb, 0); | |
| 732 | |
| 733 s->vcd_padding_bytes_written += s->packet_size; | |
| 734 | |
| 735 put_flush_packet(&ctx->pb); | |
| 736 | |
| 737 /* increasing the packet number is correct. The SCR of the following packs | |
| 738 is calculated from the packet_number and it has to include the padding | |
| 739 sector (it represents the sector index, not the MPEG pack index) | |
| 740 (see VCD standard p. IV-6)*/ | |
| 741 s->packet_number++; | |
| 506 } | 742 } |
| 507 | 743 |
| 508 /* XXX: move that to upper layer */ | 744 /* XXX: move that to upper layer */ |
| 509 /* XXX: we assume that there are always 'max_b_frames' between | 745 /* XXX: we assume that there are always 'max_b_frames' between |
| 510 reference frames. A better solution would be to use the AVFrame pts | 746 reference frames. A better solution would be to use the AVFrame pts |
| 547 } | 783 } |
| 548 *ppts = pts & ((1LL << 33) - 1); | 784 *ppts = pts & ((1LL << 33) - 1); |
| 549 *pdts = dts & ((1LL << 33) - 1); | 785 *pdts = dts & ((1LL << 33) - 1); |
| 550 } | 786 } |
| 551 | 787 |
| 788 static int64_t update_scr(AVFormatContext *ctx,int stream_index,int64_t pts) | |
| 789 { | |
| 790 MpegMuxContext *s = ctx->priv_data; | |
| 791 int64_t scr; | |
| 792 | |
| 793 if (s->is_vcd) | |
| 794 /* Since the data delivery rate is constant, SCR is computed | |
| 795 using the formula C + i * 1200 where C is the start constant | |
| 796 and i is the pack index. | |
| 797 It is recommended that SCR 0 is at the beginning of the VCD front | |
| 798 margin (a sequence of empty Form 2 sectors on the CD). | |
| 799 It is recommended that the front margin is 30 sectors long, so | |
| 800 we use C = 30*1200 = 36000 | |
| 801 (Note that even if the front margin is not 30 sectors the file | |
| 802 will still be correct according to the standard. It just won't have | |
| 803 the "recommended" value).*/ | |
| 804 scr = 36000 + s->packet_number * 1200; | |
| 805 else { | |
| 806 /* XXX I believe this calculation of SCR is wrong. SCR | |
| 807 specifies at which time the data should enter the decoder. | |
| 808 Two packs cannot enter the decoder at the same time. */ | |
| 809 | |
| 810 /* XXX: system clock should be computed precisely, especially for | |
| 811 CBR case. The current mode gives at least something coherent */ | |
| 812 if (stream_index == s->scr_stream_index | |
| 813 && pts != AV_NOPTS_VALUE) | |
| 814 scr = pts; | |
| 815 else | |
| 816 scr = s->last_scr; | |
| 817 } | |
| 818 | |
| 819 s->last_scr=scr; | |
| 820 | |
| 821 return scr; | |
| 822 } | |
| 823 | |
| 824 | |
| 552 static int mpeg_mux_write_packet(AVFormatContext *ctx, int stream_index, | 825 static int mpeg_mux_write_packet(AVFormatContext *ctx, int stream_index, |
| 553 const uint8_t *buf, int size, | 826 const uint8_t *buf, int size, |
| 554 int64_t timestamp) | 827 int64_t timestamp) |
| 555 { | 828 { |
| 556 MpegMuxContext *s = ctx->priv_data; | 829 MpegMuxContext *s = ctx->priv_data; |
| 557 AVStream *st = ctx->streams[stream_index]; | 830 AVStream *st = ctx->streams[stream_index]; |
| 558 StreamInfo *stream = st->priv_data; | 831 StreamInfo *stream = st->priv_data; |
| 559 int64_t pts, dts, new_start_pts, new_start_dts; | 832 int64_t pts, dts, new_start_pts, new_start_dts; |
| 560 int len, avail_size; | 833 int len, avail_size; |
| 561 | 834 |
| 562 compute_pts_dts(st, &pts, &dts, timestamp); | 835 compute_pts_dts(st, &pts, &dts, timestamp); |
| 563 | 836 |
| 564 /* XXX: system clock should be computed precisely, especially for | |
| 565 CBR case. The current mode gives at least something coherent */ | |
| 566 if (stream_index == s->scr_stream_index) | |
| 567 s->last_scr = pts; | |
| 568 | 837 |
| 569 #if 0 | 838 #if 0 |
| 839 update_scr(ctx,stream_index,pts); | |
| 840 | |
| 570 printf("%d: pts=%0.3f dts=%0.3f scr=%0.3f\n", | 841 printf("%d: pts=%0.3f dts=%0.3f scr=%0.3f\n", |
| 571 stream_index, | 842 stream_index, |
| 572 pts / 90000.0, | 843 pts / 90000.0, |
| 573 dts / 90000.0, | 844 dts / 90000.0, |
| 574 s->last_scr / 90000.0); | 845 s->last_scr / 90000.0); |
| 584 } | 855 } |
| 585 avail_size = get_packet_payload_size(ctx, stream_index, | 856 avail_size = get_packet_payload_size(ctx, stream_index, |
| 586 new_start_pts, | 857 new_start_pts, |
| 587 new_start_dts); | 858 new_start_dts); |
| 588 if (stream->buffer_ptr >= avail_size) { | 859 if (stream->buffer_ptr >= avail_size) { |
| 860 | |
| 861 update_scr(ctx,stream_index,stream->start_pts); | |
| 862 | |
| 589 /* unlikely case: outputing the pts or dts increase the packet | 863 /* unlikely case: outputing the pts or dts increase the packet |
| 590 size so that we cannot write the start of the next | 864 size so that we cannot write the start of the next |
| 591 packet. In this case, we must flush the current packet with | 865 packet. In this case, we must flush the current packet with |
| 592 padding */ | 866 padding. |
| 867 Note: this always happens for the first audio and video packet | |
| 868 in a VCD file, since they do not carry any data.*/ | |
| 593 flush_packet(ctx, stream_index, | 869 flush_packet(ctx, stream_index, |
| 594 stream->start_pts, stream->start_dts, s->last_scr); | 870 stream->start_pts, stream->start_dts, s->last_scr); |
| 595 stream->buffer_ptr = 0; | 871 stream->buffer_ptr = 0; |
| 596 } | 872 } |
| 597 stream->start_pts = new_start_pts; | 873 stream->start_pts = new_start_pts; |
| 609 memcpy(stream->buffer + stream->buffer_ptr, buf, len); | 885 memcpy(stream->buffer + stream->buffer_ptr, buf, len); |
| 610 stream->buffer_ptr += len; | 886 stream->buffer_ptr += len; |
| 611 buf += len; | 887 buf += len; |
| 612 size -= len; | 888 size -= len; |
| 613 if (stream->buffer_ptr >= avail_size) { | 889 if (stream->buffer_ptr >= avail_size) { |
| 890 | |
| 891 update_scr(ctx,stream_index,stream->start_pts); | |
| 892 | |
| 614 /* if packet full, we send it now */ | 893 /* if packet full, we send it now */ |
| 615 flush_packet(ctx, stream_index, | 894 flush_packet(ctx, stream_index, |
| 616 stream->start_pts, stream->start_dts, s->last_scr); | 895 stream->start_pts, stream->start_dts, s->last_scr); |
| 617 stream->buffer_ptr = 0; | 896 stream->buffer_ptr = 0; |
| 897 | |
| 898 if (s->is_vcd) { | |
| 899 /* Write one or more padding sectors, if necessary, to reach | |
| 900 the constant overall bitrate.*/ | |
| 901 int vcd_pad_bytes; | |
| 902 | |
| 903 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->start_pts) ) >= s->packet_size) | |
| 904 put_vcd_padding_sector(ctx); | |
| 905 } | |
| 906 | |
| 618 /* Make sure only the FIRST pes packet for this frame has | 907 /* Make sure only the FIRST pes packet for this frame has |
| 619 a timestamp */ | 908 a timestamp */ |
| 620 stream->start_pts = AV_NOPTS_VALUE; | 909 stream->start_pts = AV_NOPTS_VALUE; |
| 621 stream->start_dts = AV_NOPTS_VALUE; | 910 stream->start_dts = AV_NOPTS_VALUE; |
| 622 } | 911 } |
| 633 | 922 |
| 634 /* flush each packet */ | 923 /* flush each packet */ |
| 635 for(i=0;i<ctx->nb_streams;i++) { | 924 for(i=0;i<ctx->nb_streams;i++) { |
| 636 stream = ctx->streams[i]->priv_data; | 925 stream = ctx->streams[i]->priv_data; |
| 637 if (stream->buffer_ptr > 0) { | 926 if (stream->buffer_ptr > 0) { |
| 927 update_scr(ctx,i,stream->start_pts); | |
| 928 | |
| 638 /* NOTE: we can always write the remaining data as it was | 929 /* NOTE: we can always write the remaining data as it was |
| 639 tested before in mpeg_mux_write_packet() */ | 930 tested before in mpeg_mux_write_packet() */ |
| 640 flush_packet(ctx, i, stream->start_pts, stream->start_dts, | 931 flush_packet(ctx, i, stream->start_pts, stream->start_dts, |
| 641 s->last_scr); | 932 s->last_scr); |
| 642 } | 933 } |
| 1137 else if(pos > pos_limit) | 1428 else if(pos > pos_limit) |
| 1138 pos= pos_limit; | 1429 pos= pos_limit; |
| 1139 start_pos= pos; | 1430 start_pos= pos; |
| 1140 | 1431 |
| 1141 // read the next timestamp | 1432 // read the next timestamp |
| 1142 dts = mpegps_read_dts(s, stream_index, &pos, 1); | 1433 dts = mpegps_read_dts(s, stream_index, &pos, 1); |
| 1143 if(pos == pos_max) | 1434 if(pos == pos_max) |
| 1144 no_change++; | 1435 no_change++; |
| 1145 else | 1436 else |
| 1146 no_change=0; | 1437 no_change=0; |
| 1147 #ifdef DEBUG_SEEK | 1438 #ifdef DEBUG_SEEK |
| 1212 CODEC_ID_MPEG2VIDEO, | 1503 CODEC_ID_MPEG2VIDEO, |
| 1213 mpeg_mux_init, | 1504 mpeg_mux_init, |
| 1214 mpeg_mux_write_packet, | 1505 mpeg_mux_write_packet, |
| 1215 mpeg_mux_end, | 1506 mpeg_mux_end, |
| 1216 }; | 1507 }; |
| 1508 | |
| 1509 /* Same as mpeg2vob_mux except that the pack size is 2324 */ | |
| 1510 static AVOutputFormat mpeg2svcd_mux = { | |
| 1511 "svcd", | |
| 1512 "MPEG2 PS format (VOB)", | |
| 1513 "video/mpeg", | |
| 1514 "vob", | |
| 1515 sizeof(MpegMuxContext), | |
| 1516 CODEC_ID_MP2, | |
| 1517 CODEC_ID_MPEG2VIDEO, | |
| 1518 mpeg_mux_init, | |
| 1519 mpeg_mux_write_packet, | |
| 1520 mpeg_mux_end, | |
| 1521 }; | |
| 1522 | |
| 1523 | |
| 1524 | |
| 1217 #endif //CONFIG_ENCODERS | 1525 #endif //CONFIG_ENCODERS |
| 1218 | 1526 |
| 1219 AVInputFormat mpegps_demux = { | 1527 AVInputFormat mpegps_demux = { |
| 1220 "mpeg", | 1528 "mpeg", |
| 1221 "MPEG PS format", | 1529 "MPEG PS format", |
| 1231 { | 1539 { |
| 1232 #ifdef CONFIG_ENCODERS | 1540 #ifdef CONFIG_ENCODERS |
| 1233 av_register_output_format(&mpeg1system_mux); | 1541 av_register_output_format(&mpeg1system_mux); |
| 1234 av_register_output_format(&mpeg1vcd_mux); | 1542 av_register_output_format(&mpeg1vcd_mux); |
| 1235 av_register_output_format(&mpeg2vob_mux); | 1543 av_register_output_format(&mpeg2vob_mux); |
| 1544 av_register_output_format(&mpeg2svcd_mux); | |
| 1236 #endif //CONFIG_ENCODERS | 1545 #endif //CONFIG_ENCODERS |
| 1237 av_register_input_format(&mpegps_demux); | 1546 av_register_input_format(&mpegps_demux); |
| 1238 return 0; | 1547 return 0; |
| 1239 } | 1548 } |
