[FFmpeg-devel] low and not so low hanging h264 fruits
Michael Niedermayer
michaelni
Sun Feb 14 04:20:03 CET 2010
Hi
Id like you dear reader to help in optimizing h264, so please pick an
idea from below and work on it.
1. The direct temporal mv generation code (stuff like "scale * my_col + 128")
works with 2 values at once and looks like a good candidate for mmx
this one is easy
2. Our direct temporal & spatial MV generation code works with either 1 16x16
or 4 8x8 blocks, try adding code for the 2 block case (16x8/8x16)
this is easy too but no gurantee that its a win speedwise, it could be
slower due to being more code.
3. mb_stride, b4_stride, b8_stride whatever, our decoder is full of them
change them to a named macro and make it a constant this would reduce
the amount of reading these from context, less register pressure and
addressing values above and below change from [2+2*b4_stride] to [constant]
may or may not be easy
4. interleave code from fill_decode_caches and the mb decode functions calling
that so that branches are reduced as well as code is being excuted less
often. An example would be dark shikaris suggestion of not setting
non_zero_count_cache if cbp is 0.
This will likely be a "argh why doesnt that work" requireing some analysis
of where things are set and used and what can and cannot be move where.
Also no gurantee that this is faster at all, changes register pressure and
more complex code accessing more different things + gcc could kill the gains
Something similar could also be tried with the fill_filter_caches and the
loop filter
Also i might be working on parts of this, more specifically the fill+cabac
relative stuff, cabac is doing some seriously redundant looking things that
i plan to work on soon
5. simply going over all the if() finding ones that are poorly predictable
and trying to replace them by branchless code where it is faster and
cleanly doable
6. our Motion Compensation code works directly from the pictures, it is
possible that in some cases it would be faster to use a intermediate
halfperl interpolated image. This should be especially for small blocks
and bidirectionally predicted blocks
This likely is not easy, and ideally should be adaptively selected
depending on picture content (use last pictures motion vectors to predict
which way is better for the current picture. Or maybe have some kind of
cache that calcuates and reuses halfpel values between blocks but doesnt
cause any to be calculated if no block needs them ...
I have many more ideas, ill post them once some of these are done
PS: a SOC h264 optimizing project would be a good idea too with qualification
task of making our decoder at least 1% faster.
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Democracy is the form of government in which you can choose your dictator
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100214/e04a5cf2/attachment.pgp>
More information about the ffmpeg-devel
mailing list