[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