[FFmpeg-trac] #504(undetermined:new): Fixing av_seek_frame
FFmpeg
trac at avcodec.org
Sun Sep 25 01:25:25 CEST 2011
#504: Fixing av_seek_frame
-------------------------------------+-------------------------------------
Reporter: DonMoir | Type: defect
Status: new | Priority: normal
Component: | Version:
undetermined | unspecified
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
libavutil 51. 16. 1 / 51. 16. 1
libavcodec 53. 16. 0 / 53. 16. 0
libavformat 53. 12. 0 / 53. 12. 0
libavdevice 53. 4. 0 / 53. 4. 0
libavfilter 2. 43. 2 / 2. 43. 2
libswscale 2. 1. 0 / 2. 1. 0
libpostproc 51. 2. 0 / 51. 2. 0
av_seek_frame fails in several cases. This is an attempt to write a seek
function that works as expected. It may be that avformat_seek_file will be
an attempt to fix all this, but currently it just calls av_seek_frame
since read_seek2 does not exist. So mostly this needs to be a rewrite of
libavformat\utils.c.
I see that alot of the failures occur because the AVStream index_entries
is NULL or none of the entries are flaged with AVINDEX_KEYFRAME, but there
are other reasons for failure and thats going to require more digging.
This discussion is probably going to end up being lengthy. I have several
files that fail but they fail for various reasons. If you want I will just
put it all on this ticket, or open a new ticket for each case, or we can
just communicate by email. Let me know.
This first case is the simplest I have. It has index_entries but none of
them are flagged with AVINDEX_KEYFRAME. It has read_seek but that returns
-1. It ends up calling seek_frame_generic which calls
av_index_search_timestamp and that fails since none of the entries are
marked with AVINDEX_KEYFRAME. So the end result of av_seek_frame is -1.
You cannot just call av_seek_frame with AVSEEK_FLAG_ANY because that will
just put you in the middle somewhere and that will produce incorrect
results when you decode it. For looping back to the beginning, using
AVSEEK_FLAG_ANY will work since the reality here is the first frame is the
key frame. In order to correcly seek into this file at an arbitrary
position, I suppose you would need to decode the first frame and then
proceed to the timestamp of interest. The attached file, filecopy.avi, can
be tested with ffplay by using the left arrow key and you will see it says
'error while seeking'.
This is just the first case. I have several others but maybe by fixing a
few these it will cover most cases.
Another note for now is when av_seek_frame_binary is called, there are 2
variables called pos_min and pos_max. I have files where
av_seek_frame_binary is called and either 1 or 2 of the variables are
never initialized. Then av_gen_search is called with the unintialized
variables. I will get back to this later with file examples.
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/504>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list