diff mbox

[FFmpeg-devel] avformat/hls: Set AVFMT_TS_DISCONT flag on HLS input format

Message ID 20191027183908.15436-1-philipl@overt.org
State New
Headers show

Commit Message

Philip Langdale Oct. 27, 2019, 6:39 p.m. UTC
There have been many reports over the years about problems when
taking an HLS stream as input to `ffmpeg` where there are timestamp
discontinuities present. This is explicitly supported in the
HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.

Various fixes and work-arounds have been proposed over the years,
but one step that seems obvious, even if it's not a complete fix,
is to mark the HLS input format as supporting discontinuities. This
will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
up mangling the timestamps unnecessarily.

I've tested this out with an example provided by Joe Koberg early
last year, and it is sufficient to allow `ffmpeg` to download and
mux the stream correctly. Joe had briefly suggested that other
situations can still be handled incorrectly, but this seems like
a strict improvement.

Joe's example:

https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
---
 libavformat/hls.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Liu Steven Oct. 28, 2019, 2:43 a.m. UTC | #1
> 在 2019年10月28日,02:39,Philip Langdale <philipl@overt.org> 写道:
> 
> There have been many reports over the years about problems when
> taking an HLS stream as input to `ffmpeg` where there are timestamp
> discontinuities present. This is explicitly supported in the
> HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.
> 
> Various fixes and work-arounds have been proposed over the years,
> but one step that seems obvious, even if it's not a complete fix,
> is to mark the HLS input format as supporting discontinuities. This
> will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
> up mangling the timestamps unnecessarily.
> 
> I've tested this out with an example provided by Joe Koberg early
> last year, and it is sufficient to allow `ffmpeg` to download and
> mux the stream correctly. Joe had briefly suggested that other
> situations can still be handled incorrectly, but this seems like
> a strict improvement.
> 
> Joe's example:
> 
> https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
> ---
> libavformat/hls.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/libavformat/hls.c b/libavformat/hls.c
> index d7f4d5b442..ac151d5ca4 100644
> --- a/libavformat/hls.c
> +++ b/libavformat/hls.c
> @@ -2326,7 +2326,7 @@ AVInputFormat ff_hls_demuxer = {
>     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
>     .priv_class     = &hls_class,
>     .priv_data_size = sizeof(HLSContext),
> -    .flags          = AVFMT_NOGENSEARCH,
> +    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
>     .read_probe     = hls_probe,
>     .read_header    = hls_read_header,
>     .read_packet    = hls_read_packet,
> -- 
> 2.20.1
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe”.

LGTM, whatever other more reasons, this can fix one of those problems.

Thanks
Steven
Dennis Mungai Oct. 28, 2019, 5:09 p.m. UTC | #2
On Mon, 28 Oct 2019 at 05:45, Steven Liu <lq@chinaffmpeg.org> wrote:
>
>
>
> > 在 2019年10月28日,02:39,Philip Langdale <philipl@overt.org> 写道:
> >
> > There have been many reports over the years about problems when
> > taking an HLS stream as input to `ffmpeg` where there are timestamp
> > discontinuities present. This is explicitly supported in the
> > HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.
> >
> > Various fixes and work-arounds have been proposed over the years,
> > but one step that seems obvious, even if it's not a complete fix,
> > is to mark the HLS input format as supporting discontinuities. This
> > will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
> > up mangling the timestamps unnecessarily.
> >
> > I've tested this out with an example provided by Joe Koberg early
> > last year, and it is sufficient to allow `ffmpeg` to download and
> > mux the stream correctly. Joe had briefly suggested that other
> > situations can still be handled incorrectly, but this seems like
> > a strict improvement.
> >
> > Joe's example:
> >
> > https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
> > ---
> > libavformat/hls.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/libavformat/hls.c b/libavformat/hls.c
> > index d7f4d5b442..ac151d5ca4 100644
> > --- a/libavformat/hls.c
> > +++ b/libavformat/hls.c
> > @@ -2326,7 +2326,7 @@ AVInputFormat ff_hls_demuxer = {
> >     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
> >     .priv_class     = &hls_class,
> >     .priv_data_size = sizeof(HLSContext),
> > -    .flags          = AVFMT_NOGENSEARCH,
> > +    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
> >     .read_probe     = hls_probe,
> >     .read_header    = hls_read_header,
> >     .read_packet    = hls_read_packet,
> > --
> > 2.20.1
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe”.
>
> LGTM, whatever other more reasons, this can fix one of those problems.
>
> Thanks
> Steven

This patch actually fixes the occurence of DTS and PTS discontinuities
I've been seeing with (some) HLS inputs that have discontinuities due
to ad insertion(s). 10+ hours later without a single discontinuity.
Liu Steven Oct. 29, 2019, 3:06 a.m. UTC | #3
> 在 2019年10月29日,01:09,Dennis Mungai <dmngaie@gmail.com> 写道:
> 
> On Mon, 28 Oct 2019 at 05:45, Steven Liu <lq@chinaffmpeg.org> wrote:
>> 
>> 
>> 
>>> 在 2019年10月28日,02:39,Philip Langdale <philipl@overt.org> 写道:
>>> 
>>> There have been many reports over the years about problems when
>>> taking an HLS stream as input to `ffmpeg` where there are timestamp
>>> discontinuities present. This is explicitly supported in the
>>> HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.
>>> 
>>> Various fixes and work-arounds have been proposed over the years,
>>> but one step that seems obvious, even if it's not a complete fix,
>>> is to mark the HLS input format as supporting discontinuities. This
>>> will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
>>> up mangling the timestamps unnecessarily.
>>> 
>>> I've tested this out with an example provided by Joe Koberg early
>>> last year, and it is sufficient to allow `ffmpeg` to download and
>>> mux the stream correctly. Joe had briefly suggested that other
>>> situations can still be handled incorrectly, but this seems like
>>> a strict improvement.
>>> 
>>> Joe's example:
>>> 
>>> https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
>>> ---
>>> libavformat/hls.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>> 
>>> diff --git a/libavformat/hls.c b/libavformat/hls.c
>>> index d7f4d5b442..ac151d5ca4 100644
>>> --- a/libavformat/hls.c
>>> +++ b/libavformat/hls.c
>>> @@ -2326,7 +2326,7 @@ AVInputFormat ff_hls_demuxer = {
>>>    .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
>>>    .priv_class     = &hls_class,
>>>    .priv_data_size = sizeof(HLSContext),
>>> -    .flags          = AVFMT_NOGENSEARCH,
>>> +    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
>>>    .read_probe     = hls_probe,
>>>    .read_header    = hls_read_header,
>>>    .read_packet    = hls_read_packet,
>>> --
>>> 2.20.1
>>> 
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel@ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>> 
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe”.
>> 
>> LGTM, whatever other more reasons, this can fix one of those problems.
>> 
>> Thanks
>> Steven
> 
> This patch actually fixes the occurence of DTS and PTS discontinuities
> I've been seeing with (some) HLS inputs that have discontinuities due
> to ad insertion(s). 10+ hours later without a single discontinuity.

Thanks Dennis, Will push this patch after 24hours if there have no objections.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

Thanks
Steven
Dennis Mungai Oct. 30, 2019, 1:05 a.m. UTC | #4
On Tue, 29 Oct 2019 at 06:07, Steven Liu <lq@chinaffmpeg.org> wrote:
>
>
>
> > 在 2019年10月29日,01:09,Dennis Mungai <dmngaie@gmail.com> 写道:
> >
> > On Mon, 28 Oct 2019 at 05:45, Steven Liu <lq@chinaffmpeg.org> wrote:
> >>
> >>
> >>
> >>> 在 2019年10月28日,02:39,Philip Langdale <philipl@overt.org> 写道:
> >>>
> >>> There have been many reports over the years about problems when
> >>> taking an HLS stream as input to `ffmpeg` where there are timestamp
> >>> discontinuities present. This is explicitly supported in the
> >>> HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.
> >>>
> >>> Various fixes and work-arounds have been proposed over the years,
> >>> but one step that seems obvious, even if it's not a complete fix,
> >>> is to mark the HLS input format as supporting discontinuities. This
> >>> will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
> >>> up mangling the timestamps unnecessarily.
> >>>
> >>> I've tested this out with an example provided by Joe Koberg early
> >>> last year, and it is sufficient to allow `ffmpeg` to download and
> >>> mux the stream correctly. Joe had briefly suggested that other
> >>> situations can still be handled incorrectly, but this seems like
> >>> a strict improvement.
> >>>
> >>> Joe's example:
> >>>
> >>> https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
> >>> ---
> >>> libavformat/hls.c | 2 +-
> >>> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>
> >>> diff --git a/libavformat/hls.c b/libavformat/hls.c
> >>> index d7f4d5b442..ac151d5ca4 100644
> >>> --- a/libavformat/hls.c
> >>> +++ b/libavformat/hls.c
> >>> @@ -2326,7 +2326,7 @@ AVInputFormat ff_hls_demuxer = {
> >>>    .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
> >>>    .priv_class     = &hls_class,
> >>>    .priv_data_size = sizeof(HLSContext),
> >>> -    .flags          = AVFMT_NOGENSEARCH,
> >>> +    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
> >>>    .read_probe     = hls_probe,
> >>>    .read_header    = hls_read_header,
> >>>    .read_packet    = hls_read_packet,
> >>> --
> >>> 2.20.1
> >>>
> >>> _______________________________________________
> >>> ffmpeg-devel mailing list
> >>> ffmpeg-devel@ffmpeg.org
> >>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>>
> >>> To unsubscribe, visit link above, or email
> >>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe”.
> >>
> >> LGTM, whatever other more reasons, this can fix one of those problems.
> >>
> >> Thanks
> >> Steven
> >
> > This patch actually fixes the occurence of DTS and PTS discontinuities
> > I've been seeing with (some) HLS inputs that have discontinuities due
> > to ad insertion(s). 10+ hours later without a single discontinuity.
>
> Thanks Dennis, Will push this patch after 24hours if there have no objections.
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
> Thanks
> Steven


Looking forward
Liu Steven Oct. 30, 2019, 10:23 a.m. UTC | #5
> 在 2019年10月30日,09:05,Dennis Mungai <dmngaie@gmail.com> 写道:
> 
> On Tue, 29 Oct 2019 at 06:07, Steven Liu <lq@chinaffmpeg.org> wrote:
>> 
>> 
>> 
>>> 在 2019年10月29日,01:09,Dennis Mungai <dmngaie@gmail.com> 写道:
>>> 
>>> On Mon, 28 Oct 2019 at 05:45, Steven Liu <lq@chinaffmpeg.org> wrote:
>>>> 
>>>> 
>>>> 
>>>>> 在 2019年10月28日,02:39,Philip Langdale <philipl@overt.org> 写道:
>>>>> 
>>>>> There have been many reports over the years about problems when
>>>>> taking an HLS stream as input to `ffmpeg` where there are timestamp
>>>>> discontinuities present. This is explicitly supported in the
>>>>> HLS spec (EXT-X-DISCONTINUITY) and often used for ad injection.
>>>>> 
>>>>> Various fixes and work-arounds have been proposed over the years,
>>>>> but one step that seems obvious, even if it's not a complete fix,
>>>>> is to mark the HLS input format as supporting discontinuities. This
>>>>> will prevent timestamp fixup logic in ffmpeg.c kicking in that ends
>>>>> up mangling the timestamps unnecessarily.
>>>>> 
>>>>> I've tested this out with an example provided by Joe Koberg early
>>>>> last year, and it is sufficient to allow `ffmpeg` to download and
>>>>> mux the stream correctly. Joe had briefly suggested that other
>>>>> situations can still be handled incorrectly, but this seems like
>>>>> a strict improvement.
>>>>> 
>>>>> Joe's example:
>>>>> 
>>>>> https://s3.amazonaws.com/playon-test-videos/discont_test_new/discont_test.m3u8
>>>>> ---
>>>>> libavformat/hls.c | 2 +-
>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>> 
>>>>> diff --git a/libavformat/hls.c b/libavformat/hls.c
>>>>> index d7f4d5b442..ac151d5ca4 100644
>>>>> --- a/libavformat/hls.c
>>>>> +++ b/libavformat/hls.c
>>>>> @@ -2326,7 +2326,7 @@ AVInputFormat ff_hls_demuxer = {
>>>>>   .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
>>>>>   .priv_class     = &hls_class,
>>>>>   .priv_data_size = sizeof(HLSContext),
>>>>> -    .flags          = AVFMT_NOGENSEARCH,
>>>>> +    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
>>>>>   .read_probe     = hls_probe,
>>>>>   .read_header    = hls_read_header,
>>>>>   .read_packet    = hls_read_packet,
>>>>> --
>>>>> 2.20.1
>>>>> 
>>>>> _______________________________________________
>>>>> ffmpeg-devel mailing list
>>>>> ffmpeg-devel@ffmpeg.org
>>>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>>> 
>>>>> To unsubscribe, visit link above, or email
>>>>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe”.
>>>> 
>>>> LGTM, whatever other more reasons, this can fix one of those problems.
>>>> 
>>>> Thanks
>>>> Steven
>>> 
>>> This patch actually fixes the occurence of DTS and PTS discontinuities
>>> I've been seeing with (some) HLS inputs that have discontinuities due
>>> to ad insertion(s). 10+ hours later without a single discontinuity.
>> 
>> Thanks Dennis, Will push this patch after 24hours if there have no objections.
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel@ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>> 
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>> 
>> Thanks
>> Steven
> 
> 
> Looking forward
pushed

> 

Thanks
Steven
diff mbox

Patch

diff --git a/libavformat/hls.c b/libavformat/hls.c
index d7f4d5b442..ac151d5ca4 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -2326,7 +2326,7 @@  AVInputFormat ff_hls_demuxer = {
     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
     .priv_class     = &hls_class,
     .priv_data_size = sizeof(HLSContext),
-    .flags          = AVFMT_NOGENSEARCH,
+    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
     .read_probe     = hls_probe,
     .read_header    = hls_read_header,
     .read_packet    = hls_read_packet,