[Libav-user] How to get precise frame timestamp

YIRAN LI mrfun.china at gmail.com
Wed Oct 30 04:51:30 CET 2013


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20131030/5e55a942/attachment.html>


More information about the Libav-user mailing list