diff mbox

[FFmpeg-devel] fftools/ffmpeg.c: allow forcing input framerate on streamcopy

Message ID 44e96185-16ff-d9fc-feb9-15353bb253e8@gmail.com
State New
Headers show

Commit Message

Leo Izen April 1, 2019, 3:12 p.m. UTC
Bumping this? I'd like to request a review because I think being able to 
set the input framerate on streamcopy is worthwhile. In case of 
formatting issues with the reply email, I've attached the patch file as 
well.

In terms of testing, I've tested this with various input formats 
(matroska, mp4, avi, nut) and various output formats as well, both 
shrinking and growing the framerate.

On 1/9/19 5:26 PM, Leo Izen wrote:
> ---
>   fftools/ffmpeg.c | 19 ++++++++++++++-----
>   1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 544f1a1cef..f4bd5d97b7 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -2038,12 +2038,14 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
>       if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
>           ost->sync_opts++;
>   
> -    if (pkt->pts != AV_NOPTS_VALUE)
> +    if (ist->framerate.num)
> +        opkt.pts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->mux_timebase) - ost_tb_start_time;
> +    else if (pkt->pts != AV_NOPTS_VALUE)
>           opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time;
>       else
>           opkt.pts = AV_NOPTS_VALUE;
>   
> -    if (pkt->dts == AV_NOPTS_VALUE)
> +    if (pkt->dts == AV_NOPTS_VALUE || ist->framerate.num)
>           opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase);
>       else
>           opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase);
> @@ -2597,7 +2599,7 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
>           avpkt = *pkt;
>       }
>   
> -    if (pkt && pkt->dts != AV_NOPTS_VALUE) {
> +    if (pkt && pkt->dts != AV_NOPTS_VALUE && !ist->framerate.num) {
>           ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
>           if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
>               ist->next_pts = ist->pts = ist->dts;
> @@ -3153,8 +3155,15 @@ static int init_output_stream_streamcopy(OutputStream *ost)
>           else
>               sar = par_src->sample_aspect_ratio;
>           ost->st->sample_aspect_ratio = par_dst->sample_aspect_ratio = sar;
> -        ost->st->avg_frame_rate = ist->st->avg_frame_rate;
> -        ost->st->r_frame_rate = ist->st->r_frame_rate;
> +
> +        if (ist->framerate.num) {
> +            ost->st->avg_frame_rate = ist->framerate;
> +            ost->st->r_frame_rate = ist->framerate;
> +        } else {
> +            ost->st->avg_frame_rate = ist->st->avg_frame_rate;
> +            ost->st->r_frame_rate = ist->st->r_frame_rate;
> +        }
> +
>           break;
>       }
>
diff mbox

Patch

From 8338eb06ceb8e8f954a5e0740751106fb1f9ab44 Mon Sep 17 00:00:00 2001
From: Leo Izen <leo.izen@gmail.com>
Date: Fri, 19 Oct 2018 19:26:41 -0400
Subject: [PATCH] fftools/ffmpeg.c: allow forcing input framerate on streamcopy

---
 fftools/ffmpeg.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 544f1a1cef..f4bd5d97b7 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -2038,12 +2038,14 @@  static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
     if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
         ost->sync_opts++;
 
-    if (pkt->pts != AV_NOPTS_VALUE)
+    if (ist->framerate.num)
+        opkt.pts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->mux_timebase) - ost_tb_start_time;
+    else if (pkt->pts != AV_NOPTS_VALUE)
         opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time;
     else
         opkt.pts = AV_NOPTS_VALUE;
 
-    if (pkt->dts == AV_NOPTS_VALUE)
+    if (pkt->dts == AV_NOPTS_VALUE || ist->framerate.num)
         opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase);
     else
         opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase);
@@ -2597,7 +2599,7 @@  static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
         avpkt = *pkt;
     }
 
-    if (pkt && pkt->dts != AV_NOPTS_VALUE) {
+    if (pkt && pkt->dts != AV_NOPTS_VALUE && !ist->framerate.num) {
         ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
         if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
             ist->next_pts = ist->pts = ist->dts;
@@ -3153,8 +3155,15 @@  static int init_output_stream_streamcopy(OutputStream *ost)
         else
             sar = par_src->sample_aspect_ratio;
         ost->st->sample_aspect_ratio = par_dst->sample_aspect_ratio = sar;
-        ost->st->avg_frame_rate = ist->st->avg_frame_rate;
-        ost->st->r_frame_rate = ist->st->r_frame_rate;
+
+        if (ist->framerate.num) {
+            ost->st->avg_frame_rate = ist->framerate;
+            ost->st->r_frame_rate = ist->framerate;
+        } else {
+            ost->st->avg_frame_rate = ist->st->avg_frame_rate;
+            ost->st->r_frame_rate = ist->st->r_frame_rate;
+        }
+
         break;
     }
 
-- 
2.20.1