]> granicus.if.org Git - libvpx/log
libvpx
12 years agoAdded encoding in Superblock Order
Adrian Grange [Thu, 2 Feb 2012 17:04:40 +0000 (09:04 -0800)]
Added encoding in Superblock Order

As a precursor to encoding 32x32 blocks this cl adds the
ability to encode the frame superblock (=32x32 block) at
a time. Within a SB the 4 indiviual MBs are encoded in
raster-order (NW,NE,SW,SE).

This functionality is added as an experiment which can be
enabled by ispecifying --enable-superblocks in the
command line specified to configure (CONFIG_SUPERBLOCKS
macro in the code).

To make this work I had to disable the two intra
prediction modes that use data from the top-right of the
MB.

On the tests that I have run the results produce
almost exactly the same PSNRs & SSIMs with a very
slightly higher average data rate (and slightly higher
data rate than just disabling the two intra modes in
the original code).

NOTE: This will also break the multi-threaded code.

This replaces the abandoned change:
Iebebe0d1a50ce8c15c79862c537b765a2f67e162

Change-Id: I1bc1a00f236abc1a373c7210d756e25f970fcad8

12 years agoComment out segref segmentation filter changes.
Paul Wilkins [Tue, 31 Jan 2012 13:09:49 +0000 (13:09 +0000)]
Comment out segref segmentation filter changes.

Commented out changes from earlier checking:

"Change Iab7f1eff: vpnext use segref segmentation filter"

Which in its current state breaks the decoder.

Change-Id: I9185098aeda8ce65310f338c4c9375f4a39005d3

12 years agoFixes a decoder bug
Yaowu Xu [Wed, 1 Feb 2012 22:49:10 +0000 (14:49 -0800)]
Fixes a decoder bug

The bug was introduced by the commit that added I8X8 intra prediction
mode for inter frames, the decoder was not update to accept the additional
probability update from encoder. This causes the decoder typicall to crash
when encoder sends intra mode probability update.

Change-Id: Ib7dc42dc77a51178aa9ece41e081829818a25016

12 years agoImport another decoder bug fix from public stable branch
Author: John Koleszar [Wed, 1 Feb 2012 22:40:15 +0000 (14:40 -0800)]
Import another decoder bug fix from public stable branch

Please see the following for details:
https://gerrit.chromium.org/gerrit/#change,10925

Change-Id: Ie692261c255c58d7762df22eeca566a7d13adcba

12 years agoImport a decoder bug fix from public stable branch
Scott LaVarnway [Wed, 1 Feb 2012 22:27:50 +0000 (14:27 -0800)]
Import a decoder bug fix from public stable branch

Please see the following public commit for details:
https://gerrit.chromium.org/gerrit/#change,7608

Change-Id: I589eed0b6078e2c5c9c74e942886e503bd02b273

12 years agoCorrectly capped minqtarget to maxq
Adrian Grange [Tue, 31 Jan 2012 20:58:34 +0000 (12:58 -0800)]
Correctly capped minqtarget to maxq

This line of code incorrectly set maxq = maxq rather than
capping minqtarget.

Change-Id: Ifbc86df8b0ff2779e7b2a5f7349724d04a18bd62

12 years agoMerge "Refining the 8-tap interpolation filters." into experimental
Deb Mukherjee [Tue, 31 Jan 2012 16:40:41 +0000 (16:40 +0000)]
Merge "Refining the 8-tap interpolation filters." into experimental

12 years agoImplementation of new prediction model for reference frame coding.
Paul Wilkins [Sat, 28 Jan 2012 12:20:14 +0000 (12:20 +0000)]
Implementation of new prediction model for reference frame coding.

This check in uses the common prediction interface functions
to code reference frame.

Some updates made regarding the impact of the new code in rd loop
but there remain TODOs in this regard.

Change-Id: I9da3ed5dfdaa489e0903ab33258b0767a585567f

12 years agoUse common prediction interface for segment coding.
Paul Wilkins [Sat, 28 Jan 2012 10:24:43 +0000 (10:24 +0000)]
Use common prediction interface for segment coding.

This does not change any functionality just modifies the code to
use the common prediction module interface for coding
the segment data.

Change-Id: Ifd43e9153573365619774a4f5572215e44fb5aa3

12 years agoAdded common prediction modules.
Paul Wilkins [Sat, 28 Jan 2012 10:07:08 +0000 (10:07 +0000)]
Added common prediction modules.

This function adds the common prediction modules,  some data structures
and a config option but does not use them.

It also corrects a bug in clearing down  the MODE_INFO border and introduces
a new element that indicates if an entry corresponds to an "in image" macro block
or is part of the border.

Change-Id: Ib69eec0876173ebe9d1de9df9537d0b2447702e0

12 years agoMoved some reference frame data structures into common.
Paul Wilkins [Sat, 28 Jan 2012 08:50:33 +0000 (08:50 +0000)]
Moved some reference frame data structures into common.

Encoder side changes

Change-Id: I8921800e4fccec5e5a9e4755b80cbd472623107b

12 years agoMoved some reference frame data structures into common.
Paul Wilkins [Fri, 27 Jan 2012 18:35:14 +0000 (18:35 +0000)]
Moved some reference frame data structures into common.

In this commit only the decoder side was updated.

Change-Id: Ia9bd58da07d1a943f028e330f0489344e62b0d02

12 years agoMoved some segmentation data structures.
Paul Wilkins [Fri, 27 Jan 2012 18:29:07 +0000 (18:29 +0000)]
Moved some segmentation data structures.

Moved some segmentation data structures into VP8_COMMON

Change-Id: I59c6e2edf7a0176e35319936eea450027aeb3b39

12 years agoRefining the 8-tap interpolation filters.
Deb Mukherjee [Mon, 30 Jan 2012 17:27:44 +0000 (09:27 -0800)]
Refining the 8-tap interpolation filters.

Fixes a rounding issue with the 8-tap filters, which allows us to
use sharper filters that before with a little better performance.
Results on derf (0verall gain 0.76):
http://www.corp.google.com/~debargha/vp8_results/enhinterp.html
Results on a 720P set (Overall gain 0.61):
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hd.html

