annotate ffmpeg/libavformat/mpegenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * MPEG1/2 muxer
yading@11 3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include "libavutil/fifo.h"
yading@11 23 #include "libavutil/log.h"
yading@11 24 #include "libavutil/mathematics.h"
yading@11 25 #include "libavutil/opt.h"
yading@11 26 #include "libavcodec/put_bits.h"
yading@11 27 #include "avformat.h"
yading@11 28 #include "internal.h"
yading@11 29 #include "mpeg.h"
yading@11 30
yading@11 31 #define MAX_PAYLOAD_SIZE 4096
yading@11 32
yading@11 33 #undef NDEBUG
yading@11 34 #include <assert.h>
yading@11 35
yading@11 36 typedef struct PacketDesc {
yading@11 37 int64_t pts;
yading@11 38 int64_t dts;
yading@11 39 int size;
yading@11 40 int unwritten_size;
yading@11 41 int flags;
yading@11 42 struct PacketDesc *next;
yading@11 43 } PacketDesc;
yading@11 44
yading@11 45 typedef struct {
yading@11 46 AVFifoBuffer *fifo;
yading@11 47 uint8_t id;
yading@11 48 int max_buffer_size; /* in bytes */
yading@11 49 int buffer_index;
yading@11 50 PacketDesc *predecode_packet;
yading@11 51 PacketDesc *premux_packet;
yading@11 52 PacketDesc **next_packet;
yading@11 53 int packet_number;
yading@11 54 uint8_t lpcm_header[3];
yading@11 55 int lpcm_align;
yading@11 56 int bytes_to_iframe;
yading@11 57 int align_iframe;
yading@11 58 int64_t vobu_start_pts;
yading@11 59 } StreamInfo;
yading@11 60
yading@11 61 typedef struct {
yading@11 62 const AVClass *class;
yading@11 63 int packet_size; /* required packet size */
yading@11 64 int packet_number;
yading@11 65 int pack_header_freq; /* frequency (in packets^-1) at which we send pack headers */
yading@11 66 int system_header_freq;
yading@11 67 int system_header_size;
yading@11 68 int user_mux_rate; /* bitrate in units of bits/s */
yading@11 69 int mux_rate; /* bitrate in units of 50 bytes/s */
yading@11 70 /* stream info */
yading@11 71 int audio_bound;
yading@11 72 int video_bound;
yading@11 73 int is_mpeg2;
yading@11 74 int is_vcd;
yading@11 75 int is_svcd;
yading@11 76 int is_dvd;
yading@11 77 int64_t last_scr; /* current system clock */
yading@11 78
yading@11 79 double vcd_padding_bitrate; //FIXME floats
yading@11 80 int64_t vcd_padding_bytes_written;
yading@11 81
yading@11 82 int preload;
yading@11 83 } MpegMuxContext;
yading@11 84
yading@11 85 extern AVOutputFormat ff_mpeg1vcd_muxer;
yading@11 86 extern AVOutputFormat ff_mpeg2dvd_muxer;
yading@11 87 extern AVOutputFormat ff_mpeg2svcd_muxer;
yading@11 88 extern AVOutputFormat ff_mpeg2vob_muxer;
yading@11 89
yading@11 90 static int put_pack_header(AVFormatContext *ctx,
yading@11 91 uint8_t *buf, int64_t timestamp)
yading@11 92 {
yading@11 93 MpegMuxContext *s = ctx->priv_data;
yading@11 94 PutBitContext pb;
yading@11 95
yading@11 96 init_put_bits(&pb, buf, 128);
yading@11 97
yading@11 98 put_bits32(&pb, PACK_START_CODE);
yading@11 99 if (s->is_mpeg2) {
yading@11 100 put_bits(&pb, 2, 0x1);
yading@11 101 } else {
yading@11 102 put_bits(&pb, 4, 0x2);
yading@11 103 }
yading@11 104 put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
yading@11 105 put_bits(&pb, 1, 1);
yading@11 106 put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
yading@11 107 put_bits(&pb, 1, 1);
yading@11 108 put_bits(&pb, 15, (uint32_t)((timestamp ) & 0x7fff));
yading@11 109 put_bits(&pb, 1, 1);
yading@11 110 if (s->is_mpeg2) {
yading@11 111 /* clock extension */
yading@11 112 put_bits(&pb, 9, 0);
yading@11 113 }
yading@11 114 put_bits(&pb, 1, 1);
yading@11 115 put_bits(&pb, 22, s->mux_rate);
yading@11 116 put_bits(&pb, 1, 1);
yading@11 117 if (s->is_mpeg2) {
yading@11 118 put_bits(&pb, 1, 1);
yading@11 119 put_bits(&pb, 5, 0x1f); /* reserved */
yading@11 120 put_bits(&pb, 3, 0); /* stuffing length */
yading@11 121 }
yading@11 122 flush_put_bits(&pb);
yading@11 123 return put_bits_ptr(&pb) - pb.buf;
yading@11 124 }
yading@11 125
yading@11 126 static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
yading@11 127 {
yading@11 128 MpegMuxContext *s = ctx->priv_data;
yading@11 129 int size, i, private_stream_coded, id;
yading@11 130 PutBitContext pb;
yading@11 131
yading@11 132 init_put_bits(&pb, buf, 128);
yading@11 133
yading@11 134 put_bits32(&pb, SYSTEM_HEADER_START_CODE);
yading@11 135 put_bits(&pb, 16, 0);
yading@11 136 put_bits(&pb, 1, 1);
yading@11 137
yading@11 138 put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
yading@11 139 put_bits(&pb, 1, 1); /* marker */
yading@11 140 if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
yading@11 141 /* This header applies only to the video stream (see VCD standard p. IV-7)*/
yading@11 142 put_bits(&pb, 6, 0);
yading@11 143 } else
yading@11 144 put_bits(&pb, 6, s->audio_bound);
yading@11 145
yading@11 146 if (s->is_vcd) {
yading@11 147 /* see VCD standard, p. IV-7*/
yading@11 148 put_bits(&pb, 1, 0);
yading@11 149 put_bits(&pb, 1, 1);
yading@11 150 } else {
yading@11 151 put_bits(&pb, 1, 0); /* variable bitrate*/
yading@11 152 put_bits(&pb, 1, 0); /* non constrainted bit stream */
yading@11 153 }
yading@11 154
yading@11 155 if (s->is_vcd || s->is_dvd) {
yading@11 156 /* see VCD standard p IV-7 */
yading@11 157 put_bits(&pb, 1, 1); /* audio locked */
yading@11 158 put_bits(&pb, 1, 1); /* video locked */
yading@11 159 } else {
yading@11 160 put_bits(&pb, 1, 0); /* audio locked */
yading@11 161 put_bits(&pb, 1, 0); /* video locked */
yading@11 162 }
yading@11 163
yading@11 164 put_bits(&pb, 1, 1); /* marker */
yading@11 165
yading@11 166 if (s->is_vcd && (only_for_stream_id & 0xe0) == AUDIO_ID) {
yading@11 167 /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
yading@11 168 put_bits(&pb, 5, 0);
yading@11 169 } else
yading@11 170 put_bits(&pb, 5, s->video_bound);
yading@11 171
yading@11 172 if (s->is_dvd) {
yading@11 173 put_bits(&pb, 1, 0); /* packet_rate_restriction_flag */
yading@11 174 put_bits(&pb, 7, 0x7f); /* reserved byte */
yading@11 175 } else
yading@11 176 put_bits(&pb, 8, 0xff); /* reserved byte */
yading@11 177
yading@11 178 /* DVD-Video Stream_bound entries
yading@11 179 id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
yading@11 180 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)
yading@11 181 id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
yading@11 182 id (0xBF) private stream 2, NAV packs, set to 2x1024. */
yading@11 183 if (s->is_dvd) {
yading@11 184
yading@11 185 int P_STD_max_video = 0;
yading@11 186 int P_STD_max_mpeg_audio = 0;
yading@11 187 int P_STD_max_mpeg_PS1 = 0;
yading@11 188
yading@11 189 for(i=0;i<ctx->nb_streams;i++) {
yading@11 190 StreamInfo *stream = ctx->streams[i]->priv_data;
yading@11 191
yading@11 192 id = stream->id;
yading@11 193 if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
yading@11 194 P_STD_max_mpeg_PS1 = stream->max_buffer_size;
yading@11 195 } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
yading@11 196 P_STD_max_mpeg_audio = stream->max_buffer_size;
yading@11 197 } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
yading@11 198 P_STD_max_video = stream->max_buffer_size;
yading@11 199 }
yading@11 200 }
yading@11 201
yading@11 202 /* video */
yading@11 203 put_bits(&pb, 8, 0xb9); /* stream ID */
yading@11 204 put_bits(&pb, 2, 3);
yading@11 205 put_bits(&pb, 1, 1);
yading@11 206 put_bits(&pb, 13, P_STD_max_video / 1024);
yading@11 207
yading@11 208 /* audio */
yading@11 209 if (P_STD_max_mpeg_audio == 0)
yading@11 210 P_STD_max_mpeg_audio = 4096;
yading@11 211 put_bits(&pb, 8, 0xb8); /* stream ID */
yading@11 212 put_bits(&pb, 2, 3);
yading@11 213 put_bits(&pb, 1, 0);
yading@11 214 put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);
yading@11 215
yading@11 216 /* private stream 1 */
yading@11 217 put_bits(&pb, 8, 0xbd); /* stream ID */
yading@11 218 put_bits(&pb, 2, 3);
yading@11 219 put_bits(&pb, 1, 0);
yading@11 220 put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);
yading@11 221
yading@11 222 /* private stream 2 */
yading@11 223 put_bits(&pb, 8, 0xbf); /* stream ID */
yading@11 224 put_bits(&pb, 2, 3);
yading@11 225 put_bits(&pb, 1, 1);
yading@11 226 put_bits(&pb, 13, 2);
yading@11 227 }
yading@11 228 else {
yading@11 229 /* audio stream info */
yading@11 230 private_stream_coded = 0;
yading@11 231 for(i=0;i<ctx->nb_streams;i++) {
yading@11 232 StreamInfo *stream = ctx->streams[i]->priv_data;
yading@11 233
yading@11 234
yading@11 235 /* For VCDs, only include the stream info for the stream
yading@11 236 that the pack which contains this system belongs to.
yading@11 237 (see VCD standard p. IV-7) */
yading@11 238 if ( !s->is_vcd || stream->id==only_for_stream_id
yading@11 239 || only_for_stream_id==0) {
yading@11 240
yading@11 241 id = stream->id;
yading@11 242 if (id < 0xc0) {
yading@11 243 /* special case for private streams (AC-3 uses that) */
yading@11 244 if (private_stream_coded)
yading@11 245 continue;
yading@11 246 private_stream_coded = 1;
yading@11 247 id = 0xbd;
yading@11 248 }
yading@11 249 put_bits(&pb, 8, id); /* stream ID */
yading@11 250 put_bits(&pb, 2, 3);
yading@11 251 if (id < 0xe0) {
yading@11 252 /* audio */
yading@11 253 put_bits(&pb, 1, 0);
yading@11 254 put_bits(&pb, 13, stream->max_buffer_size / 128);
yading@11 255 } else {
yading@11 256 /* video */
yading@11 257 put_bits(&pb, 1, 1);
yading@11 258 put_bits(&pb, 13, stream->max_buffer_size / 1024);
yading@11 259 }
yading@11 260 }
yading@11 261 }
yading@11 262 }
yading@11 263
yading@11 264 flush_put_bits(&pb);
yading@11 265 size = put_bits_ptr(&pb) - pb.buf;
yading@11 266 /* patch packet size */
yading@11 267 buf[4] = (size - 6) >> 8;
yading@11 268 buf[5] = (size - 6) & 0xff;
yading@11 269
yading@11 270 return size;
yading@11 271 }
yading@11 272
yading@11 273 static int get_system_header_size(AVFormatContext *ctx)
yading@11 274 {
yading@11 275 int buf_index, i, private_stream_coded;
yading@11 276 StreamInfo *stream;
yading@11 277 MpegMuxContext *s = ctx->priv_data;
yading@11 278
yading@11 279 if (s->is_dvd)
yading@11 280 return 18; // DVD-Video system headers are 18 bytes fixed length.
yading@11 281
yading@11 282 buf_index = 12;
yading@11 283 private_stream_coded = 0;
yading@11 284 for(i=0;i<ctx->nb_streams;i++) {
yading@11 285 stream = ctx->streams[i]->priv_data;
yading@11 286 if (stream->id < 0xc0) {
yading@11 287 if (private_stream_coded)
yading@11 288 continue;
yading@11 289 private_stream_coded = 1;
yading@11 290 }
yading@11 291 buf_index += 3;
yading@11 292 }
yading@11 293 return buf_index;
yading@11 294 }
yading@11 295
yading@11 296 static int mpeg_mux_init(AVFormatContext *ctx)
yading@11 297 {
yading@11 298 MpegMuxContext *s = ctx->priv_data;
yading@11 299 int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
yading@11 300 AVStream *st;
yading@11 301 StreamInfo *stream;
yading@11 302 int audio_bitrate;
yading@11 303 int video_bitrate;
yading@11 304
yading@11 305 s->packet_number = 0;
yading@11 306 s->is_vcd = (CONFIG_MPEG1VCD_MUXER && ctx->oformat == &ff_mpeg1vcd_muxer);
yading@11 307 s->is_svcd = (CONFIG_MPEG2SVCD_MUXER && ctx->oformat == &ff_mpeg2svcd_muxer);
yading@11 308 s->is_mpeg2 = ((CONFIG_MPEG2VOB_MUXER && ctx->oformat == &ff_mpeg2vob_muxer) ||
yading@11 309 (CONFIG_MPEG2DVD_MUXER && ctx->oformat == &ff_mpeg2dvd_muxer) ||
yading@11 310 (CONFIG_MPEG2SVCD_MUXER && ctx->oformat == &ff_mpeg2svcd_muxer));
yading@11 311 s->is_dvd = (CONFIG_MPEG2DVD_MUXER && ctx->oformat == &ff_mpeg2dvd_muxer);
yading@11 312
yading@11 313 if(ctx->packet_size) {
yading@11 314 if (ctx->packet_size < 20 || ctx->packet_size > (1 << 23) + 10) {
yading@11 315 av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n",
yading@11 316 ctx->packet_size);
yading@11 317 goto fail;
yading@11 318 }
yading@11 319 s->packet_size = ctx->packet_size;
yading@11 320 } else
yading@11 321 s->packet_size = 2048;
yading@11 322 if (ctx->max_delay < 0) /* Not set by the caller */
yading@11 323 ctx->max_delay = 0;
yading@11 324
yading@11 325 s->vcd_padding_bytes_written = 0;
yading@11 326 s->vcd_padding_bitrate=0;
yading@11 327
yading@11 328 s->audio_bound = 0;
yading@11 329 s->video_bound = 0;
yading@11 330 mpa_id = AUDIO_ID;
yading@11 331 ac3_id = AC3_ID;
yading@11 332 dts_id = DTS_ID;
yading@11 333 mpv_id = VIDEO_ID;
yading@11 334 mps_id = SUB_ID;
yading@11 335 lpcm_id = LPCM_ID;
yading@11 336 for(i=0;i<ctx->nb_streams;i++) {
yading@11 337 st = ctx->streams[i];
yading@11 338 stream = av_mallocz(sizeof(StreamInfo));
yading@11 339 if (!stream)
yading@11 340 goto fail;
yading@11 341 st->priv_data = stream;
yading@11 342
yading@11 343 avpriv_set_pts_info(st, 64, 1, 90000);
yading@11 344
yading@11 345 switch(st->codec->codec_type) {
yading@11 346 case AVMEDIA_TYPE_AUDIO:
yading@11 347 if (st->codec->codec_id == AV_CODEC_ID_AC3) {
yading@11 348 stream->id = ac3_id++;
yading@11 349 } else if (st->codec->codec_id == AV_CODEC_ID_DTS) {
yading@11 350 stream->id = dts_id++;
yading@11 351 } else if (st->codec->codec_id == AV_CODEC_ID_PCM_S16BE) {
yading@11 352 stream->id = lpcm_id++;
yading@11 353 for(j = 0; j < 4; j++) {
yading@11 354 if (lpcm_freq_tab[j] == st->codec->sample_rate)
yading@11 355 break;
yading@11 356 }
yading@11 357 if (j == 4)
yading@11 358 goto fail;
yading@11 359 if (st->codec->channels > 8)
yading@11 360 return -1;
yading@11 361 stream->lpcm_header[0] = 0x0c;
yading@11 362 stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
yading@11 363 stream->lpcm_header[2] = 0x80;
yading@11 364 stream->lpcm_align = st->codec->channels * 2;
yading@11 365 } else {
yading@11 366 stream->id = mpa_id++;
yading@11 367 }
yading@11 368
yading@11 369 /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
yading@11 370 Right now it is also used for everything else.*/
yading@11 371 stream->max_buffer_size = 4 * 1024;
yading@11 372 s->audio_bound++;
yading@11 373 break;
yading@11 374 case AVMEDIA_TYPE_VIDEO:
yading@11 375 stream->id = mpv_id++;
yading@11 376 if (st->codec->rc_buffer_size)
yading@11 377 stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
yading@11 378 else {
yading@11 379 av_log(ctx, AV_LOG_WARNING, "VBV buffer size not set, muxing may fail\n");
yading@11 380 stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
yading@11 381 }
yading@11 382 s->video_bound++;
yading@11 383 break;
yading@11 384 case AVMEDIA_TYPE_SUBTITLE:
yading@11 385 stream->id = mps_id++;
yading@11 386 stream->max_buffer_size = 16 * 1024;
yading@11 387 break;
yading@11 388 default:
yading@11 389 return -1;
yading@11 390 }
yading@11 391 stream->fifo= av_fifo_alloc(16);
yading@11 392 if (!stream->fifo)
yading@11 393 goto fail;
yading@11 394 }
yading@11 395 bitrate = 0;
yading@11 396 audio_bitrate = 0;
yading@11 397 video_bitrate = 0;
yading@11 398 for(i=0;i<ctx->nb_streams;i++) {
yading@11 399 int codec_rate;
yading@11 400 st = ctx->streams[i];
yading@11 401 stream = (StreamInfo*) st->priv_data;
yading@11 402
yading@11 403 if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
yading@11 404 codec_rate= st->codec->rc_max_rate;
yading@11 405 else
yading@11 406 codec_rate= st->codec->bit_rate;
yading@11 407
yading@11 408 if(!codec_rate)
yading@11 409 codec_rate= (1<<21)*8*50/ctx->nb_streams;
yading@11 410
yading@11 411 bitrate += codec_rate;
yading@11 412
yading@11 413 if ((stream->id & 0xe0) == AUDIO_ID)
yading@11 414 audio_bitrate += codec_rate;
yading@11 415 else if (stream->id==VIDEO_ID)
yading@11 416 video_bitrate += codec_rate;
yading@11 417 }
yading@11 418
yading@11 419 if (s->user_mux_rate) {
yading@11 420 s->mux_rate = (s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
yading@11 421 } else {
yading@11 422 /* we increase slightly the bitrate to take into account the
yading@11 423 headers. XXX: compute it exactly */
yading@11 424 bitrate += bitrate / 20;
yading@11 425 bitrate += 10000;
yading@11 426 s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
yading@11 427 }
yading@11 428
yading@11 429 if (s->is_vcd) {
yading@11 430 double overhead_rate;
yading@11 431
yading@11 432 /* The VCD standard mandates that the mux_rate field is 3528
yading@11 433 (see standard p. IV-6).
yading@11 434 The value is actually "wrong", i.e. if you calculate
yading@11 435 it using the normal formula and the 75 sectors per second transfer
yading@11 436 rate you get a different value because the real pack size is 2324,
yading@11 437 not 2352. But the standard explicitly specifies that the mux_rate
yading@11 438 field in the header must have this value.*/
yading@11 439 // s->mux_rate=2352 * 75 / 50; /* = 3528*/
yading@11 440
yading@11 441 /* The VCD standard states that the muxed stream must be
yading@11 442 exactly 75 packs / second (the data rate of a single speed cdrom).
yading@11 443 Since the video bitrate (probably 1150000 bits/sec) will be below
yading@11 444 the theoretical maximum we have to add some padding packets
yading@11 445 to make up for the lower data rate.
yading@11 446 (cf. VCD standard p. IV-6 )*/
yading@11 447
yading@11 448 /* Add the header overhead to the data rate.
yading@11 449 2279 data bytes per audio pack, 2294 data bytes per video pack*/
yading@11 450 overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
yading@11 451 overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
yading@11 452 overhead_rate *= 8;
yading@11 453
yading@11 454 /* Add padding so that the full bitrate is 2324*75 bytes/sec */
yading@11 455 s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
yading@11 456 }
yading@11 457
yading@11 458 if (s->is_vcd || s->is_mpeg2)
yading@11 459 /* every packet */
yading@11 460 s->pack_header_freq = 1;
yading@11 461 else
yading@11 462 /* every 2 seconds */
yading@11 463 s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
yading@11 464
yading@11 465 /* the above seems to make pack_header_freq zero sometimes */
yading@11 466 if (s->pack_header_freq == 0)
yading@11 467 s->pack_header_freq = 1;
yading@11 468
yading@11 469 if (s->is_mpeg2)
yading@11 470 /* every 200 packets. Need to look at the spec. */
yading@11 471 s->system_header_freq = s->pack_header_freq * 40;
yading@11 472 else if (s->is_vcd)
yading@11 473 /* the standard mandates that there are only two system headers
yading@11 474 in the whole file: one in the first packet of each stream.
yading@11 475 (see standard p. IV-7 and IV-8) */
yading@11 476 s->system_header_freq = 0x7fffffff;
yading@11 477 else
yading@11 478 s->system_header_freq = s->pack_header_freq * 5;
yading@11 479
yading@11 480 for(i=0;i<ctx->nb_streams;i++) {
yading@11 481 stream = ctx->streams[i]->priv_data;
yading@11 482 stream->packet_number = 0;
yading@11 483 }
yading@11 484 s->system_header_size = get_system_header_size(ctx);
yading@11 485 s->last_scr = AV_NOPTS_VALUE;
yading@11 486 return 0;
yading@11 487 fail:
yading@11 488 for(i=0;i<ctx->nb_streams;i++) {
yading@11 489 av_free(ctx->streams[i]->priv_data);
yading@11 490 }
yading@11 491 return AVERROR(ENOMEM);
yading@11 492 }
yading@11 493
yading@11 494 static inline void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
yading@11 495 {
yading@11 496 avio_w8(pb,
yading@11 497 (id << 4) |
yading@11 498 (((timestamp >> 30) & 0x07) << 1) |
yading@11 499 1);
yading@11 500 avio_wb16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
yading@11 501 avio_wb16(pb, (uint16_t)((((timestamp ) & 0x7fff) << 1) | 1));
yading@11 502 }
yading@11 503
yading@11 504
yading@11 505 /* return the number of padding bytes that should be inserted into
yading@11 506 the multiplexed stream.*/
yading@11 507 static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
yading@11 508 {
yading@11 509 MpegMuxContext *s = ctx->priv_data;
yading@11 510 int pad_bytes = 0;
yading@11 511
yading@11 512 if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
yading@11 513 {
yading@11 514 int64_t full_pad_bytes;
yading@11 515
yading@11 516 full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
yading@11 517 pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);
yading@11 518
yading@11 519 if (pad_bytes<0)
yading@11 520 /* might happen if we have already padded to a later timestamp. This
yading@11 521 can occur if another stream has already advanced further.*/
yading@11 522 pad_bytes=0;
yading@11 523 }
yading@11 524
yading@11 525 return pad_bytes;
yading@11 526 }
yading@11 527
yading@11 528
yading@11 529 /* Write an MPEG padding packet header. */
yading@11 530 static void put_padding_packet(AVFormatContext *ctx, AVIOContext *pb,int packet_bytes)
yading@11 531 {
yading@11 532 MpegMuxContext *s = ctx->priv_data;
yading@11 533 int i;
yading@11 534
yading@11 535 avio_wb32(pb, PADDING_STREAM);
yading@11 536 avio_wb16(pb, packet_bytes - 6);
yading@11 537 if (!s->is_mpeg2) {
yading@11 538 avio_w8(pb, 0x0f);
yading@11 539 packet_bytes -= 7;
yading@11 540 } else
yading@11 541 packet_bytes -= 6;
yading@11 542
yading@11 543 for(i=0;i<packet_bytes;i++)
yading@11 544 avio_w8(pb, 0xff);
yading@11 545 }
yading@11 546
yading@11 547 static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
yading@11 548 int nb_frames=0;
yading@11 549 PacketDesc *pkt_desc= stream->premux_packet;
yading@11 550
yading@11 551 while(len>0){
yading@11 552 if(pkt_desc->size == pkt_desc->unwritten_size)
yading@11 553 nb_frames++;
yading@11 554 len -= pkt_desc->unwritten_size;
yading@11 555 pkt_desc= pkt_desc->next;
yading@11 556 }
yading@11 557
yading@11 558 return nb_frames;
yading@11 559 }
yading@11 560
yading@11 561 /* flush the packet on stream stream_index */
yading@11 562 static int flush_packet(AVFormatContext *ctx, int stream_index,
yading@11 563 int64_t pts, int64_t dts, int64_t scr, int trailer_size)
yading@11 564 {
yading@11 565 MpegMuxContext *s = ctx->priv_data;
yading@11 566 StreamInfo *stream = ctx->streams[stream_index]->priv_data;
yading@11 567 uint8_t *buf_ptr;
yading@11 568 int size, payload_size, startcode, id, stuffing_size, i, header_len;
yading@11 569 int packet_size;
yading@11 570 uint8_t buffer[128];
yading@11 571 int zero_trail_bytes = 0;
yading@11 572 int pad_packet_bytes = 0;
yading@11 573 int pes_flags;
yading@11 574 int general_pack = 0; /*"general" pack without data specific to one stream?*/
yading@11 575 int nb_frames;
yading@11 576
yading@11 577 id = stream->id;
yading@11 578
yading@11 579 av_dlog(ctx, "packet ID=%2x PTS=%0.3f\n", id, pts / 90000.0);
yading@11 580
yading@11 581 buf_ptr = buffer;
yading@11 582
yading@11 583 if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
yading@11 584 /* output pack and systems header if needed */
yading@11 585 size = put_pack_header(ctx, buf_ptr, scr);
yading@11 586 buf_ptr += size;
yading@11 587 s->last_scr= scr;
yading@11 588
yading@11 589 if (s->is_vcd) {
yading@11 590 /* there is exactly one system header for each stream in a VCD MPEG,
yading@11 591 One in the very first video packet and one in the very first
yading@11 592 audio packet (see VCD standard p. IV-7 and IV-8).*/
yading@11 593
yading@11 594 if (stream->packet_number==0) {
yading@11 595 size = put_system_header(ctx, buf_ptr, id);
yading@11 596 buf_ptr += size;
yading@11 597 }
yading@11 598 } else if (s->is_dvd) {
yading@11 599 if (stream->align_iframe || s->packet_number == 0){
yading@11 600 int PES_bytes_to_fill = s->packet_size - size - 10;
yading@11 601
yading@11 602 if (pts != AV_NOPTS_VALUE) {
yading@11 603 if (dts != pts)
yading@11 604 PES_bytes_to_fill -= 5 + 5;
yading@11 605 else
yading@11 606 PES_bytes_to_fill -= 5;
yading@11 607 }
yading@11 608
yading@11 609 if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
yading@11 610 size = put_system_header(ctx, buf_ptr, 0);
yading@11 611 buf_ptr += size;
yading@11 612 size = buf_ptr - buffer;
yading@11 613 avio_write(ctx->pb, buffer, size);
yading@11 614
yading@11 615 avio_wb32(ctx->pb, PRIVATE_STREAM_2);
yading@11 616 avio_wb16(ctx->pb, 0x03d4); // length
yading@11 617 avio_w8(ctx->pb, 0x00); // substream ID, 00=PCI
yading@11 618 for (i = 0; i < 979; i++)
yading@11 619 avio_w8(ctx->pb, 0x00);
yading@11 620
yading@11 621 avio_wb32(ctx->pb, PRIVATE_STREAM_2);
yading@11 622 avio_wb16(ctx->pb, 0x03fa); // length
yading@11 623 avio_w8(ctx->pb, 0x01); // substream ID, 01=DSI
yading@11 624 for (i = 0; i < 1017; i++)
yading@11 625 avio_w8(ctx->pb, 0x00);
yading@11 626
yading@11 627 memset(buffer, 0, 128);
yading@11 628 buf_ptr = buffer;
yading@11 629 s->packet_number++;
yading@11 630 stream->align_iframe = 0;
yading@11 631 scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
yading@11 632 size = put_pack_header(ctx, buf_ptr, scr);
yading@11 633 s->last_scr= scr;
yading@11 634 buf_ptr += size;
yading@11 635 /* GOP Start */
yading@11 636 } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
yading@11 637 pad_packet_bytes = PES_bytes_to_fill - stream->bytes_to_iframe;
yading@11 638 }
yading@11 639 }
yading@11 640 } else {
yading@11 641 if ((s->packet_number % s->system_header_freq) == 0) {
yading@11 642 size = put_system_header(ctx, buf_ptr, 0);
yading@11 643 buf_ptr += size;
yading@11 644 }
yading@11 645 }
yading@11 646 }
yading@11 647 size = buf_ptr - buffer;
yading@11 648 avio_write(ctx->pb, buffer, size);
yading@11 649
yading@11 650 packet_size = s->packet_size - size;
yading@11 651
yading@11 652 if (s->is_vcd && (id & 0xe0) == AUDIO_ID)
yading@11 653 /* The VCD standard demands that 20 zero bytes follow
yading@11 654 each audio pack (see standard p. IV-8).*/
yading@11 655 zero_trail_bytes += 20;
yading@11 656
yading@11 657 if ((s->is_vcd && stream->packet_number==0)
yading@11 658 || (s->is_svcd && s->packet_number==0)) {
yading@11 659 /* for VCD the first pack of each stream contains only the pack header,
yading@11 660 the system header and lots of padding (see VCD standard p. IV-6).
yading@11 661 In the case of an audio pack, 20 zero bytes are also added at
yading@11 662 the end.*/
yading@11 663 /* For SVCD we fill the very first pack to increase compatibility with
yading@11 664 some DVD players. Not mandated by the standard.*/
yading@11 665 if (s->is_svcd)
yading@11 666 general_pack = 1; /* the system header refers to both streams and no stream data*/
yading@11 667 pad_packet_bytes = packet_size - zero_trail_bytes;
yading@11 668 }
yading@11 669
yading@11 670 packet_size -= pad_packet_bytes + zero_trail_bytes;
yading@11 671
yading@11 672 if (packet_size > 0) {
yading@11 673
yading@11 674 /* packet header size */
yading@11 675 packet_size -= 6;
yading@11 676
yading@11 677 /* packet header */
yading@11 678 if (s->is_mpeg2) {
yading@11 679 header_len = 3;
yading@11 680 if (stream->packet_number==0)
yading@11 681 header_len += 3; /* PES extension */
yading@11 682 header_len += 1; /* obligatory stuffing byte */
yading@11 683 } else {
yading@11 684 header_len = 0;
yading@11 685 }
yading@11 686 if (pts != AV_NOPTS_VALUE) {
yading@11 687 if (dts != pts)
yading@11 688 header_len += 5 + 5;
yading@11 689 else
yading@11 690 header_len += 5;
yading@11 691 } else {
yading@11 692 if (!s->is_mpeg2)
yading@11 693 header_len++;
yading@11 694 }
yading@11 695
yading@11 696 payload_size = packet_size - header_len;
yading@11 697 if (id < 0xc0) {
yading@11 698 startcode = PRIVATE_STREAM_1;
yading@11 699 payload_size -= 1;
yading@11 700 if (id >= 0x40) {
yading@11 701 payload_size -= 3;
yading@11 702 if (id >= 0xa0)
yading@11 703 payload_size -= 3;
yading@11 704 }
yading@11 705 } else {
yading@11 706 startcode = 0x100 + id;
yading@11 707 }
yading@11 708
yading@11 709 stuffing_size = payload_size - av_fifo_size(stream->fifo);
yading@11 710
yading@11 711 // first byte does not fit -> reset pts/dts + stuffing
yading@11 712 if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
yading@11 713 int timestamp_len=0;
yading@11 714 if(dts != pts)
yading@11 715 timestamp_len += 5;
yading@11 716 if(pts != AV_NOPTS_VALUE)
yading@11 717 timestamp_len += s->is_mpeg2 ? 5 : 4;
yading@11 718 pts=dts= AV_NOPTS_VALUE;
yading@11 719 header_len -= timestamp_len;
yading@11 720 if (s->is_dvd && stream->align_iframe) {
yading@11 721 pad_packet_bytes += timestamp_len;
yading@11 722 packet_size -= timestamp_len;
yading@11 723 } else {
yading@11 724 payload_size += timestamp_len;
yading@11 725 }
yading@11 726 stuffing_size += timestamp_len;
yading@11 727 if(payload_size > trailer_size)
yading@11 728 stuffing_size += payload_size - trailer_size;
yading@11 729 }
yading@11 730
yading@11 731 if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
yading@11 732 packet_size += pad_packet_bytes;
yading@11 733 payload_size += pad_packet_bytes; // undo the previous adjustment
yading@11 734 if (stuffing_size < 0) {
yading@11 735 stuffing_size = pad_packet_bytes;
yading@11 736 } else {
yading@11 737 stuffing_size += pad_packet_bytes;
yading@11 738 }
yading@11 739 pad_packet_bytes = 0;
yading@11 740 }
yading@11 741
yading@11 742 if (stuffing_size < 0)
yading@11 743 stuffing_size = 0;
yading@11 744
yading@11 745 if (startcode == PRIVATE_STREAM_1 && id >= 0xa0) {
yading@11 746 if (payload_size < av_fifo_size(stream->fifo))
yading@11 747 stuffing_size += payload_size % stream->lpcm_align;
yading@11 748 }
yading@11 749
yading@11 750 if (stuffing_size > 16) { /*<=16 for MPEG-1, <=32 for MPEG-2*/
yading@11 751 pad_packet_bytes += stuffing_size;
yading@11 752 packet_size -= stuffing_size;
yading@11 753 payload_size -= stuffing_size;
yading@11 754 stuffing_size = 0;
yading@11 755 }
yading@11 756
yading@11 757 nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
yading@11 758
yading@11 759 avio_wb32(ctx->pb, startcode);
yading@11 760
yading@11 761 avio_wb16(ctx->pb, packet_size);
yading@11 762
yading@11 763 if (!s->is_mpeg2)
yading@11 764 for(i=0;i<stuffing_size;i++)
yading@11 765 avio_w8(ctx->pb, 0xff);
yading@11 766
yading@11 767 if (s->is_mpeg2) {
yading@11 768 avio_w8(ctx->pb, 0x80); /* mpeg2 id */
yading@11 769
yading@11 770 pes_flags=0;
yading@11 771
yading@11 772 if (pts != AV_NOPTS_VALUE) {
yading@11 773 pes_flags |= 0x80;
yading@11 774 if (dts != pts)
yading@11 775 pes_flags |= 0x40;
yading@11 776 }
yading@11 777
yading@11 778 /* Both the MPEG-2 and the SVCD standards demand that the
yading@11 779 P-STD_buffer_size field be included in the first packet of
yading@11 780 every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
yading@11 781 and MPEG-2 standard 2.7.7) */
yading@11 782 if (stream->packet_number == 0)
yading@11 783 pes_flags |= 0x01;
yading@11 784
yading@11 785 avio_w8(ctx->pb, pes_flags); /* flags */
yading@11 786 avio_w8(ctx->pb, header_len - 3 + stuffing_size);
yading@11 787
yading@11 788 if (pes_flags & 0x80) /*write pts*/
yading@11 789 put_timestamp(ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
yading@11 790 if (pes_flags & 0x40) /*write dts*/
yading@11 791 put_timestamp(ctx->pb, 0x01, dts);
yading@11 792
yading@11 793 if (pes_flags & 0x01) { /*write pes extension*/
yading@11 794 avio_w8(ctx->pb, 0x10); /* flags */
yading@11 795
yading@11 796 /* P-STD buffer info */
yading@11 797 if ((id & 0xe0) == AUDIO_ID)
yading@11 798 avio_wb16(ctx->pb, 0x4000 | stream->max_buffer_size/ 128);
yading@11 799 else
yading@11 800 avio_wb16(ctx->pb, 0x6000 | stream->max_buffer_size/1024);
yading@11 801 }
yading@11 802
yading@11 803 } else {
yading@11 804 if (pts != AV_NOPTS_VALUE) {
yading@11 805 if (dts != pts) {
yading@11 806 put_timestamp(ctx->pb, 0x03, pts);
yading@11 807 put_timestamp(ctx->pb, 0x01, dts);
yading@11 808 } else {
yading@11 809 put_timestamp(ctx->pb, 0x02, pts);
yading@11 810 }
yading@11 811 } else {
yading@11 812 avio_w8(ctx->pb, 0x0f);
yading@11 813 }
yading@11 814 }
yading@11 815
yading@11 816 if (s->is_mpeg2) {
yading@11 817 /* special stuffing byte that is always written
yading@11 818 to prevent accidental generation of start codes. */
yading@11 819 avio_w8(ctx->pb, 0xff);
yading@11 820
yading@11 821 for(i=0;i<stuffing_size;i++)
yading@11 822 avio_w8(ctx->pb, 0xff);
yading@11 823 }
yading@11 824
yading@11 825 if (startcode == PRIVATE_STREAM_1) {
yading@11 826 avio_w8(ctx->pb, id);
yading@11 827 if (id >= 0xa0) {
yading@11 828 /* LPCM (XXX: check nb_frames) */
yading@11 829 avio_w8(ctx->pb, 7);
yading@11 830 avio_wb16(ctx->pb, 4); /* skip 3 header bytes */
yading@11 831 avio_w8(ctx->pb, stream->lpcm_header[0]);
yading@11 832 avio_w8(ctx->pb, stream->lpcm_header[1]);
yading@11 833 avio_w8(ctx->pb, stream->lpcm_header[2]);
yading@11 834 } else if (id >= 0x40) {
yading@11 835 /* AC-3 */
yading@11 836 avio_w8(ctx->pb, nb_frames);
yading@11 837 avio_wb16(ctx->pb, trailer_size+1);
yading@11 838 }
yading@11 839 }
yading@11 840
yading@11 841 /* output data */
yading@11 842 assert(payload_size - stuffing_size <= av_fifo_size(stream->fifo));
yading@11 843 av_fifo_generic_read(stream->fifo, ctx->pb, payload_size - stuffing_size, (void*)avio_write);
yading@11 844 stream->bytes_to_iframe -= payload_size - stuffing_size;
yading@11 845 }else{
yading@11 846 payload_size=
yading@11 847 stuffing_size= 0;
yading@11 848 }
yading@11 849
yading@11 850 if (pad_packet_bytes > 0)
yading@11 851 put_padding_packet(ctx,ctx->pb, pad_packet_bytes);
yading@11 852
yading@11 853 for(i=0;i<zero_trail_bytes;i++)
yading@11 854 avio_w8(ctx->pb, 0x00);
yading@11 855
yading@11 856 avio_flush(ctx->pb);
yading@11 857
yading@11 858 s->packet_number++;
yading@11 859
yading@11 860 /* only increase the stream packet number if this pack actually contains
yading@11 861 something that is specific to this stream! I.e. a dedicated header
yading@11 862 or some data.*/
yading@11 863 if (!general_pack)
yading@11 864 stream->packet_number++;
yading@11 865
yading@11 866 return payload_size - stuffing_size;
yading@11 867 }
yading@11 868
yading@11 869 static void put_vcd_padding_sector(AVFormatContext *ctx)
yading@11 870 {
yading@11 871 /* There are two ways to do this padding: writing a sector/pack
yading@11 872 of 0 values, or writing an MPEG padding pack. Both seem to
yading@11 873 work with most decoders, BUT the VCD standard only allows a 0-sector
yading@11 874 (see standard p. IV-4, IV-5).
yading@11 875 So a 0-sector it is...*/
yading@11 876
yading@11 877 MpegMuxContext *s = ctx->priv_data;
yading@11 878 int i;
yading@11 879
yading@11 880 for(i=0;i<s->packet_size;i++)
yading@11 881 avio_w8(ctx->pb, 0);
yading@11 882
yading@11 883 s->vcd_padding_bytes_written += s->packet_size;
yading@11 884
yading@11 885 avio_flush(ctx->pb);
yading@11 886
yading@11 887 /* increasing the packet number is correct. The SCR of the following packs
yading@11 888 is calculated from the packet_number and it has to include the padding
yading@11 889 sector (it represents the sector index, not the MPEG pack index)
yading@11 890 (see VCD standard p. IV-6)*/
yading@11 891 s->packet_number++;
yading@11 892 }
yading@11 893
yading@11 894 static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
yading@11 895 // MpegMuxContext *s = ctx->priv_data;
yading@11 896 int i;
yading@11 897
yading@11 898 for(i=0; i<ctx->nb_streams; i++){
yading@11 899 AVStream *st = ctx->streams[i];
yading@11 900 StreamInfo *stream = st->priv_data;
yading@11 901 PacketDesc *pkt_desc;
yading@11 902
yading@11 903 while((pkt_desc= stream->predecode_packet)
yading@11 904 && scr > pkt_desc->dts){ //FIXME > vs >=
yading@11 905 if(stream->buffer_index < pkt_desc->size ||
yading@11 906 stream->predecode_packet == stream->premux_packet){
yading@11 907 av_log(ctx, AV_LOG_ERROR,
yading@11 908 "buffer underflow i=%d bufi=%d size=%d\n",
yading@11 909 i, stream->buffer_index, pkt_desc->size);
yading@11 910 break;
yading@11 911 }
yading@11 912 stream->buffer_index -= pkt_desc->size;
yading@11 913
yading@11 914 stream->predecode_packet= pkt_desc->next;
yading@11 915 av_freep(&pkt_desc);
yading@11 916 }
yading@11 917 }
yading@11 918
yading@11 919 return 0;
yading@11 920 }
yading@11 921
yading@11 922 static int output_packet(AVFormatContext *ctx, int flush){
yading@11 923 MpegMuxContext *s = ctx->priv_data;
yading@11 924 AVStream *st;
yading@11 925 StreamInfo *stream;
yading@11 926 int i, avail_space=0, es_size, trailer_size;
yading@11 927 int best_i= -1;
yading@11 928 int best_score= INT_MIN;
yading@11 929 int ignore_constraints=0;
yading@11 930 int64_t scr= s->last_scr;
yading@11 931 PacketDesc *timestamp_packet;
yading@11 932 const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
yading@11 933
yading@11 934 retry:
yading@11 935 for(i=0; i<ctx->nb_streams; i++){
yading@11 936 AVStream *st = ctx->streams[i];
yading@11 937 StreamInfo *stream = st->priv_data;
yading@11 938 const int avail_data= av_fifo_size(stream->fifo);
yading@11 939 const int space= stream->max_buffer_size - stream->buffer_index;
yading@11 940 int rel_space= 1024LL*space / stream->max_buffer_size;
yading@11 941 PacketDesc *next_pkt= stream->premux_packet;
yading@11 942
yading@11 943 /* for subtitle, a single PES packet must be generated,
yading@11 944 so we flush after every single subtitle packet */
yading@11 945 if(s->packet_size > avail_data && !flush
yading@11 946 && st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)
yading@11 947 return 0;
yading@11 948 if(avail_data==0)
yading@11 949 continue;
yading@11 950 assert(avail_data>0);
yading@11 951
yading@11 952 if(space < s->packet_size && !ignore_constraints)
yading@11 953 continue;
yading@11 954
yading@11 955 if(next_pkt && next_pkt->dts - scr > max_delay)
yading@11 956 continue;
yading@11 957
yading@11 958 if(rel_space > best_score){
yading@11 959 best_score= rel_space;
yading@11 960 best_i = i;
yading@11 961 avail_space= space;
yading@11 962 }
yading@11 963 }
yading@11 964
yading@11 965 if(best_i < 0){
yading@11 966 int64_t best_dts= INT64_MAX;
yading@11 967
yading@11 968 for(i=0; i<ctx->nb_streams; i++){
yading@11 969 AVStream *st = ctx->streams[i];
yading@11 970 StreamInfo *stream = st->priv_data;
yading@11 971 PacketDesc *pkt_desc= stream->predecode_packet;
yading@11 972 if(pkt_desc && pkt_desc->dts < best_dts)
yading@11 973 best_dts= pkt_desc->dts;
yading@11 974 }
yading@11 975
yading@11 976 av_dlog(ctx, "bumping scr, scr:%f, dts:%f\n",
yading@11 977 scr / 90000.0, best_dts / 90000.0);
yading@11 978 if(best_dts == INT64_MAX)
yading@11 979 return 0;
yading@11 980
yading@11 981 if(scr >= best_dts+1 && !ignore_constraints){
yading@11 982 av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
yading@11 983 ignore_constraints= 1;
yading@11 984 }
yading@11 985 scr= FFMAX(best_dts+1, scr);
yading@11 986 if(remove_decoded_packets(ctx, scr) < 0)
yading@11 987 return -1;
yading@11 988 goto retry;
yading@11 989 }
yading@11 990
yading@11 991 assert(best_i >= 0);
yading@11 992
yading@11 993 st = ctx->streams[best_i];
yading@11 994 stream = st->priv_data;
yading@11 995
yading@11 996 assert(av_fifo_size(stream->fifo) > 0);
yading@11 997
yading@11 998 assert(avail_space >= s->packet_size || ignore_constraints);
yading@11 999
yading@11 1000 timestamp_packet= stream->premux_packet;
yading@11 1001 if(timestamp_packet->unwritten_size == timestamp_packet->size){
yading@11 1002 trailer_size= 0;
yading@11 1003 }else{
yading@11 1004 trailer_size= timestamp_packet->unwritten_size;
yading@11 1005 timestamp_packet= timestamp_packet->next;
yading@11 1006 }
yading@11 1007
yading@11 1008 if(timestamp_packet){
yading@11 1009 av_dlog(ctx, "dts:%f pts:%f scr:%f stream:%d\n",
yading@11 1010 timestamp_packet->dts / 90000.0,
yading@11 1011 timestamp_packet->pts / 90000.0,
yading@11 1012 scr / 90000.0, best_i);
yading@11 1013 es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
yading@11 1014 }else{
yading@11 1015 assert(av_fifo_size(stream->fifo) == trailer_size);
yading@11 1016 es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
yading@11 1017 }
yading@11 1018
yading@11 1019 if (s->is_vcd) {
yading@11 1020 /* Write one or more padding sectors, if necessary, to reach
yading@11 1021 the constant overall bitrate.*/
yading@11 1022 int vcd_pad_bytes;
yading@11 1023
yading@11 1024 while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
yading@11 1025 put_vcd_padding_sector(ctx);
yading@11 1026 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
yading@11 1027 }
yading@11 1028 }
yading@11 1029
yading@11 1030 stream->buffer_index += es_size;
yading@11 1031 s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
yading@11 1032
yading@11 1033 while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
yading@11 1034 es_size -= stream->premux_packet->unwritten_size;
yading@11 1035 stream->premux_packet= stream->premux_packet->next;
yading@11 1036 }
yading@11 1037 if(es_size)
yading@11 1038 stream->premux_packet->unwritten_size -= es_size;
yading@11 1039
yading@11 1040 if(remove_decoded_packets(ctx, s->last_scr) < 0)
yading@11 1041 return -1;
yading@11 1042
yading@11 1043 return 1;
yading@11 1044 }
yading@11 1045
yading@11 1046 static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
yading@11 1047 {
yading@11 1048 MpegMuxContext *s = ctx->priv_data;
yading@11 1049 int stream_index= pkt->stream_index;
yading@11 1050 int size= pkt->size;
yading@11 1051 uint8_t *buf= pkt->data;
yading@11 1052 AVStream *st = ctx->streams[stream_index];
yading@11 1053 StreamInfo *stream = st->priv_data;
yading@11 1054 int64_t pts, dts;
yading@11 1055 PacketDesc *pkt_desc;
yading@11 1056 int preload;
yading@11 1057 const int is_iframe = st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (pkt->flags & AV_PKT_FLAG_KEY);
yading@11 1058
yading@11 1059 preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
yading@11 1060
yading@11 1061 pts= pkt->pts;
yading@11 1062 dts= pkt->dts;
yading@11 1063
yading@11 1064 if (s->last_scr == AV_NOPTS_VALUE) {
yading@11 1065 if (dts == AV_NOPTS_VALUE || (dts < preload && ctx->avoid_negative_ts) || s->is_dvd) {
yading@11 1066 if (dts != AV_NOPTS_VALUE)
yading@11 1067 s->preload += av_rescale(-dts, AV_TIME_BASE, 90000);
yading@11 1068 s->last_scr = 0;
yading@11 1069 } else {
yading@11 1070 s->last_scr = dts - preload;
yading@11 1071 s->preload = 0;
yading@11 1072 }
yading@11 1073 preload = av_rescale(s->preload, 90000, AV_TIME_BASE);
yading@11 1074 av_log(ctx, AV_LOG_DEBUG, "First SCR: %"PRId64" First DTS: %"PRId64"\n", s->last_scr, dts + preload);
yading@11 1075 }
yading@11 1076
yading@11 1077 if (dts != AV_NOPTS_VALUE) dts += preload;
yading@11 1078 if (pts != AV_NOPTS_VALUE) pts += preload;
yading@11 1079
yading@11 1080 av_dlog(ctx, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n",
yading@11 1081 dts / 90000.0, pts / 90000.0, pkt->flags,
yading@11 1082 pkt->stream_index, pts != AV_NOPTS_VALUE);
yading@11 1083 if (!stream->premux_packet)
yading@11 1084 stream->next_packet = &stream->premux_packet;
yading@11 1085 *stream->next_packet=
yading@11 1086 pkt_desc= av_mallocz(sizeof(PacketDesc));
yading@11 1087 pkt_desc->pts= pts;
yading@11 1088 pkt_desc->dts= dts;
yading@11 1089 pkt_desc->unwritten_size=
yading@11 1090 pkt_desc->size= size;
yading@11 1091 if(!stream->predecode_packet)
yading@11 1092 stream->predecode_packet= pkt_desc;
yading@11 1093 stream->next_packet= &pkt_desc->next;
yading@11 1094
yading@11 1095 if (av_fifo_realloc2(stream->fifo, av_fifo_size(stream->fifo) + size) < 0)
yading@11 1096 return -1;
yading@11 1097
yading@11 1098 if (s->is_dvd){
yading@11 1099 if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
yading@11 1100 stream->bytes_to_iframe = av_fifo_size(stream->fifo);
yading@11 1101 stream->align_iframe = 1;
yading@11 1102 stream->vobu_start_pts = pts;
yading@11 1103 }
yading@11 1104 }
yading@11 1105
yading@11 1106 av_fifo_generic_write(stream->fifo, buf, size, NULL);
yading@11 1107
yading@11 1108 for(;;){
yading@11 1109 int ret= output_packet(ctx, 0);
yading@11 1110 if(ret<=0)
yading@11 1111 return ret;
yading@11 1112 }
yading@11 1113 }
yading@11 1114
yading@11 1115 static int mpeg_mux_end(AVFormatContext *ctx)
yading@11 1116 {
yading@11 1117 // MpegMuxContext *s = ctx->priv_data;
yading@11 1118 StreamInfo *stream;
yading@11 1119 int i;
yading@11 1120
yading@11 1121 for(;;){
yading@11 1122 int ret= output_packet(ctx, 1);
yading@11 1123 if(ret<0)
yading@11 1124 return ret;
yading@11 1125 else if(ret==0)
yading@11 1126 break;
yading@11 1127 }
yading@11 1128
yading@11 1129 /* End header according to MPEG1 systems standard. We do not write
yading@11 1130 it as it is usually not needed by decoders and because it
yading@11 1131 complicates MPEG stream concatenation. */
yading@11 1132 //avio_wb32(ctx->pb, ISO_11172_END_CODE);
yading@11 1133 //avio_flush(ctx->pb);
yading@11 1134
yading@11 1135 for(i=0;i<ctx->nb_streams;i++) {
yading@11 1136 stream = ctx->streams[i]->priv_data;
yading@11 1137
yading@11 1138 assert(av_fifo_size(stream->fifo) == 0);
yading@11 1139 av_fifo_free(stream->fifo);
yading@11 1140 }
yading@11 1141 return 0;
yading@11 1142 }
yading@11 1143
yading@11 1144 #define OFFSET(x) offsetof(MpegMuxContext, x)
yading@11 1145 #define E AV_OPT_FLAG_ENCODING_PARAM
yading@11 1146 static const AVOption options[] = {
yading@11 1147 { "muxrate", NULL, OFFSET(user_mux_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
yading@11 1148 { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload), AV_OPT_TYPE_INT, {.i64 = 500000}, 0, INT_MAX, E},
yading@11 1149 { NULL },
yading@11 1150 };
yading@11 1151
yading@11 1152 #define MPEGENC_CLASS(flavor)\
yading@11 1153 static const AVClass flavor ## _class = {\
yading@11 1154 .class_name = #flavor " muxer",\
yading@11 1155 .item_name = av_default_item_name,\
yading@11 1156 .version = LIBAVUTIL_VERSION_INT,\
yading@11 1157 .option = options,\
yading@11 1158 };
yading@11 1159
yading@11 1160 #if CONFIG_MPEG1SYSTEM_MUXER
yading@11 1161 MPEGENC_CLASS(mpeg)
yading@11 1162 AVOutputFormat ff_mpeg1system_muxer = {
yading@11 1163 .name = "mpeg",
yading@11 1164 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream"),
yading@11 1165 .mime_type = "video/mpeg",
yading@11 1166 .extensions = "mpg,mpeg",
yading@11 1167 .priv_data_size = sizeof(MpegMuxContext),
yading@11 1168 .audio_codec = AV_CODEC_ID_MP2,
yading@11 1169 .video_codec = AV_CODEC_ID_MPEG1VIDEO,
yading@11 1170 .write_header = mpeg_mux_init,
yading@11 1171 .write_packet = mpeg_mux_write_packet,
yading@11 1172 .write_trailer = mpeg_mux_end,
yading@11 1173 .priv_class = &mpeg_class,
yading@11 1174 };
yading@11 1175 #endif
yading@11 1176 #if CONFIG_MPEG1VCD_MUXER
yading@11 1177 MPEGENC_CLASS(vcd)
yading@11 1178 AVOutputFormat ff_mpeg1vcd_muxer = {
yading@11 1179 .name = "vcd",
yading@11 1180 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 Systems / MPEG program stream (VCD)"),
yading@11 1181 .mime_type = "video/mpeg",
yading@11 1182 .priv_data_size = sizeof(MpegMuxContext),
yading@11 1183 .audio_codec = AV_CODEC_ID_MP2,
yading@11 1184 .video_codec = AV_CODEC_ID_MPEG1VIDEO,
yading@11 1185 .write_header = mpeg_mux_init,
yading@11 1186 .write_packet = mpeg_mux_write_packet,
yading@11 1187 .write_trailer = mpeg_mux_end,
yading@11 1188 .priv_class = &vcd_class,
yading@11 1189 };
yading@11 1190 #endif
yading@11 1191 #if CONFIG_MPEG2VOB_MUXER
yading@11 1192 MPEGENC_CLASS(vob)
yading@11 1193 AVOutputFormat ff_mpeg2vob_muxer = {
yading@11 1194 .name = "vob",
yading@11 1195 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (VOB)"),
yading@11 1196 .mime_type = "video/mpeg",
yading@11 1197 .extensions = "vob",
yading@11 1198 .priv_data_size = sizeof(MpegMuxContext),
yading@11 1199 .audio_codec = AV_CODEC_ID_MP2,
yading@11 1200 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
yading@11 1201 .write_header = mpeg_mux_init,
yading@11 1202 .write_packet = mpeg_mux_write_packet,
yading@11 1203 .write_trailer = mpeg_mux_end,
yading@11 1204 .priv_class = &vob_class,
yading@11 1205 };
yading@11 1206 #endif
yading@11 1207
yading@11 1208 /* Same as mpeg2vob_mux except that the pack size is 2324 */
yading@11 1209 #if CONFIG_MPEG2SVCD_MUXER
yading@11 1210 MPEGENC_CLASS(svcd)
yading@11 1211 AVOutputFormat ff_mpeg2svcd_muxer = {
yading@11 1212 .name = "svcd",
yading@11 1213 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (SVCD)"),
yading@11 1214 .mime_type = "video/mpeg",
yading@11 1215 .extensions = "vob",
yading@11 1216 .priv_data_size = sizeof(MpegMuxContext),
yading@11 1217 .audio_codec = AV_CODEC_ID_MP2,
yading@11 1218 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
yading@11 1219 .write_header = mpeg_mux_init,
yading@11 1220 .write_packet = mpeg_mux_write_packet,
yading@11 1221 .write_trailer = mpeg_mux_end,
yading@11 1222 .priv_class = &svcd_class,
yading@11 1223 };
yading@11 1224 #endif
yading@11 1225
yading@11 1226 /* Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
yading@11 1227 #if CONFIG_MPEG2DVD_MUXER
yading@11 1228 MPEGENC_CLASS(dvd)
yading@11 1229 AVOutputFormat ff_mpeg2dvd_muxer = {
yading@11 1230 .name = "dvd",
yading@11 1231 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 PS (DVD VOB)"),
yading@11 1232 .mime_type = "video/mpeg",
yading@11 1233 .extensions = "dvd",
yading@11 1234 .priv_data_size = sizeof(MpegMuxContext),
yading@11 1235 .audio_codec = AV_CODEC_ID_MP2,
yading@11 1236 .video_codec = AV_CODEC_ID_MPEG2VIDEO,
yading@11 1237 .write_header = mpeg_mux_init,
yading@11 1238 .write_packet = mpeg_mux_write_packet,
yading@11 1239 .write_trailer = mpeg_mux_end,
yading@11 1240 .priv_class = &dvd_class,
yading@11 1241 };
yading@11 1242 #endif