Michel Bardiaux wrote:
> Arjan wrote:
>> Hi all,
>> I am trying to implement a seek function for my video playback system. 
>> I'll try to explain the problem by this example: (times in milliseconds)
>>
>>
>> SEEK DONE                       (seek to 5000, using AVSEEK_FLAG_BACKWARD)
>> VIDEO PTS FOUND: 4960           (key frame)
>> VIDEO PTS FOUND: 5000
>> VIDEO PTS FOUND: 5040
>> VIDEO PTS FOUND: 5040
>> VIDEO PTS FOUND: 5080
>> VIDEO PTS FOUND: 5120
>> VIDEO PTS FOUND: 5160           (key frame)
>> VIDEO PTS FOUND: 5200
>> VIDEO PTS FOUND: 5240
>> VIDEO PTS FOUND: 5280
>> WRITTEN PTS [5280] INTO BUFFER  (avcodec_decode_video returned frame)
>>
>>
>> Here's what's happening; I tried seeking to 5000ms, I used the 
>> AVSEEK_FLAG_BACKWARD so I would get the first keyframe before the time I 
>> need. This seems to work fine, as the first PTS which is found, is a 
>> keyframe. The next frame is the valid frame, but avcodec_decode_video 
>> does not return a frame.
>> It's only at pts 5280, when there has been another key frame and several 
>> B frames, that avcodec_decode_video finally returns a frame.
>>
>> I would like to know if this is expected behaviour, 
>
> Impossible to tell without knowing the GOP structure. Besides, is PTS 
> 5040 really duplicated? That is suspect.
>
>> and if it is, how 
>> can I make sure I get the frame I need as fast as possible?
>
> There are the fields hurry_up, skip_frame and skip_idct in the codec 
> context, that might be a solution. Just a guess though, I dont know what 
> they do exactly.
>
>> thanks in advance,
>>

I'm investigating this again, and I still don't get it.
I only get the duplicate frames when I do an av_seek_frame call.
After the call I always flush the buffers (avcodec_flush_buffers) but it 
doesn't matter.

it comes down to the following calls:

- av_seek_frame
- avcodec_flush_buffers
- av_read_frame

They are executed in that order, but after I call avcodec_decode_video 
on the aquired videopacket, I sometimes get repeated pts values and I 
don't always get the keyframe I expect.

I already tried setting skip_loop_filter, skip_idct and skip_frame to 
AVDISCARD_NONE, but it did not change anything.

I hope someone can point me in the right direction, this is really 
annoying :)
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to