Change-Id: I4cd7bdf3583db974dc5589fa64857bc31ac861fa

12 years agovpnext use segref segmentation filter
Jim Bankoski [Thu, 26 Jan 2012 18:04:34 +0000 (10:04 -0800)]
vpnext use segref segmentation filter

Goes through set of ref frames used by each macroblock and
sets seg_lvl_ref_frame flags accordingly..

http://www.corp.google.com/~jimbankoski/no_crawl/segref.html

Change-Id: Iab7f1effd75a839b34eb310d7168692c8f105411

12 years agovpnext: pick loop filter segment by segment
Jim Bankoski [Thu, 26 Jan 2012 01:06:42 +0000 (17:06 -0800)]
vpnext: pick loop filter segment by segment

Picks a per segment loopfilter.  Adapts the algorithm to search for
a loopfilter value for each separate segment.  Further todo fix the
bias

Improvements .06 % ov psnr, .11% ssim
http://www.corp.google.com/~jimbankoski/no_crawl/segmentedpicklpf.html

Change-Id: Ic6a571c16fcd6ec0139f4de1f8061f87c6515a10

12 years agoMerge "fixed an issue with 8x8 token cost in trellisquant" into experimental
Yaowu Xu [Fri, 27 Jan 2012 15:11:18 +0000 (15:11 +0000)]
Merge "fixed an issue with 8x8 token cost in trellisquant" into experimental

12 years agofixed an issue with 8x8 token cost in trellisquant
Yaowu Xu [Thu, 26 Jan 2012 22:36:20 +0000 (14:36 -0800)]
fixed an issue with 8x8 token cost in trellisquant

changed the token cost for 8x8 transformed macroblock used in trellisquant
from those derived from 4x4 transform coefficient distribution to those
derived from 8x8 transform coefficient distribution. Test results show
this fix help 8x8 transform based compression consistently on cif and hd
sets:

http://www.corp.google.com/~yaowu/no_crawl/t8x8/cif_cost8x8only.html
(avg psnr:.14% glb psnr: .17% ssim: .20%)
http://www.corp.google.com/~yaowu/no_crawl/t8x8/hd_cost8x8only.html
(avg psnr:.17% glb psnr: .18% ssim: .58%)

Note: To test the effect of this change, 8x8 transform was forced to be used
only on 16x16 predicted macroblocks on inter frames, the effect would be
bigger had all macroblocks been forcd to use 8x8 transform.

Change-Id: If9b7868b75357c66541f511e5ee78e4d2d4929a4

12 years agoAdds support for enhanced interpolation for subpel motion
Deb Mukherjee [Mon, 16 Jan 2012 19:21:12 +0000 (11:21 -0800)]
Adds support for enhanced interpolation for subpel motion
using an 8-tap filter.

The results with 3 different 8-tap filters on the derf set are in:
http://www.corp.google.com/~debargha/vp8_results/enhinterp.html
The one that gives the most gain achieves an overall gain of about
0.6%. The results for a set of 12 hd (720p) videos are in:
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hd.html
with max gain of 0.55% with the same filter. The best filter apparently
achieves the best trade-off between pass band ripple and stop band
attenuation.

Change-Id: I919e28ae245c0493147fa0864f8c9d048a9dd530

12 years agoMerge "changed loop filter for MBs using 8x8 transform" into experimental
Yaowu Xu [Tue, 24 Jan 2012 21:45:16 +0000 (21:45 +0000)]
Merge "changed loop filter for MBs using 8x8 transform" into experimental

12 years agovpn common -> implicit segmentation
Jim Bankoski [Mon, 23 Jan 2012 17:55:23 +0000 (09:55 -0800)]
vpn common -> implicit segmentation

This introduces base functions for introducing implicit segmentation.
The code that actually stores the results to the segment map isn't
here yet.   This just prints out the segmentation map results
if you call it.

Uses connected component labeling technique on mbmi info so that only
if 2 mbs are horizontally or vertically touching do they get the same
segment.

vp8next - plumbing for rotation

code to produce taps for rotation ( tapify. py ),  code
for predicting using rotation ( predict_rotated.c ) ,  code
for finding the best rotation find_rotation.c.

didn't checkin code that uses this in the codec.   still work
in progress.

Fixed copyright notice

Change-Id: I450c13cfa41ab2fcb699f3897760370b4935fdf8

12 years agochanged loop filter for MBs using 8x8 transform
Yaowu Xu [Wed, 30 Nov 2011 16:05:45 +0000 (08:05 -0800)]
changed loop filter for MBs using 8x8 transform

This commit added a set of loop filter functions for macroblocks
using 8x8 transform. First we turned off the regular loop filtering
on 4x4 block boundaries that do not exist in macroblocks using 8x8
transform. Second, we change to use the same loop filter(mask and
7 tap filter) that used for macroblock edge filtering.

Change-Id: I3a00460b7674ced116917d86812ffc32578c1d3a

12 years agoAdded code to prevent I8X8_PRED mode for MBs using 8x8 transform
Yaowu Xu [Fri, 20 Jan 2012 00:37:32 +0000 (16:37 -0800)]
Added code to prevent I8X8_PRED mode for MBs using 8x8 transform

This fixed a conflict introduced by the change of adding 8x8 intra
prediction modes. The 8x8 intra prediction mode code assumed the
use of 4x4 transform, and causes encoder crashes when the codec is
configured with --enable-t8x8.

Change-Id: I00cc94df63e9725377ffba9eb51be6b77fe3fcf9

12 years agoreverted an accidental code deleting
Yaowu Xu [Fri, 20 Jan 2012 00:56:46 +0000 (16:56 -0800)]
reverted an accidental code deleting

commit cf561bad accidentally deleted a line of code that sets the
base_qindex for each frame, which leads to every frame is encoded
at Q of 0.

Change-Id: Ib5f8022e856bf3b3bd0d4147405e46241e3dcf2d

12 years agoMerge "new loop filter functions for macroblock boundaries" into experimental
Yaowu Xu [Wed, 18 Jan 2012 17:54:19 +0000 (17:54 +0000)]
Merge "new loop filter functions for macroblock boundaries" into experimental

