[FFmpeg-trac] #1607(avformat:new): av_seek_frame() without AVSEEK_FLAG_ANY on mpg files returns success without seeking to a keyframe
FFmpeg
trac at avcodec.org
Mon Aug 6 22:50:19 CEST 2012
#1607: av_seek_frame() without AVSEEK_FLAG_ANY on mpg files returns success
without seeking to a keyframe
------------------------------------+------------------------------------
Reporter: mbradshaw | Owner:
Type: defect | Status: new
Priority: normal | Component: avformat
Version: git-master | Resolution:
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
------------------------------------+------------------------------------
Description changed by mbradshaw:
Old description:
> The documentation of `av_seek_frame()` makes a contract that it seeks to
> a keyframe if AVSEEK_FLAG_ANY is not set. mpg files break this contract
> by not seeking to a keyframe but returning success.
>
> Seeking in mpg should require AVSEEK_FLAG_ANY to be set in order for
> success to be returned.
>
> For context on how this came about, see this thread:
> http://ffmpeg.org/pipermail/libav-user/2012-July/002468.html
>
> I originally opened ticket #1575 but Don Moir pointed out this is more of
> a bug than a lack of documentation.
New description:
The documentation of `av_seek_frame()` makes a contract that it seeks to a
keyframe if `AVSEEK_FLAG_ANY` is not set. mpg files break this contract by
not seeking to a keyframe and still returning success.
'''Updated Edit:'''
It seems that any `AVInputFormat` that doesn't have it's own `read_seek()`
or `read_seek2()` functions defined will default to either
`ff_seek_frame_binary()` or `ff_gen_search()` (with priority given to
`ff_seek_frame_binary()`). `ff_seek_frame_binary()` doesn't respect
seeking by keyframe, and will break the keyframe contract made by
`av_seek_frame()` when `AVSEEK_FLAG_ANY` is not set.
Proposed solutions:
'''1)'''
Seeking in mpg should require `AVSEEK_FLAG_ANY` to be set in order for
success to be returned (return failure if it's not specified). This can be
done by requiring `AVSEEK_FLAG_ANY` to be set before calling
`ff_seek_frame_binary()`.
'''2) (in response to Don's suggestions)'''
Change `ff_seek_frame_binary()` so that it respects seeking by keyframe if
`AVSEEK_FLAG_ANY` is not set. This can be done by sequentially reading
(either forwards or backwards (I would prefer backwards)) up to a keyframe
after the binary search is complete.
For context on how this came about, see this thread:
http://ffmpeg.org/pipermail/libav-user/2012-July/002468.html
I originally opened ticket #1575 but Don Moir pointed out this is more of
a bug than a lack of documentation.
--
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/1607#comment:6>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list