[FFmpeg-devel] [PATCH] fftools/ffmpeg: Disable copy_ts on timestamp wraparound

Aleksey Skripka caspy at undev.ru
Thu Oct 10 13:37:50 EEST 2019


Greetings!

Michael,
patch works good for mpegts input, 

but for hls input it works only if add AVFMT_TS_DISCONT to .flags in ff_hls_demuxer structure (libavformat/hls.c).
Is it right way?


> On 3 May 2019, at 18:36, Michael Niedermayer <michael at niedermayer.cc> wrote:
> 
> This allows handling more than 26.5h of mpeg* input
> 
> Fixes: Ticket 7876
> 
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
> fftools/ffmpeg.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 01f04103cf..b58336679d 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -4262,6 +4262,7 @@ static int process_input(int file_index)
>     int ret, thread_ret, i, j;
>     int64_t duration;
>     int64_t pkt_dts;
> +    int disable_discontinuity_correction = copy_ts;
> 
>     is  = ifile->ctx;
>     ret = get_input_packet(ifile, &pkt);
> @@ -4463,10 +4464,20 @@ static int process_input(int file_index)
>         pkt.dts += duration;
> 
>     pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
> +
> +    if (copy_ts && pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
> +        (is->iformat->flags & AVFMT_TS_DISCONT) && ist->st->pts_wrap_bits < 60) {
> +        int64_t wrap_dts = av_rescale_q_rnd(pkt.dts + (1LL<<ist->st->pts_wrap_bits),
> +                                            ist->st->time_base, AV_TIME_BASE_Q,
> +                                            AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
> +        if (FFABS(wrap_dts - ist->next_dts) < FFABS(pkt_dts - ist->next_dts)/10)
> +            disable_discontinuity_correction = 0;
> +    }
> +
>     if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
>          ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
>          pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
> -        !copy_ts) {
> +        !disable_discontinuity_correction) {
>         int64_t delta   = pkt_dts - ist->next_dts;
>         if (is->iformat->flags & AVFMT_TS_DISCONT) {
>             if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
> -- 
> 2.21.0
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list