12 years agonew loop filter functions for macroblock boundaries
Yaowu Xu [Fri, 13 Jan 2012 22:37:17 +0000 (14:37 -0800)]
new loop filter functions for macroblock boundaries

The commit adds a new set of loop filter for macroblock edge filtering.
The new loop filter has a mask to detect so-called "flat" regions. The
detection checks 5 pixels of each side of an edge. If the all pixels
have value with +/-1 from the edge pixel on the same side, the region
is treated as a "flat" region. For such case, a 7 tap filter is used
to change 3 pixel values on each side. The 7 taps are:
               [1, 1, 1, 2, 1, 1, 1]/8
The furthest away pixels used as input are +/-5 away from edge. For
non-flat region, we fall back to old filtering. It should be noted
here that the thresholds and filter taps may require more optimization
for best possible results.

Tests on a set of hd clips showed consistent gains:
http://www.corp.google.com/~yaowu/no_crawl/mblpf_hd.html
(avg psnr: .83% glb psnr: .77% ssim: .82%)

Tests on derf set also showed consistent gains:
http://www.corp.google.com/~yaowu/no_crawl/mblpf_derf.html
(avg psnr: .24% glb psnr: .22% ssim: .48%)

Change-Id: I0855b1ff48e79e1175c20b81967137e18b2af352

12 years agoPossible divide by 0 error.
Paul Wilkins [Wed, 18 Jan 2012 11:10:51 +0000 (11:10 +0000)]
Possible divide by 0 error.

Put traps to prevent two possible divide by 0 errors.

Change-Id: Ia415b945244253dcdd12f54f1f157f9ca8c94d6b

12 years agoRate control on static scenes plus Y2dc delta Q fix.
Paul Wilkins [Wed, 11 Jan 2012 14:05:57 +0000 (14:05 +0000)]
Rate control on static scenes plus Y2dc delta Q fix.

A problem can arise on static clips with force key frames where
attempts to avoid popping lead to a progressive reduction in key
frame Q that ultimately may lead to unexpected overspend against
the  rate target.

The changes in this patch help to insure that in such clips the
quality of the key frames across the clip is more uniform (rather
than starting bad and getting better - especially at low target rates).

This patch also includes a fix that removes a delta on the Y2DC
when the baseline q index < 4 as this is no longer needed.

There is also a fix to try and prevent repeat single step Q adjustment in
the recode loop leading to lots of recodes, especially where the use
of forced skips as part of segmentation has made the impact of Q on
the number of bits generated much smaller.

Patch 2: Amend "last_boosted_qindex" calculation for arf overlay frames.

Change-Id: Ia1feeb79ed8ed014e4239994fcf5e58e68fd9459

12 years agoMerge "Added an emms to prevent invalid stats output" into experimental
Yaowu Xu [Wed, 11 Jan 2012 23:07:54 +0000 (23:07 +0000)]
Merge "Added an emms to prevent invalid stats output" into experimental

12 years agoAdded an emms to prevent invalid stats output
Yaowu Xu [Thu, 5 Jan 2012 19:22:06 +0000 (11:22 -0800)]
Added an emms to prevent invalid stats output

In certain hardware configuration, where mmx code is enabled and
other simd (sse2/sse3) disabled, lacking of this emms caused invalid
internal stats outputs.

Change-Id: I77c61cf6e0448d3f3b8c11781aa9e42f31d231c9

12 years agoFix more warnings.
Christian Duvivier [Thu, 22 Dec 2011 00:19:09 +0000 (16:19 -0800)]
Fix more warnings.

Change-Id: Ifadf65026a11bdb5d39840748613880bcfb364bb

12 years agoAdd script to test all builds.
Christian Duvivier [Fri, 23 Dec 2011 00:04:15 +0000 (16:04 -0800)]
Add script to test all builds.

Change-Id: I6bbed8bcb2dfa3458ffc59179dfba66c92e18125

12 years agoFix a couple of warnings.
Christian Duvivier [Wed, 21 Dec 2011 23:52:18 +0000 (15:52 -0800)]
Fix a couple of warnings.

12 years agochanged mode_context update strategy
Yaowu Xu [Wed, 21 Dec 2011 20:05:10 +0000 (12:05 -0800)]
changed mode_context update strategy

Previously, the mode context is always udpated based on stats of current
frame, when there is no count, 50% is used for both left and right branch.
However, it is observed that with such strategy, a small count or no count
at all can skew the probability distribution significantly. This commmit
changed the mode_context update strategy to prevent small counts from
skewing the probability distributions.

Tests on derf set showed a small gain:  .06% in psnr and .09% in ssim

Change-Id: Ic812e64ae5f70251c170b0717f7b7fa587055488

12 years agoMerge "Extended Q:" into experimental
Paul Wilkins [Tue, 20 Dec 2011 11:12:28 +0000 (11:12 +0000)]
Merge "Extended Q:" into experimental

12 years agoMerge "Extend to 256 Q steps." into experimental
Paul Wilkins [Tue, 20 Dec 2011 11:12:08 +0000 (11:12 +0000)]
Merge "Extend to 256 Q steps." into experimental

12 years agoMerge "QRange experiements." into experimental
Paul Wilkins [Tue, 20 Dec 2011 11:11:50 +0000 (11:11 +0000)]
Merge "QRange experiements." into experimental

12 years agoMerge "Further QIndex realted Fixes:" into experimental
Paul Wilkins [Tue, 20 Dec 2011 11:11:09 +0000 (11:11 +0000)]
Merge "Further QIndex realted Fixes:" into experimental

12 years agoExtended Q:
Paul Wilkins [Mon, 19 Dec 2011 09:25:24 +0000 (09:25 +0000)]
Extended Q:

Cleanup and switch to Q extended at low end too.

Change-Id: Ie22676bb9e961097d75dbd1d81745208b63e5f4b

12 years agoExtend to 256 Q steps.
Paul Wilkins [Fri, 16 Dec 2011 10:23:01 +0000 (10:23 +0000)]
Extend to 256 Q steps.

This commit extends the number of Q steps to 256 from 128.
The q_trans[] array has been altered to distribute available Q index values
(using the current 64 steps available as input parameters) evenly across the
available range. This is coupled with the fact that each Q step where possible
now equates to a fixed % change in the quantizer. This may want refinement
later especially in terms of the granularity at the high quality end but is a
reasonable starting point.

