diff options
author | Ronald S. Bultje <rbultje@google.com> | 2012-08-20 14:43:34 -0700 |
---|---|---|
committer | Ronald S. Bultje <rbultje@google.com> | 2012-08-20 14:43:34 -0700 |
commit | 5d4cffb35f4bc23462eedc95a4802c65e32d7d5a (patch) | |
tree | 6fce23691dfa0c01aeb422f6c6b68c75296e91f2 /vp8/encoder/sad_c.c | |
parent | 319dd1c0f58d3db46713460ca10e920f2b18b605 (diff) | |
download | libvpx-5d4cffb35f4bc23462eedc95a4802c65e32d7d5a.tar libvpx-5d4cffb35f4bc23462eedc95a4802c65e32d7d5a.tar.gz libvpx-5d4cffb35f4bc23462eedc95a4802c65e32d7d5a.tar.bz2 libvpx-5d4cffb35f4bc23462eedc95a4802c65e32d7d5a.zip |
Superblock coding.
This commit adds a pick_sb_mode() function which selects the best 32x32
superblock coding mode. Then it selects the best per-MB modes, compares
the two and encodes that in the bitstream.
The bitstream coding is rather simplistic right now. At the SB level,
we code a bit to indicate whether this block uses SB-coding (32x32
prediction) or MB-coding (anything else), and then we follow with the
actual modes. This could and should be modified in the future, but is
omitted from this commit because it will likely involve reorganizing
much more code rather than just adding SB coding, so it's better to let
that be judged on its own merits.
Gains on derf: about even, YT/HD: +0.75%, STD/HD: +1.5%.
Change-Id: Iae313a7cbd8f75b3c66d04a68b991cb096eaaba6
Diffstat (limited to 'vp8/encoder/sad_c.c')
-rw-r--r-- | vp8/encoder/sad_c.c | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/vp8/encoder/sad_c.c b/vp8/encoder/sad_c.c index 78a87f392..4fdfd1186 100644 --- a/vp8/encoder/sad_c.c +++ b/vp8/encoder/sad_c.c @@ -13,29 +13,6 @@ #include "vpx_ports/config.h" #include "vpx/vpx_integer.h" -unsigned int vp8_sad16x16_c( - const unsigned char *src_ptr, - int src_stride, - const unsigned char *ref_ptr, - int ref_stride, - int max_sad) { - - int r, c; - unsigned int sad = 0; - - for (r = 0; r < 16; r++) { - for (c = 0; c < 16; c++) { - sad += abs(src_ptr[c] - ref_ptr[c]); - } - - src_ptr += src_stride; - ref_ptr += ref_stride; - } - - return sad; -} - - static __inline unsigned int sad_mx_n_c( const unsigned char *src_ptr, @@ -60,6 +37,21 @@ unsigned int sad_mx_n_c( return sad; } +unsigned int vp8_sad32x32_c(const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + int max_sad) { + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 32, 32); +} + +unsigned int vp8_sad16x16_c(const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + int max_sad) { + return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 16); +} unsigned int vp8_sad8x8_c( const unsigned char *src_ptr, @@ -104,6 +96,7 @@ unsigned int vp8_sad4x4_c( return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 4, 4); } + #if CONFIG_NEWBESTREFMV unsigned int vp8_sad2x16_c( const unsigned char *src_ptr, @@ -122,6 +115,34 @@ unsigned int vp8_sad16x2_c( return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 2); } #endif + +void vp8_sad32x32x3_c(const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + unsigned int *sad_array + ) { + sad_array[0] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr, ref_stride, 0x7fffffff); + sad_array[1] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); + sad_array[2] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); +} + +void vp8_sad32x32x8_c(const unsigned char *src_ptr, + int src_stride, + const unsigned char *ref_ptr, + int ref_stride, + unsigned short *sad_array + ) { + sad_array[0] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr, ref_stride, 0x7fffffff); + sad_array[1] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, 0x7fffffff); + sad_array[2] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, 0x7fffffff); + sad_array[3] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, 0x7fffffff); + sad_array[4] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, 0x7fffffff); + sad_array[5] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, 0x7fffffff); + sad_array[6] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, 0x7fffffff); + sad_array[7] = (unsigned short)vp8_sad32x32_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); +} + void vp8_sad16x16x3_c( const unsigned char *src_ptr, int src_stride, @@ -267,6 +288,18 @@ void vp8_sad4x4x8_c( sad_array[7] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, 0x7fffffff); } +void vp8_sad32x32x4d_c(const unsigned char *src_ptr, + int src_stride, + unsigned char *ref_ptr[], + int ref_stride, + unsigned int *sad_array + ) { + sad_array[0] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr[0], ref_stride, 0x7fffffff); + sad_array[1] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr[1], ref_stride, 0x7fffffff); + sad_array[2] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr[2], ref_stride, 0x7fffffff); + sad_array[3] = vp8_sad32x32_c(src_ptr, src_stride, ref_ptr[3], ref_stride, 0x7fffffff); +} + void vp8_sad16x16x4d_c( const unsigned char *src_ptr, int src_stride, |