Paul Wilkins [Wed, 30 May 2012 10:29:49 +0000 (11:29 +0100)]
Rate control fix.
This fix addresses some problems with very complex clips like
handling of flashes on clips like crew (which was made worse
by an earlier patch (derf and std-hd)).
Yaowu Xu [Wed, 16 May 2012 19:07:46 +0000 (12:07 -0700)]
changed the way that default probs for 8x8 is set.
The commit changed how baseline 8x8 coefficient probabilities are
initialized, to be consistent with the initialization of baseline
4x4 coefficient probabilities.
The commit does not have any effect on compression.
Ronald S. Bultje [Tue, 15 May 2012 00:39:42 +0000 (17:39 -0700)]
Rewrite reference frame costing in the RD loop.
I now see I didn't write a very long description, so let's do it
here then. We took a pretty big quality hit (0.1-0.2%) from my
recent fix of the inversion of arguments to vp8_cost_bit() in the
RD reference frame costing. I looked into it and basically the
costing prevented us from switching reference frames. This is of
course silly, since each frame codes its own prob_intra_coded, so
using last frame cost indications as a limiting factor can never
be right.
Here, I've rewritten that code to estimate costings based partially
on statistics from progress on current frame encoding. Overall,
this gives us a ~0.2%-0.3% improvement over what we had previously
before my argument-inversion-fix, and thus about ~0.4% over current
git (on derf-set), and a little more (0.5-1.0%) on HD/STD-HD/YT.
Yaowu Xu [Wed, 9 May 2012 16:31:14 +0000 (09:31 -0700)]
Changed to use integer 8x8 dct
The commit added an integer version of 8x8 forward DCT, based on the
orginal forward DCT from VP6. The constants, roundings, and shifts
were adjusted to improve the accuracy. The latest patch has a very
similar accuracy in term of round trip error against the floating
point version.
It should be noted here that the purpose of the patch is to help
encoding speed and facilitate all other experiments. There will be
futher review in combination with inverse DCT before finalization.
configure with "--enable--int_8x8fdct" to use the integer version
Paul Wilkins [Tue, 15 May 2012 13:58:13 +0000 (14:58 +0100)]
Firstpass.c refactoring
Removed unused function.
Added tentative code to take error score of an older frame
into account when calculating Q range. However, for now
it is disabled pending merging other changes and testing.
Paul Wilkins [Mon, 14 May 2012 14:13:26 +0000 (15:13 +0100)]
Two pass refactoring continued.
Remove testing of whether we estimate that it will be possible
to code an arf at a lower Q than the ambient Q. This adds quite
a bit of extra code and complexity for marginal gain.
Factored out some code relating to ARNR selection to a separate
function as this is likely to be changed / simplified soon.
Paul Wilkins [Mon, 14 May 2012 13:54:54 +0000 (14:54 +0100)]
Two pass rc refactoring.
Removed odd *100 >> 4 factor from boost calculations. Not all the
calculations exactly match what was there before so there may be
some minor impact on results.
Some other minor tidying up in regard to coding conventions.
The specific values of factors and thresholds will likely change as
part of subsequent patches.
Ronald S. Bultje [Sat, 12 May 2012 00:48:20 +0000 (17:48 -0700)]
Don't use compound prediction for golden frames based on alt-ref frames.
These frames can force reference frame (arf), mode (zeromv) and skip,
which means that if we use compound prediction (i.e. arf+last), we
might use a blend of a perfect (arf) and an imperfect (last) predictor,
leading to semi-garbage display and thus a huge drop in SSIM/PSNR (up
to 10dB for some frames I analyzed).
Paul Wilkins [Fri, 11 May 2012 17:07:33 +0000 (18:07 +0100)]
First pass overhaul preparatory change.
This is the first patch in a series of changes to the first
pass code. (Broken down for ease of testing/merging/review).
This patch introduces a new stats element "sr_coded_error".
This is the coded error recorded vs the second reference
frame (which is updated such that it lags by at least one frame).
No use is made of the new structure in this change so this patch
should have no material effect.
Removed some ifdefs and deprecated code (#if NEW_BOOST).
Removed twopass.gf_decay_rate (not used any more)
Yaowu Xu [Thu, 10 May 2012 00:19:16 +0000 (17:19 -0700)]
Reversible WHT pair
This commit changed the forward and the inverse 4x4 Walsh Hadamard
transform to a new pair, where the inverse transform can pefectly
reconstuct the input to forward transform. It also does so without
changing the input and output value range. Even more, it does not
change the complexity of the transforms.
While it was not expected to improve the results of our current test,
it does improve std-hd set by 0.2% on all metrics. No change on derf.
Yaowu Xu [Wed, 2 May 2012 20:53:15 +0000 (13:53 -0700)]
a number of fixes to entropy stats collection
1. block types
There are only three types of blocks for 8x8 transformed MBs, i.e. Y
block with DC does not exist for 8x8 transformed MBs as all MB using
8x8 transform have 2nd order haar transform. This commit introduced
a new macro BLOCK_TYPES_8X8 to reflect such fact.
2. context counters
This commit also fixed the mixed of context_counters between 4x4 and
8x8 transformed MBs. The mixed use of the counters leads me to think
the existing the context probabilities were not properly generated
from 8x8 transformed MBs.
3. redundant collecting in recoding
The commit also corrected the code that accumulates entropy stats by
making sure stats only collected for final packing, not during the
recode loop
Deb Mukherjee [Wed, 21 Mar 2012 22:22:21 +0000 (15:22 -0700)]
Expanding the coefficient encoding contexts
This patch expands the set of prev contexts used for video coding
from 3 to 4.
There is a small improvement of the order of 0.08% for derf and
0.15% on the HD set. The tests were rerun after the various merges
last week. There are two columns in each test - the first are the
results with the mbskip change, and the second with expanded contexts
added on top of that.
Yaowu Xu [Wed, 2 May 2012 02:54:19 +0000 (19:54 -0700)]
slight adjustment to coef band definition
This commit adjusted slightly the 4x4 coefficents band definition to
better classify coefficients with similar distributions and usages.
It helps derf set about .1%, it is alos slightly positive for std-hd
set, where 4x4 blocks are used less frequently.
Adrian Grange [Thu, 26 Apr 2012 17:37:52 +0000 (10:37 -0700)]
Removed MV costing from ARNR filtering
The ARNR filter uses a motion compensated temporal filter,
but the motion estimation implementation accounts for the
cost of the mv in its decision making process. The ARNR
filter uses a dummy cost table initialized to 0 as a way
to ignore the mv costs (which are irrelevant to the filter).
This CL modifies the ARNR filter implementation to so that
the mv costing is ignored without the requirement for
dummy tables.
This commit merge the QI mode experiment. As the experiment affects
the encoding of intra coding modes on key frame only, the overall
effect of the experiment on encoding tests is insignificant.
Deb Mukherjee [Thu, 12 Apr 2012 16:24:03 +0000 (09:24 -0700)]
Differential encoding of probability updates
Adds differential encoding of prob updates using a subexponential
code centered around the previous probability value.
Also searches for the most cost-effective update, and breaks
up the coefficient updates into smaller groups.
This commit changed to enable the usage 8x8 transform for all frame
type, all resolution and all quantizer range. This has an overall
benefit .2% to .3% in term of compression, but more importantly,
the difficult clips benefits much more, up to 2% to 3% on clips
like football, harbour and so on.
We observed some weird humps on very high end on a couple of youtube
clips, but have determined the underly cause was the aggressive zbin
having an effect of lowering rate with lower quality, which have
an impact on slide show clips around 60DB.
The commit does not change the association between prediction mode
and transform size.
Deb Mukherjee [Wed, 11 Apr 2012 21:32:20 +0000 (14:32 -0700)]
Turning off interpolation filter selection
Turning off the interpolation filter selection based on edge
proportion. This heuristics has not been working as well as
expected and I have started a more rigorous investigation into
this. We can turn this off for now since it is unnecessarily
slowing things down.
This commit tries to address an issue related to the oddity shown on
HD _mobcal clip, where some rather ugly blocks shown in the second
frame at low-mid bit rates if the third frame is not made a key frame
by he encoder. The fixes include: 1) made calls to sad_16x16 to be
consistent with function prototype. 2) remove the error bias to intra
and golden in mbgraph search. 3) changed the error accumulation on
inter_segment encoding to avoid potential out-of-range. 1) has no
effect on encoding results.
Encoding test show that the overall effect of the commit helps about
.2%(HD) to .3%(cif)
The commit removed a limit on key frame detection, which caused a big
drop in all metric measurements for standard HD clip such as _mobcal.
This single change helps two standard HD clips by a huge amount, which
help the overall std-hd set by 2.4% (glb psnr), 0.9% (avg_psnr), 2.1%
(vpxssim).
In the result page:
http://pafr9.prod.google.com:26163/?/cns/rc-d/home/on2-prod/sunkaras/borg-test/yaowu
2012_04_02_1649_yaowu_bugfix_std-hd
2012_04_03_1452_yaowu_hump_std-hd
represent the encoding test results and std-hd set prior and after this
commit respectively.
This commit has made macro_block_yrd_8x8 and macro_block_yrd_8x8 to
take same parameters. It also removed a few unnecessary shifts that
has the potential to create out-of-range distortion values.
Paul Wilkins [Tue, 27 Mar 2012 12:01:34 +0000 (13:01 +0100)]
T8x8 zbin and rate control changes.
Some adjustments to zbin for t8x8.
Changes to rules for sizing forced key frames.
Some extra stats output in tmp.stt.
Approximate gain on YT-hd set 0.5%
There are still issues in sizing key frames and gf/arf frames
when the image is largely static. These in part relate to
problems with cost estimates in the recode loop.
Adrian Grange [Fri, 6 Apr 2012 23:38:34 +0000 (16:38 -0700)]
Superblock encoding order
This is the first patch to add superblock (32x32) coding
order capabilities. It does not yet do any mode selection
at the SB level, that will follow in a further patch.
This patch encodes rows of SBs rather than
MBs, each SB contains 2x2 MBs.
Two intra prediction modes have been disabled since they
require reconstructed data for the above-right MB which
may not have been encoded yet (e.g. for the bottom right
MB in each SB).
Results on the one test clip I have tried (720p GIPS clip)
suggest that it is somewhere around 0.2dB worse than the
baseline version, so there may be bugs.
It has been tested with no experiments enabled and with
the following 3 experiments enabled:
--enable-enhanced_interp
--enable-high_precision_mv
--enable-sixteenth_subpel_uv
in each case the decode buffer matches the recon buffer
(using "cmp" to compare the dumped/decoded frames).
Note: Testing these experiments individually created
errors.
Some problems were found with other experiments but it
is unclear what state these experiments are in:
--enable-comp_intra_pred
--enable-newentropy
--enable-uvintra
This code has not been extensively tested yet, so there
is every likelihood that further bugs remain. I also
intend to do some code cleanup & refactoring in tandem
with the next patch that adds the 32x32 modes.
Deb Mukherjee [Wed, 28 Mar 2012 22:19:45 +0000 (15:19 -0700)]
Bug fix in probability update savings computation
Found this bug while tracking down some anomalies in my experiments.
Since vp8_cost_one and vp8_cost_zero return unsigned int, the
bit shift by 8 will be incorrect if the value is negative.
I am cautiously optimistic that this fix will make the prob
updates more correct and somewhat improve results across the board.
But the update probabilities will need to be retuned I think.
Patch 2: Adding more of the same fixes using a macro.
Yaowu Xu [Mon, 19 Mar 2012 18:03:27 +0000 (11:03 -0700)]
enable 8x8 transform for MBs in intra frames
When ac_yquant>171, a key frame is enabled to use 8x8 transform. In
such case, MBs with DC_PRED or TM_PRED are selected to use T8x8. This
change helped the full STD-HD set by ~.1% or so, which is reasonable
considering how often key frame occurs in these encodings.
Paul Wilkins [Wed, 21 Mar 2012 18:22:33 +0000 (18:22 +0000)]
Only support improved quant
Deprecate fast quant and strict_quant code.
Small effect on quality as fast was used in first pass but the
effect is basically neutral across the derf set.
The rationale here is to reduce the number of code paths for
now to make experimentation easier. Optimized and fast code
options can be re-introduced later along with other encode
speed options.
Deb Mukherjee [Mon, 19 Mar 2012 14:53:05 +0000 (07:53 -0700)]
Making subpel filters switchable at frame level
Various refactoring to make the subpel motion compensation
filters switchable by a frame level field.
Two types of 8-tap filters are supported in addition to the existing
bilinar and sixtap filters. One is the default 8-tap and the
other has a sharper cut-off for use with frames with substantial
edge content.
Patch 2: Added a preliminary strategy for filter selection based on
edginess detecton. Also includes some filter changes.
Deb Mukherjee [Mon, 19 Mar 2012 18:02:04 +0000 (11:02 -0700)]
Adding contextual coding of mb_skip_coeff flag.
Using contextual coding of the mkb_skip_coeff flag using the
values of this flag from the left and above. There is a small
improvement of about 0.15% on Derf:
http://www.corp.google.com/~debargha/vp8_results/mbskipcontext.html
Refactored to use pred_common.c by adding a new context type.
Results on HD set (about 0.66% improvement):
http://www.corp.google.com/~debargha/vp8_results/mbskipcontext_hd.html
Incliding missing refactoring to use the pred_common utilities.
Yaowu Xu [Tue, 13 Mar 2012 17:26:53 +0000 (10:26 -0700)]
added clamp for 2nd motion vector
The commit added a clamp to the 2nd motion vector used in compound
prediction to insure mv within UMV borders. The clamp is similar to
that of the first motion vector except that No SPLITMV is ever used
for the 2nd motion vector.
Yaowu Xu [Wed, 7 Mar 2012 20:25:50 +0000 (12:25 -0800)]
Added encode/decode recon buffer match test to vpxenc
The commit added a new command line option --test-decode to vpxenc.
The option enables encoder to decode compressed frames and test recon
buffers from the decode against those from encode for mismatch.
There are a few limitations on this option currently, one of them
being the match test is not done on a number of lagged frames at
the end of an encoding.
Yaowu Xu [Thu, 15 Mar 2012 00:29:39 +0000 (17:29 -0700)]
fixed a bug of context overwritten by key frame recoding
The recoding loop save and restore frame coding context for recodes.
However in recoding of key frames, some of the coding context saved
was stale from last encoded inter frame. The save/restore sometimes
overwrites the re-inintialized coding context with saved context
from last frame, resulting in encoder/decoder mismatch
Yaowu Xu [Mon, 12 Mar 2012 21:51:54 +0000 (14:51 -0700)]
fixed .mk files to reflect add/remove of a header file
In a previous commit, the duplicate of headerfile defaultcoefcounts.h
was identified. This commit updates the .mk file to ensure configure
and make works properly for all platforms.
Yaowu Xu [Wed, 7 Mar 2012 17:05:26 +0000 (09:05 -0800)]
Changed MAX_PSNR to be consistent with internal stats
The maximum psnr has a marginal impact on the overall output in high
quality encodings, the change will make sure the psnr output to be
consistent with encoder internal stats.
Jim Bankoski [Tue, 6 Mar 2012 17:31:51 +0000 (09:31 -0800)]
Imported a change from stable branch
https://gerrit.chromium.org/gerrit/#change,17319 fixes cost estimating
to take skip_eob into account. No quality difference seen on derf set
tests, but about .4% gain on STD_HD set.
Yaowu Xu [Wed, 22 Feb 2012 02:10:18 +0000 (18:10 -0800)]
Changed how UV r/d estimates are done for Intra Modes
The commit changed to compute UV intra RD estimates for 4x4 and 8x8
separately to be used in mode decision for MB modes associated with
the appropriate transform size respectively. Now finally after many
other changes related 8x8 quantizer zbin boost and zbin_mode_boost,
this change overall helps the HD(with 8x8) by around ~.13%.
(avg .13% glb .13% ssim .17%)
The commit also has a few changes for eliminating compiler warnings.
Yaowu Xu [Tue, 28 Feb 2012 22:19:38 +0000 (14:19 -0800)]
Correct zbinboost lookup for 8x8 quantizer
The commit fixed a problem where 8x8 regular quantizer was using the
4x4 zbinboost lookup table that only has 16 entries at each Q. The
commit assigned a uniform zbin boost value for all cases that there
are more than 16 consective zeros. The change only affects MBs using
8x8 transform. The fix has a slightly positive impact on quality.
Deb Mukherjee [Mon, 27 Feb 2012 18:22:38 +0000 (10:22 -0800)]
Initial refactoring of high_precision mv code.
This is the first patch for refactoring of the code related to
high-precision mv, so that 1/4 and 1/8 pel motion vectors can
co-exist in the same bit-stream by use of a frame level flag.
The current patch works fine for only use of 1/4th and
only use of 1/8th pel mv, but there are some issues with the
mode switching in between. Subsequent patches on this change Id
will fix the remaining issues.
Patch 2: Adds fixes to make sure that multiple mv precisions can
co-exist in the bit-stream. Frame level switching has been tested
to work correctly.
Results on derf after ssse3 bugfix, compared to everything
enabled but the 8-tap, 1/8-subpel and 1/16-subpel uv. Overall the
gains are about 3% now. Hopefully there are no more bugs lingering.
Apparently the sse3 bug affected the quartel subpel results more than
the eighth pel ones (which is understandabale because one bad predictor
due to the bug, matters less if there are a lot more subpel options
available as in the 1/8 subpel case).
The results in the 4th column correspond to the current settings.
The first two columns correspond to two settings of adaptive switching
of the 1/4 or 1/8 subpel mode based on initial Q estimate. These
do not work as good as just using 1/8 all the time yet.