Change-Id: I2aaa6874fa10ce05c958dd182947ce39f6f1eecb

12 years agoQRange experiements.
Paul Wilkins [Thu, 15 Dec 2011 18:22:42 +0000 (18:22 +0000)]
QRange experiements.

High Q end extended a little.
Some clean up.

Slightly better on SSIM, Slightly worse on PSNR over derf set.

Change-Id: I3dceea8a39e11c26e1a389a40e40b86efc76d28c

12 years agoFurther QIndex realted Fixes:
Paul Wilkins [Mon, 12 Dec 2011 18:27:25 +0000 (18:27 +0000)]
Further QIndex realted Fixes:

Added code to support 256 index steps instead of 128 but disabled for now.
Replace hard wired table vp8cx_base_skip_false_prob[128]
Observed Qindex problem with setting minimum loop filter value.
(Experiment code using real Q in place but for now just returning 0. This has a big
beneficial effect on some clips, particularly waterfall which shows 5% ssim gain)

Change-Id: I2f7117de8adc1797164c106aa13effc900a1467e

12 years agoReset segment_id to 0 when segmentation is disabled
Adrian Grange [Fri, 16 Dec 2011 22:00:36 +0000 (14:00 -0800)]
Reset segment_id to 0 when segmentation is disabled

Whilst the encoder explicitly set the segment_id to 0
when segmentation is diabled, the decoder would allow
the segment_id to persist from the previous frame.

This fix attempts to make the decoder behave the same
as the encoder by explicitly setting the segment_id to
0 in this case.

Change-Id: I65c3a05247550edb10706eb5d54d306dfb792309

12 years agoFixed stride bug in segmentation code
Adrian Grange [Thu, 15 Dec 2011 20:27:38 +0000 (12:27 -0800)]
Fixed stride bug in segmentation code

mode_info_context is padded with an additional column of data, so
mode_info_stride should be used to move between rows rather than
mb_cols.

Change-Id: I598559a2cd9df1c486d64aaeccf76b76a7ecf21c

12 years agoFixed bug to use mode_info_stride rather than mb_cols
Adrian Grange [Thu, 15 Dec 2011 18:00:46 +0000 (10:00 -0800)]
Fixed bug to use mode_info_stride rather than mb_cols

Both encoder & decoder were using mb_cols to
offset from one row of MODE_INFO structures to the next
when they should have been using mode_info_stride.

Fixing this in both encoder and decoder gives around
a 3KB size saving and 0.025dB PSNR improvement on the one
720P clip I tried.

(Also removed "index" which was being updated but not used)

Change-Id: I413bea802b142886bfcf8d8aa7f5a2f0c524fd4b

12 years agoQINDEX_RANGE fixed tables.
Paul Wilkins [Mon, 12 Dec 2011 11:18:57 +0000 (11:18 +0000)]
QINDEX_RANGE fixed tables.

Removed a couple more fixed tables for the extended quantizer experiment
that depend on QINDEX_RANGE.

Change-Id: I2c15ffc7488c2a2b8d6504e2c4b6b2339799d117

12 years agoEnabled adaptive UV intra coding for inter frames
Yaowu Xu [Thu, 8 Dec 2011 19:43:09 +0000 (11:43 -0800)]
Enabled adaptive UV intra coding for inter frames

Previously, Y-adaptive UV intra coding only enabled on key frames in
UVINTRA experiment. This commit enabled the same coding for inter
frames, so the encoding of UV intra modes are consistent cross all
frame types. Tests on derf set showed a very small overall gain around
.04%:

http://www.corp.google.com/~yaowu/no_crawl/interUVintra.html

The gain looks to be reasonable given inta coded MBs is only a
small portion of MBs in inter frames.

Change-Id: Ic6fc261923f2c253f4a0c9f8bccf4797557b9e16

12 years agoMerge "Fix out of bounds read in update_mbgraph_frame_stats" into experimental
Adrian Grange [Fri, 9 Dec 2011 21:05:00 +0000 (21:05 +0000)]
Merge "Fix out of bounds read in update_mbgraph_frame_stats" into experimental

12 years agoFix out of bounds read in update_mbgraph_frame_stats
Adrian Grange [Fri, 9 Dec 2011 20:47:57 +0000 (12:47 -0800)]
Fix out of bounds read in update_mbgraph_frame_stats

update_mbgraph_frame_stats used xd->mode_info_context
before it had been setup, resulting in potentially
random accesses of uninitialized memory.

This fix allocates a local MODE_INFO structure to hold
the data generated in the function.

Change-Id: Ic9e75610008ce0e2d690e8e583c21582fee6fc45

12 years agoRevised coding using adaptive mode context to depend on frame type
Yaowu Xu [Thu, 8 Dec 2011 19:43:09 +0000 (11:43 -0800)]
Revised coding using adaptive mode context to depend on frame type

A previous commit 76feb965 made the vp8_mode_context adaptive on a frame
frame basis, this commit further made the coding context adaptive to two
frame types separately. Tests on derf set showed a further small gain on
all metrics: avg psnr 0.10%, glb psnr: 0.11%, ssim: 0.08%

http://www.corp.google.com/~yaowu/no_crawl/newNearMode_1209.html

Change-Id: I7b3e32ec8729de1903d14a3f1213f1624b78cdee

12 years agoExperiment with old Q range:
Paul Wilkins [Thu, 8 Dec 2011 14:46:27 +0000 (14:46 +0000)]
Experiment with old Q range:

Experiment with old Q range but new higher precision quantizer
and transform code.

Change-Id: Id1ff4cb433e5775d709d0133e2aec0322975c292

12 years agofixed a crash caused invalid Q choice
Yaowu Xu [Thu, 8 Dec 2011 04:08:31 +0000 (20:08 -0800)]
fixed a crash caused invalid Q choice

The commit fixed a problem by capping cpi->active_best_quality to be
smaller than cpi->worst_quality.  Also fixed a few line of code that
was misplaced.

Change-Id: Ie908264b72140c669122a0afde5d886619c33474

