Add a new speed level between the old levels 2 and 3.
authorRalph Giles <giles@xiph.org>
Wed, 9 Feb 2011 22:08:34 +0000 (22:08 +0000)
committerRalph Giles <giles@xiph.org>
Wed, 9 Feb 2011 22:08:34 +0000 (22:08 +0000)
commit40d573e14f8d2beaa1f50dc2444b368c96077b98
treea38d49fe1c49b375adad4e21659fe5891d2af7de
parent67fe6b35fce23f9030ef47110a6ff7970ef995f1
Add a new speed level between the old levels 2 and 3.

This change inserts a new speed level OC_SP_LEVEL_NOSATD (3)
between OC_SP_LEVEL_FAST_ANALYSIS (still 2) and OC_SP_LEVEL_NOMC
(now 4). The new speed level further accelerates analysis by
using the cheaper SAD (sum of absolute differences) metric
for measuring distortion instead of the more expensive SATD
(sum of absolute transformed differences).

The new level is intermediate in both quality and encoding
speed between the adjacent speed levels, allowing smoother
adaptation to realtime encoding contraints. In particular
it's much closer to realtime 720p30 on current Core2 cpus.

The cheaper SAD metric is now also used for the fastest NOMC
speed level. This is a reduction in quality for this speed level
as well, but it also about 10% faster. Since the NOMC mode is
already very poor quality, used as a last resort when performance
is critical, we deemed this a better option than adding a further
NOMC_SATD mode or keeping the old NOMC behaviour.

To support the new speed level, parallel copies of the OC_MODE_RD
table are kept, one for each metric. The encoder context keeps
track of which on to use based ont eh current speed level. Analysis
code chooses which metric to calculate and use on the fly. The extra
conditionals did not measurably affect encoding time in benchmarks.

The metrics collection and fitting code used to generate modedec.h
is also updated to track both SAD and SATD measurements.

Thanks to Tim Terriberry and Greg Maxwell for their comments and
and contributions in reviewing this patch. The implementation
of oc_enc_frag_intra_sad is based on one from earlier development
work by Greg Maxwell.

svn path=/trunk/theora/; revision=17821
lib/analyze.c
lib/collect.c
lib/collect.h
lib/encfrag.c
lib/encint.h
lib/encode.c
lib/mcenc.c
lib/modedec.h
tools/process_modedec_stats.c