diff mbox

[FFmpeg-devel] ffmpeg: remove unused and errorneous AVFrame timestamp check

Message ID 20161004112348.GB5270@nb4
State Accepted
Headers show

Commit Message

Michael Niedermayer Oct. 4, 2016, 11:23 a.m. UTC
On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
> <michael@niedermayer.cc> wrote:
> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
> >> Decoders have previously not used AVFrame.pts, and with the upcoming
> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
> >> interpration of timestamps.
> >
> > I probably misunderstand the commit message but
> > If code is changed in a user application that cannot really lift
> > some blockage from changing a lib.
> > a lib can only change in an incompaible way with (deprecation and)
> > major version bump.
> >
> 
> The lib never did what this code suggests it did, not that I remember
> (so at least not for a long long time).

release/2.0 with


causes many tests to fail, indicating that AVFrame.pts was set for
several video decoders, the ffmpeg code is audio decoder specific
and i failed to find a case where it was triggered, i tried IIRC 3
or so checkouts from the past

so AVFrame.pts was maybe never set for decoding audio but it was set
for video

make: *** [fate-force_key_frames] Error 134
make: *** [fate-vsynth1-h263] Error 134
make: *** [fate-vsynth1-h263-obmc] Error 134
make: *** [fate-vsynth1-h263p] Error 134
make: *** [fate-vsynth1-mpeg4-rc] Error 134
make: *** [fate-vsynth1-mpeg4] Error 134
make: *** [fate-vsynth1-mpeg4-error] Error 134
make: *** [fate-vsynth1-mpeg4-nr] Error 134
make: *** [fate-vsynth1-mpeg4-adv] Error 134
make: *** [fate-vsynth1-mpeg4-thread] Error 134
make: *** [fate-vsynth1-mpeg4-qpel] Error 134
make: *** [fate-vsynth1-mpeg4-adap] Error 134
make: *** [fate-vsynth1-mpeg4-qprd] Error 134
make: *** [fate-vsynth2-h263] Error 134
make: *** [fate-vsynth2-h263-obmc] Error 134
make: *** [fate-vsynth2-h263p] Error 134
make: *** [fate-vsynth2-mpeg4] Error 134
make: *** [fate-vsynth2-mpeg4-rc] Error 134
make: *** [fate-vsynth2-mpeg4-adv] Error 134
make: *** [fate-vsynth2-mpeg4-error] Error 134
make: *** [fate-vsynth2-mpeg4-thread] Error 134
make: *** [fate-vsynth2-mpeg4-nr] Error 134
make: *** [fate-vsynth2-mpeg4-adap] Error 134
make: *** [fate-vsynth2-mpeg4-qprd] Error 134
make: *** [fate-vsynth2-mpeg4-qpel] Error 134
make: *** [fate-lavf-avi] Error 134
make: *** [fate-lavf-gif] Error 134
make: *** [fate-lavf-mkv] Error 134
make: *** [fate-lavf-ismv] Error 134
make: *** [fate-lavf-mov] Error 134
make: *** [fate-lavf-nut] Error 134
make: *** [fate-gif-color] Error 134
make: *** [fate-gif-disposal-background] Error 134
make: *** [fate-gif-disposal-restore] Error 134
make: *** [fate-gif-gray] Error 134
make: *** [fate-gifenc-rgb8] Error 134
make: *** [fate-gifenc-bgr8] Error 134
make: *** [fate-gifenc-rgb4_byte] Error 134
make: *** [fate-gifenc-gray] Error 134
make: *** [fate-gifenc-bgr4_byte] Error 134
make: *** [fate-gifenc-pal8] Error 134

[...]

Comments

