user selectable packet_size and mux_rate
Originally committed as revision 3566 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
ca37721277
commit
2db3c638a7
15
ffmpeg.c
15
ffmpeg.c
@ -200,6 +200,9 @@ static int audio_disable = 0;
|
|||||||
static int audio_channels = 1;
|
static int audio_channels = 1;
|
||||||
static int audio_codec_id = CODEC_ID_NONE;
|
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 recording_time = 0;
|
||||||
static int64_t start_time = 0;
|
static int64_t start_time = 0;
|
||||||
static int64_t rec_timestamp = 0;
|
static int64_t rec_timestamp = 0;
|
||||||
@ -3290,6 +3293,9 @@ static void opt_output_file(const char *filename)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oc->packet_size= mux_packet_size;
|
||||||
|
oc->mux_rate= mux_rate;
|
||||||
|
|
||||||
/* reset some options */
|
/* reset some options */
|
||||||
file_oformat = NULL;
|
file_oformat = NULL;
|
||||||
file_iformat = NULL;
|
file_iformat = NULL;
|
||||||
@ -3650,6 +3656,9 @@ static void opt_target(const char *arg)
|
|||||||
audio_bit_rate = 224000;
|
audio_bit_rate = 224000;
|
||||||
audio_sample_rate = 44100;
|
audio_sample_rate = 44100;
|
||||||
|
|
||||||
|
mux_packet_size= 2324;
|
||||||
|
mux_rate= 2352 * 75 * 8;
|
||||||
|
|
||||||
} else if(!strcmp(arg, "svcd")) {
|
} else if(!strcmp(arg, "svcd")) {
|
||||||
|
|
||||||
opt_video_codec("mpeg2video");
|
opt_video_codec("mpeg2video");
|
||||||
@ -3668,6 +3677,8 @@ static void opt_target(const char *arg)
|
|||||||
audio_bit_rate = 224000;
|
audio_bit_rate = 224000;
|
||||||
audio_sample_rate = 44100;
|
audio_sample_rate = 44100;
|
||||||
|
|
||||||
|
mux_packet_size= 2324;
|
||||||
|
|
||||||
} else if(!strcmp(arg, "dvd")) {
|
} else if(!strcmp(arg, "dvd")) {
|
||||||
|
|
||||||
opt_video_codec("mpeg2video");
|
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" },
|
{ "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", "" },
|
{ "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" },
|
{ "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, },
|
{ NULL, },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -302,6 +302,9 @@ typedef struct AVFormatContext {
|
|||||||
/* av_seek_frame() support */
|
/* av_seek_frame() support */
|
||||||
int64_t data_offset; /* offset of the first packet */
|
int64_t data_offset; /* offset of the first packet */
|
||||||
int index_built;
|
int index_built;
|
||||||
|
|
||||||
|
int mux_rate;
|
||||||
|
int packet_size;
|
||||||
} AVFormatContext;
|
} AVFormatContext;
|
||||||
|
|
||||||
typedef struct AVPacketList {
|
typedef struct AVPacketList {
|
||||||
|
@ -256,8 +256,8 @@ static int mpeg_mux_init(AVFormatContext *ctx)
|
|||||||
s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
|
s->is_mpeg2 = (ctx->oformat == &mpeg2vob_mux || ctx->oformat == &mpeg2svcd_mux || ctx->oformat == &mpeg2dvd_mux);
|
||||||
s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
|
s->is_dvd = (ctx->oformat == &mpeg2dvd_mux);
|
||||||
|
|
||||||
if (s->is_vcd || s->is_svcd)
|
if(ctx->packet_size)
|
||||||
s->packet_size = 2324; /* VCD/SVCD packet size */
|
s->packet_size = ctx->packet_size;
|
||||||
else
|
else
|
||||||
s->packet_size = 2048;
|
s->packet_size = 2048;
|
||||||
|
|
||||||
@ -355,6 +355,16 @@ static int mpeg_mux_init(AVFormatContext *ctx)
|
|||||||
video_bitrate += codec_rate;
|
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) {
|
if (s->is_vcd) {
|
||||||
double overhead_rate;
|
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,
|
rate you get a different value because the real pack size is 2324,
|
||||||
not 2352. But the standard explicitly specifies that the mux_rate
|
not 2352. But the standard explicitly specifies that the mux_rate
|
||||||
field in the header must have this value.*/
|
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
|
/* The VCD standard states that the muxed stream must be
|
||||||
exactly 75 packs / second (the data rate of a single speed cdrom).
|
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 */
|
/* Add padding so that the full bitrate is 2324*75 bytes/sec */
|
||||||
s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
|
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)
|
if (s->is_vcd || s->is_mpeg2)
|
||||||
@ -972,6 +975,7 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(timestamp_packet){
|
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);
|
es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
|
||||||
}else{
|
}else{
|
||||||
assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
|
assert(fifo_size(&stream->fifo, stream->fifo.rptr) == trailer_size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user