diff options
author | Anton Khirnov <anton@khirnov.net> | 2017-01-30 21:35:42 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2017-02-01 10:42:59 +0100 |
commit | b420a27e74750b60d2e064236afb10be06a38ace (patch) | |
tree | 77d7f6777d249ca8011f6eb030c5d43e893a02ad | |
parent | ab2539bd374fe7ddbc6e2f058b62645cd5076192 (diff) | |
download | ffmpeg-b420a27e74750b60d2e064236afb10be06a38ace.tar.gz |
avconv: allow -b to be used with streamcopy
In this mode it tells the muxer about the bitrate of the input stream.
-rw-r--r-- | avconv.c | 3 | ||||
-rw-r--r-- | avconv.h | 5 | ||||
-rw-r--r-- | avconv_opt.c | 11 | ||||
-rw-r--r-- | doc/avconv.texi | 7 |
4 files changed, 26 insertions, 0 deletions
@@ -1852,6 +1852,9 @@ static int init_output_stream_streamcopy(OutputStream *ost) ost->st->time_base = ist->st->time_base; + if (ost->bitrate_override) + par_dst->bit_rate = ost->bitrate_override; + if (ist->st->nb_side_data) { ost->st->side_data = av_realloc_array(NULL, ist->st->nb_side_data, sizeof(*ist->st->side_data)); @@ -162,6 +162,8 @@ typedef struct OptionsContext { int nb_sample_fmts; SpecifierOpt *qscale; int nb_qscale; + SpecifierOpt *bitrates; + int nb_bitrates; SpecifierOpt *forced_key_frames; int nb_forced_key_frames; SpecifierOpt *force_fps; @@ -382,6 +384,9 @@ typedef struct OutputStream { int forced_kf_index; char *forced_keyframes; + // the bitrate to send to the muxer for streamcopy + int bitrate_override; + char *logfile_prefix; FILE *logfile; diff --git a/avconv_opt.c b/avconv_opt.c index 8b43f0f4e2..e078a0b89d 100644 --- a/avconv_opt.c +++ b/avconv_opt.c @@ -952,6 +952,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e const char *bsfs = NULL; char *next, *codec_tag = NULL; double qscale = -1; + int bitrate = 0; if (!st) { av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n"); @@ -1091,6 +1092,14 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale; } + MATCH_PER_STREAM_OPT(bitrates, i, bitrate, oc, st); + if (bitrate > 0) { + if (ost->stream_copy) + ost->bitrate_override = bitrate; + else + ost->enc_ctx->bit_rate = bitrate; + } + ost->max_muxing_queue_size = 128; MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st); ost->max_muxing_queue_size *= sizeof(AVPacket); @@ -2570,6 +2579,8 @@ const OptionDef options[] = { { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) }, "use fixed quality scale (VBR)", "q" }, + { "b", HAS_ARG | OPT_INT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(bitrates) }, + "set stream bitrate in bits/second", "bitrate" }, { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) }, "set stream filterchain", "filter_list" }, { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) }, diff --git a/doc/avconv.texi b/doc/avconv.texi index 002dba3184..6f1fbc79b2 100644 --- a/doc/avconv.texi +++ b/doc/avconv.texi @@ -354,6 +354,13 @@ Stop writing to the stream after @var{framecount} frames. Use fixed quality scale (VBR). The meaning of @var{q} is codec-dependent. +@item -b[:@var{stream_specifier}] @var{bitrate} (@emph{output,per-stream}) +Set the stream bitrate in bits per second. When transcoding, this tells the +encoder to use the specified bitrate for the encoded stream. + +For streamcopy, this provides a hint to the muxer about the bitrate of the input +stream. + @item -filter[:@var{stream_specifier}] @var{filter_graph} (@emph{output,per-stream}) @var{filter_graph} is a description of the filter graph to apply to the stream. Use @code{-filters} to show all the available filters |