diff mbox series

[FFmpeg-devel,2/4,v2] ffmpeg: move AVFrame time base adjustment into a function

Message ID 20200913213113.247047-1-jeebjp@gmail.com
State Superseded
Headers show
Series None | expand

Commit Message

Jan Ekström Sept. 13, 2020, 9:31 p.m. UTC
This will have to be called later for video down the line.
---
 fftools/ffmpeg.c | 69 ++++++++++++++++++++++++++++++------------------
 1 file changed, 44 insertions(+), 25 deletions(-)

Comments

Jan Ekström Sept. 14, 2020, 8:08 p.m. UTC | #1
On Mon, Sep 14, 2020 at 12:31 AM Jan Ekström <jeebjp@gmail.com> wrote:
>

Diff between v1 and v2 follows:

- Forgotten to be removed debug logs removed.
- Still log debug_ts even in case of nullptr AVFrame or AV_NOPTS_VALUE.

Decided against separating the logging because this way it's a
self-contained package and the goto lets us do an early exit.

Jan

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 5425ba245d..8874da9268 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -900,11 +900,11 @@ static int check_recording_time(OutputStream *ost)
 static double adjust_frame_pts_to_encoder_tb(OutputFile *of, OutputStream *ost,
                                              AVFrame *frame)
 {
+    double float_pts = AV_NOPTS_VALUE; // this is identical to
frame.pts but with higher precision
     if (!frame || frame->pts == AV_NOPTS_VALUE ||
         !ost->filter || !ost->filter->graph->graph)
-        return AV_NOPTS_VALUE;
+        goto early_exit;

-    double float_pts = AV_NOPTS_VALUE; // this is identical to
frame.pts but with higher precision
     AVFilterContext *filter = ost->filter->filter;
     AVCodecContext *enc = ost->enc_ctx;

@@ -914,13 +914,6 @@ static double
adjust_frame_pts_to_encoder_tb(OutputFile *of, OutputStream *ost,
     int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);

     tb.den <<= extra_bits;
-    av_log(NULL, AV_LOG_VERBOSE,
-           "%s: frame pts: %"PRId64" start_time: %"PRId64", "
-           "filter_tb: %d/%d, tb: %d/%d\n",
-           __FUNCTION__, frame->pts, start_time,
-           filter_tb.num, filter_tb.den,
-           tb.num, tb.den);
-
     float_pts =
         av_rescale_q(frame->pts, filter_tb, tb) -
         av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
@@ -932,15 +925,14 @@ static double
adjust_frame_pts_to_encoder_tb(OutputFile *of, OutputStream *ost,
         av_rescale_q(frame->pts, filter_tb, enc->time_base) -
         av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);

-    av_log(NULL, AV_LOG_VERBOSE,
-           "%s: post-adjustment PTS: %"PRId64"\n",
-           __FUNCTION__, frame->pts);
+early_exit:

     if (debug_ts) {
         av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s
exact:%f time_base:%d/%d\n",
-                av_ts2str(frame->pts), av_ts2timestr(frame->pts,
&enc->time_base),
-                float_pts,
-                enc->time_base.num, enc->time_base.den);
+               frame ? av_ts2str(frame->pts) : "NULL",
+               frame ? av_ts2timestr(frame->pts, &enc->time_base) : "NULL",
+               float_pts,
+               enc->time_base.num, enc->time_base.den);
     }

     return float_pts;
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index cb7644de6a..54802a8ec3 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -897,6 +897,47 @@  static int check_recording_time(OutputStream *ost)
     return 1;
 }
 
+static double adjust_frame_pts_to_encoder_tb(OutputFile *of, OutputStream *ost,
+                                             AVFrame *frame)
+{
+    double float_pts = AV_NOPTS_VALUE; // this is identical to frame.pts but with higher precision
+    if (!frame || frame->pts == AV_NOPTS_VALUE ||
+        !ost->filter || !ost->filter->graph->graph)
+        goto early_exit;
+
+    AVFilterContext *filter = ost->filter->filter;
+    AVCodecContext *enc = ost->enc_ctx;
+
+    int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
+    AVRational filter_tb = av_buffersink_get_time_base(filter);
+    AVRational tb = enc->time_base;
+    int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);
+
+    tb.den <<= extra_bits;
+    float_pts =
+        av_rescale_q(frame->pts, filter_tb, tb) -
+        av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
+    float_pts /= 1 << extra_bits;
+    // avoid exact midoints to reduce the chance of rounding differences, this can be removed in case the fps code is changed to work with integers
+    float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
+
+    frame->pts =
+        av_rescale_q(frame->pts, filter_tb, enc->time_base) -
+        av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
+
+early_exit:
+
+    if (debug_ts) {
+        av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n",
+               frame ? av_ts2str(frame->pts) : "NULL",
+               frame ? av_ts2timestr(frame->pts, &enc->time_base) : "NULL",
+               float_pts,
+               enc->time_base.num, enc->time_base.den);
+    }
+
+    return float_pts;
+}
+
 static void do_audio_out(OutputFile *of, OutputStream *ost,
                          AVFrame *frame)
 {
@@ -1473,37 +1514,15 @@  static int reap_filters(int flush)
                 av_frame_unref(filtered_frame);
                 continue;
             }
-            if (filtered_frame->pts != AV_NOPTS_VALUE) {
-                int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
-                AVRational filter_tb = av_buffersink_get_time_base(filter);
-                AVRational tb = enc->time_base;
-                int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);
-
-                tb.den <<= extra_bits;
-                float_pts =
-                    av_rescale_q(filtered_frame->pts, filter_tb, tb) -
-                    av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
-                float_pts /= 1 << extra_bits;
-                // avoid exact midoints to reduce the chance of rounding differences, this can be removed in case the fps code is changed to work with integers
-                float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
-
-                filtered_frame->pts =
-                    av_rescale_q(filtered_frame->pts, filter_tb, enc->time_base) -
-                    av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
-            }
+
+            float_pts = adjust_frame_pts_to_encoder_tb(of, ost,
+                                                       filtered_frame);
 
             switch (av_buffersink_get_type(filter)) {
             case AVMEDIA_TYPE_VIDEO:
                 if (!ost->frame_aspect_ratio.num)
                     enc->sample_aspect_ratio = filtered_frame->sample_aspect_ratio;
 
-                if (debug_ts) {
-                    av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n",
-                            av_ts2str(filtered_frame->pts), av_ts2timestr(filtered_frame->pts, &enc->time_base),
-                            float_pts,
-                            enc->time_base.num, enc->time_base.den);
-                }
-
                 do_video_out(of, ost, filtered_frame, float_pts);
                 break;
             case AVMEDIA_TYPE_AUDIO: