[FFmpeg-devel] ogg seeking status

Don Moir donmoir at comcast.net
Wed Feb 8 20:29:42 CET 2012

----- Original Message ----- 
From: "Don Moir" <donmoir at comcast.net>
To: "FFmpeg development discussions and patches" <ffmpeg-devel at ffmpeg.org>
Sent: Wednesday, February 08, 2012 5:06 AM
Subject: Re: [FFmpeg-devel] ogg seeking status

>> On Mon, Feb 06, 2012 at 04:36:37PM -0500, Don Moir wrote:
>>> Good to see you are persistent reimar, I figured you and others
>>> might be getting tired of this by now.
>>> >On Mon, Feb 06, 2012 at 12:14:09PM -0500, Don Moir wrote:
>>> >>o - the reimar patch to ogg_read_timestamp does provide somewhat
>>> >>accurate keyframe seeking - problem is it doesn't get close
>>> >>enough - not sure if this is a failure of the algorithm or not
>>> >>but I do know that much closer keyframes are available - I was
>>> >>not able to improve on it. Since you still don't have the index
>>> >>entries, future seeks will tend to have the same "not close
>>> >>enough" problem and this can effect exact timestamp seeking
>>> >>quite abit. If you don't care about exact timestamp seeking then
>>> >>I suppose it works well enough, but expect it to be off
>>> >>sometimes quite abit.
>>> >
>>> >Can you provide a sample?
>>> This file is kind of large but shows a couple things. Probably best
>>> tested in MPlayer for you. I can also provide more samples.
>>> 1) with your ogg_read_timestamp patch in and on startup, click
>>> around the 6 - 7 minute mark and it should jump back to the 3 - 4
>>> minute mark
>> MPlayer seeks at least within 10 seconds of any position in the 6
>> - 7 minute area.
>> However the audio time stamps for a while reset to 0 before going
>> back to proper values, so that might cause some issues.
>> I have not yet tests FFmpeg/ffplay, but it seems to me that the
>> seek function in principle seems to work fine.
> I guess the thing is we and/or I don't know what MPlayer might be doing to 
> catch up to the requested time.
> With my own app I can set that in about 3 or 4 ways to test things and 
> thats the value of a special test app and looking directly at the code to 
> see what's going on. As it stands I can't count on SMPlayer or ffplay to 
> do things right (or any other player really for all cases of every format) 
> but they can be good for a cross-check.
> With this sample:
> http://sms.pangolin.com/temp/bad_seek_not_accurate.ogv  (104 mb)
> I just noticed that this is one of those many "good" files that won't work 
> correctly if you don't set os->keyframe to zero after seek. I don't even 
> notice these kind of problems because I always set keyframe to zero after 
> seek. Your audio being off is is good indication of this and reminded me 
> to check the behavior of that and sure enough was a problem if I don't set 
> os->keyframe to zero but it's not bad for this file and it does not effect 
> this test I am going to ask you to do.
> Test 1)
> Open this file like you would normally in some of your own code or use the 
> MPlayer code to get it opened. I open the audio and video streams for this 
> file.
> Then do: avformat (pFormatCtx, videoStreamIndex, INT64_MIN, 0x405c, 
> INT64_MAX);'

sorry meant to say do:

Then do: avformat_seek_file (pFormatCtx, videoStreamIndex, INT64_MIN, 
0x405c,> INT64_MAX);'


> For this file, the 0x405c corresponds to about 9 minutes.
> Start reading packets until you get the first videoStreamIndex packet 
> using av_read_frame (pFormatCtx, &packet);
> The first videoStreamIndex packet should contain 0x1b41 for both the 
> packet pts and dts values. 0x1b41 a little less than 4 minutes for the 
> video stream for this file and this is way off.
> Now I would need to proceed to read packets and making sure is all good 
> until I hit the 9 minute mark. When doing exact timestamp seeking you have 
> to make sure complete frames are going to be available and this can slow 
> it down when your time is way off like this.
> Ok the above test should get us on the same page for the way off problem 
> :)
> Test 2)
> Open the file much like to did in Test 1, and just after open, read and 
> free all the packets. You can then check the video stream index_entries 
> and you will see many entries and they all flagged as key frames. If you 
> now look in the index_entries around position 0x102 you will have a 
> keyframe with timestamp at 0x4020 which is much closer than that returned 
> by just avformat_seek_file. You can now seek directly to the position 
> associated with 0x4020 and proceed quickly.
> For ogg files only:
> What I currently do is I first call avformat_seek_file but I am going to 
> optimize that. I then check to see how close it got. If it's not close 
> enough, I read in some packets starting at the position set by 
> avformat_seek_file and check the timestamps of the packets. If I have 
> determined I can get closer then I do a qucik seek to the index_entries of 
> that closer timestamp. I can now proceed and be happy it's as close as 
> possible and this is quick. I would not have to do this extra step if 
> avformat_seek_file got closest to begin with.
> All the ogg files that don't seek correctly for ffmpeg when you don't set 
> os->keyframe to zero after seek, do work in ffdshow libavcodec. They also 
> all work in my app because I set os->keyframe to zero after seek and I 
> have not found any file it breaks. ffdshow libacodec is just not very fast 
> at seeking for the above file.
> Let me try and give another status list here:
> o - I have not had any problem with the patch for fix potential infinite 
> discard loop. This fixes files like BuckBunny on ticket #941.
> o - I know I get much closer to a requested timestamp then that set by 
> avformat_seek_file with your ogg_read_timestamp patch. I took a quick look 
> at the patch to see if I could improve on it but wasn't able to without 
> spending much time on it. Before this patch, the seek position of the 
> requested timestamp was pretty much dead on, but you will be positioned 
> such that you will get incomplete frames.
> o - I probably could tell you why setting os->keframe to zero fixes things 
> and doesn't appear to break anything, I do have some clues but I am in 
> punt mode right now and don't have the time for it just yet. I just need 
> something that works now and that does the trick. Setting this to zero 
> fixes about 20 percent of my ogg files and I have not found any file it 
> breaks. Try setting os->keyframe to zero on this file. For me it fixes it 
> perfect. You told me it's a bad file. You may not be able to count on 
> whatever it is that you are using to test with to do it right. 
> http://sms.pangolin.com/temp/bad_seek_os-keyframe_Wiki_feel_stupid.ogv If 
> you want a bunch more then ask. I hope you will look into this issue more 
> as well. Don't just say this is a bad file and give up on it. I have 
> several that have the same problem. I have no problem with this file.
> o - with some changes I have made and some patches from reimar all my ogg 
> files work and seek well. The fact is, my app now does this better than 
> any other player I tested: VLC, fflpay, SMPlayer, and WMP using ffdhow. 
> These players all have problems with ogg. ffdshow libavcode does get it 
> all right, it just can be slow on some seeks.
>> but it seems to me that the seek function in principle seems to work 
>> fine.
> Yes it does appear to work in principle. That is you are going to be 
> positioned at a keyframe and can expect clean results. It can be very far 
> off though and I don't know why that is. Please run Test 1) and Test 2) 
> above so we can see what your results are.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel 

More information about the ffmpeg-devel mailing list