12 years agoRemoved #if CONFIG_MULCONTEXT
Yaowu Xu [Wed, 7 Dec 2011 21:55:58 +0000 (13:55 -0800)]
Removed #if CONFIG_MULCONTEXT

This commit removed the macro CONFIG_MULCONTEXT, which was used to
indicate the experiment code for using separate context for altref
and normal frames. This commit made the change fully merged in.

Change-Id: I525f927f68e2365d37b340ef23b836a136a4f70b

12 years agoRemoved #if CONFIG_I8X8
Yaowu Xu [Wed, 7 Dec 2011 21:03:57 +0000 (13:03 -0800)]
Removed #if CONFIG_I8X8

This commit removed the macro CONFIG_I8X8, which was used to indicate
the 8x8 intra prediction experiment, made the change fully merged in.

Change-Id: Iafa4443781ce6e83f5591c12ba615a0e92ce0ea0

12 years agomade vp8_mode_context adaptive
Yaowu Xu [Tue, 6 Dec 2011 20:03:42 +0000 (12:03 -0800)]
made vp8_mode_context adaptive

vp8_mode_contexts[] is an entropy table used to code inter mode
choices. It was a fixed constant table. This commit made the entropy
context adaptive. Tests on derf set showed very good consistent gains
on all metrics: avg psnr .47%, overall psnr .46% and ssim .40%.

http://www.corp.google.com/~yaowu/no_crawl/newModeContext.html

Change-Id: Ia62b14485c948e2b74586118619c5eb2068b43b2

12 years agofixed a crash when MODE_STATS is enabled
Yaowu Xu [Tue, 6 Dec 2011 15:37:39 +0000 (07:37 -0800)]
fixed a crash when MODE_STATS is enabled

The MODE_STATS macro was used to #ifdef around code for mode entropy
stats collection, this commit fixed a crash when MODE_STATS is on.
The commit also changed a number of array definitions to use defined
macros instead of hard-coded numbers.

Change-Id: I114592f53a1e44e31e455f5725f036ae6168735a

12 years agoMerge "Minor fixes:" into experimental
Yaowu Xu [Wed, 7 Dec 2011 18:52:51 +0000 (18:52 +0000)]
Merge "Minor fixes:" into experimental

12 years agoMinor fixes:
Paul Wilkins [Wed, 7 Dec 2011 13:32:45 +0000 (13:32 +0000)]
Minor fixes:

fixed issues caused by conflicts between two experiments.

Change-Id: I56a9bd69493e4850c121ea057a6233c55777c2a5

12 years agoRename use_dc_pred to use_16x16_pred.
Ronald S. Bultje [Fri, 28 Oct 2011 21:36:03 +0000 (14:36 -0700)]
Rename use_dc_pred to use_16x16_pred.

Because the variable doesn't distinguish between DC and non-DC
prediction, but rather between 16x16 or 4x4 prediction.

Change-ID: Ia4e7dda2bd6230c91515072e3277be2d64e42629

12 years agoMerge "corrected an enum name" into experimental
Yaowu Xu [Wed, 7 Dec 2011 03:25:08 +0000 (03:25 +0000)]
Merge "corrected an enum name" into experimental

12 years agoFix for RD thresholds if both I8X8 and DUALPRED are enabled.
Ronald S. Bultje [Tue, 6 Dec 2011 23:13:11 +0000 (15:13 -0800)]
Fix for RD thresholds if both I8X8 and DUALPRED are enabled.

Change-Id: I5f9fc894e6a332d9be6d7336c7c5fe11e65b8498

12 years agoDual 16x16 inter prediction.
Ronald S. Bultje [Tue, 6 Dec 2011 19:53:02 +0000 (11:53 -0800)]
Dual 16x16 inter prediction.

This patch introduces the concept of dual inter16x16 prediction. A
16x16 inter-predicted macroblock can use 2 references instead of 1,
where both references use the same mvmode (new, near/est, zero). In the
case of newmv, this means that two MVs are coded instead of one. The
frame can be encoded in 3 ways: all MBs single-prediction, all MBs dual
prediction, or per-MB single/dual prediction selection ("hybrid"), in
which case a single bit is coded per-MB to indicate whether the MB uses
single or dual inter prediction.

In the future, we can (maybe?) get further gains by mixing this with
Adrian's 32x32 work, per-segment dual prediction settings, or adding
support for dual splitmv/8x8mv inter prediction.

Gain (on derf-set, CQ mode) is ~2.8% (SSIM) or ~3.6% (glb PSNR). Most
gain is at medium/high bitrates, but there's minor gains at low bitrates
also. Output was confirmed to match between encoder and decoder.

Note for optimization people: this patch introduces a 2nd version of
16x16/8x8 sixtap/bilin functions, which does an avg instead of a
store. They may want to look and make sure this is implemented to
their satisfaction so we can optimize it best in the future.

Change-ID: I59dc84b07cbb3ccf073ac0f756d03d294cb19281

12 years agoSome further QIndex issues with extended Q
Paul Wilkins [Tue, 6 Dec 2011 14:48:52 +0000 (14:48 +0000)]
Some further QIndex issues with extended Q

Resolved or factored out some further issues with Q index.
Put in a 3rd order polynomial instead of less accurate power function
as the best fit on gf and kf boost adjustment.
Added avg_q value to use instead of ni_av_qi.
Compute segment delta Q values based on avg_q.
Fixed bug in adjust_maxq_qrange().

The extended range Q on the derf set, using standard data rates
(which do not extend high enough to get big benefits) still show
a shortfall of between 0.5 and 1% though so there would appear to
be further issues that need to be tracked down.

Change-Id: Icfd49b9f401906ba487ef1bef7d397048295d959

12 years agocorrected an enum name
Yaowu Xu [Tue, 6 Dec 2011 15:09:08 +0000 (07:09 -0800)]
corrected an enum name

CNT_INTRA has been used for counting (0,0) motion vectos, this commit
renames it to CNT_ZEROMV

Change-Id: I8f67c5468370090525faf84ba5b3f780d302443f

12 years agoremoved leftover code from a couple merge problems.
Yaowu Xu [Mon, 5 Dec 2011 19:22:35 +0000 (11:22 -0800)]
removed leftover code from a couple merge problems.

