[2/7] avconv: Forward the input average framerate to the encoders

Message ID 20180216170209.52876-3-lu_zero@gentoo.org
State New
Headers show
Series
  • [1/7] avcodec: Always fill the encoder target framerate
Related show

Commit Message

Luca Barbato Feb. 16, 2018, 5:02 p.m.
So it can be used by the rate control as a better estimate of it.
Before the time_base was used and that confused some rate-control
algorithms or cause setup failures in some of the encoders.
---
 avtools/avconv.c     |  7 +++++--
 avtools/avconv.h     |  2 ++
 avtools/avconv_opt.c | 10 ++++++++--
 3 files changed, 15 insertions(+), 4 deletions(-)

Comments

Diego Biurrun Feb. 16, 2018, 5:28 p.m. | #1
On Fri, Feb 16, 2018 at 06:02:04PM +0100, Luca Barbato wrote:
> So it can be used by the rate control as a better estimate of it.
> Before the time_base was used and that confused some rate-control
> algorithms or cause setup failures in some of the encoders.

cause_d

No opinion on the patch itself.

Diego

Patch

diff --git a/avtools/avconv.c b/avtools/avconv.c
index ac15464a8d..282cc7ef3d 100644
--- a/avtools/avconv.c
+++ b/avtools/avconv.c
@@ -2045,9 +2045,12 @@  static int init_output_stream_encode(OutputStream *ost)
             ost->filter->filter->inputs[0]->sample_aspect_ratio;
         enc_ctx->pix_fmt = ost->filter->filter->inputs[0]->format;
 
-        enc_ctx->framerate = ost->frame_rate;
+        enc_ctx->framerate = ost->avg_frame_rate;
 
-        ost->st->avg_frame_rate = ost->frame_rate;
+        if (ost->frame_rate.num)
+            ost->st->avg_frame_rate = ost->frame_rate;
+        else
+            ost->st->avg_frame_rate = ost->avg_frame_rate;
 
         if (dec_ctx &&
             (enc_ctx->width   != dec_ctx->width  ||
diff --git a/avtools/avconv.h b/avtools/avconv.h
index 0d24c71a74..b8e2fecac8 100644
--- a/avtools/avconv.h
+++ b/avtools/avconv.h
@@ -378,6 +378,8 @@  typedef struct OutputStream {
 
     /* video only */
     AVRational frame_rate;
+    /* rate-control hint */
+    AVRational avg_frame_rate;
     int force_fps;
     int top_field_first;
 
diff --git a/avtools/avconv_opt.c b/avtools/avconv_opt.c
index a4a225c3e9..1d6d2abaa0 100644
--- a/avtools/avconv_opt.c
+++ b/avtools/avconv_opt.c
@@ -1853,6 +1853,7 @@  loop_end:
          * in such a case, set ost->frame_rate
          */
         if (ost->encoding_needed && ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+            InputStream *ist = ost->source_index >= 0 ? input_streams[ost->source_index] : NULL;
             int format_cfr = !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS));
             int need_cfr = !!ost->frame_rate.num;
 
@@ -1861,8 +1862,6 @@  loop_end:
                 need_cfr = 1;
 
             if (need_cfr && !ost->frame_rate.num) {
-                InputStream *ist = ost->source_index >= 0 ? input_streams[ost->source_index] : NULL;
-
                 if (ist && ist->framerate.num)
                     ost->frame_rate = ist->framerate;
                 else if (ist && ist->st->avg_frame_rate.num)
@@ -1882,6 +1881,13 @@  loop_end:
                 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
                 ost->frame_rate = ost->enc->supported_framerates[idx];
             }
+
+            if (ost->frame_rate.num)
+                ost->avg_frame_rate = ost->frame_rate;
+            else if (ist && ist->framerate.num)
+                ost->avg_frame_rate = ist->framerate;
+            else if (ist && ist->st->avg_frame_rate.num)
+                ost->avg_frame_rate = ist->st->avg_frame_rate;
         }
 
         /* set the filter output constraints */