avconv: allow -b to be used with streamcopy
authorAnton Khirnov <anton@khirnov.net>
Mon, 30 Jan 2017 20:35:42 +0000 (21:35 +0100)
committerAnton Khirnov <anton@khirnov.net>
Wed, 1 Feb 2017 09:42:59 +0000 (10:42 +0100)
In this mode it tells the muxer about the bitrate of the input stream.

avconv.c
avconv.h
avconv_opt.c
doc/avconv.texi

index fe60625..94b6da2 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -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));
index 6360f76..3c3f0ef 100644 (file)
--- a/avconv.h
+++ b/avconv.h
@@ -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;
 
index 8b43f0f..e078a0b 100644 (file)
@@ -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) },
index 002dba3..6f1fbc7 100644 (file)
@@ -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