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

Leo Izen leo.izen at gmail.com
Mon Apr 1 18:12:23 EEST 2019


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;
>       }
>   
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-fftools-ffmpeg.c-allow-forcing-input-framerate-on-st.patch
Type: text/x-patch
Size: 2429 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190401/8466317c/attachment.bin>


More information about the ffmpeg-devel mailing list