Hendrik Leppkes Oct. 4, 2016, 11:44 a.m. UTC | #1
On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
<michael@niedermayer.cc> wrote:
> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>> <michael@niedermayer.cc> wrote:
>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>> >> interpration of timestamps.
>> >
>> > I probably misunderstand the commit message but
>> > If code is changed in a user application that cannot really lift
>> > some blockage from changing a lib.
>> > a lib can only change in an incompaible way with (deprecation and)
>> > major version bump.
>> >
>>
>> The lib never did what this code suggests it did, not that I remember
>> (so at least not for a long long time).
>
> release/2.0 with
>
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 29d5492..57c8d50 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>                  avci->to_free.extended_data = avci->to_free.data;
>                  memset(picture->buf, 0, sizeof(picture->buf));
>              }
> -
> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>              avctx->frame_number++;
>              av_frame_set_best_effort_timestamp(picture,
>                                                 guess_correct_pts(avctx,
>
> causes many tests to fail, indicating that AVFrame.pts was set for
> several video decoders, the ffmpeg code is audio decoder specific
> and i failed to find a case where it was triggered, i tried IIRC 3
> or so checkouts from the past
>
> so AVFrame.pts was maybe never set for decoding audio but it was set
> for video

Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
Because thats what it would be set to after the merge. A quick check
in the 2.0 code base looks like some decoders did set that, but to the
exact same value as pkt_pts (which is what the merge is proposing
right now as well)

- Hendrik
Hendrik Leppkes Oct. 4, 2016, 11:52 a.m. UTC | #2
On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
> On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
> <michael@niedermayer.cc> wrote:
>> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>>> <michael@niedermayer.cc> wrote:
>>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
>>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>>> >> interpration of timestamps.
>>> >
>>> > I probably misunderstand the commit message but
>>> > If code is changed in a user application that cannot really lift
>>> > some blockage from changing a lib.
>>> > a lib can only change in an incompaible way with (deprecation and)
>>> > major version bump.
>>> >
>>>
>>> The lib never did what this code suggests it did, not that I remember
>>> (so at least not for a long long time).
>>
>> release/2.0 with
>>
>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>> index 29d5492..57c8d50 100644
>> --- a/libavcodec/utils.c
>> +++ b/libavcodec/utils.c
>> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>>                  avci->to_free.extended_data = avci->to_free.data;
>>                  memset(picture->buf, 0, sizeof(picture->buf));
>>              }
>> -
>> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>>              avctx->frame_number++;
>>              av_frame_set_best_effort_timestamp(picture,
>>                                                 guess_correct_pts(avctx,
>>
>> causes many tests to fail, indicating that AVFrame.pts was set for
>> several video decoders, the ffmpeg code is audio decoder specific
>> and i failed to find a case where it was triggered, i tried IIRC 3
>> or so checkouts from the past
>>
>> so AVFrame.pts was maybe never set for decoding audio but it was set
>> for video
>
> Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
> Because thats what it would be set to after the merge. A quick check
> in the 2.0 code base looks like some decoders did set that, but to the
> exact same value as pkt_pts (which is what the merge is proposing
> right now as well)
>

And I found this (after 2.0):
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8

Which apparently set pts for mpeg4 to a number parsed from the
bitstream, entirely uncorrelated to container or audio timestamps, so
using them would have been rather impractical for any real use-cases.

- Hendrik
Michael Niedermayer Oct. 4, 2016, 12:15 p.m. UTC | #3
On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
> On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
> > On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
> > <michael@niedermayer.cc> wrote:
> >> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
> >>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
> >>> <michael@niedermayer.cc> wrote:
> >>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
> >>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
> >>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
> >>> >> interpration of timestamps.
> >>> >
> >>> > I probably misunderstand the commit message but
> >>> > If code is changed in a user application that cannot really lift
> >>> > some blockage from changing a lib.
> >>> > a lib can only change in an incompaible way with (deprecation and)
> >>> > major version bump.
> >>> >
> >>>
> >>> The lib never did what this code suggests it did, not that I remember
> >>> (so at least not for a long long time).
> >>
> >> release/2.0 with
> >>
> >> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> >> index 29d5492..57c8d50 100644
> >> --- a/libavcodec/utils.c
> >> +++ b/libavcodec/utils.c
> >> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
> >>                  avci->to_free.extended_data = avci->to_free.data;
> >>                  memset(picture->buf, 0, sizeof(picture->buf));
> >>              }
> >> -
> >> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
> >>              avctx->frame_number++;
> >>              av_frame_set_best_effort_timestamp(picture,
> >>                                                 guess_correct_pts(avctx,
> >>
> >> causes many tests to fail, indicating that AVFrame.pts was set for
> >> several video decoders, the ffmpeg code is audio decoder specific
> >> and i failed to find a case where it was triggered, i tried IIRC 3
> >> or so checkouts from the past
> >>
> >> so AVFrame.pts was maybe never set for decoding audio but it was set
> >> for video
> >
> > Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
> > Because thats what it would be set to after the merge. A quick check
> > in the 2.0 code base looks like some decoders did set that, but to the
> > exact same value as pkt_pts (which is what the merge is proposing
> > right now as well)
> >
> 
> And I found this (after 2.0):
> http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
> 
> Which apparently set pts for mpeg4 to a number parsed from the
> bitstream, entirely uncorrelated to container or audio timestamps, so
> using them would have been rather impractical for any real use-cases.

They can be usfull, some random examples:

playing MPEG4-ES with timing stored from the bitstream (assuming there
  is no demuxer lib used that is capable to extract them)

forensics, raw video stream could have its timing
  recovered, a video with manipulated container timestamps could be
  detected.

error correction, if the container level timestamps are lost or
  corrupted the stream level ones can be used to recreate them

There may be more, these are just some of the top of my head,
not your mainstream multimedia player stuff maybe but they arent
useless

[...]
wm4 Oct. 4, 2016, 2:32 p.m. UTC | #4
On Tue, 4 Oct 2016 14:15:03 +0200
Michael Niedermayer <michael@niedermayer.cc> wrote:

> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
> > On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:  
> > > On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
> > > <michael@niedermayer.cc> wrote:  
> > >> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:  
> > >>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
> > >>> <michael@niedermayer.cc> wrote:  
> > >>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:  
> > >>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
> > >>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
> > >>> >> interpration of timestamps.  
> > >>> >
> > >>> > I probably misunderstand the commit message but
> > >>> > If code is changed in a user application that cannot really lift
> > >>> > some blockage from changing a lib.
> > >>> > a lib can only change in an incompaible way with (deprecation and)
> > >>> > major version bump.
> > >>> >  
> > >>>
> > >>> The lib never did what this code suggests it did, not that I remember
> > >>> (so at least not for a long long time).  
> > >>
> > >> release/2.0 with
> > >>
> > >> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> > >> index 29d5492..57c8d50 100644
> > >> --- a/libavcodec/utils.c
> > >> +++ b/libavcodec/utils.c
> > >> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
> > >>                  avci->to_free.extended_data = avci->to_free.data;
> > >>                  memset(picture->buf, 0, sizeof(picture->buf));
> > >>              }
> > >> -
> > >> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
> > >>              avctx->frame_number++;
> > >>              av_frame_set_best_effort_timestamp(picture,
> > >>                                                 guess_correct_pts(avctx,
> > >>
> > >> causes many tests to fail, indicating that AVFrame.pts was set for
> > >> several video decoders, the ffmpeg code is audio decoder specific
> > >> and i failed to find a case where it was triggered, i tried IIRC 3
> > >> or so checkouts from the past
> > >>
> > >> so AVFrame.pts was maybe never set for decoding audio but it was set
> > >> for video  
> > >
> > > Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
> > > Because thats what it would be set to after the merge. A quick check
> > > in the 2.0 code base looks like some decoders did set that, but to the
> > > exact same value as pkt_pts (which is what the merge is proposing
> > > right now as well)
> > >  
> > 
> > And I found this (after 2.0):
> > http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
> > 
> > Which apparently set pts for mpeg4 to a number parsed from the
> > bitstream, entirely uncorrelated to container or audio timestamps, so
> > using them would have been rather impractical for any real use-cases.  
> 
> They can be usfull, some random examples:
> 
> playing MPEG4-ES with timing stored from the bitstream (assuming there
>   is no demuxer lib used that is capable to extract them)
> 
> forensics, raw video stream could have its timing
>   recovered, a video with manipulated container timestamps could be
>   detected.
> 
> error correction, if the container level timestamps are lost or
>   corrupted the stream level ones can be used to recreate them
> 
> There may be more, these are just some of the top of my head,
> not your mainstream multimedia player stuff maybe but they arent
> useless
> 
> [...]
> 

They don't belong into the AVFrame.pts field, though.
Hendrik Leppkes Oct. 4, 2016, 2:35 p.m. UTC | #5
On Tue, Oct 4, 2016 at 4:32 PM, wm4 <nfxjfg@googlemail.com> wrote:
> On Tue, 4 Oct 2016 14:15:03 +0200
> Michael Niedermayer <michael@niedermayer.cc> wrote:
>
>> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
>> > On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
>> > > On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
>> > > <michael@niedermayer.cc> wrote:
>> > >> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>> > >>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>> > >>> <michael@niedermayer.cc> wrote:
>> > >>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>> > >>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
>> > >>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>> > >>> >> interpration of timestamps.
>> > >>> >
>> > >>> > I probably misunderstand the commit message but
>> > >>> > If code is changed in a user application that cannot really lift
>> > >>> > some blockage from changing a lib.
>> > >>> > a lib can only change in an incompaible way with (deprecation and)
>> > >>> > major version bump.
>> > >>> >
>> > >>>
>> > >>> The lib never did what this code suggests it did, not that I remember
>> > >>> (so at least not for a long long time).
>> > >>
>> > >> release/2.0 with
>> > >>
>> > >> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>> > >> index 29d5492..57c8d50 100644
>> > >> --- a/libavcodec/utils.c
>> > >> +++ b/libavcodec/utils.c
>> > >> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>> > >>                  avci->to_free.extended_data = avci->to_free.data;
>> > >>                  memset(picture->buf, 0, sizeof(picture->buf));
>> > >>              }
>> > >> -
>> > >> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>> > >>              avctx->frame_number++;
>> > >>              av_frame_set_best_effort_timestamp(picture,
>> > >>                                                 guess_correct_pts(avctx,
>> > >>
>> > >> causes many tests to fail, indicating that AVFrame.pts was set for
>> > >> several video decoders, the ffmpeg code is audio decoder specific
>> > >> and i failed to find a case where it was triggered, i tried IIRC 3
>> > >> or so checkouts from the past
>> > >>
>> > >> so AVFrame.pts was maybe never set for decoding audio but it was set
>> > >> for video
>> > >
>> > > Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
>> > > Because thats what it would be set to after the merge. A quick check
>> > > in the 2.0 code base looks like some decoders did set that, but to the
>> > > exact same value as pkt_pts (which is what the merge is proposing
>> > > right now as well)
>> > >
>> >
>> > And I found this (after 2.0):
>> > http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
>> >
>> > Which apparently set pts for mpeg4 to a number parsed from the
>> > bitstream, entirely uncorrelated to container or audio timestamps, so
>> > using them would have been rather impractical for any real use-cases.
>>
>> They can be usfull, some random examples:
>>
>> playing MPEG4-ES with timing stored from the bitstream (assuming there
>>   is no demuxer lib used that is capable to extract them)
>>
>> forensics, raw video stream could have its timing
>>   recovered, a video with manipulated container timestamps could be
>>   detected.
>>
>> error correction, if the container level timestamps are lost or
>>   corrupted the stream level ones can be used to recreate them
>>
>> There may be more, these are just some of the top of my head,
>> not your mainstream multimedia player stuff maybe but they arent
>> useless
>>
>> [...]
>>
>
> They don't belong into the AVFrame.pts field, though.

And they don't go in there anymore right now, so thats that.

The real question is, what do we do about this merge now?
Can we set AVFrame.pts to the same value as AVFrame.pkt_pts safely,
considering it was unused in the current ABI/API, or would that be
considered an API break and we better delay this change until the next
major?

- Hendrik
wm4 Oct. 4, 2016, 2:41 p.m. UTC | #6
On Tue, 4 Oct 2016 16:35:02 +0200
Hendrik Leppkes <h.leppkes@gmail.com> wrote:

> On Tue, Oct 4, 2016 at 4:32 PM, wm4 <nfxjfg@googlemail.com> wrote:
> > On Tue, 4 Oct 2016 14:15:03 +0200
> > Michael Niedermayer <michael@niedermayer.cc> wrote:
> >  
> >> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:  
> >> > On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:  
> >> > > On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
> >> > > <michael@niedermayer.cc> wrote:  
> >> > >> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:  
> >> > >>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
> >> > >>> <michael@niedermayer.cc> wrote:  
> >> > >>> > On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:  
> >> > >>> >> Decoders have previously not used AVFrame.pts, and with the upcoming
> >> > >>> >> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
> >> > >>> >> interpration of timestamps.  
> >> > >>> >
> >> > >>> > I probably misunderstand the commit message but
> >> > >>> > If code is changed in a user application that cannot really lift
> >> > >>> > some blockage from changing a lib.
> >> > >>> > a lib can only change in an incompaible way with (deprecation and)
> >> > >>> > major version bump.
> >> > >>> >  
> >> > >>>
> >> > >>> The lib never did what this code suggests it did, not that I remember
> >> > >>> (so at least not for a long long time).  
> >> > >>
> >> > >> release/2.0 with
> >> > >>
> >> > >> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> >> > >> index 29d5492..57c8d50 100644
> >> > >> --- a/libavcodec/utils.c
> >> > >> +++ b/libavcodec/utils.c
> >> > >> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
> >> > >>                  avci->to_free.extended_data = avci->to_free.data;
> >> > >>                  memset(picture->buf, 0, sizeof(picture->buf));
> >> > >>              }
> >> > >> -
> >> > >> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
> >> > >>              avctx->frame_number++;
> >> > >>              av_frame_set_best_effort_timestamp(picture,
> >> > >>                                                 guess_correct_pts(avctx,
> >> > >>
> >> > >> causes many tests to fail, indicating that AVFrame.pts was set for
> >> > >> several video decoders, the ffmpeg code is audio decoder specific
> >> > >> and i failed to find a case where it was triggered, i tried IIRC 3
> >> > >> or so checkouts from the past
> >> > >>
> >> > >> so AVFrame.pts was maybe never set for decoding audio but it was set
> >> > >> for video  
> >> > >
> >> > > Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
> >> > > Because thats what it would be set to after the merge. A quick check
> >> > > in the 2.0 code base looks like some decoders did set that, but to the
> >> > > exact same value as pkt_pts (which is what the merge is proposing
> >> > > right now as well)
> >> > >  
> >> >
> >> > And I found this (after 2.0):
> >> > http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
> >> >
> >> > Which apparently set pts for mpeg4 to a number parsed from the
> >> > bitstream, entirely uncorrelated to container or audio timestamps, so
> >> > using them would have been rather impractical for any real use-cases.  
> >>
> >> They can be usfull, some random examples:
> >>
> >> playing MPEG4-ES with timing stored from the bitstream (assuming there
> >>   is no demuxer lib used that is capable to extract them)
> >>
> >> forensics, raw video stream could have its timing
> >>   recovered, a video with manipulated container timestamps could be
> >>   detected.
> >>
> >> error correction, if the container level timestamps are lost or
> >>   corrupted the stream level ones can be used to recreate them
> >>
> >> There may be more, these are just some of the top of my head,
> >> not your mainstream multimedia player stuff maybe but they arent
> >> useless
> >>
> >> [...]
> >>  
> >
> > They don't belong into the AVFrame.pts field, though.  
> 
> And they don't go in there anymore right now, so thats that.
> 
> The real question is, what do we do about this merge now?
> Can we set AVFrame.pts to the same value as AVFrame.pkt_pts safely,
> considering it was unused in the current ABI/API, or would that be
> considered an API break and we better delay this change until the next
> major?

IMO applications which did this were pretty broken anyway, and we
should be able to get away with a simple version bump.
James Almer Oct. 4, 2016, 2:44 p.m. UTC | #7
On 10/4/2016 11:35 AM, Hendrik Leppkes wrote:
> On Tue, Oct 4, 2016 at 4:32 PM, wm4 <nfxjfg@googlemail.com> wrote:
>> On Tue, 4 Oct 2016 14:15:03 +0200
>> Michael Niedermayer <michael@niedermayer.cc> wrote:
>>
>>> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
>>>> On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
>>>>> On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
>>>>> <michael@niedermayer.cc> wrote:
>>>>>> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>>>>>>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>>>>>>> <michael@niedermayer.cc> wrote:
>>>>>>>> On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>>>>>>>>> Decoders have previously not used AVFrame.pts, and with the upcoming
>>>>>>>>> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>>>>>>>>> interpration of timestamps.
>>>>>>>>
>>>>>>>> I probably misunderstand the commit message but
>>>>>>>> If code is changed in a user application that cannot really lift
>>>>>>>> some blockage from changing a lib.
>>>>>>>> a lib can only change in an incompaible way with (deprecation and)
>>>>>>>> major version bump.
>>>>>>>>
>>>>>>>
>>>>>>> The lib never did what this code suggests it did, not that I remember
>>>>>>> (so at least not for a long long time).
>>>>>>
>>>>>> release/2.0 with
>>>>>>
>>>>>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>>>>>> index 29d5492..57c8d50 100644
>>>>>> --- a/libavcodec/utils.c
>>>>>> +++ b/libavcodec/utils.c
>>>>>> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>>>>>>                  avci->to_free.extended_data = avci->to_free.data;
>>>>>>                  memset(picture->buf, 0, sizeof(picture->buf));
>>>>>>              }
>>>>>> -
>>>>>> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>>>>>>              avctx->frame_number++;
>>>>>>              av_frame_set_best_effort_timestamp(picture,
>>>>>>                                                 guess_correct_pts(avctx,
>>>>>>
>>>>>> causes many tests to fail, indicating that AVFrame.pts was set for
>>>>>> several video decoders, the ffmpeg code is audio decoder specific
>>>>>> and i failed to find a case where it was triggered, i tried IIRC 3
>>>>>> or so checkouts from the past
>>>>>>
>>>>>> so AVFrame.pts was maybe never set for decoding audio but it was set
>>>>>> for video
>>>>>
>>>>> Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
>>>>> Because thats what it would be set to after the merge. A quick check
>>>>> in the 2.0 code base looks like some decoders did set that, but to the
>>>>> exact same value as pkt_pts (which is what the merge is proposing
>>>>> right now as well)
>>>>>
>>>>
>>>> And I found this (after 2.0):
>>>> http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
>>>>
>>>> Which apparently set pts for mpeg4 to a number parsed from the
>>>> bitstream, entirely uncorrelated to container or audio timestamps, so
>>>> using them would have been rather impractical for any real use-cases.
>>>
>>> They can be usfull, some random examples:
>>>
>>> playing MPEG4-ES with timing stored from the bitstream (assuming there
>>>   is no demuxer lib used that is capable to extract them)
>>>
>>> forensics, raw video stream could have its timing
>>>   recovered, a video with manipulated container timestamps could be
>>>   detected.
>>>
>>> error correction, if the container level timestamps are lost or
>>>   corrupted the stream level ones can be used to recreate them
>>>
>>> There may be more, these are just some of the top of my head,
>>> not your mainstream multimedia player stuff maybe but they arent
>>> useless
>>>
>>> [...]
>>>
>>
>> They don't belong into the AVFrame.pts field, though.
> 
> And they don't go in there anymore right now, so thats that.
> 
> The real question is, what do we do about this merge now?
> Can we set AVFrame.pts to the same value as AVFrame.pkt_pts safely,
> considering it was unused in the current ABI/API, or would that be
> considered an API break and we better delay this change until the next
> major?
> 
> - Hendrik

Delaying it could result in further merges becoming technically wrong,
or at least require extra manual changes for them to not misbehave in
our tree.

IMO merge it now, and if needed/preferred, we could make sure it
doesn't make it to 3.2
Hendrik Leppkes Oct. 6, 2016, 2:08 p.m. UTC | #8
On Tue, Oct 4, 2016 at 4:44 PM, James Almer <jamrial@gmail.com> wrote:
> On 10/4/2016 11:35 AM, Hendrik Leppkes wrote:
>> On Tue, Oct 4, 2016 at 4:32 PM, wm4 <nfxjfg@googlemail.com> wrote:
>>> On Tue, 4 Oct 2016 14:15:03 +0200
>>> Michael Niedermayer <michael@niedermayer.cc> wrote:
>>>
>>>> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
>>>>> On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
>>>>>> On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
>>>>>> <michael@niedermayer.cc> wrote:
>>>>>>> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>>>>>>>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>>>>>>>> <michael@niedermayer.cc> wrote:
>>>>>>>>> On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>>>>>>>>>> Decoders have previously not used AVFrame.pts, and with the upcoming
>>>>>>>>>> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>>>>>>>>>> interpration of timestamps.
>>>>>>>>>
>>>>>>>>> I probably misunderstand the commit message but
>>>>>>>>> If code is changed in a user application that cannot really lift
>>>>>>>>> some blockage from changing a lib.
>>>>>>>>> a lib can only change in an incompaible way with (deprecation and)
>>>>>>>>> major version bump.
>>>>>>>>>
>>>>>>>>
>>>>>>>> The lib never did what this code suggests it did, not that I remember
>>>>>>>> (so at least not for a long long time).
>>>>>>>
>>>>>>> release/2.0 with
>>>>>>>
>>>>>>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>>>>>>> index 29d5492..57c8d50 100644
>>>>>>> --- a/libavcodec/utils.c
>>>>>>> +++ b/libavcodec/utils.c
>>>>>>> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>>>>>>>                  avci->to_free.extended_data = avci->to_free.data;
>>>>>>>                  memset(picture->buf, 0, sizeof(picture->buf));
>>>>>>>              }
>>>>>>> -
>>>>>>> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>>>>>>>              avctx->frame_number++;
>>>>>>>              av_frame_set_best_effort_timestamp(picture,
>>>>>>>                                                 guess_correct_pts(avctx,
>>>>>>>
>>>>>>> causes many tests to fail, indicating that AVFrame.pts was set for
>>>>>>> several video decoders, the ffmpeg code is audio decoder specific
>>>>>>> and i failed to find a case where it was triggered, i tried IIRC 3
>>>>>>> or so checkouts from the past
>>>>>>>
>>>>>>> so AVFrame.pts was maybe never set for decoding audio but it was set
>>>>>>> for video
>>>>>>
>>>>>> Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
>>>>>> Because thats what it would be set to after the merge. A quick check
>>>>>> in the 2.0 code base looks like some decoders did set that, but to the
>>>>>> exact same value as pkt_pts (which is what the merge is proposing
>>>>>> right now as well)
>>>>>>
>>>>>
>>>>> And I found this (after 2.0):
>>>>> http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
>>>>>
>>>>> Which apparently set pts for mpeg4 to a number parsed from the
>>>>> bitstream, entirely uncorrelated to container or audio timestamps, so
>>>>> using them would have been rather impractical for any real use-cases.
>>>>
>>>> They can be usfull, some random examples:
>>>>
>>>> playing MPEG4-ES with timing stored from the bitstream (assuming there
>>>>   is no demuxer lib used that is capable to extract them)
>>>>
>>>> forensics, raw video stream could have its timing
>>>>   recovered, a video with manipulated container timestamps could be
>>>>   detected.
>>>>
>>>> error correction, if the container level timestamps are lost or
>>>>   corrupted the stream level ones can be used to recreate them
>>>>
>>>> There may be more, these are just some of the top of my head,
>>>> not your mainstream multimedia player stuff maybe but they arent
>>>> useless
>>>>
>>>> [...]
>>>>
>>>
>>> They don't belong into the AVFrame.pts field, though.
>>
>> And they don't go in there anymore right now, so thats that.
>>
>> The real question is, what do we do about this merge now?
>> Can we set AVFrame.pts to the same value as AVFrame.pkt_pts safely,
>> considering it was unused in the current ABI/API, or would that be
>> considered an API break and we better delay this change until the next
>> major?
>>
>> - Hendrik
>
> Delaying it could result in further merges becoming technically wrong,
> or at least require extra manual changes for them to not misbehave in
> our tree.
>
> IMO merge it now, and if needed/preferred, we could make sure it
> doesn't make it to 3.2
>

Last call for any actual and clear objections to going forward with
this route. I would like to get merging a bunch over the weekend so we
get some progress here.

- Hendrik
Hendrik Leppkes Oct. 7, 2016, 11:07 a.m. UTC | #9
On Thu, Oct 6, 2016 at 4:08 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
> On Tue, Oct 4, 2016 at 4:44 PM, James Almer <jamrial@gmail.com> wrote:
>> On 10/4/2016 11:35 AM, Hendrik Leppkes wrote:
>>> On Tue, Oct 4, 2016 at 4:32 PM, wm4 <nfxjfg@googlemail.com> wrote:
>>>> On Tue, 4 Oct 2016 14:15:03 +0200
>>>> Michael Niedermayer <michael@niedermayer.cc> wrote:
>>>>
>>>>> On Tue, Oct 04, 2016 at 01:52:02PM +0200, Hendrik Leppkes wrote:
>>>>>> On Tue, Oct 4, 2016 at 1:44 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
>>>>>>> On Tue, Oct 4, 2016 at 1:23 PM, Michael Niedermayer
>>>>>>> <michael@niedermayer.cc> wrote:
>>>>>>>> On Tue, Oct 04, 2016 at 08:41:42AM +0200, Hendrik Leppkes wrote:
>>>>>>>>> On Tue, Oct 4, 2016 at 4:05 AM, Michael Niedermayer
>>>>>>>>> <michael@niedermayer.cc> wrote:
>>>>>>>>>> On Sat, Oct 01, 2016 at 04:15:45PM +0200, Hendrik Leppkes wrote:
>>>>>>>>>>> Decoders have previously not used AVFrame.pts, and with the upcoming
>>>>>>>>>>> deprecation of pkt_pts (in favor of pts), this would lead to an errorneous
>>>>>>>>>>> interpration of timestamps.
>>>>>>>>>>
>>>>>>>>>> I probably misunderstand the commit message but
>>>>>>>>>> If code is changed in a user application that cannot really lift
>>>>>>>>>> some blockage from changing a lib.
>>>>>>>>>> a lib can only change in an incompaible way with (deprecation and)
>>>>>>>>>> major version bump.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> The lib never did what this code suggests it did, not that I remember
>>>>>>>>> (so at least not for a long long time).
>>>>>>>>
>>>>>>>> release/2.0 with
>>>>>>>>
>>>>>>>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>>>>>>>> index 29d5492..57c8d50 100644
>>>>>>>> --- a/libavcodec/utils.c
>>>>>>>> +++ b/libavcodec/utils.c
>>>>>>>> @@ -2008,7 +2008,7 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
>>>>>>>>                  avci->to_free.extended_data = avci->to_free.data;
>>>>>>>>                  memset(picture->buf, 0, sizeof(picture->buf));
>>>>>>>>              }
>>>>>>>> -
>>>>>>>> +av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
>>>>>>>>              avctx->frame_number++;
>>>>>>>>              av_frame_set_best_effort_timestamp(picture,
>>>>>>>>                                                 guess_correct_pts(avctx,
>>>>>>>>
>>>>>>>> causes many tests to fail, indicating that AVFrame.pts was set for
>>>>>>>> several video decoders, the ffmpeg code is audio decoder specific
>>>>>>>> and i failed to find a case where it was triggered, i tried IIRC 3
>>>>>>>> or so checkouts from the past
>>>>>>>>
>>>>>>>> so AVFrame.pts was maybe never set for decoding audio but it was set
>>>>>>>> for video
>>>>>>>
>>>>>>> Can you extend the test to add "|| picture->pts == picture->pkt_pts"?
>>>>>>> Because thats what it would be set to after the merge. A quick check
>>>>>>> in the 2.0 code base looks like some decoders did set that, but to the
>>>>>>> exact same value as pkt_pts (which is what the merge is proposing
>>>>>>> right now as well)
>>>>>>>
>>>>>>
>>>>>> And I found this (after 2.0):
>>>>>> http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a1c5cc429d99216406170eac7e8352860076d3e8
>>>>>>
>>>>>> Which apparently set pts for mpeg4 to a number parsed from the
>>>>>> bitstream, entirely uncorrelated to container or audio timestamps, so
>>>>>> using them would have been rather impractical for any real use-cases.
>>>>>
>>>>> They can be usfull, some random examples:
>>>>>
>>>>> playing MPEG4-ES with timing stored from the bitstream (assuming there
>>>>>   is no demuxer lib used that is capable to extract them)
>>>>>
>>>>> forensics, raw video stream could have its timing
>>>>>   recovered, a video with manipulated container timestamps could be
>>>>>   detected.
>>>>>
>>>>> error correction, if the container level timestamps are lost or
>>>>>   corrupted the stream level ones can be used to recreate them
>>>>>
>>>>> There may be more, these are just some of the top of my head,
>>>>> not your mainstream multimedia player stuff maybe but they arent
>>>>> useless
>>>>>
>>>>> [...]
>>>>>
>>>>
>>>> They don't belong into the AVFrame.pts field, though.
>>>
>>> And they don't go in there anymore right now, so thats that.
>>>
>>> The real question is, what do we do about this merge now?
>>> Can we set AVFrame.pts to the same value as AVFrame.pkt_pts safely,
>>> considering it was unused in the current ABI/API, or would that be
>>> considered an API break and we better delay this change until the next
>>> major?
>>>
>>> - Hendrik
>>
>> Delaying it could result in further merges becoming technically wrong,
>> or at least require extra manual changes for them to not misbehave in
>> our tree.
>>
>> IMO merge it now, and if needed/preferred, we could make sure it
>> doesn't make it to 3.2
>>
>
> Last call for any actual and clear objections to going forward with
> this route. I would like to get merging a bunch over the weekend so we
> get some progress here.
>

I applied the commit at the beginning of this thread and merged the
pkt_pts -> pts changes now.

- Hendrik
diff mbox

Patch

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 29d5492..57c8d50 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2008,7 +2008,7 @@  int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
                 avci->to_free.extended_data = avci->to_free.data;
                 memset(picture->buf, 0, sizeof(picture->buf));
             }
-
+av_assert0(picture->pts == 0 || picture->pts == AV_NOPTS_VALUE);
             avctx->frame_number++;
             av_frame_set_best_effort_timestamp(picture,
                                                guess_correct_pts(avctx,