[FFmpeg-devel] [PATCH] Fix MPEG-TS seek and frame positions in general
Ivan Schreter
schreter
Tue Feb 17 11:02:03 CET 2009
Baptiste Coudurier wrote:
> Hi,
>
> Ivan Schreter wrote:
>
>> Ivan Schreter wrote:
>>
>>> Ivan Schreter wrote:
>>>
>>>
>>>> Ivan Schreter wrote:
>>>>
>>>>
>>>>
>>>>> [...]
>>>>> Patch #5: mpegts seek only searches for a PES packet with correct pid
>>>>> and existing DTS and relies on this being a key frame. This is not
>>>>> even the case in the test file. Read frames via av_read_frame until a
>>>>> key frame is found and return position/timestamp of this frame. This
>>>>> needs #1 to reset the packet reader after reading the frames, so
>>>>> further reads work correctly, #2 to have correct positions from mpegts
>>>>> and #4 to have exact position of the packet for later file seek.
>>>>>
>>>>>
>
> If I understand correctly, this seems to be a general issue with
> read_timestamp which does not honor the key frame request.
>
>
Yes, read_timestamp will return position of some timestamp, not
necessarily a key frame. mpegts by itself cannot know, if it is a key
frame or not, only after actually parsing the frame found at the given
position (and walking to a frame which IS a key frame).
Generic implementation would then in av_gen_search() call
read_timestamp_and_find_keyframe() instead of just read_timestamp(), and
this new function would call read_timestamp() and then walk the frames
until key frame found. I.e., the code for key frame search which I
implemented for mpegts.c would be moved to utils.c. Do I understand you
correctly?
The only disadvantage is, if we have some formats which do return
timestamp of a key frame, we'd do an unnecessary read_frame. But since
seeking is IMHO not that time critical, this should be no big deal.
Shall I prepare a patch for that? Michael must also give his OK then, I
suppose.
> I'm not sure if this code belongs in mpegts demuxer since mpegps also
> suffer from the same problem, using read_timestamps.
>
Possibly. I didn't check mpegps, since I only want to process mpegts
files :-)
> I think this could be handled in a generic way in av_seek_frame_binary.
> Maybe mpegts and mpegps demuxer could use AVFMT_GENERIC_INDEX to
> populate index entries with key flag set which will be set by parser, it
> seems current mpegps demuxer use index but consider all frames as key
> frames.
>
Currently, it seems like the index is not populated for mpegts. Do you
mean, setting this flag will do it then automagically? I'll try it.
Regards,
Ivan
More information about the ffmpeg-devel
mailing list