From 2db3c638a753b74bbb67fe3e2f639620a91fb667 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 6 Oct 2004 22:29:30 +0000 Subject: [PATCH] user selectable packet_size and mux_rate Originally committed as revision 3566 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 15 +++++++++++++++ libavformat/avformat.h | 3 +++ libavformat/mpeg.c | 26 +++++++++++++++----------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 4cca20ec0a..6af03b264e 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -200,6 +200,9 @@ static int audio_disable = 0; static int audio_channels = 1; static int audio_codec_id = CODEC_ID_NONE; +static int mux_rate= 0; +static int mux_packet_size= 0; + static int64_t recording_time = 0; static int64_t start_time = 0; static int64_t rec_timestamp = 0; @@ -3290,6 +3293,9 @@ static void opt_output_file(const char *filename) exit(1); } + oc->packet_size= mux_packet_size; + oc->mux_rate= mux_rate; + /* reset some options */ file_oformat = NULL; file_iformat = NULL; @@ -3649,6 +3655,9 @@ static void opt_target(const char *arg) audio_bit_rate = 224000; audio_sample_rate = 44100; + + mux_packet_size= 2324; + mux_rate= 2352 * 75 * 8; } else if(!strcmp(arg, "svcd")) { @@ -3668,6 +3677,8 @@ static void opt_target(const char *arg) audio_bit_rate = 224000; audio_sample_rate = 44100; + mux_packet_size= 2324; + } else if(!strcmp(arg, "dvd")) { opt_video_codec("mpeg2video"); @@ -3865,6 +3876,10 @@ const OptionDef options[] = { { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" }, { "dv1394", OPT_EXPERT | OPT_GRAB, {(void*)opt_dv1394}, "set DV1394 grab", "" }, { "ad", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_GRAB, {(void*)opt_audio_device}, "set audio device", "device" }, + + /* muxer options */ + { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" }, + { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" }, { NULL, }, }; diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a4793a7ca7..4994b6ac78 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -302,6 +302,9 @@ typedef struct AVFormatContext { /* av_seek_frame() support */ int64_t data_offset; /* offset of the first packet */ int index_built; + + int mux_rate; + int packet_size; } AVFormatContext; typedef struct AVPacketList { diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 4ee74cdc1a..4f8d20dc6a 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -256,11 +256,11 @@ static int mpeg_mux_init(AVFormatContext *ctx) s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux); s->is_dvd = (ctx->oformat == &mpeg2dvd_mux); - if (s->is_vcd || s->is_svcd) - s->packet_size = 2324; /* VCD/SVCD packet size */ + if(ctx->packet_size) + s->packet_size = ctx->packet_size; else s->packet_size = 2048; - + s->vcd_padding_bytes_written = 0; s->vcd_padding_bitrate=0; @@ -354,6 +354,16 @@ static int mpeg_mux_init(AVFormatContext *ctx) else if (stream->id==VIDEO_ID) video_bitrate += codec_rate; } + + if(ctx->mux_rate){ + s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50); + } else { + /* we increase slightly the bitrate to take into account the + headers. XXX: compute it exactly */ + bitrate += bitrate*5/100; + bitrate += 10000; + s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); + } if (s->is_vcd) { double overhead_rate; @@ -365,7 +375,7 @@ static int mpeg_mux_init(AVFormatContext *ctx) rate you get a different value because the real pack size is 2324, not 2352. But the standard explicitly specifies that the mux_rate field in the header must have this value.*/ - s->mux_rate=2352 * 75 / 50; /* = 3528*/ +// s->mux_rate=2352 * 75 / 50; /* = 3528*/ /* The VCD standard states that the muxed stream must be exactly 75 packs / second (the data rate of a single speed cdrom). @@ -382,13 +392,6 @@ static int mpeg_mux_init(AVFormatContext *ctx) /* Add padding so that the full bitrate is 2324*75 bytes/sec */ s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate); - - } else { - /* we increase slightly the bitrate to take into account the - headers. XXX: compute it exactly */ - bitrate += bitrate*5/100; - bitrate += 10000; - s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50); } if (s->is_vcd || s->is_mpeg2) @@ -972,6 +975,7 @@ retry: } if(timestamp_packet){ +//av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f scr:%f stream:%d\n", timestamp_packet->dts/90000.0, timestamp_packet->pts/90000.0, scr/90000.0, best_i); es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size); }else{ assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);