[FFmpeg-devel] high cpu usage and frame dropping

Don Moir donmoir at comcast.net
Wed May 2 22:08:34 CEST 2012


> On Wed, May 02, 2012 at 02:31:34PM -0400, Don Moir wrote:
>> All players I tested fail badly when I push them. They try to drop 
>> frames, but they can stop displaying all together and never recover, 
>> audio is no longer serviced, and worse.
>>
>> A sad state of affairs for players that have been out for awhile.
>
> I don't think you can have tested many. MPlayer will just desync, or you
> can tell it to skip even decoding, though that has a good chance of
> crashing.
> Anyway I can't see why it is a sad state, in 90% of cases the video will
> be unwatchable anyway, why putting a lot of effort into what just ends
> up prolonging the users' pain.

I tested WMP, QuickTime, VLC, SMPlayer, and player built into firefox. I 
would say the most used players on windows are WMP, QuickTime, and VLC. 
SMPlayer uses mplayer.

All these players failed badly when pushed. When I say badly, I mean 
ridiculously bad.

It's a sad state mostly because it's handled poorly to begin with and then 
they can't even recover from it. Again stop playing altogether, infinite 
short audio loops (audio stops getting serviced), and more. WMP seemed to 
handle it better but only because it did nothing to deal with it and audio 
and video totally out of sync.

>> I have tried various flags etc to speed things up and that helps a little 
>> but not enough and they don't really work anyway. There could be 
>> something in the flags or callbacks that would help alot but I have not 
>> found them yet.
>
> You're too vague. skiploopfilter always helps a lot for files using the
> feature.
> For high level H.264 skipping nonref frames will cut the processing time
> by at least half.

I have tried skip_frame and skip_loop_filter. These do help. The thing is 
you need to turn these on and off on the fly depending on CPU usage etc. and 
that is ok but still in some cases not enough. Also, you can't use these 
blindly as you may not get any frame at all depending on demuxer and if 
there are going to be future keyframes etc. I tried AVDISCARD_NOREF and 
AVDISCARD_NONKEY with some improvement.

I think using skip_frame and skip_loop_filter can have some side effects 
such as distortion also, when changing on the fly, so that has to be dealt 
with.

In our applications, we have the abilitily to play any number of videos at 
the same time. This is not to say we do this in an abitrary way. The most 
use case of this is to fade in one video while the other is fading out. 
There was a request that I do this and that led me down the path of beating 
the hell out of things related to CPU usage. On my fast machine I played 7 
high res videos all at the same time in one container with no real impact 
and no frame drops.

In my test app, I can control when I need to start dropping frames depending 
on desired CPU usage. I can set this to allow anywhere from 1 to 100 percent 
usage. For much of testing with many different files, I set it to 1 or 2 
percent so I can see the effect it might have.

So the thing that works absolutely the best so far is to stop decoding and 
wait but I will continue to dig.

Is there any possible way to know if a future keyframe will exist on a 
general basis when index entries may not exist ? If it means I have to look 
as every possible codec and make a best guess that would probably be ok.




More information about the ffmpeg-devel mailing list