Change-Id: I17d9c1246d69e102297ec1c3efb359691b3da313

12 years agochanged configure script to enable new experimental options
Yaowu Xu [Fri, 2 Dec 2011 23:32:46 +0000 (15:32 -0800)]
changed configure script to enable new experimental options

Added two experimental options to the configure script:
1. newnear:
   new scheme of doing mv encoding that include a motion vector from
   last frame in nearest and near mv search
2. mulcontext:
   tracks entropy context separately for regular frames and alt ref
   frames.

Change-Id: If6e0d5d593351707b497a26eb6a763e080f77e6f

12 years agoadded separate entropy context for alt_ref
Yaowu Xu [Thu, 1 Dec 2011 00:36:46 +0000 (16:36 -0800)]
added separate entropy context for alt_ref

This commit added code to keep track of separate entropy contexts for
normal frames and alt ref frames. The underly assumption was that the
two type of frames have different entropy characteristics given they
typically have quite different quantization levels. By keeping entropy
contexts separate, it helps the entropy context distribution to be more
closely adapted to each frame type.

Tests on derf set showed a good and very consistent gain on all clips
on all metrics, avg psnr: 0.89%, overall psnr: 0.84% and ssim 0.93%.

http://www.corp.google.com/~yaowu/no_crawl/mulcontext.html

Change-Id: I15bc9697f6ff7829042911fe0c62930585d7e65d

12 years agoenabled 8x8 intra prediction modes on inter frames
Yaowu Xu [Thu, 1 Dec 2011 00:25:00 +0000 (16:25 -0800)]
enabled 8x8 intra prediction modes on inter frames

This commit enabled the usage of 8x8 intra prediction modes on inter
frames. There are a few TODO items related to this: 1)baseline entropy
need be calibrated; 2)cost of UV need to be done more properly rather
than using decision only relying on Y; 3)Threshold for allowing picking
8x8 intra prediction should be lowered to lower than the B_PRED.

Even with all the TODOs, tests showed consistent gain on derf set ~0.1%
(PSNR:0.08% and SSIM:0.14%). It is assumed that 8x8 intra prediction
will help more on large resolution clips, especially with above TODOs
addressed.

Change-Id: I398ada49dfc32575cfab962a569c2885111ae3ba

12 years agoFurther work on extended Q range.
Paul Wilkins [Fri, 2 Dec 2011 14:57:21 +0000 (14:57 +0000)]
Further work on extended Q range.

Fixed some further QIndex related issues and replaced some tables
(eg zbin and rounding)

Also Added function (currently disabled by default) to populate the
main AC and DC quantizer tables. Using the original AC range the
resulting computed DC values give behavior broadly comparable
on the DERF set. That is not to say that the equations will hold good
over a more extended range. The purpose of this code is to make it
easier to experiment with further alterations to the Q range and distribution
of Q values plus the relative weights given to AC and DC.

The function find_fp_qindex() ensures that changes to the Q tables
are reflected in the value passed in to the first pass code.

Slight experimental adjustment to static segment Q offset.

Change-Id: I36186267d55dfc2a3d565d0cff7218ef300d1cd5

12 years agoCR/LF issue.
Paul Wilkins [Fri, 2 Dec 2011 15:06:15 +0000 (15:06 +0000)]
CR/LF issue.

Change-Id: I95fab6f51967008acf1bc9e98fdb7bb56974807f

12 years agoadded transform type to MB_MODE_INFO
Yaowu Xu [Fri, 18 Nov 2011 02:31:00 +0000 (18:31 -0800)]
added transform type to MB_MODE_INFO

this commit is to add an variable in the macroblock level mode
info structure to track the transform size used in each MB, so
the information can be used later in the loop filter to change
how loop filter works on MBs with different transform sizes.

Change-Id: Id0eeaba6cc854c6d1be00ed8d237b3d9e250e447

12 years agoMinQ equations.
Paul Wilkins [Mon, 28 Nov 2011 11:48:07 +0000 (11:48 +0000)]
MinQ equations.

Slight tweaks to the new minq equations to bring results more into line with
original lookup tables.

Change-Id: I969fc87d95912df549b6775e83ee2345e84d4da0

12 years agoExtended Q Range:
Paul Wilkins [Fri, 25 Nov 2011 16:31:56 +0000 (16:31 +0000)]
Extended Q Range:

Addressed a couple of other QIndex dependencies.

Change-Id: I15b224bffd0210d3c7065cb6905156f2ca8e9ea9

12 years agoFurther work on extended Q range.
Paul Wilkins [Thu, 24 Nov 2011 18:25:03 +0000 (18:25 +0000)]
Further work on extended Q range.

Fixed bug in firspass.c call to vp8_initialize_rd_consts()

This was passing in vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q)
 instead of (cm->base_qindex + cm->y1dc_delta_q).

It just so happens that for the value 26 used for cm->base_qindex in the
unextended Q case,  the two give similar results. However, when using
the extended Q range the two are very different.

Also added more stats output and partly disabled another broken feature.

Change-Id: Iddf6cf5ea8467c44b7c133f38e629f6ba6f2581e

12 years agombgraph: fix invalid memory access if motion vectors are too big.
Ronald S. Bultje [Mon, 28 Nov 2011 20:39:38 +0000 (12:39 -0800)]
mbgraph: fix invalid memory access if motion vectors are too big.

12 years agochanged find_near_mvs search to include a mb from last frame
Yaowu Xu [Wed, 16 Nov 2011 00:16:30 +0000 (16:16 -0800)]
changed find_near_mvs search to include a mb from last frame

This is an experiment to include a mv contribution from last frame to
nearest and near mv definition. Initial test showed some small though
consistent gain.

latest patch slightly better result ~.13%-~.18%.

TODO: the entropy used to encode the mode choice, i.e. the mv counts
based conditional distribution of modes should be re-collected to
reflect this change, it is expected that there is some further gain
from that.

Change-Id: Ief1e284a36d8aa56b49ae5b360c91419ec494fa4

12 years agoTwo pass rate control code changes.
Paul Wilkins [Wed, 23 Nov 2011 17:18:31 +0000 (17:18 +0000)]
Two pass rate control code changes.

