[FFmpeg-devel] [PATCH] H.264 timestamps in h264_parser - complete set
Michael Niedermayer
michaelni
Sat Feb 21 14:05:33 CET 2009
On Sat, Feb 21, 2009 at 01:15:46PM +0100, Ivan Schreter wrote:
> Michael Niedermayer wrote:
> > On Sat, Feb 21, 2009 at 12:15:11AM +0100, Ivan Schreter wrote:
> >
> >> Michael Niedermayer wrote:
> >>
> >>> [...]
> >>> time_base is set by:
> >>> if(h->sps.timing_info_present_flag){
> >>> s->avctx->time_base= (AVRational){h->sps.num_units_in_tick * 2, h->sps.time_scale};
> >>> if(h->x264_build > 0 && h->x264_build < 44)
> >>> s->avctx->time_base.den *= 2;
> >>> av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,
> >>> s->avctx->time_base.num, s->avctx->time_base.den, 1<<30);
> >>> }
> >>>
> >>> the parser should set it if no decoder is there doing it and
> >>> the *2 in there looks wrong without it you should have a tb useabel for fields
> >>>
> >>>
> >>>
> >> Yes, it looked wrong to me as well, but it's actually correct. H.264
> >> specifies timebase 1/50, although it's a 25fps video. I.e., there is
> >> always a tick per field and videos with full frames have timestamps 2
> >> ticks apart (field-coded interlaced videos 1 tick). Changing this to
> >> 1/50 would break the rest of FFmpeg, thinking it's a 50fps video, which
> >> it isn't. Alternative would be special handling in lavf, but that's also
> >> no solution.
> >>
> >
> > fps != timebase and if a video specifes 1/50 thats what should be stored in
> > time_base.
> > That might break something but its that something that is broken not setting
> > tb correctly.
> > And i dont think we can fix h264 if we keep a fundamental field like the
> > timebase set incorrectly.
> > also lavf / ffmpeg has and uses r_frame_rate for the real "base" frame rate
> > not AVCodecContext.time_base
> >
> ... which is computed from AVCodecContext.time_base.
the code in av_find_stream_info analyzes frame durations to set r_frame_rate
of course there may be small adjustments needed but it should not really
require special handling of h264 ...
>
> So we'd have to special-case H.264 to compute r_frame_rate properly. OK
> with you or any better idea?
>
> >> Even if we had double framerate to handle integer timestamps, this
> >> somehow doesn't fit with rest of lavf. lavf currently passes full
> >> timestamps to lavc to be corrected by lavc, if it wishes to do so. I
> >> still think telling lavc which time base to use is the right way.
> >>
> >
> > lavf does not pass timestamps to lavc for correction, but rather for
> > reordering. lavc does not know the timebase in which the timestamps
> > are specified.
> >
> >
> OK, noted (reordering). You mean, the resulting decoded picture PTS
> should be set correctly, based on PTS of the packet which results in the
> decoded picture?
not the lavf pts no.
the AVFrame.pts are independant of the demuxer AVPacket.pts
>
> H.264 code doesn't access those timestamps at all and PTS of decoded
> picture is always 0. What is this PTS of decoded picture supposed to be
> and in which units?
>
> > Besides i belive it is better to export information to let the outer
> > part use it the way it likes instead of sucking things in and changing
> > them.
> > Also fields like repeat_pict are exported and used outside lavc so this
> > is not really different from existing code.
> >
> Would something like this be acceptable?
>
> 1) add parser_dts and parser_pts in AVCodecParserContext, defaulting to
> AV_NOPTS_VALUE (alternatively, instead of parser_pts we could use
> parser_delay relative to parser_dts)
exporting
dts_last_dts_delta (cpb_removial_delay)
pts_dts_delta (dpb_output_delay)
from the parser
seems nicer
>
> 2a) time_base for H.264 will be fixed, with appropriate special-case in
> lavf (NOTE NOTE NOTE: will break older lavf working with newer lavc)
> or
i really dont care what happens with old lavf or old apps when tb is fixed
> 2b) we let time_base as is and add another variable ts_ticks_per_frame,
> which will be set to 2 for H.264, 1 by default
>
> 3) if the parser is capable of decoding timestamps, it will fill these
> two with integer timestamps in AVCodec.time_base/ts_ticks_per_frame
> units and instead of current guessing, lavf would use these multiplied
> by (effectively) frame_duration/ts_ticks_per_frame (actually, I'd
> implement it using time bases to prevent rounding errors).
>
> 4) if a DTS is available from the container, it would be associated with
> current parser_dts, so latter packets without DTS would simply take the
> delta (e.g., via last_known_stream_dts and last_known_parser_dts in
> AVStream, both initialized to AV_NOPTS_VALUE).
>
> 5) in H.264, after a seek the timestamps would begin from 0 again, but
> next container DTS would associate new lavc timestamp, so the timestamps
> would be resumed correctly
this is not ok
for now just using AV_NOPTS_VALUE until a dts/pts is found should do,
later, once things are in svn we could try to use
update_initial_timestamps / durations to fill in the timestamps after
seeking
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090221/d57a621e/attachment.pgp>
More information about the ffmpeg-devel
mailing list