[Libav-user] How to get precise frame timestamp

YIRAN LI mrfun.china at gmail.com
Thu Oct 31 03:27:47 CET 2013


Hi Alex,

Seems I couldn't find the source code of av_frame_get_best_effort_timestamp,
so I have to ask here, because I found that ffmpeg 1.1.3 return -1 for
every frame of same file.

So definitely
int64_t position = av_frame_get_best_effort_timestamp(pFrame);
if ((position != AV_NOPTS_VALUE) && (position >=0))

is needed to check if best effort timestamp is valid, but I'd like to know
if it's enough.

As you can see in ffmpeg2.0.1 (with which av_frame_get_best_effort_timestamp
returns correct value) the best effort time stamp returned equals to
frame.pkt_dts,
that's ok.

But if it's possible, for exmpale, av_frame_get_best_effort_timestamp
 returns all 0 for every frame?

So in summary I'd like to know on what condition can I totally trust time
stamp returned by this function (so I can forget about those packet.dts,
packet.pts, frame.pkt_dts)

Thanks!


2013/10/30 YIRAN LI <mrfun.china at gmail.com>

> Thanks Alex,
>
> I just had a quick check, called
> av_frame_get_best_effort_timestamp(pFrame); and seems
> pFrame->best_effort_timestamp was filled with desired values (1st frame
> having 0, 2nd having 1 and so on).
>
> I'll read through the link you gave me later on.
>
> Great Thanks!
>
>
> 2013/10/30 Alex Cohn <alexcohn at netvision.net.il>
>
>> On Wed, Oct 30, 2013 at 5:51 AM, YIRAN LI <mrfun.china at gmail.com> wrote:
>> >
>> > Hi friends,
>> >
>> > Here I have a question about AVFrame pts needs your help.
>> >
>> > My application uses av_read_frame to get packets and then calls
>>  avcodec_decode_video2 to get video frames. But recently I found one
>> specific video file generates strange pts/dts.
>> >
>> > Below is a part of the log:
>> >
>> > 00:00:17.301  MAIN  timestamp_debug:  pkt.pts = -9223372036854775808,
>> dts = 0
>> > 00:00:17.301  MAIN  timestamp_debug:            frame.pkt_pts =
>> -9223372036854775808, frame.pkt_dts = -9223372036854775808, frame.pts =
>> -9223372036854775808
>> > 00:00:17.301  1108  FFMPEG: looks like this file was encoded with
>> (divx4/(old)xvid/opendivx) -> forcing low_delay flag
>> >
>> > 00:00:17.301  MAIN  timestamp_debug:  pkt.pts = -9223372036854775808,
>> dts = 1
>> > 00:00:17.301  MAIN  timestamp_debug:            frame.pkt_pts =
>> -9223372036854775808, frame.pkt_dts = -9223372036854775808, frame.pts =
>> -9223372036854775808
>> > 00:00:17.301  MAIN  timestamp_debug:  pkt.pts = -9223372036854775808,
>> dts = 2
>> > 00:00:17.301  MAIN  timestamp_debug:            frame.pkt_pts =
>> -9223372036854775808, frame.pkt_dts = -9223372036854775808, frame.pts =
>> -9223372036854775808
>> > 00:00:17.301  MAIN  timestamp_debug:  pkt.pts = -9223372036854775808,
>> dts = 3
>> > 00:00:17.301  MAIN  timestamp_debug:            frame.pkt_pts =
>> -9223372036854775808, frame.pkt_dts = -9223372036854775808, frame.pts =
>> -9223372036854775808
>> > 00:00:17.301  MAIN  timestamp_debug:  pkt.pts = -9223372036854775808,
>> dts = 4
>> > 00:00:17.301  MAIN  timestamp_debug:  [a full frame : frame.pkt_pts =
>> -9223372036854775808, frame.pkt_dts = 0], frame.pts = 0
>> > 00:00:18.393  LVid236  timestamp_debug:  pkt.pts =
>> -9223372036854775808, dts = 5
>> > 00:00:18.408  LVid236  timestamp_debug:  [a full frame : frame.pkt_pts
>> = -9223372036854775808, frame.pkt_dts = 1], frame.pts = 0
>> > 00:00:18.439  LVid236  timestamp_debug:  pkt.pts =
>> -9223372036854775808, dts = 6
>> > 00:00:18.439  LVid236  timestamp_debug:  [a full frame : frame.pkt_pts
>> = -9223372036854775808, frame.pkt_dts = 2], frame.pts = 0
>> > 00:00:18.439  LSou259  FFMPEG: first_dts 0 not matching first dts
>> 113424 in the queue
>> > 00:00:18.486  LVid236  timestamp_debug:  pkt.pts =
>> -9223372036854775808, dts = 7
>> > 00:00:18.486  LVid236  timestamp_debug:  [a full frame : frame.pkt_pts
>> = -9223372036854775808, frame.pkt_dts = 3], frame.pts = 0
>> > 00:00:18.517  LVid236  timestamp_debug:  pkt.pts =
>> -9223372036854775808, dts = 8
>> > 00:00:18.517  LVid236  timestamp_debug:  [a full frame : frame.pkt_pts
>> = -9223372036854775808, frame.pkt_dts = 4], frame.pts = 0
>> > 00:00:18.549  LSou259  FFMPEG: first_dts 0 not matching first dts
>> 114675 in the queue
>> >
>> > We can see that, it was until 4th packet is sent to decode function
>> that we got the first full frame. and all frames had pts = 0
>> >
>> > So here I want to know, frame.pts, frame.pkt_dts, packet,dts. which is
>> best to represent the time stamp of a video frame (I mean pts, but in this
>> case, no pts is valid).
>> >
>> > For example, in this case, for the 1st frame, should I use
>> frame.pkt_dts (that's 0), or pkt.pts (the last packet that generates this
>> frame, in this case 4) as the time  position
>> > of the frame?
>> >
>> > The file I used to test is here
>> https://dl.dropboxusercontent.com/u/89678527/av_divx_24_yuv420p_mp3_44100_2_1.avi
>> >
>> > Thanks
>>
>>
>> That's what best_effort_timestamp is for. See
>> http://dranger.com/ffmpeg/tutorial05.html about different values of
>> pts/dts.
>>
>> BR,
>> Alex Cohn
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20131031/4604666d/attachment.html>


More information about the Libav-user mailing list