aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-10-06 22:29:30 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-10-06 22:29:30 +0000
commit2db3c638a753b74bbb67fe3e2f639620a91fb667 (patch)
tree128e0c6d5eee68fba6570559f9abae1ab654a22b
parentca37721277fef7167fbc3545d93faefb0b6566b2 (diff)
downloadffmpeg-2db3c638a753b74bbb67fe3e2f639620a91fb667.tar.gz
user selectable packet_size and mux_rate
Originally committed as revision 3566 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--ffmpeg.c15
-rw-r--r--libavformat/avformat.h3
-rw-r--r--libavformat/mpeg.c26
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);