Message ID | 20181019025821.23120-1-leo.izen@gmail.com |
---|---|
State | Superseded |
Headers | show |
2018-10-19 4:58 GMT+02:00, Leo Izen <leo.izen@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
On 10/19/18 2:26 PM, Carl Eugen Hoyos wrote: > 2018-10-19 4:58 GMT+02:00, Leo Izen <leo.izen@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. Leo Izen
2018-10-19 20:39 GMT+02:00, Leo Izen <leo.izen@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@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
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;