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

Michael Niedermayer michael at niedermayer.cc
Sun Oct 21 01:47:15 EEST 2018


On Fri, Oct 19, 2018 at 07:29:28PM -0400, Leo Izen wrote:
> 
> On 10/19/18 3:02 PM, Carl Eugen Hoyos wrote:
> >2018-10-19 20:39 GMT+02:00, Leo Izen <leo.izen at gmail.com>:
> >>On 10/19/18 2:26 PM, Carl Eugen Hoyos wrote:
> >>>2018-10-19 4:58 GMT+02:00, Leo Izen <leo.izen at gmail.com>:
> >>>>---
> >>>>   fftools/ffmpeg.c | 8 +++++---
> >>>>   1 file changed, 5 insertions(+), 3 deletions(-)
> >>>>
> >>>>diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> >>>>index da4259a9a8..5d68194676 100644
> >>>>--- a/fftools/ffmpeg.c
> >>>>+++ b/fftools/ffmpeg.c
> >>>>@@ -2045,12 +2045,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);
> >>>>@@ -2602,7 +2604,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;
> >>>How can this be tested?
> >>>
> >>>Carl Eugen
> >>I'm not entirely sure. I ran "make fate" and it passed, and I
> >>successfully rescaled a 30fps clip to 15fps, 20fps, 45fps, and 60fps
> >>using -r:v as an input option. I'm not entirely sure what the standard
> >>procedure is for performing more rigorous tests.
> >What I meant was:
> >Which kind of input and output did you use to test your patch?
> >
> >Carl Eugen
> >_______________________________________________
> 
> It worked perfectly at various framerates for AVI files. It also worked in
> practice for MP4 and Matroska files, although my patch doesn't properly set
> the avg_frame_rate and r_frame_rate of the output stream. Intelligent
> players like MPV play it fine and ignore the incorrect *_frame_rate
> metadata. Anyway, here's an updated patch that fixes that problem so it
> shouldn't be an issue.
> 
> Leo Izen
> 
> ---

>  fftools/ffmpeg.c | 19 ++++++++++++++-----
>  1 file changed, 14 insertions(+), 5 deletions(-)
> 
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index da4259a9a8..6e81716795 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -2045,12 +2045,14 @@ static void do_streamcopy(InputStream *ist,
> OutputStream *ost, const AVPacket *p

This will not apply as it has too many newlines

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In a rich man's house there is no place to spit but his face.
-- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20181021/42ccc713/attachment.sig>


More information about the ffmpeg-devel mailing list