This comitt brings accross changes from the public branch
commit number Icf74d13af77437c08602571dc7a97e747cce5066.

The main puurpose of this comit relates to CQ mode but it
also includes some refactoring of the two pass code which
I hope will make tuning the experimental branch for the new
quantizer range a little less painfull.

Change-Id: I278e989436a928fc1fe7761068960048f9d7a376

12 years agoFurther resolution of QIndex LUTS;
Paul Wilkins [Wed, 23 Nov 2011 11:32:20 +0000 (11:32 +0000)]
Further resolution of QIndex LUTS;

This commit resolves further QIndex look up tables to facilitate
experimentation with the quantizer range.

In some cases  rather than remove the look up tables completely
I have created functions that are called once  to populate them
using a formulaic approach base on the actual quantizer.

The use of these functions based on best fit of data from the original
tables does affect the results on some clips but across the derf test
set the effect was broadly neutral.

Change-Id: I8baa61c97ce87dc09a6340d56fdeb681b9345793

12 years agoRemove redundant code (lf_or_gf and frame_lf_or_gf)
Adrian Grange [Fri, 18 Nov 2011 21:02:59 +0000 (13:02 -0800)]
Remove redundant code (lf_or_gf and frame_lf_or_gf)

Removed unused variables lf_or_gf and frame_lf_or_gf.

Change-Id: I88692cd7d53e532d303c4525ee4667c1ecea3026

12 years agoRemoval of Qindex LUTS.
Paul Wilkins [Mon, 21 Nov 2011 15:45:10 +0000 (15:45 +0000)]
Removal of Qindex LUTS.

One of the problems arising when tweaking or adjusting the quantizer
tables is that there are a lot of look up tables that depend on the QINDEX.
Any adjustment to the link between QINDEX and real quantizer therefore tends
to break aspects of for example the rate control.

In this check in I have replaced several of the look up tables with functions that
approximate the same results as the old Q luts but use a formulaic approach
based on real Q values rather than QIndex. This should hopefully make it easier
to experiment with changes to the Q tables without always having to go through
and hand optimize a set of look up tables. Once things stabilize we may choose
to re-instate luts for the sake of performance.

Patch 2:
    Addressed Ronald's comments.
    vp8_init_me_luts() Added so luts only initialized once.

Change-Id: Ic80db2212d2fd01e08e8cb5c7dca1fda1102be57

12 years agoExtended Q range Experiment.
Paul Wilkins [Mon, 21 Nov 2011 14:18:11 +0000 (14:18 +0000)]
Extended Q range Experiment.

Corrected dc lookup table to maintain ac/dc balance
close to what it was previously.

Firstpass not being passed the adjusted Q index for
the extended range.

Change-Id: Ic0200dabda445fea03bf81067999cb2670e99b77

12 years agoCosmetic clean up.
Paul Wilkins [Mon, 21 Nov 2011 11:07:28 +0000 (11:07 +0000)]
Cosmetic clean up.

Clean up of vp8_kfread_modes().
Remove unnecessary indentation and enforce line length.

Change-Id: I0864d1aff55368126db01bb23efa815786b5245d

12 years agoDecoder segmentation bug.
Paul Wilkins [Mon, 21 Nov 2011 11:02:08 +0000 (11:02 +0000)]
Decoder segmentation bug.

Fix decoder segmentation bug for temporal coding where the segment map
was first initialized on a key frame.

in vp8_kfread_modes() after reading the segment id it must be written to
the  pbi->segmentation_map[] for use in temporal coding on subsequent frames.

Change-Id: I1489305efc376564e734a216f69c2844646ee3d3

12 years agoCONFIG_T8X8 experiment.:
Paul Wilkins [Fri, 18 Nov 2011 19:44:57 +0000 (19:44 +0000)]
CONFIG_T8X8 experiment.:

Block the selection of 4x4 modes in key frames if 8x8 is selected.

Change-Id: Ie5729ec22a999d9a1996f020bd4b941e29514992

12 years agoClip buffer level to the maximum buffer size in CBR
Adrian Grange [Thu, 17 Nov 2011 23:57:37 +0000 (15:57 -0800)]
Clip buffer level to the maximum buffer size in CBR

The buffer level was able to increase indefinitely rather than
being clipped to the maximum buffer size specified by the user.

This change checks the buffrer level and prevents it from
going beyond the upper limit of the buffer.

Change-Id: Ifff55f79d3c018e4d3d77e554b11ada543cc1654

12 years agoMerge "fixed the scaling in 8x8 trellis quant" into experimental
Yaowu Xu [Thu, 17 Nov 2011 14:55:43 +0000 (14:55 +0000)]
Merge "fixed the scaling in 8x8 trellis quant" into experimental

12 years agofixed the scaling in 8x8 trellis quant
Yaowu Xu [Fri, 11 Nov 2011 05:14:45 +0000 (21:14 -0800)]
fixed the scaling in 8x8 trellis quant

This commit has a few minor fixes to the 8x8 trellis quant, so to
make it work regardless if extend_qrange is enabled or not. It also
borrowed adaptive RDMULT constants from 4x4 trellis that was missed
in the 8x8 trellis quant.

Change-Id: I60d7769071f102c699b5084597e62bca87a1f759

12 years agoHeader inclusion for Unix build
Paul Wilkins [Wed, 16 Nov 2011 10:34:47 +0000 (10:34 +0000)]
Header inclusion for Unix build

Explicit inclusion of limits.h to satisfy unix build for definition of INT_MAX.
Some commented out code removed.

Change-Id: I5b5980dfaa9b4d2d12bfd729cfd35bd982106908

12 years agoMerge CONFIGURE_SEGMENTATION experiment.
Paul Wilkins [Tue, 15 Nov 2011 16:15:23 +0000 (16:15 +0000)]
Merge CONFIGURE_SEGMENTATION experiment.

Removal of CONFIGURE_SEGMENTATION ifdefs.

Removal of legacy support code fo the old coding mechanism.

Use local reference "xd" for MACROBLOCKD structure in
encode_frame_to_data_rate()

Moved call to choose_segmap_coding_method() out of encode
loop as the cost of segmentation is not properly accounted
in the loop anyway. If this is desirable in the future it
can be moved back. The use of this function to do all the
analysis and set the probabilities also removes the need
to track segment useage in threading code.

Change-Id: I85bc8fd63440e7176c73d26cb742698f9b70cade

12 years agoFurther clean up of Segmentation experiment code
Paul Wilkins [Tue, 15 Nov 2011 15:22:26 +0000 (15:22 +0000)]
Further clean up of Segmentation experiment code

Changed name and sense of segment_flag to "seg_id_predicted"
Added some additional comments and retested.

I also did some experimentation with a spatial prediction option
using a similar strategy to the temporal mode implemented.
This helps in some cases where temporal prediction is bad but
I suspect there is more overlap here with work on a larger scale
block structure and spatial correlation will likely be better
handled through that mechanism.

Next check in will remove #ifdefs and legacy mode code.

Change-Id: I3b382b65ed2a57bd7775ac0f3a01a9508a209cbc

12 years agoFurther work on Segmentation Experiment:
Paul Wilkins [Tue, 15 Nov 2011 11:13:33 +0000 (11:13 +0000)]
Further work on Segmentation Experiment:

This check in includes quite a lot of clean up and refactoring.

Most of the analysis and set up for the different coding options for the
segment map (currently simple distribution based coding or temporaly
predicted coding), has been moved to one location (the function
choose_segmap_coding_method() in segmenation.c). This code was previously
scattered around in various locations making integration with other
experiments and modification / debug more difficult.

Currently the functionality is as it was with the exception that the
prediction probabilities are now only transmitted when the temporal
prediction mode is selected.

There is still quite a bit more clean up work that will be possible
when the #ifdef is removed. Also at that time I may rename and alter
the sense of macroblock based variable "segment_flag" which indicates
(1 that the segmnet id is not predicted vs 0 that it is predicted).

I also intend to experiment with a spatial prediction mode that can be
used when coding a key frame segment map or in cases where temporal
prediction does not work well but there is spatial correlation.

In a later check in when the ifdefs have gone I may also move the call
to choose_segmap_coding_method() to just before where the bitsream is
packed (currently it is in vp8_encode_frame()) to further reduce the
possibility of clashes with other experiments and prevent it being called
on each itteration of the recode loop.

Change-Id: I3d4aba2a2826ec21f367678d5b07c1d1c36db168

13 years agoSegmentation experiment:
Paul Wilkins [Fri, 11 Nov 2011 18:08:06 +0000 (18:08 +0000)]
Segmentation experiment:

Added last_segmentation_map[] structure
to keep track of what we had before when
doing temporal prediction. With this change
the existing code does once again appear to
be giving a decodable bitstream for both
temporal and standard prediction modes.
However, it is still somewhat messy and
confused and there is no option to take
advantage of spatial prediction so it could
do with further work.

Some housekeeping / clean out.

Change-Id: I368258243f82127b81d8dffa7ada615208513b47

13 years agoSEGMENTATION experiment:
Paul Wilkins [Fri, 11 Nov 2011 10:10:06 +0000 (10:10 +0000)]
SEGMENTATION experiment:

Some initial cleanup to aid testing and debug.

Pull code to choose temporal or spatial encoding
out of encodeframe.c into a dedicated function
in segmentation.c.

For now disable broken temporal mode.

Move the coding of "temporal_update" flag and
only transmit if segment map update is indicated.

Rename the functions read_mb_features() and
write_mb_features() to read_mb_segid() and
read_mb_segid() as they only read and write
the macroblock segment id not any of the
features.

Change-Id: Ib75118520b1144c24d35fdfc6ce46106803cabcf

13 years agochanged function name for clarity
Yaowu Xu [Thu, 10 Nov 2011 20:54:22 +0000 (12:54 -0800)]
changed function name for clarity

The dequantizer functions for 2nd order haar block had confusing 8x8
in their names. this commit fixed their name to avoid confusion.

Change-Id: I6ae4e7888330865f831436313637d4395b1fc273

13 years agoMerge "fixed the decoder when using 8x8 transform" into experimental
Yaowu Xu [Fri, 11 Nov 2011 15:38:42 +0000 (15:38 +0000)]
Merge "fixed the decoder when using 8x8 transform" into experimental

13 years agoMake 8x8 and extend_qrange to work together
Yaowu Xu [Thu, 10 Nov 2011 20:54:22 +0000 (12:54 -0800)]
Make 8x8 and extend_qrange to work together

This commit added scaling factors to 8x8 transform, quant, dequant and
inverse transform pipeline to make 8x8 transform to work when configed
with enable-extend_qrange. This commit also disabled the trellis-quant
when extend_qrange is configured.

Change-Id: Icfb3192e4746f70a4bb35ad18b7b47705b657e52

13 years agofixed the decoder when using 8x8 transform
Yaowu Xu [Fri, 11 Nov 2011 01:15:06 +0000 (17:15 -0800)]
fixed the decoder when using 8x8 transform

updated the decode_macroblock logic to reflect that 8x8 transform is
not used for "SPLITMV". Also fixed an issue where 2nd order haar block
has wrong dequant/idct process.

Change-Id: I1e373f6535c009dfec503b6362c8a5cfc196e1da

13 years agoMerge "scaled the threshold for 2nd order coefficient reset" into experimental
Yaowu Xu [Thu, 10 Nov 2011 16:34:36 +0000 (16:34 +0000)]
Merge "scaled the threshold for 2nd order coefficient reset" into experimental

13 years agoscaled the threshold for 2nd order coefficient reset
Yaowu Xu [Thu, 10 Nov 2011 15:40:44 +0000 (07:40 -0800)]
scaled the threshold for 2nd order coefficient reset

extend_qrange introduces a different scaling factor, this commit takes
the scaling difference into account for reset 2nd order coefficients.

Change-Id: Ie58bca9f52698fa759e3f88da2aa4d82630fa91a

13 years agoMerge "T8x8 experiment merge." into experimental
Paul Wilkins [Thu, 10 Nov 2011 09:37:26 +0000 (09:37 +0000)]
Merge "T8x8 experiment merge." into experimental