summaryrefslogtreecommitdiff
path: root/chromium/third_party/libvpx/source/libvpx/vp8/encoder
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/libvpx/source/libvpx/vp8/encoder')
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/vp8_short_fdct4x4_armv6.asm262
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/walsh_v6.asm212
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/dct_arm.c22
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/denoising_neon.c478
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/fastquantizeb_neon.c89
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/shortfdct_neon.c269
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/subtract_neon.c154
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.c129
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.c1737
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.h25
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/block.h175
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.c70
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.h132
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct.c118
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_cost.h371
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_tokens.h712
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/defaultcoefcounts.h236
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c745
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h117
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.c1424
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.h35
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.c139
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.h29
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.c641
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.h34
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.c380
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.h29
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/ethreading.c670
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.c3368
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.h32
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.c230
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.h117
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c2032
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.h115
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.c55
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.h27
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.c237
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.h28
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_if.c6011
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_int.h751
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c1548
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.h35
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/picklpf.c407
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.c583
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.h34
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.c1609
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.h39
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c2644
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.h147
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.c66
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.h28
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/ssim.c233
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/temporal_filter.c521
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.c608
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.h58
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.c43
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.h134
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_mmx.asm241
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_sse2.asm432
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/denoising_sse2.c379
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/encodeopt.asm386
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/fwalsh_sse2.asm164
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_mmx.asm286
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse2.c228
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse4.c128
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_ssse3.c114
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/ssim_opt_x86_64.asm216
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_mmx.asm223
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_sse2.asm245
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/temporal_filter_apply_sse2.asm207
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_mmx.c78
-rw-r--r--chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_sse2.c43
72 files changed, 0 insertions, 34544 deletions
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/vp8_short_fdct4x4_armv6.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/vp8_short_fdct4x4_armv6.asm
deleted file mode 100644
index 8034c1db9ad..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/vp8_short_fdct4x4_armv6.asm
+++ /dev/null
@@ -1,262 +0,0 @@
-;
-; Copyright (c) 2011 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
- EXPORT |vp8_short_fdct4x4_armv6|
-
- ARM
- REQUIRE8
- PRESERVE8
-
- AREA |.text|, CODE, READONLY
-; void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
-|vp8_short_fdct4x4_armv6| PROC
-
- stmfd sp!, {r4 - r12, lr}
-
- ; PART 1
-
- ; coeffs 0-3
- ldrd r4, r5, [r0] ; [i1 | i0] [i3 | i2]
-
- ldr r10, c7500
- ldr r11, c14500
- ldr r12, c0x22a453a0 ; [2217*4 | 5352*4]
- ldr lr, c0x00080008
- ror r5, r5, #16 ; [i2 | i3]
-
- qadd16 r6, r4, r5 ; [i1+i2 | i0+i3] = [b1 | a1] without shift
- qsub16 r7, r4, r5 ; [i1-i2 | i0-i3] = [c1 | d1] without shift
-
- add r0, r0, r2 ; update input pointer
-
- qadd16 r7, r7, r7 ; 2*[c1|d1] --> we can use smlad and smlsd
- ; with 2217*4 and 5352*4 without losing the
- ; sign bit (overflow)
-
- smuad r4, r6, lr ; o0 = (i1+i2)*8 + (i0+i3)*8
- smusd r5, r6, lr ; o2 = (i1+i2)*8 - (i0+i3)*8
-
- smlad r6, r7, r12, r11 ; o1 = (c1 * 2217 + d1 * 5352 + 14500)
- smlsdx r7, r7, r12, r10 ; o3 = (d1 * 2217 - c1 * 5352 + 7500)
-
- ldrd r8, r9, [r0] ; [i5 | i4] [i7 | i6]
-
- pkhbt r3, r4, r6, lsl #4 ; [o1 | o0], keep in register for PART 2
- pkhbt r6, r5, r7, lsl #4 ; [o3 | o2]
-
- str r6, [r1, #4]
-
- ; coeffs 4-7
- ror r9, r9, #16 ; [i6 | i7]
-
- qadd16 r6, r8, r9 ; [i5+i6 | i4+i7] = [b1 | a1] without shift
- qsub16 r7, r8, r9 ; [i5-i6 | i4-i7] = [c1 | d1] without shift
-
- add r0, r0, r2 ; update input pointer
-
- qadd16 r7, r7, r7 ; 2x[c1|d1] --> we can use smlad and smlsd
- ; with 2217*4 and 5352*4 without losing the
- ; sign bit (overflow)
-
- smuad r9, r6, lr ; o4 = (i5+i6)*8 + (i4+i7)*8
- smusd r8, r6, lr ; o6 = (i5+i6)*8 - (i4+i7)*8
-
- smlad r6, r7, r12, r11 ; o5 = (c1 * 2217 + d1 * 5352 + 14500)
- smlsdx r7, r7, r12, r10 ; o7 = (d1 * 2217 - c1 * 5352 + 7500)
-
- ldrd r4, r5, [r0] ; [i9 | i8] [i11 | i10]
-
- pkhbt r9, r9, r6, lsl #4 ; [o5 | o4], keep in register for PART 2
- pkhbt r6, r8, r7, lsl #4 ; [o7 | o6]
-
- str r6, [r1, #12]
-
- ; coeffs 8-11
- ror r5, r5, #16 ; [i10 | i11]
-
- qadd16 r6, r4, r5 ; [i9+i10 | i8+i11]=[b1 | a1] without shift
- qsub16 r7, r4, r5 ; [i9-i10 | i8-i11]=[c1 | d1] without shift
-
- add r0, r0, r2 ; update input pointer
-
- qadd16 r7, r7, r7 ; 2x[c1|d1] --> we can use smlad and smlsd
- ; with 2217*4 and 5352*4 without losing the
- ; sign bit (overflow)
-
- smuad r2, r6, lr ; o8 = (i9+i10)*8 + (i8+i11)*8
- smusd r8, r6, lr ; o10 = (i9+i10)*8 - (i8+i11)*8
-
- smlad r6, r7, r12, r11 ; o9 = (c1 * 2217 + d1 * 5352 + 14500)
- smlsdx r7, r7, r12, r10 ; o11 = (d1 * 2217 - c1 * 5352 + 7500)
-
- ldrd r4, r5, [r0] ; [i13 | i12] [i15 | i14]
-
- pkhbt r2, r2, r6, lsl #4 ; [o9 | o8], keep in register for PART 2
- pkhbt r6, r8, r7, lsl #4 ; [o11 | o10]
-
- str r6, [r1, #20]
-
- ; coeffs 12-15
- ror r5, r5, #16 ; [i14 | i15]
-
- qadd16 r6, r4, r5 ; [i13+i14 | i12+i15]=[b1|a1] without shift
- qsub16 r7, r4, r5 ; [i13-i14 | i12-i15]=[c1|d1] without shift
-
- qadd16 r7, r7, r7 ; 2x[c1|d1] --> we can use smlad and smlsd
- ; with 2217*4 and 5352*4 without losing the
- ; sign bit (overflow)
-
- smuad r4, r6, lr ; o12 = (i13+i14)*8 + (i12+i15)*8
- smusd r5, r6, lr ; o14 = (i13+i14)*8 - (i12+i15)*8
-
- smlad r6, r7, r12, r11 ; o13 = (c1 * 2217 + d1 * 5352 + 14500)
- smlsdx r7, r7, r12, r10 ; o15 = (d1 * 2217 - c1 * 5352 + 7500)
-
- pkhbt r0, r4, r6, lsl #4 ; [o13 | o12], keep in register for PART 2
- pkhbt r6, r5, r7, lsl #4 ; [o15 | o14]
-
- str r6, [r1, #28]
-
-
- ; PART 2 -------------------------------------------------
- ldr r11, c12000
- ldr r10, c51000
- ldr lr, c0x00070007
-
- qadd16 r4, r3, r0 ; a1 = [i1+i13 | i0+i12]
- qadd16 r5, r9, r2 ; b1 = [i5+i9 | i4+i8]
- qsub16 r6, r9, r2 ; c1 = [i5-i9 | i4-i8]
- qsub16 r7, r3, r0 ; d1 = [i1-i13 | i0-i12]
-
- qadd16 r4, r4, lr ; a1 + 7
-
- add r0, r11, #0x10000 ; add (d!=0)
-
- qadd16 r2, r4, r5 ; a1 + b1 + 7
- qsub16 r3, r4, r5 ; a1 - b1 + 7
-
- ldr r12, c0x08a914e8 ; [2217 | 5352]
-
- lsl r8, r2, #16 ; prepare bottom halfword for scaling
- asr r2, r2, #4 ; scale top halfword
- lsl r9, r3, #16 ; prepare bottom halfword for scaling
- asr r3, r3, #4 ; scale top halfword
- pkhtb r4, r2, r8, asr #20 ; pack and scale bottom halfword
- pkhtb r5, r3, r9, asr #20 ; pack and scale bottom halfword
-
- smulbt r2, r6, r12 ; [ ------ | c1*2217]
- str r4, [r1, #0] ; [ o1 | o0]
- smultt r3, r6, r12 ; [c1*2217 | ------ ]
- str r5, [r1, #16] ; [ o9 | o8]
-
- smlabb r8, r7, r12, r2 ; [ ------ | d1*5352]
- smlatb r9, r7, r12, r3 ; [d1*5352 | ------ ]
-
- smulbb r2, r6, r12 ; [ ------ | c1*5352]
- smultb r3, r6, r12 ; [c1*5352 | ------ ]
-
- lsls r6, r7, #16 ; d1 != 0 ?
- addeq r8, r8, r11 ; c1_b*2217+d1_b*5352+12000 + (d==0)
- addne r8, r8, r0 ; c1_b*2217+d1_b*5352+12000 + (d!=0)
- asrs r6, r7, #16
- addeq r9, r9, r11 ; c1_t*2217+d1_t*5352+12000 + (d==0)
- addne r9, r9, r0 ; c1_t*2217+d1_t*5352+12000 + (d!=0)
-
- smlabt r4, r7, r12, r10 ; [ ------ | d1*2217] + 51000
- smlatt r5, r7, r12, r10 ; [d1*2217 | ------ ] + 51000
-
- pkhtb r9, r9, r8, asr #16
-
- sub r4, r4, r2
- sub r5, r5, r3
-
- ldr r3, [r1, #4] ; [i3 | i2]
-
- pkhtb r5, r5, r4, asr #16 ; [o13|o12]
-
- str r9, [r1, #8] ; [o5 | 04]
-
- ldr r9, [r1, #12] ; [i7 | i6]
- ldr r8, [r1, #28] ; [i15|i14]
- ldr r2, [r1, #20] ; [i11|i10]
- str r5, [r1, #24] ; [o13|o12]
-
- qadd16 r4, r3, r8 ; a1 = [i3+i15 | i2+i14]
- qadd16 r5, r9, r2 ; b1 = [i7+i11 | i6+i10]
-
- qadd16 r4, r4, lr ; a1 + 7
-
- qsub16 r6, r9, r2 ; c1 = [i7-i11 | i6-i10]
- qadd16 r2, r4, r5 ; a1 + b1 + 7
- qsub16 r7, r3, r8 ; d1 = [i3-i15 | i2-i14]
- qsub16 r3, r4, r5 ; a1 - b1 + 7
-
- lsl r8, r2, #16 ; prepare bottom halfword for scaling
- asr r2, r2, #4 ; scale top halfword
- lsl r9, r3, #16 ; prepare bottom halfword for scaling
- asr r3, r3, #4 ; scale top halfword
- pkhtb r4, r2, r8, asr #20 ; pack and scale bottom halfword
- pkhtb r5, r3, r9, asr #20 ; pack and scale bottom halfword
-
- smulbt r2, r6, r12 ; [ ------ | c1*2217]
- str r4, [r1, #4] ; [ o3 | o2]
- smultt r3, r6, r12 ; [c1*2217 | ------ ]
- str r5, [r1, #20] ; [ o11 | o10]
-
- smlabb r8, r7, r12, r2 ; [ ------ | d1*5352]
- smlatb r9, r7, r12, r3 ; [d1*5352 | ------ ]
-
- smulbb r2, r6, r12 ; [ ------ | c1*5352]
- smultb r3, r6, r12 ; [c1*5352 | ------ ]
-
- lsls r6, r7, #16 ; d1 != 0 ?
- addeq r8, r8, r11 ; c1_b*2217+d1_b*5352+12000 + (d==0)
- addne r8, r8, r0 ; c1_b*2217+d1_b*5352+12000 + (d!=0)
-
- asrs r6, r7, #16
- addeq r9, r9, r11 ; c1_t*2217+d1_t*5352+12000 + (d==0)
- addne r9, r9, r0 ; c1_t*2217+d1_t*5352+12000 + (d!=0)
-
- smlabt r4, r7, r12, r10 ; [ ------ | d1*2217] + 51000
- smlatt r5, r7, r12, r10 ; [d1*2217 | ------ ] + 51000
-
- pkhtb r9, r9, r8, asr #16
-
- sub r4, r4, r2
- sub r5, r5, r3
-
- str r9, [r1, #12] ; [o7 | o6]
- pkhtb r5, r5, r4, asr #16 ; [o15|o14]
-
- str r5, [r1, #28] ; [o15|o14]
-
- ldmfd sp!, {r4 - r12, pc}
-
- ENDP
-
-; Used constants
-c7500
- DCD 7500
-c14500
- DCD 14500
-c0x22a453a0
- DCD 0x22a453a0
-c0x00080008
- DCD 0x00080008
-c12000
- DCD 12000
-c51000
- DCD 51000
-c0x00070007
- DCD 0x00070007
-c0x08a914e8
- DCD 0x08a914e8
-
- END
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/walsh_v6.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/walsh_v6.asm
deleted file mode 100644
index 5eaf3f25a90..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/armv6/walsh_v6.asm
+++ /dev/null
@@ -1,212 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
- EXPORT |vp8_short_walsh4x4_armv6|
-
- ARM
- REQUIRE8
- PRESERVE8
-
- AREA |.text|, CODE, READONLY ; name this block of code
-
-;short vp8_short_walsh4x4_armv6(short *input, short *output, int pitch)
-; r0 short *input,
-; r1 short *output,
-; r2 int pitch
-|vp8_short_walsh4x4_armv6| PROC
-
- stmdb sp!, {r4 - r11, lr}
-
- ldrd r4, r5, [r0], r2
- ldr lr, c00040004
- ldrd r6, r7, [r0], r2
-
- ; 0-3
- qadd16 r3, r4, r5 ; [d1|a1] [1+3 | 0+2]
- qsub16 r4, r4, r5 ; [c1|b1] [1-3 | 0-2]
-
- ldrd r8, r9, [r0], r2
- ; 4-7
- qadd16 r5, r6, r7 ; [d1|a1] [5+7 | 4+6]
- qsub16 r6, r6, r7 ; [c1|b1] [5-7 | 4-6]
-
- ldrd r10, r11, [r0]
- ; 8-11
- qadd16 r7, r8, r9 ; [d1|a1] [9+11 | 8+10]
- qsub16 r8, r8, r9 ; [c1|b1] [9-11 | 8-10]
-
- ; 12-15
- qadd16 r9, r10, r11 ; [d1|a1] [13+15 | 12+14]
- qsub16 r10, r10, r11 ; [c1|b1] [13-15 | 12-14]
-
-
- lsls r2, r3, #16
- smuad r11, r3, lr ; A0 = a1<<2 + d1<<2
- addne r11, r11, #1 ; A0 += (a1!=0)
-
- lsls r2, r7, #16
- smuad r12, r7, lr ; C0 = a1<<2 + d1<<2
- addne r12, r12, #1 ; C0 += (a1!=0)
-
- add r0, r11, r12 ; a1_0 = A0 + C0
- sub r11, r11, r12 ; b1_0 = A0 - C0
-
- lsls r2, r5, #16
- smuad r12, r5, lr ; B0 = a1<<2 + d1<<2
- addne r12, r12, #1 ; B0 += (a1!=0)
-
- lsls r2, r9, #16
- smuad r2, r9, lr ; D0 = a1<<2 + d1<<2
- addne r2, r2, #1 ; D0 += (a1!=0)
-
- add lr, r12, r2 ; d1_0 = B0 + D0
- sub r12, r12, r2 ; c1_0 = B0 - D0
-
- ; op[0,4,8,12]
- adds r2, r0, lr ; a2 = a1_0 + d1_0
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- subs r0, r0, lr ; d2 = a1_0 - d1_0
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1] ; op[0]
-
- addmi r0, r0, #1 ; += a2 < 0
- add r0, r0, #3 ; += 3
- ldr lr, c00040004
- mov r0, r0, asr #3 ; >> 3
- strh r0, [r1, #24] ; op[12]
-
- adds r2, r11, r12 ; b2 = b1_0 + c1_0
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- subs r0, r11, r12 ; c2 = b1_0 - c1_0
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #8] ; op[4]
-
- addmi r0, r0, #1 ; += a2 < 0
- add r0, r0, #3 ; += 3
- smusd r3, r3, lr ; A3 = a1<<2 - d1<<2
- smusd r7, r7, lr ; C3 = a1<<2 - d1<<2
- mov r0, r0, asr #3 ; >> 3
- strh r0, [r1, #16] ; op[8]
-
-
- ; op[3,7,11,15]
- add r0, r3, r7 ; a1_3 = A3 + C3
- sub r3, r3, r7 ; b1_3 = A3 - C3
-
- smusd r5, r5, lr ; B3 = a1<<2 - d1<<2
- smusd r9, r9, lr ; D3 = a1<<2 - d1<<2
- add r7, r5, r9 ; d1_3 = B3 + D3
- sub r5, r5, r9 ; c1_3 = B3 - D3
-
- adds r2, r0, r7 ; a2 = a1_3 + d1_3
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- adds r9, r3, r5 ; b2 = b1_3 + c1_3
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #6] ; op[3]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- subs r2, r3, r5 ; c2 = b1_3 - c1_3
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #14] ; op[7]
-
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- subs r9, r0, r7 ; d2 = a1_3 - d1_3
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #22] ; op[11]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- smuad r3, r4, lr ; A1 = b1<<2 + c1<<2
- smuad r5, r8, lr ; C1 = b1<<2 + c1<<2
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #30] ; op[15]
-
- ; op[1,5,9,13]
- add r0, r3, r5 ; a1_1 = A1 + C1
- sub r3, r3, r5 ; b1_1 = A1 - C1
-
- smuad r7, r6, lr ; B1 = b1<<2 + c1<<2
- smuad r9, r10, lr ; D1 = b1<<2 + c1<<2
- add r5, r7, r9 ; d1_1 = B1 + D1
- sub r7, r7, r9 ; c1_1 = B1 - D1
-
- adds r2, r0, r5 ; a2 = a1_1 + d1_1
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- adds r9, r3, r7 ; b2 = b1_1 + c1_1
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #2] ; op[1]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- subs r2, r3, r7 ; c2 = b1_1 - c1_1
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #10] ; op[5]
-
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- subs r9, r0, r5 ; d2 = a1_1 - d1_1
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #18] ; op[9]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- smusd r4, r4, lr ; A2 = b1<<2 - c1<<2
- smusd r8, r8, lr ; C2 = b1<<2 - c1<<2
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #26] ; op[13]
-
-
- ; op[2,6,10,14]
- add r11, r4, r8 ; a1_2 = A2 + C2
- sub r12, r4, r8 ; b1_2 = A2 - C2
-
- smusd r6, r6, lr ; B2 = b1<<2 - c1<<2
- smusd r10, r10, lr ; D2 = b1<<2 - c1<<2
- add r4, r6, r10 ; d1_2 = B2 + D2
- sub r8, r6, r10 ; c1_2 = B2 - D2
-
- adds r2, r11, r4 ; a2 = a1_2 + d1_2
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- adds r9, r12, r8 ; b2 = b1_2 + c1_2
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #4] ; op[2]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- subs r2, r12, r8 ; c2 = b1_2 - c1_2
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #12] ; op[6]
-
- addmi r2, r2, #1 ; += a2 < 0
- add r2, r2, #3 ; += 3
- subs r9, r11, r4 ; d2 = a1_2 - d1_2
- mov r2, r2, asr #3 ; >> 3
- strh r2, [r1, #20] ; op[10]
-
- addmi r9, r9, #1 ; += a2 < 0
- add r9, r9, #3 ; += 3
- mov r9, r9, asr #3 ; >> 3
- strh r9, [r1, #28] ; op[14]
-
-
- ldmia sp!, {r4 - r11, pc}
- ENDP ; |vp8_short_walsh4x4_armv6|
-
-c00040004
- DCD 0x00040004
-
- END
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/dct_arm.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/dct_arm.c
deleted file mode 100644
index f71300d2c6c..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/dct_arm.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2011 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-
-#if HAVE_MEDIA
-
-void vp8_short_fdct8x4_armv6(short *input, short *output, int pitch)
-{
- vp8_short_fdct4x4_armv6(input, output, pitch);
- vp8_short_fdct4x4_armv6(input + 4, output + 16, pitch);
-}
-
-#endif /* HAVE_MEDIA */
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/denoising_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/denoising_neon.c
deleted file mode 100644
index 08be76e4338..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/denoising_neon.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <arm_neon.h>
-
-#include "vp8/encoder/denoising.h"
-#include "vpx_mem/vpx_mem.h"
-#include "./vp8_rtcd.h"
-
-/*
- * The filter function was modified to reduce the computational complexity.
- *
- * Step 1:
- * Instead of applying tap coefficients for each pixel, we calculated the
- * pixel adjustments vs. pixel diff value ahead of time.
- * adjustment = filtered_value - current_raw
- * = (filter_coefficient * diff + 128) >> 8
- * where
- * filter_coefficient = (255 << 8) / (256 + ((abs_diff * 330) >> 3));
- * filter_coefficient += filter_coefficient /
- * (3 + motion_magnitude_adjustment);
- * filter_coefficient is clamped to 0 ~ 255.
- *
- * Step 2:
- * The adjustment vs. diff curve becomes flat very quick when diff increases.
- * This allowed us to use only several levels to approximate the curve without
- * changing the filtering algorithm too much.
- * The adjustments were further corrected by checking the motion magnitude.
- * The levels used are:
- * diff level adjustment w/o adjustment w/
- * motion correction motion correction
- * [-255, -16] 3 -6 -7
- * [-15, -8] 2 -4 -5
- * [-7, -4] 1 -3 -4
- * [-3, 3] 0 diff diff
- * [4, 7] 1 3 4
- * [8, 15] 2 4 5
- * [16, 255] 3 6 7
- */
-
-int vp8_denoiser_filter_neon(unsigned char *mc_running_avg_y,
- int mc_running_avg_y_stride,
- unsigned char *running_avg_y,
- int running_avg_y_stride,
- unsigned char *sig, int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising) {
- /* If motion_magnitude is small, making the denoiser more aggressive by
- * increasing the adjustment for each level, level1 adjustment is
- * increased, the deltas stay the same.
- */
- int shift_inc = (increase_denoising &&
- motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) ? 1 : 0;
- const uint8x16_t v_level1_adjustment = vmovq_n_u8(
- (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) ? 4 + shift_inc : 3);
- const uint8x16_t v_delta_level_1_and_2 = vdupq_n_u8(1);
- const uint8x16_t v_delta_level_2_and_3 = vdupq_n_u8(2);
- const uint8x16_t v_level1_threshold = vmovq_n_u8(4 + shift_inc);
- const uint8x16_t v_level2_threshold = vdupq_n_u8(8);
- const uint8x16_t v_level3_threshold = vdupq_n_u8(16);
- int64x2_t v_sum_diff_total = vdupq_n_s64(0);
-
- /* Go over lines. */
- int r;
- for (r = 0; r < 16; ++r) {
- /* Load inputs. */
- const uint8x16_t v_sig = vld1q_u8(sig);
- const uint8x16_t v_mc_running_avg_y = vld1q_u8(mc_running_avg_y);
-
- /* Calculate absolute difference and sign masks. */
- const uint8x16_t v_abs_diff = vabdq_u8(v_sig, v_mc_running_avg_y);
- const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig, v_mc_running_avg_y);
- const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig, v_mc_running_avg_y);
-
- /* Figure out which level that put us in. */
- const uint8x16_t v_level1_mask = vcleq_u8(v_level1_threshold,
- v_abs_diff);
- const uint8x16_t v_level2_mask = vcleq_u8(v_level2_threshold,
- v_abs_diff);
- const uint8x16_t v_level3_mask = vcleq_u8(v_level3_threshold,
- v_abs_diff);
-
- /* Calculate absolute adjustments for level 1, 2 and 3. */
- const uint8x16_t v_level2_adjustment = vandq_u8(v_level2_mask,
- v_delta_level_1_and_2);
- const uint8x16_t v_level3_adjustment = vandq_u8(v_level3_mask,
- v_delta_level_2_and_3);
- const uint8x16_t v_level1and2_adjustment = vaddq_u8(v_level1_adjustment,
- v_level2_adjustment);
- const uint8x16_t v_level1and2and3_adjustment = vaddq_u8(
- v_level1and2_adjustment, v_level3_adjustment);
-
- /* Figure adjustment absolute value by selecting between the absolute
- * difference if in level0 or the value for level 1, 2 and 3.
- */
- const uint8x16_t v_abs_adjustment = vbslq_u8(v_level1_mask,
- v_level1and2and3_adjustment, v_abs_diff);
-
- /* Calculate positive and negative adjustments. Apply them to the signal
- * and accumulate them. Adjustments are less than eight and the maximum
- * sum of them (7 * 16) can fit in a signed char.
- */
- const uint8x16_t v_pos_adjustment = vandq_u8(v_diff_pos_mask,
- v_abs_adjustment);
- const uint8x16_t v_neg_adjustment = vandq_u8(v_diff_neg_mask,
- v_abs_adjustment);
-
- uint8x16_t v_running_avg_y = vqaddq_u8(v_sig, v_pos_adjustment);
- v_running_avg_y = vqsubq_u8(v_running_avg_y, v_neg_adjustment);
-
- /* Store results. */
- vst1q_u8(running_avg_y, v_running_avg_y);
-
- /* Sum all the accumulators to have the sum of all pixel differences
- * for this macroblock.
- */
- {
- const int8x16_t v_sum_diff =
- vqsubq_s8(vreinterpretq_s8_u8(v_pos_adjustment),
- vreinterpretq_s8_u8(v_neg_adjustment));
-
- const int16x8_t fe_dc_ba_98_76_54_32_10 = vpaddlq_s8(v_sum_diff);
-
- const int32x4_t fedc_ba98_7654_3210 =
- vpaddlq_s16(fe_dc_ba_98_76_54_32_10);
-
- const int64x2_t fedcba98_76543210 =
- vpaddlq_s32(fedc_ba98_7654_3210);
-
- v_sum_diff_total = vqaddq_s64(v_sum_diff_total, fedcba98_76543210);
- }
-
- /* Update pointers for next iteration. */
- sig += sig_stride;
- mc_running_avg_y += mc_running_avg_y_stride;
- running_avg_y += running_avg_y_stride;
- }
-
- /* Too much adjustments => copy block. */
- {
- int64x1_t x = vqadd_s64(vget_high_s64(v_sum_diff_total),
- vget_low_s64(v_sum_diff_total));
- int sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0);
- int sum_diff_thresh = SUM_DIFF_THRESHOLD;
-
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH;
- if (sum_diff > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising),
- // checK if we can still apply some (weaker) temporal filtering to
- // this block, that would otherwise not be denoised at all. Simplest
- // is to apply an additional adjustment to running_avg_y to bring it
- // closer to sig. The adjustment is capped by a maximum delta, and
- // chosen such that in most cases the resulting sum_diff will be
- // within the accceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over the
- // threshold.
- int delta = ((sum_diff - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- const uint8x16_t k_delta = vmovq_n_u8(delta);
- sig -= sig_stride * 16;
- mc_running_avg_y -= mc_running_avg_y_stride * 16;
- running_avg_y -= running_avg_y_stride * 16;
- for (r = 0; r < 16; ++r) {
- uint8x16_t v_running_avg_y = vld1q_u8(running_avg_y);
- const uint8x16_t v_sig = vld1q_u8(sig);
- const uint8x16_t v_mc_running_avg_y = vld1q_u8(mc_running_avg_y);
-
- /* Calculate absolute difference and sign masks. */
- const uint8x16_t v_abs_diff = vabdq_u8(v_sig,
- v_mc_running_avg_y);
- const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig,
- v_mc_running_avg_y);
- const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig,
- v_mc_running_avg_y);
- // Clamp absolute difference to delta to get the adjustment.
- const uint8x16_t v_abs_adjustment =
- vminq_u8(v_abs_diff, (k_delta));
-
- const uint8x16_t v_pos_adjustment = vandq_u8(v_diff_pos_mask,
- v_abs_adjustment);
- const uint8x16_t v_neg_adjustment = vandq_u8(v_diff_neg_mask,
- v_abs_adjustment);
-
- v_running_avg_y = vqsubq_u8(v_running_avg_y, v_pos_adjustment);
- v_running_avg_y = vqaddq_u8(v_running_avg_y, v_neg_adjustment);
-
- /* Store results. */
- vst1q_u8(running_avg_y, v_running_avg_y);
-
- {
- const int8x16_t v_sum_diff =
- vqsubq_s8(vreinterpretq_s8_u8(v_neg_adjustment),
- vreinterpretq_s8_u8(v_pos_adjustment));
-
- const int16x8_t fe_dc_ba_98_76_54_32_10 =
- vpaddlq_s8(v_sum_diff);
- const int32x4_t fedc_ba98_7654_3210 =
- vpaddlq_s16(fe_dc_ba_98_76_54_32_10);
- const int64x2_t fedcba98_76543210 =
- vpaddlq_s32(fedc_ba98_7654_3210);
-
- v_sum_diff_total = vqaddq_s64(v_sum_diff_total,
- fedcba98_76543210);
- }
- /* Update pointers for next iteration. */
- sig += sig_stride;
- mc_running_avg_y += mc_running_avg_y_stride;
- running_avg_y += running_avg_y_stride;
- }
- {
- // Update the sum of all pixel differences of this MB.
- x = vqadd_s64(vget_high_s64(v_sum_diff_total),
- vget_low_s64(v_sum_diff_total));
- sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0);
-
- if (sum_diff > sum_diff_thresh) {
- return COPY_BLOCK;
- }
- }
- } else {
- return COPY_BLOCK;
- }
- }
- }
-
- /* Tell above level that block was filtered. */
- running_avg_y -= running_avg_y_stride * 16;
- sig -= sig_stride * 16;
-
- vp8_copy_mem16x16(running_avg_y, running_avg_y_stride, sig, sig_stride);
-
- return FILTER_BLOCK;
-}
-
-int vp8_denoiser_filter_uv_neon(unsigned char *mc_running_avg,
- int mc_running_avg_stride,
- unsigned char *running_avg,
- int running_avg_stride,
- unsigned char *sig, int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising) {
- /* If motion_magnitude is small, making the denoiser more aggressive by
- * increasing the adjustment for each level, level1 adjustment is
- * increased, the deltas stay the same.
- */
- int shift_inc = (increase_denoising &&
- motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD_UV) ? 1 : 0;
- const uint8x16_t v_level1_adjustment = vmovq_n_u8(
- (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD_UV) ? 4 + shift_inc : 3);
-
- const uint8x16_t v_delta_level_1_and_2 = vdupq_n_u8(1);
- const uint8x16_t v_delta_level_2_and_3 = vdupq_n_u8(2);
- const uint8x16_t v_level1_threshold = vmovq_n_u8(4 + shift_inc);
- const uint8x16_t v_level2_threshold = vdupq_n_u8(8);
- const uint8x16_t v_level3_threshold = vdupq_n_u8(16);
- int64x2_t v_sum_diff_total = vdupq_n_s64(0);
- int r;
-
- {
- uint16x4_t v_sum_block = vdup_n_u16(0);
-
- // Avoid denoising color signal if its close to average level.
- for (r = 0; r < 8; ++r) {
- const uint8x8_t v_sig = vld1_u8(sig);
- const uint16x4_t _76_54_32_10 = vpaddl_u8(v_sig);
- v_sum_block = vqadd_u16(v_sum_block, _76_54_32_10);
- sig += sig_stride;
- }
- sig -= sig_stride * 8;
- {
- const uint32x2_t _7654_3210 = vpaddl_u16(v_sum_block);
- const uint64x1_t _76543210 = vpaddl_u32(_7654_3210);
- const int sum_block =
- vget_lane_s32(vreinterpret_s32_u64(_76543210), 0);
- if (abs(sum_block - (128 * 8 * 8)) < SUM_DIFF_FROM_AVG_THRESH_UV) {
- return COPY_BLOCK;
- }
- }
- }
-
- /* Go over lines. */
- for (r = 0; r < 4; ++r) {
- /* Load inputs. */
- const uint8x8_t v_sig_lo = vld1_u8(sig);
- const uint8x8_t v_sig_hi = vld1_u8(&sig[sig_stride]);
- const uint8x16_t v_sig = vcombine_u8(v_sig_lo, v_sig_hi);
- const uint8x8_t v_mc_running_avg_lo = vld1_u8(mc_running_avg);
- const uint8x8_t v_mc_running_avg_hi =
- vld1_u8(&mc_running_avg[mc_running_avg_stride]);
- const uint8x16_t v_mc_running_avg =
- vcombine_u8(v_mc_running_avg_lo, v_mc_running_avg_hi);
- /* Calculate absolute difference and sign masks. */
- const uint8x16_t v_abs_diff = vabdq_u8(v_sig, v_mc_running_avg);
- const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig, v_mc_running_avg);
- const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig, v_mc_running_avg);
-
- /* Figure out which level that put us in. */
- const uint8x16_t v_level1_mask = vcleq_u8(v_level1_threshold,
- v_abs_diff);
- const uint8x16_t v_level2_mask = vcleq_u8(v_level2_threshold,
- v_abs_diff);
- const uint8x16_t v_level3_mask = vcleq_u8(v_level3_threshold,
- v_abs_diff);
-
- /* Calculate absolute adjustments for level 1, 2 and 3. */
- const uint8x16_t v_level2_adjustment = vandq_u8(v_level2_mask,
- v_delta_level_1_and_2);
- const uint8x16_t v_level3_adjustment = vandq_u8(v_level3_mask,
- v_delta_level_2_and_3);
- const uint8x16_t v_level1and2_adjustment = vaddq_u8(v_level1_adjustment,
- v_level2_adjustment);
- const uint8x16_t v_level1and2and3_adjustment = vaddq_u8(
- v_level1and2_adjustment, v_level3_adjustment);
-
- /* Figure adjustment absolute value by selecting between the absolute
- * difference if in level0 or the value for level 1, 2 and 3.
- */
- const uint8x16_t v_abs_adjustment = vbslq_u8(v_level1_mask,
- v_level1and2and3_adjustment, v_abs_diff);
-
- /* Calculate positive and negative adjustments. Apply them to the signal
- * and accumulate them. Adjustments are less than eight and the maximum
- * sum of them (7 * 16) can fit in a signed char.
- */
- const uint8x16_t v_pos_adjustment = vandq_u8(v_diff_pos_mask,
- v_abs_adjustment);
- const uint8x16_t v_neg_adjustment = vandq_u8(v_diff_neg_mask,
- v_abs_adjustment);
-
- uint8x16_t v_running_avg = vqaddq_u8(v_sig, v_pos_adjustment);
- v_running_avg = vqsubq_u8(v_running_avg, v_neg_adjustment);
-
- /* Store results. */
- vst1_u8(running_avg, vget_low_u8(v_running_avg));
- vst1_u8(&running_avg[running_avg_stride], vget_high_u8(v_running_avg));
-
- /* Sum all the accumulators to have the sum of all pixel differences
- * for this macroblock.
- */
- {
- const int8x16_t v_sum_diff =
- vqsubq_s8(vreinterpretq_s8_u8(v_pos_adjustment),
- vreinterpretq_s8_u8(v_neg_adjustment));
-
- const int16x8_t fe_dc_ba_98_76_54_32_10 = vpaddlq_s8(v_sum_diff);
-
- const int32x4_t fedc_ba98_7654_3210 =
- vpaddlq_s16(fe_dc_ba_98_76_54_32_10);
-
- const int64x2_t fedcba98_76543210 =
- vpaddlq_s32(fedc_ba98_7654_3210);
-
- v_sum_diff_total = vqaddq_s64(v_sum_diff_total, fedcba98_76543210);
- }
-
- /* Update pointers for next iteration. */
- sig += sig_stride * 2;
- mc_running_avg += mc_running_avg_stride * 2;
- running_avg += running_avg_stride * 2;
- }
-
-
- /* Too much adjustments => copy block. */
- {
- int64x1_t x = vqadd_s64(vget_high_s64(v_sum_diff_total),
- vget_low_s64(v_sum_diff_total));
- int sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0);
- int sum_diff_thresh = SUM_DIFF_THRESHOLD_UV;
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH_UV;
- if (sum_diff > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising),
- // checK if we can still apply some (weaker) temporal filtering to
- // this block, that would otherwise not be denoised at all. Simplest
- // is to apply an additional adjustment to running_avg_y to bring it
- // closer to sig. The adjustment is capped by a maximum delta, and
- // chosen such that in most cases the resulting sum_diff will be
- // within the accceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over the
- // threshold.
- int delta = ((sum_diff - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- const uint8x16_t k_delta = vmovq_n_u8(delta);
- sig -= sig_stride * 8;
- mc_running_avg -= mc_running_avg_stride * 8;
- running_avg -= running_avg_stride * 8;
- for (r = 0; r < 4; ++r) {
- const uint8x8_t v_sig_lo = vld1_u8(sig);
- const uint8x8_t v_sig_hi = vld1_u8(&sig[sig_stride]);
- const uint8x16_t v_sig = vcombine_u8(v_sig_lo, v_sig_hi);
- const uint8x8_t v_mc_running_avg_lo = vld1_u8(mc_running_avg);
- const uint8x8_t v_mc_running_avg_hi =
- vld1_u8(&mc_running_avg[mc_running_avg_stride]);
- const uint8x16_t v_mc_running_avg =
- vcombine_u8(v_mc_running_avg_lo, v_mc_running_avg_hi);
- /* Calculate absolute difference and sign masks. */
- const uint8x16_t v_abs_diff = vabdq_u8(v_sig,
- v_mc_running_avg);
- const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig,
- v_mc_running_avg);
- const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig,
- v_mc_running_avg);
- // Clamp absolute difference to delta to get the adjustment.
- const uint8x16_t v_abs_adjustment =
- vminq_u8(v_abs_diff, (k_delta));
-
- const uint8x16_t v_pos_adjustment = vandq_u8(v_diff_pos_mask,
- v_abs_adjustment);
- const uint8x16_t v_neg_adjustment = vandq_u8(v_diff_neg_mask,
- v_abs_adjustment);
- const uint8x8_t v_running_avg_lo = vld1_u8(running_avg);
- const uint8x8_t v_running_avg_hi =
- vld1_u8(&running_avg[running_avg_stride]);
- uint8x16_t v_running_avg =
- vcombine_u8(v_running_avg_lo, v_running_avg_hi);
-
- v_running_avg = vqsubq_u8(v_running_avg, v_pos_adjustment);
- v_running_avg = vqaddq_u8(v_running_avg, v_neg_adjustment);
-
- /* Store results. */
- vst1_u8(running_avg, vget_low_u8(v_running_avg));
- vst1_u8(&running_avg[running_avg_stride],
- vget_high_u8(v_running_avg));
-
- {
- const int8x16_t v_sum_diff =
- vqsubq_s8(vreinterpretq_s8_u8(v_neg_adjustment),
- vreinterpretq_s8_u8(v_pos_adjustment));
-
- const int16x8_t fe_dc_ba_98_76_54_32_10 =
- vpaddlq_s8(v_sum_diff);
- const int32x4_t fedc_ba98_7654_3210 =
- vpaddlq_s16(fe_dc_ba_98_76_54_32_10);
- const int64x2_t fedcba98_76543210 =
- vpaddlq_s32(fedc_ba98_7654_3210);
-
- v_sum_diff_total = vqaddq_s64(v_sum_diff_total,
- fedcba98_76543210);
- }
- /* Update pointers for next iteration. */
- sig += sig_stride * 2;
- mc_running_avg += mc_running_avg_stride * 2;
- running_avg += running_avg_stride * 2;
- }
- {
- // Update the sum of all pixel differences of this MB.
- x = vqadd_s64(vget_high_s64(v_sum_diff_total),
- vget_low_s64(v_sum_diff_total));
- sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0);
-
- if (sum_diff > sum_diff_thresh) {
- return COPY_BLOCK;
- }
- }
- } else {
- return COPY_BLOCK;
- }
- }
- }
-
- /* Tell above level that block was filtered. */
- running_avg -= running_avg_stride * 8;
- sig -= sig_stride * 8;
-
- vp8_copy_mem8x8(running_avg, running_avg_stride, sig, sig_stride);
-
- return FILTER_BLOCK;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/fastquantizeb_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/fastquantizeb_neon.c
deleted file mode 100644
index e5824bfb217..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/fastquantizeb_neon.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <arm_neon.h>
-#include "vp8/encoder/block.h"
-
-static const uint16_t inv_zig_zag[16] = {
- 1, 2, 6, 7,
- 3, 5, 8, 13,
- 4, 9, 12, 14,
- 10, 11, 15, 16
-};
-
-void vp8_fast_quantize_b_neon(BLOCK *b, BLOCKD *d) {
- const int16x8_t one_q = vdupq_n_s16(-1),
- z0 = vld1q_s16(b->coeff),
- z1 = vld1q_s16(b->coeff + 8),
- round0 = vld1q_s16(b->round),
- round1 = vld1q_s16(b->round + 8),
- quant0 = vld1q_s16(b->quant_fast),
- quant1 = vld1q_s16(b->quant_fast + 8),
- dequant0 = vld1q_s16(d->dequant),
- dequant1 = vld1q_s16(d->dequant + 8);
- const uint16x8_t zig_zag0 = vld1q_u16(inv_zig_zag),
- zig_zag1 = vld1q_u16(inv_zig_zag + 8);
- int16x8_t x0, x1, sz0, sz1, y0, y1;
- uint16x8_t eob0, eob1;
- uint16x4_t eob_d16;
- uint32x2_t eob_d32;
- uint32x4_t eob_q32;
-
- /* sign of z: z >> 15 */
- sz0 = vshrq_n_s16(z0, 15);
- sz1 = vshrq_n_s16(z1, 15);
-
- /* x = abs(z) */
- x0 = vabsq_s16(z0);
- x1 = vabsq_s16(z1);
-
- /* x += round */
- x0 = vaddq_s16(x0, round0);
- x1 = vaddq_s16(x1, round1);
-
- /* y = 2 * (x * quant) >> 16 */
- y0 = vqdmulhq_s16(x0, quant0);
- y1 = vqdmulhq_s16(x1, quant1);
-
- /* Compensate for doubling in vqdmulhq */
- y0 = vshrq_n_s16(y0, 1);
- y1 = vshrq_n_s16(y1, 1);
-
- /* Restore sign bit */
- y0 = veorq_s16(y0, sz0);
- y1 = veorq_s16(y1, sz1);
- x0 = vsubq_s16(y0, sz0);
- x1 = vsubq_s16(y1, sz1);
-
- /* find non-zero elements */
- eob0 = vtstq_s16(x0, one_q);
- eob1 = vtstq_s16(x1, one_q);
-
- /* mask zig zag */
- eob0 = vandq_u16(eob0, zig_zag0);
- eob1 = vandq_u16(eob1, zig_zag1);
-
- /* select the largest value */
- eob0 = vmaxq_u16(eob0, eob1);
- eob_d16 = vmax_u16(vget_low_u16(eob0), vget_high_u16(eob0));
- eob_q32 = vmovl_u16(eob_d16);
- eob_d32 = vmax_u32(vget_low_u32(eob_q32), vget_high_u32(eob_q32));
- eob_d32 = vpmax_u32(eob_d32, eob_d32);
-
- /* qcoeff = x */
- vst1q_s16(d->qcoeff, x0);
- vst1q_s16(d->qcoeff + 8, x1);
-
- /* dqcoeff = x * dequant */
- vst1q_s16(d->dqcoeff, vmulq_s16(dequant0, x0));
- vst1q_s16(d->dqcoeff + 8, vmulq_s16(dequant1, x1));
-
- vst1_lane_s8((int8_t *)d->eob, vreinterpret_s8_u32(eob_d32), 0);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/shortfdct_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/shortfdct_neon.c
deleted file mode 100644
index 391e5f99070..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/shortfdct_neon.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <arm_neon.h>
-
-void vp8_short_fdct4x4_neon(
- int16_t *input,
- int16_t *output,
- int pitch) {
- int16x4_t d0s16, d1s16, d2s16, d3s16, d4s16, d5s16, d6s16, d7s16;
- int16x4_t d16s16, d17s16, d26s16, dEmptys16;
- uint16x4_t d4u16;
- int16x8_t q0s16, q1s16;
- int32x4_t q9s32, q10s32, q11s32, q12s32;
- int16x4x2_t v2tmp0, v2tmp1;
- int32x2x2_t v2tmp2, v2tmp3;
-
- d16s16 = vdup_n_s16(5352);
- d17s16 = vdup_n_s16(2217);
- q9s32 = vdupq_n_s32(14500);
- q10s32 = vdupq_n_s32(7500);
- q11s32 = vdupq_n_s32(12000);
- q12s32 = vdupq_n_s32(51000);
-
- // Part one
- pitch >>= 1;
- d0s16 = vld1_s16(input);
- input += pitch;
- d1s16 = vld1_s16(input);
- input += pitch;
- d2s16 = vld1_s16(input);
- input += pitch;
- d3s16 = vld1_s16(input);
-
- v2tmp2 = vtrn_s32(vreinterpret_s32_s16(d0s16),
- vreinterpret_s32_s16(d2s16));
- v2tmp3 = vtrn_s32(vreinterpret_s32_s16(d1s16),
- vreinterpret_s32_s16(d3s16));
- v2tmp0 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[0]), // d0
- vreinterpret_s16_s32(v2tmp3.val[0])); // d1
- v2tmp1 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[1]), // d2
- vreinterpret_s16_s32(v2tmp3.val[1])); // d3
-
- d4s16 = vadd_s16(v2tmp0.val[0], v2tmp1.val[1]);
- d5s16 = vadd_s16(v2tmp0.val[1], v2tmp1.val[0]);
- d6s16 = vsub_s16(v2tmp0.val[1], v2tmp1.val[0]);
- d7s16 = vsub_s16(v2tmp0.val[0], v2tmp1.val[1]);
-
- d4s16 = vshl_n_s16(d4s16, 3);
- d5s16 = vshl_n_s16(d5s16, 3);
- d6s16 = vshl_n_s16(d6s16, 3);
- d7s16 = vshl_n_s16(d7s16, 3);
-
- d0s16 = vadd_s16(d4s16, d5s16);
- d2s16 = vsub_s16(d4s16, d5s16);
-
- q9s32 = vmlal_s16(q9s32, d7s16, d16s16);
- q10s32 = vmlal_s16(q10s32, d7s16, d17s16);
- q9s32 = vmlal_s16(q9s32, d6s16, d17s16);
- q10s32 = vmlsl_s16(q10s32, d6s16, d16s16);
-
- d1s16 = vshrn_n_s32(q9s32, 12);
- d3s16 = vshrn_n_s32(q10s32, 12);
-
- // Part two
- v2tmp2 = vtrn_s32(vreinterpret_s32_s16(d0s16),
- vreinterpret_s32_s16(d2s16));
- v2tmp3 = vtrn_s32(vreinterpret_s32_s16(d1s16),
- vreinterpret_s32_s16(d3s16));
- v2tmp0 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[0]), // d0
- vreinterpret_s16_s32(v2tmp3.val[0])); // d1
- v2tmp1 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[1]), // d2
- vreinterpret_s16_s32(v2tmp3.val[1])); // d3
-
- d4s16 = vadd_s16(v2tmp0.val[0], v2tmp1.val[1]);
- d5s16 = vadd_s16(v2tmp0.val[1], v2tmp1.val[0]);
- d6s16 = vsub_s16(v2tmp0.val[1], v2tmp1.val[0]);
- d7s16 = vsub_s16(v2tmp0.val[0], v2tmp1.val[1]);
-
- d26s16 = vdup_n_s16(7);
- d4s16 = vadd_s16(d4s16, d26s16);
-
- d0s16 = vadd_s16(d4s16, d5s16);
- d2s16 = vsub_s16(d4s16, d5s16);
-
- q11s32 = vmlal_s16(q11s32, d7s16, d16s16);
- q12s32 = vmlal_s16(q12s32, d7s16, d17s16);
-
- dEmptys16 = vdup_n_s16(0);
- d4u16 = vceq_s16(d7s16, dEmptys16);
-
- d0s16 = vshr_n_s16(d0s16, 4);
- d2s16 = vshr_n_s16(d2s16, 4);
-
- q11s32 = vmlal_s16(q11s32, d6s16, d17s16);
- q12s32 = vmlsl_s16(q12s32, d6s16, d16s16);
-
- d4u16 = vmvn_u16(d4u16);
- d1s16 = vshrn_n_s32(q11s32, 16);
- d1s16 = vsub_s16(d1s16, vreinterpret_s16_u16(d4u16));
- d3s16 = vshrn_n_s32(q12s32, 16);
-
- q0s16 = vcombine_s16(d0s16, d1s16);
- q1s16 = vcombine_s16(d2s16, d3s16);
-
- vst1q_s16(output, q0s16);
- vst1q_s16(output + 8, q1s16);
- return;
-}
-
-void vp8_short_fdct8x4_neon(
- int16_t *input,
- int16_t *output,
- int pitch) {
- int16x4_t d0s16, d1s16, d2s16, d3s16, d4s16, d5s16, d6s16, d7s16;
- int16x4_t d16s16, d17s16, d26s16, d27s16, d28s16, d29s16;
- uint16x4_t d28u16, d29u16;
- uint16x8_t q14u16;
- int16x8_t q0s16, q1s16, q2s16, q3s16;
- int16x8_t q11s16, q12s16, q13s16, q14s16, q15s16, qEmptys16;
- int32x4_t q9s32, q10s32, q11s32, q12s32;
- int16x8x2_t v2tmp0, v2tmp1;
- int32x4x2_t v2tmp2, v2tmp3;
-
- d16s16 = vdup_n_s16(5352);
- d17s16 = vdup_n_s16(2217);
- q9s32 = vdupq_n_s32(14500);
- q10s32 = vdupq_n_s32(7500);
-
- // Part one
- pitch >>= 1;
- q0s16 = vld1q_s16(input);
- input += pitch;
- q1s16 = vld1q_s16(input);
- input += pitch;
- q2s16 = vld1q_s16(input);
- input += pitch;
- q3s16 = vld1q_s16(input);
-
- v2tmp2 = vtrnq_s32(vreinterpretq_s32_s16(q0s16),
- vreinterpretq_s32_s16(q2s16));
- v2tmp3 = vtrnq_s32(vreinterpretq_s32_s16(q1s16),
- vreinterpretq_s32_s16(q3s16));
- v2tmp0 = vtrnq_s16(vreinterpretq_s16_s32(v2tmp2.val[0]), // q0
- vreinterpretq_s16_s32(v2tmp3.val[0])); // q1
- v2tmp1 = vtrnq_s16(vreinterpretq_s16_s32(v2tmp2.val[1]), // q2
- vreinterpretq_s16_s32(v2tmp3.val[1])); // q3
-
- q11s16 = vaddq_s16(v2tmp0.val[0], v2tmp1.val[1]);
- q12s16 = vaddq_s16(v2tmp0.val[1], v2tmp1.val[0]);
- q13s16 = vsubq_s16(v2tmp0.val[1], v2tmp1.val[0]);
- q14s16 = vsubq_s16(v2tmp0.val[0], v2tmp1.val[1]);
-
- q11s16 = vshlq_n_s16(q11s16, 3);
- q12s16 = vshlq_n_s16(q12s16, 3);
- q13s16 = vshlq_n_s16(q13s16, 3);
- q14s16 = vshlq_n_s16(q14s16, 3);
-
- q0s16 = vaddq_s16(q11s16, q12s16);
- q2s16 = vsubq_s16(q11s16, q12s16);
-
- q11s32 = q9s32;
- q12s32 = q10s32;
-
- d26s16 = vget_low_s16(q13s16);
- d27s16 = vget_high_s16(q13s16);
- d28s16 = vget_low_s16(q14s16);
- d29s16 = vget_high_s16(q14s16);
-
- q9s32 = vmlal_s16(q9s32, d28s16, d16s16);
- q10s32 = vmlal_s16(q10s32, d28s16, d17s16);
- q11s32 = vmlal_s16(q11s32, d29s16, d16s16);
- q12s32 = vmlal_s16(q12s32, d29s16, d17s16);
-
- q9s32 = vmlal_s16(q9s32, d26s16, d17s16);
- q10s32 = vmlsl_s16(q10s32, d26s16, d16s16);
- q11s32 = vmlal_s16(q11s32, d27s16, d17s16);
- q12s32 = vmlsl_s16(q12s32, d27s16, d16s16);
-
- d2s16 = vshrn_n_s32(q9s32, 12);
- d6s16 = vshrn_n_s32(q10s32, 12);
- d3s16 = vshrn_n_s32(q11s32, 12);
- d7s16 = vshrn_n_s32(q12s32, 12);
- q1s16 = vcombine_s16(d2s16, d3s16);
- q3s16 = vcombine_s16(d6s16, d7s16);
-
- // Part two
- q9s32 = vdupq_n_s32(12000);
- q10s32 = vdupq_n_s32(51000);
-
- v2tmp2 = vtrnq_s32(vreinterpretq_s32_s16(q0s16),
- vreinterpretq_s32_s16(q2s16));
- v2tmp3 = vtrnq_s32(vreinterpretq_s32_s16(q1s16),
- vreinterpretq_s32_s16(q3s16));
- v2tmp0 = vtrnq_s16(vreinterpretq_s16_s32(v2tmp2.val[0]), // q0
- vreinterpretq_s16_s32(v2tmp3.val[0])); // q1
- v2tmp1 = vtrnq_s16(vreinterpretq_s16_s32(v2tmp2.val[1]), // q2
- vreinterpretq_s16_s32(v2tmp3.val[1])); // q3
-
- q11s16 = vaddq_s16(v2tmp0.val[0], v2tmp1.val[1]);
- q12s16 = vaddq_s16(v2tmp0.val[1], v2tmp1.val[0]);
- q13s16 = vsubq_s16(v2tmp0.val[1], v2tmp1.val[0]);
- q14s16 = vsubq_s16(v2tmp0.val[0], v2tmp1.val[1]);
-
- q15s16 = vdupq_n_s16(7);
- q11s16 = vaddq_s16(q11s16, q15s16);
- q0s16 = vaddq_s16(q11s16, q12s16);
- q1s16 = vsubq_s16(q11s16, q12s16);
-
- q11s32 = q9s32;
- q12s32 = q10s32;
-
- d0s16 = vget_low_s16(q0s16);
- d1s16 = vget_high_s16(q0s16);
- d2s16 = vget_low_s16(q1s16);
- d3s16 = vget_high_s16(q1s16);
-
- d0s16 = vshr_n_s16(d0s16, 4);
- d4s16 = vshr_n_s16(d1s16, 4);
- d2s16 = vshr_n_s16(d2s16, 4);
- d6s16 = vshr_n_s16(d3s16, 4);
-
- d26s16 = vget_low_s16(q13s16);
- d27s16 = vget_high_s16(q13s16);
- d28s16 = vget_low_s16(q14s16);
- d29s16 = vget_high_s16(q14s16);
-
- q9s32 = vmlal_s16(q9s32, d28s16, d16s16);
- q10s32 = vmlal_s16(q10s32, d28s16, d17s16);
- q11s32 = vmlal_s16(q11s32, d29s16, d16s16);
- q12s32 = vmlal_s16(q12s32, d29s16, d17s16);
-
- q9s32 = vmlal_s16(q9s32, d26s16, d17s16);
- q10s32 = vmlsl_s16(q10s32, d26s16, d16s16);
- q11s32 = vmlal_s16(q11s32, d27s16, d17s16);
- q12s32 = vmlsl_s16(q12s32, d27s16, d16s16);
-
- d1s16 = vshrn_n_s32(q9s32, 16);
- d3s16 = vshrn_n_s32(q10s32, 16);
- d5s16 = vshrn_n_s32(q11s32, 16);
- d7s16 = vshrn_n_s32(q12s32, 16);
-
- qEmptys16 = vdupq_n_s16(0);
- q14u16 = vceqq_s16(q14s16, qEmptys16);
- q14u16 = vmvnq_u16(q14u16);
-
- d28u16 = vget_low_u16(q14u16);
- d29u16 = vget_high_u16(q14u16);
- d1s16 = vsub_s16(d1s16, vreinterpret_s16_u16(d28u16));
- d5s16 = vsub_s16(d5s16, vreinterpret_s16_u16(d29u16));
-
- q0s16 = vcombine_s16(d0s16, d1s16);
- q1s16 = vcombine_s16(d2s16, d3s16);
- q2s16 = vcombine_s16(d4s16, d5s16);
- q3s16 = vcombine_s16(d6s16, d7s16);
-
- vst1q_s16(output, q0s16);
- vst1q_s16(output + 8, q1s16);
- vst1q_s16(output + 16, q2s16);
- vst1q_s16(output + 24, q3s16);
- return;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/subtract_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/subtract_neon.c
deleted file mode 100644
index d3ab7b16553..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/subtract_neon.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <arm_neon.h>
-#include "vp8/encoder/block.h"
-
-void vp8_subtract_b_neon(
- BLOCK *be,
- BLOCKD *bd,
- int pitch) {
- unsigned char *src_ptr, *predictor;
- int src_stride;
- int16_t *src_diff;
- uint8x8_t d0u8, d1u8, d2u8, d3u8, d4u8, d5u8, d6u8, d7u8;
- uint16x8_t q10u16, q11u16, q12u16, q13u16;
-
- src_ptr = *be->base_src + be->src;
- src_stride = be->src_stride;
- predictor = bd->predictor;
-
- d0u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d2u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d4u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d6u8 = vld1_u8(src_ptr);
-
- d1u8 = vld1_u8(predictor);
- predictor += pitch;
- d3u8 = vld1_u8(predictor);
- predictor += pitch;
- d5u8 = vld1_u8(predictor);
- predictor += pitch;
- d7u8 = vld1_u8(predictor);
-
- q10u16 = vsubl_u8(d0u8, d1u8);
- q11u16 = vsubl_u8(d2u8, d3u8);
- q12u16 = vsubl_u8(d4u8, d5u8);
- q13u16 = vsubl_u8(d6u8, d7u8);
-
- src_diff = be->src_diff;
- vst1_u16((uint16_t *)src_diff, vget_low_u16(q10u16));
- src_diff += pitch;
- vst1_u16((uint16_t *)src_diff, vget_low_u16(q11u16));
- src_diff += pitch;
- vst1_u16((uint16_t *)src_diff, vget_low_u16(q12u16));
- src_diff += pitch;
- vst1_u16((uint16_t *)src_diff, vget_low_u16(q13u16));
- return;
-}
-
-void vp8_subtract_mby_neon(
- int16_t *diff,
- unsigned char *src,
- int src_stride,
- unsigned char *pred,
- int pred_stride) {
- int i;
- uint8x16_t q0u8, q1u8, q2u8, q3u8;
- uint16x8_t q8u16, q9u16, q10u16, q11u16;
-
- for (i = 0; i < 8; i++) { // subtract_mby_loop
- q0u8 = vld1q_u8(src);
- src += src_stride;
- q2u8 = vld1q_u8(src);
- src += src_stride;
- q1u8 = vld1q_u8(pred);
- pred += pred_stride;
- q3u8 = vld1q_u8(pred);
- pred += pred_stride;
-
- q8u16 = vsubl_u8(vget_low_u8(q0u8), vget_low_u8(q1u8));
- q9u16 = vsubl_u8(vget_high_u8(q0u8), vget_high_u8(q1u8));
- q10u16 = vsubl_u8(vget_low_u8(q2u8), vget_low_u8(q3u8));
- q11u16 = vsubl_u8(vget_high_u8(q2u8), vget_high_u8(q3u8));
-
- vst1q_u16((uint16_t *)diff, q8u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q9u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q10u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q11u16);
- diff += 8;
- }
- return;
-}
-
-void vp8_subtract_mbuv_neon(
- int16_t *diff,
- unsigned char *usrc,
- unsigned char *vsrc,
- int src_stride,
- unsigned char *upred,
- unsigned char *vpred,
- int pred_stride) {
- int i, j;
- unsigned char *src_ptr, *pred_ptr;
- uint8x8_t d0u8, d1u8, d2u8, d3u8, d4u8, d5u8, d6u8, d7u8;
- uint16x8_t q8u16, q9u16, q10u16, q11u16;
-
- diff += 256;
- for (i = 0; i < 2; i++) {
- if (i == 0) {
- src_ptr = usrc;
- pred_ptr = upred;
- } else if (i == 1) {
- src_ptr = vsrc;
- pred_ptr = vpred;
- }
-
- for (j = 0; j < 2; j++) {
- d0u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d1u8 = vld1_u8(pred_ptr);
- pred_ptr += pred_stride;
- d2u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d3u8 = vld1_u8(pred_ptr);
- pred_ptr += pred_stride;
- d4u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d5u8 = vld1_u8(pred_ptr);
- pred_ptr += pred_stride;
- d6u8 = vld1_u8(src_ptr);
- src_ptr += src_stride;
- d7u8 = vld1_u8(pred_ptr);
- pred_ptr += pred_stride;
-
- q8u16 = vsubl_u8(d0u8, d1u8);
- q9u16 = vsubl_u8(d2u8, d3u8);
- q10u16 = vsubl_u8(d4u8, d5u8);
- q11u16 = vsubl_u8(d6u8, d7u8);
-
- vst1q_u16((uint16_t *)diff, q8u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q9u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q10u16);
- diff += 8;
- vst1q_u16((uint16_t *)diff, q11u16);
- diff += 8;
- }
- }
- return;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.c
deleted file mode 100644
index 5ad9465002e..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/arm/neon/vp8_shortwalsh4x4_neon.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <arm_neon.h>
-#include "vpx_ports/arm.h"
-
-#ifdef VPX_INCOMPATIBLE_GCC
-#include "./vp8_rtcd.h"
-void vp8_short_walsh4x4_neon(
- int16_t *input,
- int16_t *output,
- int pitch) {
- vp8_short_walsh4x4_c(input, output, pitch);
-}
-#else
-void vp8_short_walsh4x4_neon(
- int16_t *input,
- int16_t *output,
- int pitch) {
- uint16x4_t d16u16;
- int16x8_t q0s16, q1s16;
- int16x4_t dEmptys16, d0s16, d1s16, d2s16, d3s16, d4s16, d5s16, d6s16, d7s16;
- int32x4_t qEmptys32, q0s32, q1s32, q2s32, q3s32, q8s32;
- int32x4_t q9s32, q10s32, q11s32, q15s32;
- uint32x4_t q8u32, q9u32, q10u32, q11u32;
- int16x4x2_t v2tmp0, v2tmp1;
- int32x2x2_t v2tmp2, v2tmp3;
-
- dEmptys16 = vdup_n_s16(0);
- qEmptys32 = vdupq_n_s32(0);
- q15s32 = vdupq_n_s32(3);
-
- d0s16 = vld1_s16(input);
- input += pitch/2;
- d1s16 = vld1_s16(input);
- input += pitch/2;
- d2s16 = vld1_s16(input);
- input += pitch/2;
- d3s16 = vld1_s16(input);
-
- v2tmp2 = vtrn_s32(vreinterpret_s32_s16(d0s16),
- vreinterpret_s32_s16(d2s16));
- v2tmp3 = vtrn_s32(vreinterpret_s32_s16(d1s16),
- vreinterpret_s32_s16(d3s16));
- v2tmp0 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[0]), // d0
- vreinterpret_s16_s32(v2tmp3.val[0])); // d1
- v2tmp1 = vtrn_s16(vreinterpret_s16_s32(v2tmp2.val[1]), // d2
- vreinterpret_s16_s32(v2tmp3.val[1])); // d3
-
- d4s16 = vadd_s16(v2tmp0.val[0], v2tmp1.val[0]);
- d5s16 = vadd_s16(v2tmp0.val[1], v2tmp1.val[1]);
- d6s16 = vsub_s16(v2tmp0.val[1], v2tmp1.val[1]);
- d7s16 = vsub_s16(v2tmp0.val[0], v2tmp1.val[0]);
-
- d4s16 = vshl_n_s16(d4s16, 2);
- d5s16 = vshl_n_s16(d5s16, 2);
- d6s16 = vshl_n_s16(d6s16, 2);
- d7s16 = vshl_n_s16(d7s16, 2);
-
- d16u16 = vceq_s16(d4s16, dEmptys16);
- d16u16 = vmvn_u16(d16u16);
-
- d0s16 = vadd_s16(d4s16, d5s16);
- d3s16 = vsub_s16(d4s16, d5s16);
- d1s16 = vadd_s16(d7s16, d6s16);
- d2s16 = vsub_s16(d7s16, d6s16);
-
- d0s16 = vsub_s16(d0s16, vreinterpret_s16_u16(d16u16));
-
- // Second for-loop
- v2tmp2 = vtrn_s32(vreinterpret_s32_s16(d1s16),
- vreinterpret_s32_s16(d3s16));
- v2tmp3 = vtrn_s32(vreinterpret_s32_s16(d0s16),
- vreinterpret_s32_s16(d2s16));
- v2tmp0 = vtrn_s16(vreinterpret_s16_s32(v2tmp3.val[1]), // d2
- vreinterpret_s16_s32(v2tmp2.val[1])); // d3
- v2tmp1 = vtrn_s16(vreinterpret_s16_s32(v2tmp3.val[0]), // d0
- vreinterpret_s16_s32(v2tmp2.val[0])); // d1
-
- q8s32 = vaddl_s16(v2tmp1.val[0], v2tmp0.val[0]);
- q9s32 = vaddl_s16(v2tmp1.val[1], v2tmp0.val[1]);
- q10s32 = vsubl_s16(v2tmp1.val[1], v2tmp0.val[1]);
- q11s32 = vsubl_s16(v2tmp1.val[0], v2tmp0.val[0]);
-
- q0s32 = vaddq_s32(q8s32, q9s32);
- q1s32 = vaddq_s32(q11s32, q10s32);
- q2s32 = vsubq_s32(q11s32, q10s32);
- q3s32 = vsubq_s32(q8s32, q9s32);
-
- q8u32 = vcltq_s32(q0s32, qEmptys32);
- q9u32 = vcltq_s32(q1s32, qEmptys32);
- q10u32 = vcltq_s32(q2s32, qEmptys32);
- q11u32 = vcltq_s32(q3s32, qEmptys32);
-
- q8s32 = vreinterpretq_s32_u32(q8u32);
- q9s32 = vreinterpretq_s32_u32(q9u32);
- q10s32 = vreinterpretq_s32_u32(q10u32);
- q11s32 = vreinterpretq_s32_u32(q11u32);
-
- q0s32 = vsubq_s32(q0s32, q8s32);
- q1s32 = vsubq_s32(q1s32, q9s32);
- q2s32 = vsubq_s32(q2s32, q10s32);
- q3s32 = vsubq_s32(q3s32, q11s32);
-
- q8s32 = vaddq_s32(q0s32, q15s32);
- q9s32 = vaddq_s32(q1s32, q15s32);
- q10s32 = vaddq_s32(q2s32, q15s32);
- q11s32 = vaddq_s32(q3s32, q15s32);
-
- d0s16 = vshrn_n_s32(q8s32, 3);
- d1s16 = vshrn_n_s32(q9s32, 3);
- d2s16 = vshrn_n_s32(q10s32, 3);
- d3s16 = vshrn_n_s32(q11s32, 3);
-
- q0s16 = vcombine_s16(d0s16, d1s16);
- q1s16 = vcombine_s16(d2s16, d3s16);
-
- vst1q_s16(output, q0s16);
- vst1q_s16(output + 8, q1s16);
- return;
-}
-#endif // VPX_INCOMPATIBLE_GCC
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.c
deleted file mode 100644
index ea279b32181..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.c
+++ /dev/null
@@ -1,1737 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vp8/common/header.h"
-#include "encodemv.h"
-#include "vp8/common/entropymode.h"
-#include "vp8/common/findnearmv.h"
-#include "mcomp.h"
-#include "vp8/common/systemdependent.h"
-#include <assert.h>
-#include <stdio.h>
-#include <limits.h>
-#include "vpx/vpx_encoder.h"
-#include "vpx_mem/vpx_mem.h"
-#include "bitstream.h"
-
-#include "defaultcoefcounts.h"
-#include "vp8/common/common.h"
-
-const int vp8cx_base_skip_false_prob[128] =
-{
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 251, 248, 244, 240, 236, 232, 229, 225,
- 221, 217, 213, 208, 204, 199, 194, 190,
- 187, 183, 179, 175, 172, 168, 164, 160,
- 157, 153, 149, 145, 142, 138, 134, 130,
- 127, 124, 120, 117, 114, 110, 107, 104,
- 101, 98, 95, 92, 89, 86, 83, 80,
- 77, 74, 71, 68, 65, 62, 59, 56,
- 53, 50, 47, 44, 41, 38, 35, 32,
- 30, 28, 26, 24, 22, 20, 18, 16,
-};
-
-#if defined(SECTIONBITS_OUTPUT)
-unsigned __int64 Sectionbits[500];
-#endif
-
-#ifdef VP8_ENTROPY_STATS
-int intra_mode_stats[10][10][10];
-static unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] [2];
-extern unsigned int active_section;
-#endif
-
-#ifdef MODE_STATS
-int count_mb_seg[4] = { 0, 0, 0, 0 };
-#endif
-
-
-static void update_mode(
- vp8_writer *const w,
- int n,
- vp8_token tok [/* n */],
- vp8_tree tree,
- vp8_prob Pnew [/* n-1 */],
- vp8_prob Pcur [/* n-1 */],
- unsigned int bct [/* n-1 */] [2],
- const unsigned int num_events[/* n */]
-)
-{
- unsigned int new_b = 0, old_b = 0;
- int i = 0;
-
- vp8_tree_probs_from_distribution(
- n--, tok, tree,
- Pnew, bct, num_events,
- 256, 1
- );
-
- do
- {
- new_b += vp8_cost_branch(bct[i], Pnew[i]);
- old_b += vp8_cost_branch(bct[i], Pcur[i]);
- }
- while (++i < n);
-
- if (new_b + (n << 8) < old_b)
- {
- int j = 0;
-
- vp8_write_bit(w, 1);
-
- do
- {
- const vp8_prob p = Pnew[j];
-
- vp8_write_literal(w, Pcur[j] = p ? p : 1, 8);
- }
- while (++j < n);
- }
- else
- vp8_write_bit(w, 0);
-}
-
-static void update_mbintra_mode_probs(VP8_COMP *cpi)
-{
- VP8_COMMON *const x = & cpi->common;
-
- vp8_writer *const w = cpi->bc;
-
- {
- vp8_prob Pnew [VP8_YMODES-1];
- unsigned int bct [VP8_YMODES-1] [2];
-
- update_mode(
- w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
- Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->mb.ymode_count
- );
- }
- {
- vp8_prob Pnew [VP8_UV_MODES-1];
- unsigned int bct [VP8_UV_MODES-1] [2];
-
- update_mode(
- w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
- Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->mb.uv_mode_count
- );
- }
-}
-
-static void write_ymode(vp8_writer *bc, int m, const vp8_prob *p)
-{
- vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m);
-}
-
-static void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p)
-{
- vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m);
-}
-
-static void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p)
-{
- vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m);
-}
-
-
-static void write_bmode(vp8_writer *bc, int m, const vp8_prob *p)
-{
- vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m);
-}
-
-static void write_split(vp8_writer *bc, int x)
-{
- vp8_write_token(
- bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x
- );
-}
-
-void vp8_pack_tokens(vp8_writer *w, const TOKENEXTRA *p, int xcount)
-{
- const TOKENEXTRA *stop = p + xcount;
- unsigned int split;
- unsigned int shift;
- int count = w->count;
- unsigned int range = w->range;
- unsigned int lowvalue = w->lowvalue;
-
- while (p < stop)
- {
- const int t = p->Token;
- vp8_token *a = vp8_coef_encodings + t;
- const vp8_extra_bit_struct *b = vp8_extra_bits + t;
- int i = 0;
- const unsigned char *pp = p->context_tree;
- int v = a->value;
- int n = a->Len;
-
- if (p->skip_eob_node)
- {
- n--;
- i = 2;
- }
-
- do
- {
- const int bb = (v >> --n) & 1;
- split = 1 + (((range - 1) * pp[i>>1]) >> 8);
- i = vp8_coef_tree[i+bb];
-
- if (bb)
- {
- lowvalue += split;
- range = range - split;
- }
- else
- {
- range = split;
- }
-
- shift = vp8_norm[range];
- range <<= shift;
- count += shift;
-
- if (count >= 0)
- {
- int offset = shift - count;
-
- if ((lowvalue << (offset - 1)) & 0x80000000)
- {
- int x = w->pos - 1;
-
- while (x >= 0 && w->buffer[x] == 0xff)
- {
- w->buffer[x] = (unsigned char)0;
- x--;
- }
-
- w->buffer[x] += 1;
- }
-
- validate_buffer(w->buffer + w->pos,
- 1,
- w->buffer_end,
- w->error);
-
- w->buffer[w->pos++] = (lowvalue >> (24 - offset));
- lowvalue <<= offset;
- shift = count;
- lowvalue &= 0xffffff;
- count -= 8 ;
- }
-
- lowvalue <<= shift;
- }
- while (n);
-
-
- if (b->base_val)
- {
- const int e = p->Extra, L = b->Len;
-
- if (L)
- {
- const unsigned char *proba = b->prob;
- const int v2 = e >> 1;
- int n2 = L; /* number of bits in v2, assumed nonzero */
- i = 0;
-
- do
- {
- const int bb = (v2 >> --n2) & 1;
- split = 1 + (((range - 1) * proba[i>>1]) >> 8);
- i = b->tree[i+bb];
-
- if (bb)
- {
- lowvalue += split;
- range = range - split;
- }
- else
- {
- range = split;
- }
-
- shift = vp8_norm[range];
- range <<= shift;
- count += shift;
-
- if (count >= 0)
- {
- int offset = shift - count;
-
- if ((lowvalue << (offset - 1)) & 0x80000000)
- {
- int x = w->pos - 1;
-
- while (x >= 0 && w->buffer[x] == 0xff)
- {
- w->buffer[x] = (unsigned char)0;
- x--;
- }
-
- w->buffer[x] += 1;
- }
-
- validate_buffer(w->buffer + w->pos,
- 1,
- w->buffer_end,
- w->error);
-
- w->buffer[w->pos++] = (lowvalue >> (24 - offset));
- lowvalue <<= offset;
- shift = count;
- lowvalue &= 0xffffff;
- count -= 8 ;
- }
-
- lowvalue <<= shift;
- }
- while (n2);
- }
-
-
- {
-
- split = (range + 1) >> 1;
-
- if (e & 1)
- {
- lowvalue += split;
- range = range - split;
- }
- else
- {
- range = split;
- }
-
- range <<= 1;
-
- if ((lowvalue & 0x80000000))
- {
- int x = w->pos - 1;
-
- while (x >= 0 && w->buffer[x] == 0xff)
- {
- w->buffer[x] = (unsigned char)0;
- x--;
- }
-
- w->buffer[x] += 1;
-
- }
-
- lowvalue <<= 1;
-
- if (!++count)
- {
- count = -8;
-
- validate_buffer(w->buffer + w->pos,
- 1,
- w->buffer_end,
- w->error);
-
- w->buffer[w->pos++] = (lowvalue >> 24);
- lowvalue &= 0xffffff;
- }
- }
-
- }
-
- ++p;
- }
-
- w->count = count;
- w->lowvalue = lowvalue;
- w->range = range;
-
-}
-
-static void write_partition_size(unsigned char *cx_data, int size)
-{
- signed char csize;
-
- csize = size & 0xff;
- *cx_data = csize;
- csize = (size >> 8) & 0xff;
- *(cx_data + 1) = csize;
- csize = (size >> 16) & 0xff;
- *(cx_data + 2) = csize;
-
-}
-
-static void pack_tokens_into_partitions(VP8_COMP *cpi, unsigned char *cx_data,
- unsigned char * cx_data_end,
- int num_part)
-{
-
- int i;
- unsigned char *ptr = cx_data;
- unsigned char *ptr_end = cx_data_end;
- vp8_writer * w;
-
- for (i = 0; i < num_part; i++)
- {
- int mb_row;
-
- w = cpi->bc + i + 1;
-
- vp8_start_encode(w, ptr, ptr_end);
-
- for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part)
- {
- const TOKENEXTRA *p = cpi->tplist[mb_row].start;
- const TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
- int tokens = (int)(stop - p);
-
- vp8_pack_tokens(w, p, tokens);
- }
-
- vp8_stop_encode(w);
- ptr += w->pos;
- }
-}
-
-
-static void pack_mb_row_tokens(VP8_COMP *cpi, vp8_writer *w)
-{
- int mb_row;
-
- for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++)
- {
- const TOKENEXTRA *p = cpi->tplist[mb_row].start;
- const TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
- int tokens = (int)(stop - p);
-
- vp8_pack_tokens(w, p, tokens);
- }
-
-}
-
-static void write_mv_ref
-(
- vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p
-)
-{
-#if CONFIG_DEBUG
- assert(NEARESTMV <= m && m <= SPLITMV);
-#endif
- vp8_write_token(w, vp8_mv_ref_tree, p,
- vp8_mv_ref_encoding_array + (m - NEARESTMV));
-}
-
-static void write_sub_mv_ref
-(
- vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p
-)
-{
-#if CONFIG_DEBUG
- assert(LEFT4X4 <= m && m <= NEW4X4);
-#endif
- vp8_write_token(w, vp8_sub_mv_ref_tree, p,
- vp8_sub_mv_ref_encoding_array + (m - LEFT4X4));
-}
-
-static void write_mv
-(
- vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT *mvc
-)
-{
- MV e;
- e.row = mv->row - ref->as_mv.row;
- e.col = mv->col - ref->as_mv.col;
-
- vp8_encode_motion_vector(w, &e, mvc);
-}
-
-static void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x)
-{
- /* Encode the MB segment id. */
- if (x->segmentation_enabled && x->update_mb_segmentation_map)
- {
- switch (mi->segment_id)
- {
- case 0:
- vp8_write(w, 0, x->mb_segment_tree_probs[0]);
- vp8_write(w, 0, x->mb_segment_tree_probs[1]);
- break;
- case 1:
- vp8_write(w, 0, x->mb_segment_tree_probs[0]);
- vp8_write(w, 1, x->mb_segment_tree_probs[1]);
- break;
- case 2:
- vp8_write(w, 1, x->mb_segment_tree_probs[0]);
- vp8_write(w, 0, x->mb_segment_tree_probs[2]);
- break;
- case 3:
- vp8_write(w, 1, x->mb_segment_tree_probs[0]);
- vp8_write(w, 1, x->mb_segment_tree_probs[2]);
- break;
-
- /* TRAP.. This should not happen */
- default:
- vp8_write(w, 0, x->mb_segment_tree_probs[0]);
- vp8_write(w, 0, x->mb_segment_tree_probs[1]);
- break;
- }
- }
-}
-void vp8_convert_rfct_to_prob(VP8_COMP *const cpi)
-{
- const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
- const int rf_intra = rfct[INTRA_FRAME];
- const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
-
- /* Calculate the probabilities used to code the ref frame based on usage */
- if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter)))
- cpi->prob_intra_coded = 1;
-
- cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
-
- if (!cpi->prob_last_coded)
- cpi->prob_last_coded = 1;
-
- cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
- ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
-
- if (!cpi->prob_gf_coded)
- cpi->prob_gf_coded = 1;
-
-}
-
-static void pack_inter_mode_mvs(VP8_COMP *const cpi)
-{
- VP8_COMMON *const pc = & cpi->common;
- vp8_writer *const w = cpi->bc;
- const MV_CONTEXT *mvc = pc->fc.mvc;
-
-
- MODE_INFO *m = pc->mi;
- const int mis = pc->mode_info_stride;
- int mb_row = -1;
-
- int prob_skip_false = 0;
-
- cpi->mb.partition_info = cpi->mb.pi;
-
- vp8_convert_rfct_to_prob(cpi);
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 1;
-#endif
-
- if (pc->mb_no_coeff_skip)
- {
- int total_mbs = pc->mb_rows * pc->mb_cols;
-
- prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs;
-
- if (prob_skip_false <= 1)
- prob_skip_false = 1;
-
- if (prob_skip_false > 255)
- prob_skip_false = 255;
-
- cpi->prob_skip_false = prob_skip_false;
- vp8_write_literal(w, prob_skip_false, 8);
- }
-
- vp8_write_literal(w, cpi->prob_intra_coded, 8);
- vp8_write_literal(w, cpi->prob_last_coded, 8);
- vp8_write_literal(w, cpi->prob_gf_coded, 8);
-
- update_mbintra_mode_probs(cpi);
-
- vp8_write_mvprobs(cpi);
-
- while (++mb_row < pc->mb_rows)
- {
- int mb_col = -1;
-
- while (++mb_col < pc->mb_cols)
- {
- const MB_MODE_INFO *const mi = & m->mbmi;
- const MV_REFERENCE_FRAME rf = mi->ref_frame;
- const MB_PREDICTION_MODE mode = mi->mode;
-
- MACROBLOCKD *xd = &cpi->mb.e_mbd;
-
- /* Distance of Mb to the various image edges.
- * These specified to 8th pel as they are always compared to MV
- * values that are in 1/8th pel units
- */
- xd->mb_to_left_edge = -((mb_col * 16) << 3);
- xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;
- xd->mb_to_top_edge = -((mb_row * 16) << 3);
- xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3;
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 9;
-#endif
-
- if (cpi->mb.e_mbd.update_mb_segmentation_map)
- write_mb_features(w, mi, &cpi->mb.e_mbd);
-
- if (pc->mb_no_coeff_skip)
- vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false);
-
- if (rf == INTRA_FRAME)
- {
- vp8_write(w, 0, cpi->prob_intra_coded);
-#ifdef VP8_ENTROPY_STATS
- active_section = 6;
-#endif
- write_ymode(w, mode, pc->fc.ymode_prob);
-
- if (mode == B_PRED)
- {
- int j = 0;
-
- do
- write_bmode(w, m->bmi[j].as_mode, pc->fc.bmode_prob);
- while (++j < 16);
- }
-
- write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob);
- }
- else /* inter coded */
- {
- int_mv best_mv;
- vp8_prob mv_ref_p [VP8_MVREFS-1];
-
- vp8_write(w, 1, cpi->prob_intra_coded);
-
- if (rf == LAST_FRAME)
- vp8_write(w, 0, cpi->prob_last_coded);
- else
- {
- vp8_write(w, 1, cpi->prob_last_coded);
- vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, cpi->prob_gf_coded);
- }
-
- {
- int_mv n1, n2;
- int ct[4];
-
- vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias);
- vp8_clamp_mv2(&best_mv, xd);
-
- vp8_mv_ref_probs(mv_ref_p, ct);
-
-#ifdef VP8_ENTROPY_STATS
- accum_mv_refs(mode, ct);
-#endif
-
- }
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 3;
-#endif
-
- write_mv_ref(w, mode, mv_ref_p);
-
- switch (mode) /* new, split require MVs */
- {
- case NEWMV:
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 5;
-#endif
-
- write_mv(w, &mi->mv.as_mv, &best_mv, mvc);
- break;
-
- case SPLITMV:
- {
- int j = 0;
-
-#ifdef MODE_STATS
- ++count_mb_seg [mi->partitioning];
-#endif
-
- write_split(w, mi->partitioning);
-
- do
- {
- B_PREDICTION_MODE blockmode;
- int_mv blockmv;
- const int *const L = vp8_mbsplits [mi->partitioning];
- int k = -1; /* first block in subset j */
- int mv_contz;
- int_mv leftmv, abovemv;
-
- blockmode = cpi->mb.partition_info->bmi[j].mode;
- blockmv = cpi->mb.partition_info->bmi[j].mv;
-#if CONFIG_DEBUG
- while (j != L[++k])
- if (k >= 16)
- assert(0);
-#else
- while (j != L[++k]);
-#endif
- leftmv.as_int = left_block_mv(m, k);
- abovemv.as_int = above_block_mv(m, k, mis);
- mv_contz = vp8_mv_cont(&leftmv, &abovemv);
-
- write_sub_mv_ref(w, blockmode, vp8_sub_mv_ref_prob2 [mv_contz]);
-
- if (blockmode == NEW4X4)
- {
-#ifdef VP8_ENTROPY_STATS
- active_section = 11;
-#endif
- write_mv(w, &blockmv.as_mv, &best_mv, (const MV_CONTEXT *) mvc);
- }
- }
- while (++j < cpi->mb.partition_info->count);
- }
- break;
- default:
- break;
- }
- }
-
- ++m;
- cpi->mb.partition_info++;
- }
-
- ++m; /* skip L prediction border */
- cpi->mb.partition_info++;
- }
-}
-
-
-static void write_kfmodes(VP8_COMP *cpi)
-{
- vp8_writer *const bc = cpi->bc;
- const VP8_COMMON *const c = & cpi->common;
- /* const */
- MODE_INFO *m = c->mi;
-
- int mb_row = -1;
- int prob_skip_false = 0;
-
- if (c->mb_no_coeff_skip)
- {
- int total_mbs = c->mb_rows * c->mb_cols;
-
- prob_skip_false = (total_mbs - cpi->mb.skip_true_count ) * 256 / total_mbs;
-
- if (prob_skip_false <= 1)
- prob_skip_false = 1;
-
- if (prob_skip_false >= 255)
- prob_skip_false = 255;
-
- cpi->prob_skip_false = prob_skip_false;
- vp8_write_literal(bc, prob_skip_false, 8);
- }
-
- while (++mb_row < c->mb_rows)
- {
- int mb_col = -1;
-
- while (++mb_col < c->mb_cols)
- {
- const int ym = m->mbmi.mode;
-
- if (cpi->mb.e_mbd.update_mb_segmentation_map)
- write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd);
-
- if (c->mb_no_coeff_skip)
- vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
-
- kfwrite_ymode(bc, ym, vp8_kf_ymode_prob);
-
- if (ym == B_PRED)
- {
- const int mis = c->mode_info_stride;
- int i = 0;
-
- do
- {
- const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
- const B_PREDICTION_MODE L = left_block_mode(m, i);
- const int bm = m->bmi[i].as_mode;
-
-#ifdef VP8_ENTROPY_STATS
- ++intra_mode_stats [A] [L] [bm];
-#endif
-
- write_bmode(bc, bm, vp8_kf_bmode_prob [A] [L]);
- }
- while (++i < 16);
- }
-
- write_uv_mode(bc, (m++)->mbmi.uv_mode, vp8_kf_uv_mode_prob);
- }
-
- m++; /* skip L prediction border */
- }
-}
-
-#if 0
-/* This function is used for debugging probability trees. */
-static void print_prob_tree(vp8_prob
- coef_probs[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES])
-{
- /* print coef probability tree */
- int i,j,k,l;
- FILE* f = fopen("enc_tree_probs.txt", "a");
- fprintf(f, "{\n");
- for (i = 0; i < BLOCK_TYPES; i++)
- {
- fprintf(f, " {\n");
- for (j = 0; j < COEF_BANDS; j++)
- {
- fprintf(f, " {\n");
- for (k = 0; k < PREV_COEF_CONTEXTS; k++)
- {
- fprintf(f, " {");
- for (l = 0; l < ENTROPY_NODES; l++)
- {
- fprintf(f, "%3u, ",
- (unsigned int)(coef_probs [i][j][k][l]));
- }
- fprintf(f, " }\n");
- }
- fprintf(f, " }\n");
- }
- fprintf(f, " }\n");
- }
- fprintf(f, "}\n");
- fclose(f);
-}
-#endif
-
-static void sum_probs_over_prev_coef_context(
- const unsigned int probs[PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS],
- unsigned int* out)
-{
- int i, j;
- for (i=0; i < MAX_ENTROPY_TOKENS; ++i)
- {
- for (j=0; j < PREV_COEF_CONTEXTS; ++j)
- {
- const unsigned int tmp = out[i];
- out[i] += probs[j][i];
- /* check for wrap */
- if (out[i] < tmp)
- out[i] = UINT_MAX;
- }
- }
-}
-
-static int prob_update_savings(const unsigned int *ct,
- const vp8_prob oldp, const vp8_prob newp,
- const vp8_prob upd)
-{
- const int old_b = vp8_cost_branch(ct, oldp);
- const int new_b = vp8_cost_branch(ct, newp);
- const int update_b = 8 +
- ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8);
-
- return old_b - new_b - update_b;
-}
-
-static int independent_coef_context_savings(VP8_COMP *cpi)
-{
- MACROBLOCK *const x = & cpi->mb;
- int savings = 0;
- int i = 0;
- do
- {
- int j = 0;
- do
- {
- int k = 0;
- unsigned int prev_coef_count_sum[MAX_ENTROPY_TOKENS] = {0};
- int prev_coef_savings[MAX_ENTROPY_TOKENS] = {0};
- const unsigned int (*probs)[MAX_ENTROPY_TOKENS];
- /* Calculate new probabilities given the constraint that
- * they must be equal over the prev coef contexts
- */
-
- probs = (const unsigned int (*)[MAX_ENTROPY_TOKENS])
- x->coef_counts[i][j];
-
- /* Reset to default probabilities at key frames */
- if (cpi->common.frame_type == KEY_FRAME)
- probs = default_coef_counts[i][j];
-
- sum_probs_over_prev_coef_context(probs, prev_coef_count_sum);
-
- do
- {
- /* at every context */
-
- /* calc probs and branch cts for this frame only */
- int t = 0; /* token/prob index */
-
- vp8_tree_probs_from_distribution(
- MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree,
- cpi->frame_coef_probs[i][j][k],
- cpi->frame_branch_ct [i][j][k],
- prev_coef_count_sum,
- 256, 1);
-
- do
- {
- const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t];
- const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
- const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t];
- const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
- const int s = prob_update_savings(ct, oldp, newp, upd);
-
- if (cpi->common.frame_type != KEY_FRAME ||
- (cpi->common.frame_type == KEY_FRAME && newp != oldp))
- prev_coef_savings[t] += s;
- }
- while (++t < ENTROPY_NODES);
- }
- while (++k < PREV_COEF_CONTEXTS);
- k = 0;
- do
- {
- /* We only update probabilities if we can save bits, except
- * for key frames where we have to update all probabilities
- * to get the equal probabilities across the prev coef
- * contexts.
- */
- if (prev_coef_savings[k] > 0 ||
- cpi->common.frame_type == KEY_FRAME)
- savings += prev_coef_savings[k];
- }
- while (++k < ENTROPY_NODES);
- }
- while (++j < COEF_BANDS);
- }
- while (++i < BLOCK_TYPES);
- return savings;
-}
-
-static int default_coef_context_savings(VP8_COMP *cpi)
-{
- MACROBLOCK *const x = & cpi->mb;
- int savings = 0;
- int i = 0;
- do
- {
- int j = 0;
- do
- {
- int k = 0;
- do
- {
- /* at every context */
-
- /* calc probs and branch cts for this frame only */
- int t = 0; /* token/prob index */
-
- vp8_tree_probs_from_distribution(
- MAX_ENTROPY_TOKENS, vp8_coef_encodings, vp8_coef_tree,
- cpi->frame_coef_probs [i][j][k],
- cpi->frame_branch_ct [i][j][k],
- x->coef_counts [i][j][k],
- 256, 1
- );
-
- do
- {
- const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t];
- const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
- const vp8_prob oldp = cpi->common.fc.coef_probs [i][j][k][t];
- const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
- const int s = prob_update_savings(ct, oldp, newp, upd);
-
- if (s > 0)
- {
- savings += s;
- }
- }
- while (++t < ENTROPY_NODES);
- }
- while (++k < PREV_COEF_CONTEXTS);
- }
- while (++j < COEF_BANDS);
- }
- while (++i < BLOCK_TYPES);
- return savings;
-}
-
-void vp8_calc_ref_frame_costs(int *ref_frame_cost,
- int prob_intra,
- int prob_last,
- int prob_garf
- )
-{
- assert(prob_intra >= 0);
- assert(prob_intra <= 255);
- assert(prob_last >= 0);
- assert(prob_last <= 255);
- assert(prob_garf >= 0);
- assert(prob_garf <= 255);
- ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(prob_intra);
- ref_frame_cost[LAST_FRAME] = vp8_cost_one(prob_intra)
- + vp8_cost_zero(prob_last);
- ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(prob_intra)
- + vp8_cost_one(prob_last)
- + vp8_cost_zero(prob_garf);
- ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(prob_intra)
- + vp8_cost_one(prob_last)
- + vp8_cost_one(prob_garf);
-
-}
-
-int vp8_estimate_entropy_savings(VP8_COMP *cpi)
-{
- int savings = 0;
-
- const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
- const int rf_intra = rfct[INTRA_FRAME];
- const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
- int new_intra, new_last, new_garf, oldtotal, newtotal;
- int ref_frame_cost[MAX_REF_FRAMES];
-
- vp8_clear_system_state();
-
- if (cpi->common.frame_type != KEY_FRAME)
- {
- if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter)))
- new_intra = 1;
-
- new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
-
- new_garf = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
- ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
-
-
- vp8_calc_ref_frame_costs(ref_frame_cost,new_intra,new_last,new_garf);
-
- newtotal =
- rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
- rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
- rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
- rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
-
-
- /* old costs */
- vp8_calc_ref_frame_costs(ref_frame_cost,cpi->prob_intra_coded,
- cpi->prob_last_coded,cpi->prob_gf_coded);
-
- oldtotal =
- rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
- rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
- rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
- rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
-
- savings += (oldtotal - newtotal) / 256;
- }
-
-
- if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
- savings += independent_coef_context_savings(cpi);
- else
- savings += default_coef_context_savings(cpi);
-
-
- return savings;
-}
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
-int vp8_update_coef_context(VP8_COMP *cpi)
-{
- int savings = 0;
-
-
- if (cpi->common.frame_type == KEY_FRAME)
- {
- /* Reset to default counts/probabilities at key frames */
- vp8_copy(cpi->mb.coef_counts, default_coef_counts);
- }
-
- if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
- savings += independent_coef_context_savings(cpi);
- else
- savings += default_coef_context_savings(cpi);
-
- return savings;
-}
-#endif
-
-void vp8_update_coef_probs(VP8_COMP *cpi)
-{
- int i = 0;
-#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- vp8_writer *const w = cpi->bc;
-#endif
- int savings = 0;
-
- vp8_clear_system_state();
-
- do
- {
- int j = 0;
-
- do
- {
- int k = 0;
- int prev_coef_savings[ENTROPY_NODES] = {0};
- if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
- {
- for (k = 0; k < PREV_COEF_CONTEXTS; ++k)
- {
- int t; /* token/prob index */
- for (t = 0; t < ENTROPY_NODES; ++t)
- {
- const unsigned int *ct = cpi->frame_branch_ct [i][j]
- [k][t];
- const vp8_prob newp = cpi->frame_coef_probs[i][j][k][t];
- const vp8_prob oldp = cpi->common.fc.coef_probs[i][j]
- [k][t];
- const vp8_prob upd = vp8_coef_update_probs[i][j][k][t];
-
- prev_coef_savings[t] +=
- prob_update_savings(ct, oldp, newp, upd);
- }
- }
- k = 0;
- }
- do
- {
- /* note: use result from vp8_estimate_entropy_savings, so no
- * need to call vp8_tree_probs_from_distribution here.
- */
-
- /* at every context */
-
- /* calc probs and branch cts for this frame only */
- int t = 0; /* token/prob index */
-
- do
- {
- const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
-
- vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t;
- const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
-
- int s = prev_coef_savings[t];
- int u = 0;
-
- if (!(cpi->oxcf.error_resilient_mode &
- VPX_ERROR_RESILIENT_PARTITIONS))
- {
- s = prob_update_savings(
- cpi->frame_branch_ct [i][j][k][t],
- *Pold, newp, upd);
- }
-
- if (s > 0)
- u = 1;
-
- /* Force updates on key frames if the new is different,
- * so that we can be sure we end up with equal probabilities
- * over the prev coef contexts.
- */
- if ((cpi->oxcf.error_resilient_mode &
- VPX_ERROR_RESILIENT_PARTITIONS) &&
- cpi->common.frame_type == KEY_FRAME && newp != *Pold)
- u = 1;
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- cpi->update_probs[i][j][k][t] = u;
-#else
- vp8_write(w, u, upd);
-#endif
-
-
-#ifdef VP8_ENTROPY_STATS
- ++ tree_update_hist [i][j][k][t] [u];
-#endif
-
- if (u)
- {
- /* send/use new probability */
-
- *Pold = newp;
-#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- vp8_write_literal(w, newp, 8);
-#endif
-
- savings += s;
-
- }
-
- }
- while (++t < ENTROPY_NODES);
-
- /* Accum token counts for generation of default statistics */
-#ifdef VP8_ENTROPY_STATS
- t = 0;
-
- do
- {
- context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t];
- }
- while (++t < MAX_ENTROPY_TOKENS);
-
-#endif
-
- }
- while (++k < PREV_COEF_CONTEXTS);
- }
- while (++j < COEF_BANDS);
- }
- while (++i < BLOCK_TYPES);
-
-}
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
-static void pack_coef_probs(VP8_COMP *cpi)
-{
- int i = 0;
- vp8_writer *const w = cpi->bc;
-
- do
- {
- int j = 0;
-
- do
- {
- int k = 0;
-
- do
- {
- int t = 0; /* token/prob index */
-
- do
- {
- const vp8_prob newp = cpi->common.fc.coef_probs [i][j][k][t];
- const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
-
- const char u = cpi->update_probs[i][j][k][t] ;
-
- vp8_write(w, u, upd);
-
- if (u)
- {
- /* send/use new probability */
- vp8_write_literal(w, newp, 8);
- }
- }
- while (++t < ENTROPY_NODES);
- }
- while (++k < PREV_COEF_CONTEXTS);
- }
- while (++j < COEF_BANDS);
- }
- while (++i < BLOCK_TYPES);
-}
-#endif
-
-#ifdef PACKET_TESTING
-FILE *vpxlogc = 0;
-#endif
-
-static void put_delta_q(vp8_writer *bc, int delta_q)
-{
- if (delta_q != 0)
- {
- vp8_write_bit(bc, 1);
- vp8_write_literal(bc, abs(delta_q), 4);
-
- if (delta_q < 0)
- vp8_write_bit(bc, 1);
- else
- vp8_write_bit(bc, 0);
- }
- else
- vp8_write_bit(bc, 0);
-}
-
-void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned char * dest_end, unsigned long *size)
-{
- int i, j;
- VP8_HEADER oh;
- VP8_COMMON *const pc = & cpi->common;
- vp8_writer *const bc = cpi->bc;
- MACROBLOCKD *const xd = & cpi->mb.e_mbd;
- int extra_bytes_packed = 0;
-
- unsigned char *cx_data = dest;
- unsigned char *cx_data_end = dest_end;
- const int *mb_feature_data_bits;
-
- oh.show_frame = (int) pc->show_frame;
- oh.type = (int)pc->frame_type;
- oh.version = pc->version;
- oh.first_partition_length_in_bytes = 0;
-
- mb_feature_data_bits = vp8_mb_feature_data_bits;
-
- bc[0].error = &pc->error;
-
- validate_buffer(cx_data, 3, cx_data_end, &cpi->common.error);
- cx_data += 3;
-
-#if defined(SECTIONBITS_OUTPUT)
- Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256;
-#endif
-
- /* every keyframe send startcode, width, height, scale factor, clamp
- * and color type
- */
- if (oh.type == KEY_FRAME)
- {
- int v;
-
- validate_buffer(cx_data, 7, cx_data_end, &cpi->common.error);
-
- /* Start / synch code */
- cx_data[0] = 0x9D;
- cx_data[1] = 0x01;
- cx_data[2] = 0x2a;
-
- v = (pc->horiz_scale << 14) | pc->Width;
- cx_data[3] = v;
- cx_data[4] = v >> 8;
-
- v = (pc->vert_scale << 14) | pc->Height;
- cx_data[5] = v;
- cx_data[6] = v >> 8;
-
-
- extra_bytes_packed = 7;
- cx_data += extra_bytes_packed ;
-
- vp8_start_encode(bc, cx_data, cx_data_end);
-
- /* signal clr type */
- vp8_write_bit(bc, 0);
- vp8_write_bit(bc, pc->clamp_type);
-
- }
- else
- vp8_start_encode(bc, cx_data, cx_data_end);
-
-
- /* Signal whether or not Segmentation is enabled */
- vp8_write_bit(bc, xd->segmentation_enabled);
-
- /* Indicate which features are enabled */
- if (xd->segmentation_enabled)
- {
- /* Signal whether or not the segmentation map is being updated. */
- vp8_write_bit(bc, xd->update_mb_segmentation_map);
- vp8_write_bit(bc, xd->update_mb_segmentation_data);
-
- if (xd->update_mb_segmentation_data)
- {
- signed char Data;
-
- vp8_write_bit(bc, xd->mb_segement_abs_delta);
-
- /* For each segmentation feature (Quant and loop filter level) */
- for (i = 0; i < MB_LVL_MAX; i++)
- {
- /* For each of the segments */
- for (j = 0; j < MAX_MB_SEGMENTS; j++)
- {
- Data = xd->segment_feature_data[i][j];
-
- /* Frame level data */
- if (Data)
- {
- vp8_write_bit(bc, 1);
-
- if (Data < 0)
- {
- Data = - Data;
- vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
- vp8_write_bit(bc, 1);
- }
- else
- {
- vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
- vp8_write_bit(bc, 0);
- }
- }
- else
- vp8_write_bit(bc, 0);
- }
- }
- }
-
- if (xd->update_mb_segmentation_map)
- {
- /* Write the probs used to decode the segment id for each mb */
- for (i = 0; i < MB_FEATURE_TREE_PROBS; i++)
- {
- int Data = xd->mb_segment_tree_probs[i];
-
- if (Data != 255)
- {
- vp8_write_bit(bc, 1);
- vp8_write_literal(bc, Data, 8);
- }
- else
- vp8_write_bit(bc, 0);
- }
- }
- }
-
- vp8_write_bit(bc, pc->filter_type);
- vp8_write_literal(bc, pc->filter_level, 6);
- vp8_write_literal(bc, pc->sharpness_level, 3);
-
- /* Write out loop filter deltas applied at the MB level based on mode
- * or ref frame (if they are enabled).
- */
- vp8_write_bit(bc, xd->mode_ref_lf_delta_enabled);
-
- if (xd->mode_ref_lf_delta_enabled)
- {
- /* Do the deltas need to be updated */
- int send_update = xd->mode_ref_lf_delta_update
- || cpi->oxcf.error_resilient_mode;
-
- vp8_write_bit(bc, send_update);
- if (send_update)
- {
- int Data;
-
- /* Send update */
- for (i = 0; i < MAX_REF_LF_DELTAS; i++)
- {
- Data = xd->ref_lf_deltas[i];
-
- /* Frame level data */
- if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i]
- || cpi->oxcf.error_resilient_mode)
- {
- xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i];
- vp8_write_bit(bc, 1);
-
- if (Data > 0)
- {
- vp8_write_literal(bc, (Data & 0x3F), 6);
- vp8_write_bit(bc, 0); /* sign */
- }
- else
- {
- Data = -Data;
- vp8_write_literal(bc, (Data & 0x3F), 6);
- vp8_write_bit(bc, 1); /* sign */
- }
- }
- else
- vp8_write_bit(bc, 0);
- }
-
- /* Send update */
- for (i = 0; i < MAX_MODE_LF_DELTAS; i++)
- {
- Data = xd->mode_lf_deltas[i];
-
- if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i]
- || cpi->oxcf.error_resilient_mode)
- {
- xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i];
- vp8_write_bit(bc, 1);
-
- if (Data > 0)
- {
- vp8_write_literal(bc, (Data & 0x3F), 6);
- vp8_write_bit(bc, 0); /* sign */
- }
- else
- {
- Data = -Data;
- vp8_write_literal(bc, (Data & 0x3F), 6);
- vp8_write_bit(bc, 1); /* sign */
- }
- }
- else
- vp8_write_bit(bc, 0);
- }
- }
- }
-
- /* signal here is multi token partition is enabled */
- vp8_write_literal(bc, pc->multi_token_partition, 2);
-
- /* Frame Qbaseline quantizer index */
- vp8_write_literal(bc, pc->base_qindex, 7);
-
- /* Transmit Dc, Second order and Uv quantizer delta information */
- put_delta_q(bc, pc->y1dc_delta_q);
- put_delta_q(bc, pc->y2dc_delta_q);
- put_delta_q(bc, pc->y2ac_delta_q);
- put_delta_q(bc, pc->uvdc_delta_q);
- put_delta_q(bc, pc->uvac_delta_q);
-
- /* When there is a key frame all reference buffers are updated using
- * the new key frame
- */
- if (pc->frame_type != KEY_FRAME)
- {
- /* Should the GF or ARF be updated using the transmitted frame
- * or buffer
- */
- vp8_write_bit(bc, pc->refresh_golden_frame);
- vp8_write_bit(bc, pc->refresh_alt_ref_frame);
-
- /* If not being updated from current frame should either GF or ARF
- * be updated from another buffer
- */
- if (!pc->refresh_golden_frame)
- vp8_write_literal(bc, pc->copy_buffer_to_gf, 2);
-
- if (!pc->refresh_alt_ref_frame)
- vp8_write_literal(bc, pc->copy_buffer_to_arf, 2);
-
- /* Indicate reference frame sign bias for Golden and ARF frames
- * (always 0 for last frame buffer)
- */
- vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]);
- vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]);
- }
-
-#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
- {
- if (pc->frame_type == KEY_FRAME)
- pc->refresh_entropy_probs = 1;
- else
- pc->refresh_entropy_probs = 0;
- }
-#endif
-
- vp8_write_bit(bc, pc->refresh_entropy_probs);
-
- if (pc->frame_type != KEY_FRAME)
- vp8_write_bit(bc, pc->refresh_last_frame);
-
-#ifdef VP8_ENTROPY_STATS
-
- if (pc->frame_type == INTER_FRAME)
- active_section = 0;
- else
- active_section = 7;
-
-#endif
-
- vp8_clear_system_state();
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- pack_coef_probs(cpi);
-#else
- if (pc->refresh_entropy_probs == 0)
- {
- /* save a copy for later refresh */
- memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc));
- }
-
- vp8_update_coef_probs(cpi);
-#endif
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 2;
-#endif
-
- /* Write out the mb_no_coeff_skip flag */
- vp8_write_bit(bc, pc->mb_no_coeff_skip);
-
- if (pc->frame_type == KEY_FRAME)
- {
- write_kfmodes(cpi);
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 8;
-#endif
- }
- else
- {
- pack_inter_mode_mvs(cpi);
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 1;
-#endif
- }
-
- vp8_stop_encode(bc);
-
- cx_data += bc->pos;
-
- oh.first_partition_length_in_bytes = cpi->bc->pos;
-
- /* update frame tag */
- {
- int v = (oh.first_partition_length_in_bytes << 5) |
- (oh.show_frame << 4) |
- (oh.version << 1) |
- oh.type;
-
- dest[0] = v;
- dest[1] = v >> 8;
- dest[2] = v >> 16;
- }
-
- *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc->pos;
-
- cpi->partition_sz[0] = *size;
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- {
- const int num_part = (1 << pc->multi_token_partition);
- unsigned char * dp = cpi->partition_d[0] + cpi->partition_sz[0];
-
- if (num_part > 1)
- {
- /* write token part sizes (all but last) if more than 1 */
- validate_buffer(dp, 3 * (num_part - 1), cpi->partition_d_end[0],
- &pc->error);
-
- cpi->partition_sz[0] += 3*(num_part-1);
-
- for(i = 1; i < num_part; i++)
- {
- write_partition_size(dp, cpi->partition_sz[i]);
- dp += 3;
- }
- }
-
- if (!cpi->output_partition)
- {
- /* concatenate partition buffers */
- for(i = 0; i < num_part; i++)
- {
- memmove(dp, cpi->partition_d[i+1], cpi->partition_sz[i+1]);
- cpi->partition_d[i+1] = dp;
- dp += cpi->partition_sz[i+1];
- }
- }
-
- /* update total size */
- *size = 0;
- for(i = 0; i < num_part+1; i++)
- {
- *size += cpi->partition_sz[i];
- }
- }
-#else
- if (pc->multi_token_partition != ONE_PARTITION)
- {
- int num_part = 1 << pc->multi_token_partition;
-
- /* partition size table at the end of first partition */
- cpi->partition_sz[0] += 3 * (num_part - 1);
- *size += 3 * (num_part - 1);
-
- validate_buffer(cx_data, 3 * (num_part - 1), cx_data_end,
- &pc->error);
-
- for(i = 1; i < num_part + 1; i++)
- {
- cpi->bc[i].error = &pc->error;
- }
-
- pack_tokens_into_partitions(cpi, cx_data + 3 * (num_part - 1),
- cx_data_end, num_part);
-
- for(i = 1; i < num_part; i++)
- {
- cpi->partition_sz[i] = cpi->bc[i].pos;
- write_partition_size(cx_data, cpi->partition_sz[i]);
- cx_data += 3;
- *size += cpi->partition_sz[i]; /* add to total */
- }
-
- /* add last partition to total size */
- cpi->partition_sz[i] = cpi->bc[i].pos;
- *size += cpi->partition_sz[i];
- }
- else
- {
- bc[1].error = &pc->error;
-
- vp8_start_encode(&cpi->bc[1], cx_data, cx_data_end);
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded)
- pack_mb_row_tokens(cpi, &cpi->bc[1]);
- else
-#endif
- vp8_pack_tokens(&cpi->bc[1], cpi->tok, cpi->tok_count);
-
- vp8_stop_encode(&cpi->bc[1]);
-
- *size += cpi->bc[1].pos;
- cpi->partition_sz[1] = cpi->bc[1].pos;
- }
-#endif
-}
-
-#ifdef VP8_ENTROPY_STATS
-void print_tree_update_probs()
-{
- int i, j, k, l;
- FILE *f = fopen("context.c", "a");
- int Sum;
- fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n");
- fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES] = {\n");
-
- for (i = 0; i < BLOCK_TYPES; i++)
- {
- fprintf(f, " { \n");
-
- for (j = 0; j < COEF_BANDS; j++)
- {
- fprintf(f, " {\n");
-
- for (k = 0; k < PREV_COEF_CONTEXTS; k++)
- {
- fprintf(f, " {");
-
- for (l = 0; l < ENTROPY_NODES; l++)
- {
- Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1];
-
- if (Sum > 0)
- {
- if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0)
- fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum);
- else
- fprintf(f, "%3ld, ", 1);
- }
- else
- fprintf(f, "%3ld, ", 128);
- }
-
- fprintf(f, "},\n");
- }
-
- fprintf(f, " },\n");
- }
-
- fprintf(f, " },\n");
- }
-
- fprintf(f, "};\n");
- fclose(f);
-}
-#endif
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.h
deleted file mode 100644
index de69805513c..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/bitstream.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_BITSTREAM_H_
-#define VP8_ENCODER_BITSTREAM_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void vp8_pack_tokens(vp8_writer *w, const TOKENEXTRA *p, int xcount);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_BITSTREAM_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/block.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/block.h
deleted file mode 100644
index 248e79549bf..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/block.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_BLOCK_H_
-#define VP8_ENCODER_BLOCK_H_
-
-#include "vp8/common/onyx.h"
-#include "vp8/common/blockd.h"
-#include "vp8/common/entropymv.h"
-#include "vp8/common/entropy.h"
-#include "vpx_ports/mem.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define MAX_MODES 20
-#define MAX_ERROR_BINS 1024
-
-/* motion search site */
-typedef struct
-{
- MV mv;
- int offset;
-} search_site;
-
-typedef struct block
-{
- /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
- short *src_diff;
- short *coeff;
-
- /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
- short *quant;
- short *quant_fast;
- short *quant_shift;
- short *zbin;
- short *zrun_zbin_boost;
- short *round;
-
- /* Zbin Over Quant value */
- short zbin_extra;
-
- unsigned char **base_src;
- int src;
- int src_stride;
-} BLOCK;
-
-typedef struct
-{
- int count;
- struct
- {
- B_PREDICTION_MODE mode;
- int_mv mv;
- } bmi[16];
-} PARTITION_INFO;
-
-typedef struct macroblock
-{
- DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */
- DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */
- DECLARE_ALIGNED(16, unsigned char, thismb[256]);
-
- unsigned char *thismb_ptr;
- /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */
- BLOCK block[25];
-
- YV12_BUFFER_CONFIG src;
-
- MACROBLOCKD e_mbd;
- PARTITION_INFO *partition_info; /* work pointer */
- PARTITION_INFO *pi; /* Corresponds to upper left visible macroblock */
- PARTITION_INFO *pip; /* Base of allocated array */
-
- int ref_frame_cost[MAX_REF_FRAMES];
-
- search_site *ss;
- int ss_count;
- int searches_per_step;
-
- int errorperbit;
- int sadperbit16;
- int sadperbit4;
- int rddiv;
- int rdmult;
- unsigned int * mb_activity_ptr;
- int * mb_norm_activity_ptr;
- signed int act_zbin_adj;
- signed int last_act_zbin_adj;
-
- int *mvcost[2];
- int *mvsadcost[2];
- int (*mbmode_cost)[MB_MODE_COUNT];
- int (*intra_uv_mode_cost)[MB_MODE_COUNT];
- int (*bmode_costs)[10][10];
- int *inter_bmode_costs;
- int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS]
- [MAX_ENTROPY_TOKENS];
-
- /* These define limits to motion vector components to prevent
- * them from extending outside the UMV borders.
- */
- int mv_col_min;
- int mv_col_max;
- int mv_row_min;
- int mv_row_max;
-
- int skip;
-
- unsigned int encode_breakout;
-
- signed char *gf_active_ptr;
-
- unsigned char *active_ptr;
- MV_CONTEXT *mvc;
-
- int optimize;
- int q_index;
- int is_skin;
- int denoise_zeromv;
-
-#if CONFIG_TEMPORAL_DENOISING
- int increase_denoising;
- MB_PREDICTION_MODE best_sse_inter_mode;
- int_mv best_sse_mv;
- MV_REFERENCE_FRAME best_reference_frame;
- MV_REFERENCE_FRAME best_zeromv_reference_frame;
- unsigned char need_to_clamp_best_mvs;
-#endif
-
- int skip_true_count;
- unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
- unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */
- int ymode_count [VP8_YMODES]; /* intra MB type cts this frame */
- int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */
- int64_t prediction_error;
- int64_t intra_error;
- int count_mb_ref_frame_usage[MAX_REF_FRAMES];
-
- int rd_thresh_mult[MAX_MODES];
- int rd_threshes[MAX_MODES];
- unsigned int mbs_tested_so_far;
- unsigned int mode_test_hit_counts[MAX_MODES];
- int zbin_mode_boost_enabled;
- int zbin_mode_boost;
- int last_zbin_mode_boost;
-
- int last_zbin_over_quant;
- int zbin_over_quant;
- int error_bins[MAX_ERROR_BINS];
-
- void (*short_fdct4x4)(short *input, short *output, int pitch);
- void (*short_fdct8x4)(short *input, short *output, int pitch);
- void (*short_walsh4x4)(short *input, short *output, int pitch);
- void (*quantize_b)(BLOCK *b, BLOCKD *d);
-
- unsigned int mbs_zero_last_dot_suppress;
- int zero_last_dot_suppress;
-} MACROBLOCK;
-
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_BLOCK_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.c
deleted file mode 100644
index 3b0c03a142d..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "boolhuff.h"
-
-#if defined(SECTIONBITS_OUTPUT)
-unsigned __int64 Sectionbits[500];
-
-#endif
-
-#ifdef VP8_ENTROPY_STATS
-unsigned int active_section = 0;
-#endif
-
-const unsigned int vp8_prob_cost[256] =
-{
- 2047, 2047, 1791, 1641, 1535, 1452, 1385, 1328, 1279, 1235, 1196, 1161, 1129, 1099, 1072, 1046,
- 1023, 1000, 979, 959, 940, 922, 905, 889, 873, 858, 843, 829, 816, 803, 790, 778,
- 767, 755, 744, 733, 723, 713, 703, 693, 684, 675, 666, 657, 649, 641, 633, 625,
- 617, 609, 602, 594, 587, 580, 573, 567, 560, 553, 547, 541, 534, 528, 522, 516,
- 511, 505, 499, 494, 488, 483, 477, 472, 467, 462, 457, 452, 447, 442, 437, 433,
- 428, 424, 419, 415, 410, 406, 401, 397, 393, 389, 385, 381, 377, 373, 369, 365,
- 361, 357, 353, 349, 346, 342, 338, 335, 331, 328, 324, 321, 317, 314, 311, 307,
- 304, 301, 297, 294, 291, 288, 285, 281, 278, 275, 272, 269, 266, 263, 260, 257,
- 255, 252, 249, 246, 243, 240, 238, 235, 232, 229, 227, 224, 221, 219, 216, 214,
- 211, 208, 206, 203, 201, 198, 196, 194, 191, 189, 186, 184, 181, 179, 177, 174,
- 172, 170, 168, 165, 163, 161, 159, 156, 154, 152, 150, 148, 145, 143, 141, 139,
- 137, 135, 133, 131, 129, 127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107,
- 105, 103, 101, 99, 97, 95, 93, 92, 90, 88, 86, 84, 82, 81, 79, 77,
- 75, 73, 72, 70, 68, 66, 65, 63, 61, 60, 58, 56, 55, 53, 51, 50,
- 48, 46, 45, 43, 41, 40, 38, 37, 35, 33, 32, 30, 29, 27, 25, 24,
- 22, 21, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 3, 1, 1
-};
-
-void vp8_start_encode(BOOL_CODER *br, unsigned char *source, unsigned char *source_end)
-{
-
- br->lowvalue = 0;
- br->range = 255;
- br->count = -24;
- br->buffer = source;
- br->buffer_end = source_end;
- br->pos = 0;
-}
-
-void vp8_stop_encode(BOOL_CODER *br)
-{
- int i;
-
- for (i = 0; i < 32; i++)
- vp8_encode_bool(br, 0, 128);
-}
-
-
-void vp8_encode_value(BOOL_CODER *br, int data, int bits)
-{
- int bit;
-
- for (bit = bits - 1; bit >= 0; bit--)
- vp8_encode_bool(br, (1 & (data >> bit)), 0x80);
-
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.h
deleted file mode 100644
index 7c012a82969..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/boolhuff.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-/****************************************************************************
-*
-* Module Title : boolhuff.h
-*
-* Description : Bool Coder header file.
-*
-****************************************************************************/
-#ifndef VP8_ENCODER_BOOLHUFF_H_
-#define VP8_ENCODER_BOOLHUFF_H_
-
-#include "vpx_ports/mem.h"
-#include "vpx/internal/vpx_codec_internal.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct
-{
- unsigned int lowvalue;
- unsigned int range;
- int count;
- unsigned int pos;
- unsigned char *buffer;
- unsigned char *buffer_end;
- struct vpx_internal_error_info *error;
-} BOOL_CODER;
-
-extern void vp8_start_encode(BOOL_CODER *bc, unsigned char *buffer, unsigned char *buffer_end);
-
-extern void vp8_encode_value(BOOL_CODER *br, int data, int bits);
-extern void vp8_stop_encode(BOOL_CODER *bc);
-extern const unsigned int vp8_prob_cost[256];
-
-
-DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]);
-
-static int validate_buffer(const unsigned char *start,
- size_t len,
- const unsigned char *end,
- struct vpx_internal_error_info *error)
-{
- if (start + len > start && start + len < end)
- return 1;
- else
- vpx_internal_error(error, VPX_CODEC_CORRUPT_FRAME,
- "Truncated packet or corrupt partition ");
-
- return 0;
-}
-static void vp8_encode_bool(BOOL_CODER *br, int bit, int probability)
-{
- unsigned int split;
- int count = br->count;
- unsigned int range = br->range;
- unsigned int lowvalue = br->lowvalue;
- register unsigned int shift;
-
-#ifdef VP8_ENTROPY_STATS
-#if defined(SECTIONBITS_OUTPUT)
-
- if (bit)
- Sectionbits[active_section] += vp8_prob_cost[255-probability];
- else
- Sectionbits[active_section] += vp8_prob_cost[probability];
-
-#endif
-#endif
-
- split = 1 + (((range - 1) * probability) >> 8);
-
- range = split;
-
- if (bit)
- {
- lowvalue += split;
- range = br->range - split;
- }
-
- shift = vp8_norm[range];
-
- range <<= shift;
- count += shift;
-
- if (count >= 0)
- {
- int offset = shift - count;
-
- if ((lowvalue << (offset - 1)) & 0x80000000)
- {
- int x = br->pos - 1;
-
- while (x >= 0 && br->buffer[x] == 0xff)
- {
- br->buffer[x] = (unsigned char)0;
- x--;
- }
-
- br->buffer[x] += 1;
- }
-
- validate_buffer(br->buffer + br->pos, 1, br->buffer_end, br->error);
- br->buffer[br->pos++] = (lowvalue >> (24 - offset));
-
- lowvalue <<= offset;
- shift = count;
- lowvalue &= 0xffffff;
- count -= 8 ;
- }
-
- lowvalue <<= shift;
- br->count = count;
- br->lowvalue = lowvalue;
- br->range = range;
-}
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_BOOLHUFF_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct.c
deleted file mode 100644
index 0c7198d5d3a..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <math.h>
-
-#include "./vp8_rtcd.h"
-
-void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
-{
- int i;
- int a1, b1, c1, d1;
- short *ip = input;
- short *op = output;
-
- for (i = 0; i < 4; i++)
- {
- a1 = ((ip[0] + ip[3]) * 8);
- b1 = ((ip[1] + ip[2]) * 8);
- c1 = ((ip[1] - ip[2]) * 8);
- d1 = ((ip[0] - ip[3]) * 8);
-
- op[0] = a1 + b1;
- op[2] = a1 - b1;
-
- op[1] = (c1 * 2217 + d1 * 5352 + 14500)>>12;
- op[3] = (d1 * 2217 - c1 * 5352 + 7500)>>12;
-
- ip += pitch / 2;
- op += 4;
-
- }
- ip = output;
- op = output;
- for (i = 0; i < 4; i++)
- {
- a1 = ip[0] + ip[12];
- b1 = ip[4] + ip[8];
- c1 = ip[4] - ip[8];
- d1 = ip[0] - ip[12];
-
- op[0] = ( a1 + b1 + 7)>>4;
- op[8] = ( a1 - b1 + 7)>>4;
-
- op[4] =((c1 * 2217 + d1 * 5352 + 12000)>>16) + (d1!=0);
- op[12] = (d1 * 2217 - c1 * 5352 + 51000)>>16;
-
- ip++;
- op++;
- }
-}
-
-void vp8_short_fdct8x4_c(short *input, short *output, int pitch)
-{
- vp8_short_fdct4x4_c(input, output, pitch);
- vp8_short_fdct4x4_c(input + 4, output + 16, pitch);
-}
-
-void vp8_short_walsh4x4_c(short *input, short *output, int pitch)
-{
- int i;
- int a1, b1, c1, d1;
- int a2, b2, c2, d2;
- short *ip = input;
- short *op = output;
-
-
- for (i = 0; i < 4; i++)
- {
- a1 = ((ip[0] + ip[2]) * 4);
- d1 = ((ip[1] + ip[3]) * 4);
- c1 = ((ip[1] - ip[3]) * 4);
- b1 = ((ip[0] - ip[2]) * 4);
-
- op[0] = a1 + d1 + (a1!=0);
- op[1] = b1 + c1;
- op[2] = b1 - c1;
- op[3] = a1 - d1;
- ip += pitch / 2;
- op += 4;
- }
-
- ip = output;
- op = output;
-
- for (i = 0; i < 4; i++)
- {
- a1 = ip[0] + ip[8];
- d1 = ip[4] + ip[12];
- c1 = ip[4] - ip[12];
- b1 = ip[0] - ip[8];
-
- a2 = a1 + d1;
- b2 = b1 + c1;
- c2 = b1 - c1;
- d2 = a1 - d1;
-
- a2 += a2<0;
- b2 += b2<0;
- c2 += c2<0;
- d2 += d2<0;
-
- op[0] = (a2+3) >> 3;
- op[4] = (b2+3) >> 3;
- op[8] = (c2+3) >> 3;
- op[12]= (d2+3) >> 3;
-
- ip++;
- op++;
- }
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_cost.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_cost.h
deleted file mode 100644
index 1cd3eec84ac..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_cost.h
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef VP8_ENCODER_DCT_VALUE_COST_H_
-#define VP8_ENCODER_DCT_VALUE_COST_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Generated file, included by tokenize.c */
-/* Values generated by fill_value_tokens() */
-
-static const short dct_value_cost[2048*2] =
-{
- 8285, 8277, 8267, 8259, 8253, 8245, 8226, 8218, 8212, 8204, 8194, 8186,
- 8180, 8172, 8150, 8142, 8136, 8128, 8118, 8110, 8104, 8096, 8077, 8069,
- 8063, 8055, 8045, 8037, 8031, 8023, 7997, 7989, 7983, 7975, 7965, 7957,
- 7951, 7943, 7924, 7916, 7910, 7902, 7892, 7884, 7878, 7870, 7848, 7840,
- 7834, 7826, 7816, 7808, 7802, 7794, 7775, 7767, 7761, 7753, 7743, 7735,
- 7729, 7721, 7923, 7915, 7909, 7901, 7891, 7883, 7877, 7869, 7850, 7842,
- 7836, 7828, 7818, 7810, 7804, 7796, 7774, 7766, 7760, 7752, 7742, 7734,
- 7728, 7720, 7701, 7693, 7687, 7679, 7669, 7661, 7655, 7647, 7621, 7613,
- 7607, 7599, 7589, 7581, 7575, 7567, 7548, 7540, 7534, 7526, 7516, 7508,
- 7502, 7494, 7472, 7464, 7458, 7450, 7440, 7432, 7426, 7418, 7399, 7391,
- 7385, 7377, 7367, 7359, 7353, 7345, 7479, 7471, 7465, 7457, 7447, 7439,
- 7433, 7425, 7406, 7398, 7392, 7384, 7374, 7366, 7360, 7352, 7330, 7322,
- 7316, 7308, 7298, 7290, 7284, 7276, 7257, 7249, 7243, 7235, 7225, 7217,
- 7211, 7203, 7177, 7169, 7163, 7155, 7145, 7137, 7131, 7123, 7104, 7096,
- 7090, 7082, 7072, 7064, 7058, 7050, 7028, 7020, 7014, 7006, 6996, 6988,
- 6982, 6974, 6955, 6947, 6941, 6933, 6923, 6915, 6909, 6901, 7632, 7624,
- 7618, 7610, 7600, 7592, 7586, 7578, 7559, 7551, 7545, 7537, 7527, 7519,
- 7513, 7505, 7483, 7475, 7469, 7461, 7451, 7443, 7437, 7429, 7410, 7402,
- 7396, 7388, 7378, 7370, 7364, 7356, 7330, 7322, 7316, 7308, 7298, 7290,
- 7284, 7276, 7257, 7249, 7243, 7235, 7225, 7217, 7211, 7203, 7181, 7173,
- 7167, 7159, 7149, 7141, 7135, 7127, 7108, 7100, 7094, 7086, 7076, 7068,
- 7062, 7054, 7188, 7180, 7174, 7166, 7156, 7148, 7142, 7134, 7115, 7107,
- 7101, 7093, 7083, 7075, 7069, 7061, 7039, 7031, 7025, 7017, 7007, 6999,
- 6993, 6985, 6966, 6958, 6952, 6944, 6934, 6926, 6920, 6912, 6886, 6878,
- 6872, 6864, 6854, 6846, 6840, 6832, 6813, 6805, 6799, 6791, 6781, 6773,
- 6767, 6759, 6737, 6729, 6723, 6715, 6705, 6697, 6691, 6683, 6664, 6656,
- 6650, 6642, 6632, 6624, 6618, 6610, 6812, 6804, 6798, 6790, 6780, 6772,
- 6766, 6758, 6739, 6731, 6725, 6717, 6707, 6699, 6693, 6685, 6663, 6655,
- 6649, 6641, 6631, 6623, 6617, 6609, 6590, 6582, 6576, 6568, 6558, 6550,
- 6544, 6536, 6510, 6502, 6496, 6488, 6478, 6470, 6464, 6456, 6437, 6429,
- 6423, 6415, 6405, 6397, 6391, 6383, 6361, 6353, 6347, 6339, 6329, 6321,
- 6315, 6307, 6288, 6280, 6274, 6266, 6256, 6248, 6242, 6234, 6368, 6360,
- 6354, 6346, 6336, 6328, 6322, 6314, 6295, 6287, 6281, 6273, 6263, 6255,
- 6249, 6241, 6219, 6211, 6205, 6197, 6187, 6179, 6173, 6165, 6146, 6138,
- 6132, 6124, 6114, 6106, 6100, 6092, 6066, 6058, 6052, 6044, 6034, 6026,
- 6020, 6012, 5993, 5985, 5979, 5971, 5961, 5953, 5947, 5939, 5917, 5909,
- 5903, 5895, 5885, 5877, 5871, 5863, 5844, 5836, 5830, 5822, 5812, 5804,
- 5798, 5790, 6697, 6689, 6683, 6675, 6665, 6657, 6651, 6643, 6624, 6616,
- 6610, 6602, 6592, 6584, 6578, 6570, 6548, 6540, 6534, 6526, 6516, 6508,
- 6502, 6494, 6475, 6467, 6461, 6453, 6443, 6435, 6429, 6421, 6395, 6387,
- 6381, 6373, 6363, 6355, 6349, 6341, 6322, 6314, 6308, 6300, 6290, 6282,
- 6276, 6268, 6246, 6238, 6232, 6224, 6214, 6206, 6200, 6192, 6173, 6165,
- 6159, 6151, 6141, 6133, 6127, 6119, 6253, 6245, 6239, 6231, 6221, 6213,
- 6207, 6199, 6180, 6172, 6166, 6158, 6148, 6140, 6134, 6126, 6104, 6096,
- 6090, 6082, 6072, 6064, 6058, 6050, 6031, 6023, 6017, 6009, 5999, 5991,
- 5985, 5977, 5951, 5943, 5937, 5929, 5919, 5911, 5905, 5897, 5878, 5870,
- 5864, 5856, 5846, 5838, 5832, 5824, 5802, 5794, 5788, 5780, 5770, 5762,
- 5756, 5748, 5729, 5721, 5715, 5707, 5697, 5689, 5683, 5675, 5877, 5869,
- 5863, 5855, 5845, 5837, 5831, 5823, 5804, 5796, 5790, 5782, 5772, 5764,
- 5758, 5750, 5728, 5720, 5714, 5706, 5696, 5688, 5682, 5674, 5655, 5647,
- 5641, 5633, 5623, 5615, 5609, 5601, 5575, 5567, 5561, 5553, 5543, 5535,
- 5529, 5521, 5502, 5494, 5488, 5480, 5470, 5462, 5456, 5448, 5426, 5418,
- 5412, 5404, 5394, 5386, 5380, 5372, 5353, 5345, 5339, 5331, 5321, 5313,
- 5307, 5299, 5433, 5425, 5419, 5411, 5401, 5393, 5387, 5379, 5360, 5352,
- 5346, 5338, 5328, 5320, 5314, 5306, 5284, 5276, 5270, 5262, 5252, 5244,
- 5238, 5230, 5211, 5203, 5197, 5189, 5179, 5171, 5165, 5157, 5131, 5123,
- 5117, 5109, 5099, 5091, 5085, 5077, 5058, 5050, 5044, 5036, 5026, 5018,
- 5012, 5004, 4982, 4974, 4968, 4960, 4950, 4942, 4936, 4928, 4909, 4901,
- 4895, 4887, 4877, 4869, 4863, 4855, 5586, 5578, 5572, 5564, 5554, 5546,
- 5540, 5532, 5513, 5505, 5499, 5491, 5481, 5473, 5467, 5459, 5437, 5429,
- 5423, 5415, 5405, 5397, 5391, 5383, 5364, 5356, 5350, 5342, 5332, 5324,
- 5318, 5310, 5284, 5276, 5270, 5262, 5252, 5244, 5238, 5230, 5211, 5203,
- 5197, 5189, 5179, 5171, 5165, 5157, 5135, 5127, 5121, 5113, 5103, 5095,
- 5089, 5081, 5062, 5054, 5048, 5040, 5030, 5022, 5016, 5008, 5142, 5134,
- 5128, 5120, 5110, 5102, 5096, 5088, 5069, 5061, 5055, 5047, 5037, 5029,
- 5023, 5015, 4993, 4985, 4979, 4971, 4961, 4953, 4947, 4939, 4920, 4912,
- 4906, 4898, 4888, 4880, 4874, 4866, 4840, 4832, 4826, 4818, 4808, 4800,
- 4794, 4786, 4767, 4759, 4753, 4745, 4735, 4727, 4721, 4713, 4691, 4683,
- 4677, 4669, 4659, 4651, 4645, 4637, 4618, 4610, 4604, 4596, 4586, 4578,
- 4572, 4564, 4766, 4758, 4752, 4744, 4734, 4726, 4720, 4712, 4693, 4685,
- 4679, 4671, 4661, 4653, 4647, 4639, 4617, 4609, 4603, 4595, 4585, 4577,
- 4571, 4563, 4544, 4536, 4530, 4522, 4512, 4504, 4498, 4490, 4464, 4456,
- 4450, 4442, 4432, 4424, 4418, 4410, 4391, 4383, 4377, 4369, 4359, 4351,
- 4345, 4337, 4315, 4307, 4301, 4293, 4283, 4275, 4269, 4261, 4242, 4234,
- 4228, 4220, 4210, 4202, 4196, 4188, 4322, 4314, 4308, 4300, 4290, 4282,
- 4276, 4268, 4249, 4241, 4235, 4227, 4217, 4209, 4203, 4195, 4173, 4165,
- 4159, 4151, 4141, 4133, 4127, 4119, 4100, 4092, 4086, 4078, 4068, 4060,
- 4054, 4046, 4020, 4012, 4006, 3998, 3988, 3980, 3974, 3966, 3947, 3939,
- 3933, 3925, 3915, 3907, 3901, 3893, 3871, 3863, 3857, 3849, 3839, 3831,
- 3825, 3817, 3798, 3790, 3784, 3776, 3766, 3758, 3752, 3744, 6697, 6689,
- 6683, 6675, 6665, 6657, 6651, 6643, 6624, 6616, 6610, 6602, 6592, 6584,
- 6578, 6570, 6548, 6540, 6534, 6526, 6516, 6508, 6502, 6494, 6475, 6467,
- 6461, 6453, 6443, 6435, 6429, 6421, 6395, 6387, 6381, 6373, 6363, 6355,
- 6349, 6341, 6322, 6314, 6308, 6300, 6290, 6282, 6276, 6268, 6246, 6238,
- 6232, 6224, 6214, 6206, 6200, 6192, 6173, 6165, 6159, 6151, 6141, 6133,
- 6127, 6119, 6253, 6245, 6239, 6231, 6221, 6213, 6207, 6199, 6180, 6172,
- 6166, 6158, 6148, 6140, 6134, 6126, 6104, 6096, 6090, 6082, 6072, 6064,
- 6058, 6050, 6031, 6023, 6017, 6009, 5999, 5991, 5985, 5977, 5951, 5943,
- 5937, 5929, 5919, 5911, 5905, 5897, 5878, 5870, 5864, 5856, 5846, 5838,
- 5832, 5824, 5802, 5794, 5788, 5780, 5770, 5762, 5756, 5748, 5729, 5721,
- 5715, 5707, 5697, 5689, 5683, 5675, 5877, 5869, 5863, 5855, 5845, 5837,
- 5831, 5823, 5804, 5796, 5790, 5782, 5772, 5764, 5758, 5750, 5728, 5720,
- 5714, 5706, 5696, 5688, 5682, 5674, 5655, 5647, 5641, 5633, 5623, 5615,
- 5609, 5601, 5575, 5567, 5561, 5553, 5543, 5535, 5529, 5521, 5502, 5494,
- 5488, 5480, 5470, 5462, 5456, 5448, 5426, 5418, 5412, 5404, 5394, 5386,
- 5380, 5372, 5353, 5345, 5339, 5331, 5321, 5313, 5307, 5299, 5433, 5425,
- 5419, 5411, 5401, 5393, 5387, 5379, 5360, 5352, 5346, 5338, 5328, 5320,
- 5314, 5306, 5284, 5276, 5270, 5262, 5252, 5244, 5238, 5230, 5211, 5203,
- 5197, 5189, 5179, 5171, 5165, 5157, 5131, 5123, 5117, 5109, 5099, 5091,
- 5085, 5077, 5058, 5050, 5044, 5036, 5026, 5018, 5012, 5004, 4982, 4974,
- 4968, 4960, 4950, 4942, 4936, 4928, 4909, 4901, 4895, 4887, 4877, 4869,
- 4863, 4855, 5586, 5578, 5572, 5564, 5554, 5546, 5540, 5532, 5513, 5505,
- 5499, 5491, 5481, 5473, 5467, 5459, 5437, 5429, 5423, 5415, 5405, 5397,
- 5391, 5383, 5364, 5356, 5350, 5342, 5332, 5324, 5318, 5310, 5284, 5276,
- 5270, 5262, 5252, 5244, 5238, 5230, 5211, 5203, 5197, 5189, 5179, 5171,
- 5165, 5157, 5135, 5127, 5121, 5113, 5103, 5095, 5089, 5081, 5062, 5054,
- 5048, 5040, 5030, 5022, 5016, 5008, 5142, 5134, 5128, 5120, 5110, 5102,
- 5096, 5088, 5069, 5061, 5055, 5047, 5037, 5029, 5023, 5015, 4993, 4985,
- 4979, 4971, 4961, 4953, 4947, 4939, 4920, 4912, 4906, 4898, 4888, 4880,
- 4874, 4866, 4840, 4832, 4826, 4818, 4808, 4800, 4794, 4786, 4767, 4759,
- 4753, 4745, 4735, 4727, 4721, 4713, 4691, 4683, 4677, 4669, 4659, 4651,
- 4645, 4637, 4618, 4610, 4604, 4596, 4586, 4578, 4572, 4564, 4766, 4758,
- 4752, 4744, 4734, 4726, 4720, 4712, 4693, 4685, 4679, 4671, 4661, 4653,
- 4647, 4639, 4617, 4609, 4603, 4595, 4585, 4577, 4571, 4563, 4544, 4536,
- 4530, 4522, 4512, 4504, 4498, 4490, 4464, 4456, 4450, 4442, 4432, 4424,
- 4418, 4410, 4391, 4383, 4377, 4369, 4359, 4351, 4345, 4337, 4315, 4307,
- 4301, 4293, 4283, 4275, 4269, 4261, 4242, 4234, 4228, 4220, 4210, 4202,
- 4196, 4188, 4322, 4314, 4308, 4300, 4290, 4282, 4276, 4268, 4249, 4241,
- 4235, 4227, 4217, 4209, 4203, 4195, 4173, 4165, 4159, 4151, 4141, 4133,
- 4127, 4119, 4100, 4092, 4086, 4078, 4068, 4060, 4054, 4046, 4020, 4012,
- 4006, 3998, 3988, 3980, 3974, 3966, 3947, 3939, 3933, 3925, 3915, 3907,
- 3901, 3893, 3871, 3863, 3857, 3849, 3839, 3831, 3825, 3817, 3798, 3790,
- 3784, 3776, 3766, 3758, 3752, 3744, 4651, 4643, 4637, 4629, 4619, 4611,
- 4605, 4597, 4578, 4570, 4564, 4556, 4546, 4538, 4532, 4524, 4502, 4494,
- 4488, 4480, 4470, 4462, 4456, 4448, 4429, 4421, 4415, 4407, 4397, 4389,
- 4383, 4375, 4349, 4341, 4335, 4327, 4317, 4309, 4303, 4295, 4276, 4268,
- 4262, 4254, 4244, 4236, 4230, 4222, 4200, 4192, 4186, 4178, 4168, 4160,
- 4154, 4146, 4127, 4119, 4113, 4105, 4095, 4087, 4081, 4073, 4207, 4199,
- 4193, 4185, 4175, 4167, 4161, 4153, 4134, 4126, 4120, 4112, 4102, 4094,
- 4088, 4080, 4058, 4050, 4044, 4036, 4026, 4018, 4012, 4004, 3985, 3977,
- 3971, 3963, 3953, 3945, 3939, 3931, 3905, 3897, 3891, 3883, 3873, 3865,
- 3859, 3851, 3832, 3824, 3818, 3810, 3800, 3792, 3786, 3778, 3756, 3748,
- 3742, 3734, 3724, 3716, 3710, 3702, 3683, 3675, 3669, 3661, 3651, 3643,
- 3637, 3629, 3831, 3823, 3817, 3809, 3799, 3791, 3785, 3777, 3758, 3750,
- 3744, 3736, 3726, 3718, 3712, 3704, 3682, 3674, 3668, 3660, 3650, 3642,
- 3636, 3628, 3609, 3601, 3595, 3587, 3577, 3569, 3563, 3555, 3529, 3521,
- 3515, 3507, 3497, 3489, 3483, 3475, 3456, 3448, 3442, 3434, 3424, 3416,
- 3410, 3402, 3380, 3372, 3366, 3358, 3348, 3340, 3334, 3326, 3307, 3299,
- 3293, 3285, 3275, 3267, 3261, 3253, 3387, 3379, 3373, 3365, 3355, 3347,
- 3341, 3333, 3314, 3306, 3300, 3292, 3282, 3274, 3268, 3260, 3238, 3230,
- 3224, 3216, 3206, 3198, 3192, 3184, 3165, 3157, 3151, 3143, 3133, 3125,
- 3119, 3111, 3085, 3077, 3071, 3063, 3053, 3045, 3039, 3031, 3012, 3004,
- 2998, 2990, 2980, 2972, 2966, 2958, 2936, 2928, 2922, 2914, 2904, 2896,
- 2890, 2882, 2863, 2855, 2849, 2841, 2831, 2823, 2817, 2809, 3540, 3532,
- 3526, 3518, 3508, 3500, 3494, 3486, 3467, 3459, 3453, 3445, 3435, 3427,
- 3421, 3413, 3391, 3383, 3377, 3369, 3359, 3351, 3345, 3337, 3318, 3310,
- 3304, 3296, 3286, 3278, 3272, 3264, 3238, 3230, 3224, 3216, 3206, 3198,
- 3192, 3184, 3165, 3157, 3151, 3143, 3133, 3125, 3119, 3111, 3089, 3081,
- 3075, 3067, 3057, 3049, 3043, 3035, 3016, 3008, 3002, 2994, 2984, 2976,
- 2970, 2962, 3096, 3088, 3082, 3074, 3064, 3056, 3050, 3042, 3023, 3015,
- 3009, 3001, 2991, 2983, 2977, 2969, 2947, 2939, 2933, 2925, 2915, 2907,
- 2901, 2893, 2874, 2866, 2860, 2852, 2842, 2834, 2828, 2820, 2794, 2786,
- 2780, 2772, 2762, 2754, 2748, 2740, 2721, 2713, 2707, 2699, 2689, 2681,
- 2675, 2667, 2645, 2637, 2631, 2623, 2613, 2605, 2599, 2591, 2572, 2564,
- 2558, 2550, 2540, 2532, 2526, 2518, 2720, 2712, 2706, 2698, 2688, 2680,
- 2674, 2666, 2647, 2639, 2633, 2625, 2615, 2607, 2601, 2593, 2571, 2563,
- 2557, 2549, 2539, 2531, 2525, 2517, 2498, 2490, 2484, 2476, 2466, 2458,
- 2452, 2444, 2418, 2410, 2404, 2396, 2386, 2378, 2372, 2364, 2345, 2337,
- 2331, 2323, 2313, 2305, 2299, 2291, 2269, 2261, 2255, 2247, 2237, 2229,
- 2223, 2215, 2196, 2188, 2182, 2174, 2164, 2156, 2150, 2142, 2276, 2268,
- 2262, 2254, 2244, 2236, 2230, 2222, 2203, 2195, 2189, 2181, 2171, 2163,
- 2157, 2149, 2127, 2119, 2113, 2105, 2095, 2087, 2081, 2073, 2054, 2046,
- 2040, 2032, 2022, 2014, 2008, 2000, 1974, 1966, 1960, 1952, 1942, 1934,
- 1928, 1920, 1901, 1893, 1887, 1879, 1869, 1861, 1855, 1847, 1825, 1817,
- 1811, 1803, 1793, 1785, 1779, 1771, 1752, 1744, 1738, 1730, 1720, 1712,
- 1706, 1698, 1897, 1883, 1860, 1846, 1819, 1805, 1782, 1768, 1723, 1709,
- 1686, 1672, 1645, 1631, 1608, 1594, 1574, 1560, 1537, 1523, 1496, 1482,
- 1459, 1445, 1400, 1386, 1363, 1349, 1322, 1308, 1285, 1271, 1608, 1565,
- 1535, 1492, 1446, 1403, 1373, 1330, 1312, 1269, 1239, 1196, 1150, 1107,
- 1077, 1034, 1291, 1218, 1171, 1098, 1015, 942, 895, 822, 953, 850,
- 729, 626, 618, 431, 257, 257, 257, 257, 0, 255, 255, 255,
- 255, 429, 616, 624, 727, 848, 951, 820, 893, 940, 1013, 1096,
- 1169, 1216, 1289, 1032, 1075, 1105, 1148, 1194, 1237, 1267, 1310, 1328,
- 1371, 1401, 1444, 1490, 1533, 1563, 1606, 1269, 1283, 1306, 1320, 1347,
- 1361, 1384, 1398, 1443, 1457, 1480, 1494, 1521, 1535, 1558, 1572, 1592,
- 1606, 1629, 1643, 1670, 1684, 1707, 1721, 1766, 1780, 1803, 1817, 1844,
- 1858, 1881, 1895, 1696, 1704, 1710, 1718, 1728, 1736, 1742, 1750, 1769,
- 1777, 1783, 1791, 1801, 1809, 1815, 1823, 1845, 1853, 1859, 1867, 1877,
- 1885, 1891, 1899, 1918, 1926, 1932, 1940, 1950, 1958, 1964, 1972, 1998,
- 2006, 2012, 2020, 2030, 2038, 2044, 2052, 2071, 2079, 2085, 2093, 2103,
- 2111, 2117, 2125, 2147, 2155, 2161, 2169, 2179, 2187, 2193, 2201, 2220,
- 2228, 2234, 2242, 2252, 2260, 2266, 2274, 2140, 2148, 2154, 2162, 2172,
- 2180, 2186, 2194, 2213, 2221, 2227, 2235, 2245, 2253, 2259, 2267, 2289,
- 2297, 2303, 2311, 2321, 2329, 2335, 2343, 2362, 2370, 2376, 2384, 2394,
- 2402, 2408, 2416, 2442, 2450, 2456, 2464, 2474, 2482, 2488, 2496, 2515,
- 2523, 2529, 2537, 2547, 2555, 2561, 2569, 2591, 2599, 2605, 2613, 2623,
- 2631, 2637, 2645, 2664, 2672, 2678, 2686, 2696, 2704, 2710, 2718, 2516,
- 2524, 2530, 2538, 2548, 2556, 2562, 2570, 2589, 2597, 2603, 2611, 2621,
- 2629, 2635, 2643, 2665, 2673, 2679, 2687, 2697, 2705, 2711, 2719, 2738,
- 2746, 2752, 2760, 2770, 2778, 2784, 2792, 2818, 2826, 2832, 2840, 2850,
- 2858, 2864, 2872, 2891, 2899, 2905, 2913, 2923, 2931, 2937, 2945, 2967,
- 2975, 2981, 2989, 2999, 3007, 3013, 3021, 3040, 3048, 3054, 3062, 3072,
- 3080, 3086, 3094, 2960, 2968, 2974, 2982, 2992, 3000, 3006, 3014, 3033,
- 3041, 3047, 3055, 3065, 3073, 3079, 3087, 3109, 3117, 3123, 3131, 3141,
- 3149, 3155, 3163, 3182, 3190, 3196, 3204, 3214, 3222, 3228, 3236, 3262,
- 3270, 3276, 3284, 3294, 3302, 3308, 3316, 3335, 3343, 3349, 3357, 3367,
- 3375, 3381, 3389, 3411, 3419, 3425, 3433, 3443, 3451, 3457, 3465, 3484,
- 3492, 3498, 3506, 3516, 3524, 3530, 3538, 2807, 2815, 2821, 2829, 2839,
- 2847, 2853, 2861, 2880, 2888, 2894, 2902, 2912, 2920, 2926, 2934, 2956,
- 2964, 2970, 2978, 2988, 2996, 3002, 3010, 3029, 3037, 3043, 3051, 3061,
- 3069, 3075, 3083, 3109, 3117, 3123, 3131, 3141, 3149, 3155, 3163, 3182,
- 3190, 3196, 3204, 3214, 3222, 3228, 3236, 3258, 3266, 3272, 3280, 3290,
- 3298, 3304, 3312, 3331, 3339, 3345, 3353, 3363, 3371, 3377, 3385, 3251,
- 3259, 3265, 3273, 3283, 3291, 3297, 3305, 3324, 3332, 3338, 3346, 3356,
- 3364, 3370, 3378, 3400, 3408, 3414, 3422, 3432, 3440, 3446, 3454, 3473,
- 3481, 3487, 3495, 3505, 3513, 3519, 3527, 3553, 3561, 3567, 3575, 3585,
- 3593, 3599, 3607, 3626, 3634, 3640, 3648, 3658, 3666, 3672, 3680, 3702,
- 3710, 3716, 3724, 3734, 3742, 3748, 3756, 3775, 3783, 3789, 3797, 3807,
- 3815, 3821, 3829, 3627, 3635, 3641, 3649, 3659, 3667, 3673, 3681, 3700,
- 3708, 3714, 3722, 3732, 3740, 3746, 3754, 3776, 3784, 3790, 3798, 3808,
- 3816, 3822, 3830, 3849, 3857, 3863, 3871, 3881, 3889, 3895, 3903, 3929,
- 3937, 3943, 3951, 3961, 3969, 3975, 3983, 4002, 4010, 4016, 4024, 4034,
- 4042, 4048, 4056, 4078, 4086, 4092, 4100, 4110, 4118, 4124, 4132, 4151,
- 4159, 4165, 4173, 4183, 4191, 4197, 4205, 4071, 4079, 4085, 4093, 4103,
- 4111, 4117, 4125, 4144, 4152, 4158, 4166, 4176, 4184, 4190, 4198, 4220,
- 4228, 4234, 4242, 4252, 4260, 4266, 4274, 4293, 4301, 4307, 4315, 4325,
- 4333, 4339, 4347, 4373, 4381, 4387, 4395, 4405, 4413, 4419, 4427, 4446,
- 4454, 4460, 4468, 4478, 4486, 4492, 4500, 4522, 4530, 4536, 4544, 4554,
- 4562, 4568, 4576, 4595, 4603, 4609, 4617, 4627, 4635, 4641, 4649, 3742,
- 3750, 3756, 3764, 3774, 3782, 3788, 3796, 3815, 3823, 3829, 3837, 3847,
- 3855, 3861, 3869, 3891, 3899, 3905, 3913, 3923, 3931, 3937, 3945, 3964,
- 3972, 3978, 3986, 3996, 4004, 4010, 4018, 4044, 4052, 4058, 4066, 4076,
- 4084, 4090, 4098, 4117, 4125, 4131, 4139, 4149, 4157, 4163, 4171, 4193,
- 4201, 4207, 4215, 4225, 4233, 4239, 4247, 4266, 4274, 4280, 4288, 4298,
- 4306, 4312, 4320, 4186, 4194, 4200, 4208, 4218, 4226, 4232, 4240, 4259,
- 4267, 4273, 4281, 4291, 4299, 4305, 4313, 4335, 4343, 4349, 4357, 4367,
- 4375, 4381, 4389, 4408, 4416, 4422, 4430, 4440, 4448, 4454, 4462, 4488,
- 4496, 4502, 4510, 4520, 4528, 4534, 4542, 4561, 4569, 4575, 4583, 4593,
- 4601, 4607, 4615, 4637, 4645, 4651, 4659, 4669, 4677, 4683, 4691, 4710,
- 4718, 4724, 4732, 4742, 4750, 4756, 4764, 4562, 4570, 4576, 4584, 4594,
- 4602, 4608, 4616, 4635, 4643, 4649, 4657, 4667, 4675, 4681, 4689, 4711,
- 4719, 4725, 4733, 4743, 4751, 4757, 4765, 4784, 4792, 4798, 4806, 4816,
- 4824, 4830, 4838, 4864, 4872, 4878, 4886, 4896, 4904, 4910, 4918, 4937,
- 4945, 4951, 4959, 4969, 4977, 4983, 4991, 5013, 5021, 5027, 5035, 5045,
- 5053, 5059, 5067, 5086, 5094, 5100, 5108, 5118, 5126, 5132, 5140, 5006,
- 5014, 5020, 5028, 5038, 5046, 5052, 5060, 5079, 5087, 5093, 5101, 5111,
- 5119, 5125, 5133, 5155, 5163, 5169, 5177, 5187, 5195, 5201, 5209, 5228,
- 5236, 5242, 5250, 5260, 5268, 5274, 5282, 5308, 5316, 5322, 5330, 5340,
- 5348, 5354, 5362, 5381, 5389, 5395, 5403, 5413, 5421, 5427, 5435, 5457,
- 5465, 5471, 5479, 5489, 5497, 5503, 5511, 5530, 5538, 5544, 5552, 5562,
- 5570, 5576, 5584, 4853, 4861, 4867, 4875, 4885, 4893, 4899, 4907, 4926,
- 4934, 4940, 4948, 4958, 4966, 4972, 4980, 5002, 5010, 5016, 5024, 5034,
- 5042, 5048, 5056, 5075, 5083, 5089, 5097, 5107, 5115, 5121, 5129, 5155,
- 5163, 5169, 5177, 5187, 5195, 5201, 5209, 5228, 5236, 5242, 5250, 5260,
- 5268, 5274, 5282, 5304, 5312, 5318, 5326, 5336, 5344, 5350, 5358, 5377,
- 5385, 5391, 5399, 5409, 5417, 5423, 5431, 5297, 5305, 5311, 5319, 5329,
- 5337, 5343, 5351, 5370, 5378, 5384, 5392, 5402, 5410, 5416, 5424, 5446,
- 5454, 5460, 5468, 5478, 5486, 5492, 5500, 5519, 5527, 5533, 5541, 5551,
- 5559, 5565, 5573, 5599, 5607, 5613, 5621, 5631, 5639, 5645, 5653, 5672,
- 5680, 5686, 5694, 5704, 5712, 5718, 5726, 5748, 5756, 5762, 5770, 5780,
- 5788, 5794, 5802, 5821, 5829, 5835, 5843, 5853, 5861, 5867, 5875, 5673,
- 5681, 5687, 5695, 5705, 5713, 5719, 5727, 5746, 5754, 5760, 5768, 5778,
- 5786, 5792, 5800, 5822, 5830, 5836, 5844, 5854, 5862, 5868, 5876, 5895,
- 5903, 5909, 5917, 5927, 5935, 5941, 5949, 5975, 5983, 5989, 5997, 6007,
- 6015, 6021, 6029, 6048, 6056, 6062, 6070, 6080, 6088, 6094, 6102, 6124,
- 6132, 6138, 6146, 6156, 6164, 6170, 6178, 6197, 6205, 6211, 6219, 6229,
- 6237, 6243, 6251, 6117, 6125, 6131, 6139, 6149, 6157, 6163, 6171, 6190,
- 6198, 6204, 6212, 6222, 6230, 6236, 6244, 6266, 6274, 6280, 6288, 6298,
- 6306, 6312, 6320, 6339, 6347, 6353, 6361, 6371, 6379, 6385, 6393, 6419,
- 6427, 6433, 6441, 6451, 6459, 6465, 6473, 6492, 6500, 6506, 6514, 6524,
- 6532, 6538, 6546, 6568, 6576, 6582, 6590, 6600, 6608, 6614, 6622, 6641,
- 6649, 6655, 6663, 6673, 6681, 6687, 6695, 3742, 3750, 3756, 3764, 3774,
- 3782, 3788, 3796, 3815, 3823, 3829, 3837, 3847, 3855, 3861, 3869, 3891,
- 3899, 3905, 3913, 3923, 3931, 3937, 3945, 3964, 3972, 3978, 3986, 3996,
- 4004, 4010, 4018, 4044, 4052, 4058, 4066, 4076, 4084, 4090, 4098, 4117,
- 4125, 4131, 4139, 4149, 4157, 4163, 4171, 4193, 4201, 4207, 4215, 4225,
- 4233, 4239, 4247, 4266, 4274, 4280, 4288, 4298, 4306, 4312, 4320, 4186,
- 4194, 4200, 4208, 4218, 4226, 4232, 4240, 4259, 4267, 4273, 4281, 4291,
- 4299, 4305, 4313, 4335, 4343, 4349, 4357, 4367, 4375, 4381, 4389, 4408,
- 4416, 4422, 4430, 4440, 4448, 4454, 4462, 4488, 4496, 4502, 4510, 4520,
- 4528, 4534, 4542, 4561, 4569, 4575, 4583, 4593, 4601, 4607, 4615, 4637,
- 4645, 4651, 4659, 4669, 4677, 4683, 4691, 4710, 4718, 4724, 4732, 4742,
- 4750, 4756, 4764, 4562, 4570, 4576, 4584, 4594, 4602, 4608, 4616, 4635,
- 4643, 4649, 4657, 4667, 4675, 4681, 4689, 4711, 4719, 4725, 4733, 4743,
- 4751, 4757, 4765, 4784, 4792, 4798, 4806, 4816, 4824, 4830, 4838, 4864,
- 4872, 4878, 4886, 4896, 4904, 4910, 4918, 4937, 4945, 4951, 4959, 4969,
- 4977, 4983, 4991, 5013, 5021, 5027, 5035, 5045, 5053, 5059, 5067, 5086,
- 5094, 5100, 5108, 5118, 5126, 5132, 5140, 5006, 5014, 5020, 5028, 5038,
- 5046, 5052, 5060, 5079, 5087, 5093, 5101, 5111, 5119, 5125, 5133, 5155,
- 5163, 5169, 5177, 5187, 5195, 5201, 5209, 5228, 5236, 5242, 5250, 5260,
- 5268, 5274, 5282, 5308, 5316, 5322, 5330, 5340, 5348, 5354, 5362, 5381,
- 5389, 5395, 5403, 5413, 5421, 5427, 5435, 5457, 5465, 5471, 5479, 5489,
- 5497, 5503, 5511, 5530, 5538, 5544, 5552, 5562, 5570, 5576, 5584, 4853,
- 4861, 4867, 4875, 4885, 4893, 4899, 4907, 4926, 4934, 4940, 4948, 4958,
- 4966, 4972, 4980, 5002, 5010, 5016, 5024, 5034, 5042, 5048, 5056, 5075,
- 5083, 5089, 5097, 5107, 5115, 5121, 5129, 5155, 5163, 5169, 5177, 5187,
- 5195, 5201, 5209, 5228, 5236, 5242, 5250, 5260, 5268, 5274, 5282, 5304,
- 5312, 5318, 5326, 5336, 5344, 5350, 5358, 5377, 5385, 5391, 5399, 5409,
- 5417, 5423, 5431, 5297, 5305, 5311, 5319, 5329, 5337, 5343, 5351, 5370,
- 5378, 5384, 5392, 5402, 5410, 5416, 5424, 5446, 5454, 5460, 5468, 5478,
- 5486, 5492, 5500, 5519, 5527, 5533, 5541, 5551, 5559, 5565, 5573, 5599,
- 5607, 5613, 5621, 5631, 5639, 5645, 5653, 5672, 5680, 5686, 5694, 5704,
- 5712, 5718, 5726, 5748, 5756, 5762, 5770, 5780, 5788, 5794, 5802, 5821,
- 5829, 5835, 5843, 5853, 5861, 5867, 5875, 5673, 5681, 5687, 5695, 5705,
- 5713, 5719, 5727, 5746, 5754, 5760, 5768, 5778, 5786, 5792, 5800, 5822,
- 5830, 5836, 5844, 5854, 5862, 5868, 5876, 5895, 5903, 5909, 5917, 5927,
- 5935, 5941, 5949, 5975, 5983, 5989, 5997, 6007, 6015, 6021, 6029, 6048,
- 6056, 6062, 6070, 6080, 6088, 6094, 6102, 6124, 6132, 6138, 6146, 6156,
- 6164, 6170, 6178, 6197, 6205, 6211, 6219, 6229, 6237, 6243, 6251, 6117,
- 6125, 6131, 6139, 6149, 6157, 6163, 6171, 6190, 6198, 6204, 6212, 6222,
- 6230, 6236, 6244, 6266, 6274, 6280, 6288, 6298, 6306, 6312, 6320, 6339,
- 6347, 6353, 6361, 6371, 6379, 6385, 6393, 6419, 6427, 6433, 6441, 6451,
- 6459, 6465, 6473, 6492, 6500, 6506, 6514, 6524, 6532, 6538, 6546, 6568,
- 6576, 6582, 6590, 6600, 6608, 6614, 6622, 6641, 6649, 6655, 6663, 6673,
- 6681, 6687, 6695, 5788, 5796, 5802, 5810, 5820, 5828, 5834, 5842, 5861,
- 5869, 5875, 5883, 5893, 5901, 5907, 5915, 5937, 5945, 5951, 5959, 5969,
- 5977, 5983, 5991, 6010, 6018, 6024, 6032, 6042, 6050, 6056, 6064, 6090,
- 6098, 6104, 6112, 6122, 6130, 6136, 6144, 6163, 6171, 6177, 6185, 6195,
- 6203, 6209, 6217, 6239, 6247, 6253, 6261, 6271, 6279, 6285, 6293, 6312,
- 6320, 6326, 6334, 6344, 6352, 6358, 6366, 6232, 6240, 6246, 6254, 6264,
- 6272, 6278, 6286, 6305, 6313, 6319, 6327, 6337, 6345, 6351, 6359, 6381,
- 6389, 6395, 6403, 6413, 6421, 6427, 6435, 6454, 6462, 6468, 6476, 6486,
- 6494, 6500, 6508, 6534, 6542, 6548, 6556, 6566, 6574, 6580, 6588, 6607,
- 6615, 6621, 6629, 6639, 6647, 6653, 6661, 6683, 6691, 6697, 6705, 6715,
- 6723, 6729, 6737, 6756, 6764, 6770, 6778, 6788, 6796, 6802, 6810, 6608,
- 6616, 6622, 6630, 6640, 6648, 6654, 6662, 6681, 6689, 6695, 6703, 6713,
- 6721, 6727, 6735, 6757, 6765, 6771, 6779, 6789, 6797, 6803, 6811, 6830,
- 6838, 6844, 6852, 6862, 6870, 6876, 6884, 6910, 6918, 6924, 6932, 6942,
- 6950, 6956, 6964, 6983, 6991, 6997, 7005, 7015, 7023, 7029, 7037, 7059,
- 7067, 7073, 7081, 7091, 7099, 7105, 7113, 7132, 7140, 7146, 7154, 7164,
- 7172, 7178, 7186, 7052, 7060, 7066, 7074, 7084, 7092, 7098, 7106, 7125,
- 7133, 7139, 7147, 7157, 7165, 7171, 7179, 7201, 7209, 7215, 7223, 7233,
- 7241, 7247, 7255, 7274, 7282, 7288, 7296, 7306, 7314, 7320, 7328, 7354,
- 7362, 7368, 7376, 7386, 7394, 7400, 7408, 7427, 7435, 7441, 7449, 7459,
- 7467, 7473, 7481, 7503, 7511, 7517, 7525, 7535, 7543, 7549, 7557, 7576,
- 7584, 7590, 7598, 7608, 7616, 7622, 7630, 6899, 6907, 6913, 6921, 6931,
- 6939, 6945, 6953, 6972, 6980, 6986, 6994, 7004, 7012, 7018, 7026, 7048,
- 7056, 7062, 7070, 7080, 7088, 7094, 7102, 7121, 7129, 7135, 7143, 7153,
- 7161, 7167, 7175, 7201, 7209, 7215, 7223, 7233, 7241, 7247, 7255, 7274,
- 7282, 7288, 7296, 7306, 7314, 7320, 7328, 7350, 7358, 7364, 7372, 7382,
- 7390, 7396, 7404, 7423, 7431, 7437, 7445, 7455, 7463, 7469, 7477, 7343,
- 7351, 7357, 7365, 7375, 7383, 7389, 7397, 7416, 7424, 7430, 7438, 7448,
- 7456, 7462, 7470, 7492, 7500, 7506, 7514, 7524, 7532, 7538, 7546, 7565,
- 7573, 7579, 7587, 7597, 7605, 7611, 7619, 7645, 7653, 7659, 7667, 7677,
- 7685, 7691, 7699, 7718, 7726, 7732, 7740, 7750, 7758, 7764, 7772, 7794,
- 7802, 7808, 7816, 7826, 7834, 7840, 7848, 7867, 7875, 7881, 7889, 7899,
- 7907, 7913, 7921, 7719, 7727, 7733, 7741, 7751, 7759, 7765, 7773, 7792,
- 7800, 7806, 7814, 7824, 7832, 7838, 7846, 7868, 7876, 7882, 7890, 7900,
- 7908, 7914, 7922, 7941, 7949, 7955, 7963, 7973, 7981, 7987, 7995, 8021,
- 8029, 8035, 8043, 8053, 8061, 8067, 8075, 8094, 8102, 8108, 8116, 8126,
- 8134, 8140, 8148, 8170, 8178, 8184, 8192, 8202, 8210, 8216, 8224, 8243,
- 8251, 8257, 8265, 8275
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_DCT_VALUE_COST_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_tokens.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_tokens.h
deleted file mode 100644
index c2aadefca79..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/dct_value_tokens.h
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef VP8_ENCODER_DCT_VALUE_TOKENS_H_
-#define VP8_ENCODER_DCT_VALUE_TOKENS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Generated file, included by tokenize.c */
-/* Values generated by fill_value_tokens() */
-
-static const TOKENVALUE dct_value_tokens[2048*2] =
-{
- {10, 3963}, {10, 3961}, {10, 3959}, {10, 3957}, {10, 3955}, {10, 3953},
- {10, 3951}, {10, 3949}, {10, 3947}, {10, 3945}, {10, 3943}, {10, 3941},
- {10, 3939}, {10, 3937}, {10, 3935}, {10, 3933}, {10, 3931}, {10, 3929},
- {10, 3927}, {10, 3925}, {10, 3923}, {10, 3921}, {10, 3919}, {10, 3917},
- {10, 3915}, {10, 3913}, {10, 3911}, {10, 3909}, {10, 3907}, {10, 3905},
- {10, 3903}, {10, 3901}, {10, 3899}, {10, 3897}, {10, 3895}, {10, 3893},
- {10, 3891}, {10, 3889}, {10, 3887}, {10, 3885}, {10, 3883}, {10, 3881},
- {10, 3879}, {10, 3877}, {10, 3875}, {10, 3873}, {10, 3871}, {10, 3869},
- {10, 3867}, {10, 3865}, {10, 3863}, {10, 3861}, {10, 3859}, {10, 3857},
- {10, 3855}, {10, 3853}, {10, 3851}, {10, 3849}, {10, 3847}, {10, 3845},
- {10, 3843}, {10, 3841}, {10, 3839}, {10, 3837}, {10, 3835}, {10, 3833},
- {10, 3831}, {10, 3829}, {10, 3827}, {10, 3825}, {10, 3823}, {10, 3821},
- {10, 3819}, {10, 3817}, {10, 3815}, {10, 3813}, {10, 3811}, {10, 3809},
- {10, 3807}, {10, 3805}, {10, 3803}, {10, 3801}, {10, 3799}, {10, 3797},
- {10, 3795}, {10, 3793}, {10, 3791}, {10, 3789}, {10, 3787}, {10, 3785},
- {10, 3783}, {10, 3781}, {10, 3779}, {10, 3777}, {10, 3775}, {10, 3773},
- {10, 3771}, {10, 3769}, {10, 3767}, {10, 3765}, {10, 3763}, {10, 3761},
- {10, 3759}, {10, 3757}, {10, 3755}, {10, 3753}, {10, 3751}, {10, 3749},
- {10, 3747}, {10, 3745}, {10, 3743}, {10, 3741}, {10, 3739}, {10, 3737},
- {10, 3735}, {10, 3733}, {10, 3731}, {10, 3729}, {10, 3727}, {10, 3725},
- {10, 3723}, {10, 3721}, {10, 3719}, {10, 3717}, {10, 3715}, {10, 3713},
- {10, 3711}, {10, 3709}, {10, 3707}, {10, 3705}, {10, 3703}, {10, 3701},
- {10, 3699}, {10, 3697}, {10, 3695}, {10, 3693}, {10, 3691}, {10, 3689},
- {10, 3687}, {10, 3685}, {10, 3683}, {10, 3681}, {10, 3679}, {10, 3677},
- {10, 3675}, {10, 3673}, {10, 3671}, {10, 3669}, {10, 3667}, {10, 3665},
- {10, 3663}, {10, 3661}, {10, 3659}, {10, 3657}, {10, 3655}, {10, 3653},
- {10, 3651}, {10, 3649}, {10, 3647}, {10, 3645}, {10, 3643}, {10, 3641},
- {10, 3639}, {10, 3637}, {10, 3635}, {10, 3633}, {10, 3631}, {10, 3629},
- {10, 3627}, {10, 3625}, {10, 3623}, {10, 3621}, {10, 3619}, {10, 3617},
- {10, 3615}, {10, 3613}, {10, 3611}, {10, 3609}, {10, 3607}, {10, 3605},
- {10, 3603}, {10, 3601}, {10, 3599}, {10, 3597}, {10, 3595}, {10, 3593},
- {10, 3591}, {10, 3589}, {10, 3587}, {10, 3585}, {10, 3583}, {10, 3581},
- {10, 3579}, {10, 3577}, {10, 3575}, {10, 3573}, {10, 3571}, {10, 3569},
- {10, 3567}, {10, 3565}, {10, 3563}, {10, 3561}, {10, 3559}, {10, 3557},
- {10, 3555}, {10, 3553}, {10, 3551}, {10, 3549}, {10, 3547}, {10, 3545},
- {10, 3543}, {10, 3541}, {10, 3539}, {10, 3537}, {10, 3535}, {10, 3533},
- {10, 3531}, {10, 3529}, {10, 3527}, {10, 3525}, {10, 3523}, {10, 3521},
- {10, 3519}, {10, 3517}, {10, 3515}, {10, 3513}, {10, 3511}, {10, 3509},
- {10, 3507}, {10, 3505}, {10, 3503}, {10, 3501}, {10, 3499}, {10, 3497},
- {10, 3495}, {10, 3493}, {10, 3491}, {10, 3489}, {10, 3487}, {10, 3485},
- {10, 3483}, {10, 3481}, {10, 3479}, {10, 3477}, {10, 3475}, {10, 3473},
- {10, 3471}, {10, 3469}, {10, 3467}, {10, 3465}, {10, 3463}, {10, 3461},
- {10, 3459}, {10, 3457}, {10, 3455}, {10, 3453}, {10, 3451}, {10, 3449},
- {10, 3447}, {10, 3445}, {10, 3443}, {10, 3441}, {10, 3439}, {10, 3437},
- {10, 3435}, {10, 3433}, {10, 3431}, {10, 3429}, {10, 3427}, {10, 3425},
- {10, 3423}, {10, 3421}, {10, 3419}, {10, 3417}, {10, 3415}, {10, 3413},
- {10, 3411}, {10, 3409}, {10, 3407}, {10, 3405}, {10, 3403}, {10, 3401},
- {10, 3399}, {10, 3397}, {10, 3395}, {10, 3393}, {10, 3391}, {10, 3389},
- {10, 3387}, {10, 3385}, {10, 3383}, {10, 3381}, {10, 3379}, {10, 3377},
- {10, 3375}, {10, 3373}, {10, 3371}, {10, 3369}, {10, 3367}, {10, 3365},
- {10, 3363}, {10, 3361}, {10, 3359}, {10, 3357}, {10, 3355}, {10, 3353},
- {10, 3351}, {10, 3349}, {10, 3347}, {10, 3345}, {10, 3343}, {10, 3341},
- {10, 3339}, {10, 3337}, {10, 3335}, {10, 3333}, {10, 3331}, {10, 3329},
- {10, 3327}, {10, 3325}, {10, 3323}, {10, 3321}, {10, 3319}, {10, 3317},
- {10, 3315}, {10, 3313}, {10, 3311}, {10, 3309}, {10, 3307}, {10, 3305},
- {10, 3303}, {10, 3301}, {10, 3299}, {10, 3297}, {10, 3295}, {10, 3293},
- {10, 3291}, {10, 3289}, {10, 3287}, {10, 3285}, {10, 3283}, {10, 3281},
- {10, 3279}, {10, 3277}, {10, 3275}, {10, 3273}, {10, 3271}, {10, 3269},
- {10, 3267}, {10, 3265}, {10, 3263}, {10, 3261}, {10, 3259}, {10, 3257},
- {10, 3255}, {10, 3253}, {10, 3251}, {10, 3249}, {10, 3247}, {10, 3245},
- {10, 3243}, {10, 3241}, {10, 3239}, {10, 3237}, {10, 3235}, {10, 3233},
- {10, 3231}, {10, 3229}, {10, 3227}, {10, 3225}, {10, 3223}, {10, 3221},
- {10, 3219}, {10, 3217}, {10, 3215}, {10, 3213}, {10, 3211}, {10, 3209},
- {10, 3207}, {10, 3205}, {10, 3203}, {10, 3201}, {10, 3199}, {10, 3197},
- {10, 3195}, {10, 3193}, {10, 3191}, {10, 3189}, {10, 3187}, {10, 3185},
- {10, 3183}, {10, 3181}, {10, 3179}, {10, 3177}, {10, 3175}, {10, 3173},
- {10, 3171}, {10, 3169}, {10, 3167}, {10, 3165}, {10, 3163}, {10, 3161},
- {10, 3159}, {10, 3157}, {10, 3155}, {10, 3153}, {10, 3151}, {10, 3149},
- {10, 3147}, {10, 3145}, {10, 3143}, {10, 3141}, {10, 3139}, {10, 3137},
- {10, 3135}, {10, 3133}, {10, 3131}, {10, 3129}, {10, 3127}, {10, 3125},
- {10, 3123}, {10, 3121}, {10, 3119}, {10, 3117}, {10, 3115}, {10, 3113},
- {10, 3111}, {10, 3109}, {10, 3107}, {10, 3105}, {10, 3103}, {10, 3101},
- {10, 3099}, {10, 3097}, {10, 3095}, {10, 3093}, {10, 3091}, {10, 3089},
- {10, 3087}, {10, 3085}, {10, 3083}, {10, 3081}, {10, 3079}, {10, 3077},
- {10, 3075}, {10, 3073}, {10, 3071}, {10, 3069}, {10, 3067}, {10, 3065},
- {10, 3063}, {10, 3061}, {10, 3059}, {10, 3057}, {10, 3055}, {10, 3053},
- {10, 3051}, {10, 3049}, {10, 3047}, {10, 3045}, {10, 3043}, {10, 3041},
- {10, 3039}, {10, 3037}, {10, 3035}, {10, 3033}, {10, 3031}, {10, 3029},
- {10, 3027}, {10, 3025}, {10, 3023}, {10, 3021}, {10, 3019}, {10, 3017},
- {10, 3015}, {10, 3013}, {10, 3011}, {10, 3009}, {10, 3007}, {10, 3005},
- {10, 3003}, {10, 3001}, {10, 2999}, {10, 2997}, {10, 2995}, {10, 2993},
- {10, 2991}, {10, 2989}, {10, 2987}, {10, 2985}, {10, 2983}, {10, 2981},
- {10, 2979}, {10, 2977}, {10, 2975}, {10, 2973}, {10, 2971}, {10, 2969},
- {10, 2967}, {10, 2965}, {10, 2963}, {10, 2961}, {10, 2959}, {10, 2957},
- {10, 2955}, {10, 2953}, {10, 2951}, {10, 2949}, {10, 2947}, {10, 2945},
- {10, 2943}, {10, 2941}, {10, 2939}, {10, 2937}, {10, 2935}, {10, 2933},
- {10, 2931}, {10, 2929}, {10, 2927}, {10, 2925}, {10, 2923}, {10, 2921},
- {10, 2919}, {10, 2917}, {10, 2915}, {10, 2913}, {10, 2911}, {10, 2909},
- {10, 2907}, {10, 2905}, {10, 2903}, {10, 2901}, {10, 2899}, {10, 2897},
- {10, 2895}, {10, 2893}, {10, 2891}, {10, 2889}, {10, 2887}, {10, 2885},
- {10, 2883}, {10, 2881}, {10, 2879}, {10, 2877}, {10, 2875}, {10, 2873},
- {10, 2871}, {10, 2869}, {10, 2867}, {10, 2865}, {10, 2863}, {10, 2861},
- {10, 2859}, {10, 2857}, {10, 2855}, {10, 2853}, {10, 2851}, {10, 2849},
- {10, 2847}, {10, 2845}, {10, 2843}, {10, 2841}, {10, 2839}, {10, 2837},
- {10, 2835}, {10, 2833}, {10, 2831}, {10, 2829}, {10, 2827}, {10, 2825},
- {10, 2823}, {10, 2821}, {10, 2819}, {10, 2817}, {10, 2815}, {10, 2813},
- {10, 2811}, {10, 2809}, {10, 2807}, {10, 2805}, {10, 2803}, {10, 2801},
- {10, 2799}, {10, 2797}, {10, 2795}, {10, 2793}, {10, 2791}, {10, 2789},
- {10, 2787}, {10, 2785}, {10, 2783}, {10, 2781}, {10, 2779}, {10, 2777},
- {10, 2775}, {10, 2773}, {10, 2771}, {10, 2769}, {10, 2767}, {10, 2765},
- {10, 2763}, {10, 2761}, {10, 2759}, {10, 2757}, {10, 2755}, {10, 2753},
- {10, 2751}, {10, 2749}, {10, 2747}, {10, 2745}, {10, 2743}, {10, 2741},
- {10, 2739}, {10, 2737}, {10, 2735}, {10, 2733}, {10, 2731}, {10, 2729},
- {10, 2727}, {10, 2725}, {10, 2723}, {10, 2721}, {10, 2719}, {10, 2717},
- {10, 2715}, {10, 2713}, {10, 2711}, {10, 2709}, {10, 2707}, {10, 2705},
- {10, 2703}, {10, 2701}, {10, 2699}, {10, 2697}, {10, 2695}, {10, 2693},
- {10, 2691}, {10, 2689}, {10, 2687}, {10, 2685}, {10, 2683}, {10, 2681},
- {10, 2679}, {10, 2677}, {10, 2675}, {10, 2673}, {10, 2671}, {10, 2669},
- {10, 2667}, {10, 2665}, {10, 2663}, {10, 2661}, {10, 2659}, {10, 2657},
- {10, 2655}, {10, 2653}, {10, 2651}, {10, 2649}, {10, 2647}, {10, 2645},
- {10, 2643}, {10, 2641}, {10, 2639}, {10, 2637}, {10, 2635}, {10, 2633},
- {10, 2631}, {10, 2629}, {10, 2627}, {10, 2625}, {10, 2623}, {10, 2621},
- {10, 2619}, {10, 2617}, {10, 2615}, {10, 2613}, {10, 2611}, {10, 2609},
- {10, 2607}, {10, 2605}, {10, 2603}, {10, 2601}, {10, 2599}, {10, 2597},
- {10, 2595}, {10, 2593}, {10, 2591}, {10, 2589}, {10, 2587}, {10, 2585},
- {10, 2583}, {10, 2581}, {10, 2579}, {10, 2577}, {10, 2575}, {10, 2573},
- {10, 2571}, {10, 2569}, {10, 2567}, {10, 2565}, {10, 2563}, {10, 2561},
- {10, 2559}, {10, 2557}, {10, 2555}, {10, 2553}, {10, 2551}, {10, 2549},
- {10, 2547}, {10, 2545}, {10, 2543}, {10, 2541}, {10, 2539}, {10, 2537},
- {10, 2535}, {10, 2533}, {10, 2531}, {10, 2529}, {10, 2527}, {10, 2525},
- {10, 2523}, {10, 2521}, {10, 2519}, {10, 2517}, {10, 2515}, {10, 2513},
- {10, 2511}, {10, 2509}, {10, 2507}, {10, 2505}, {10, 2503}, {10, 2501},
- {10, 2499}, {10, 2497}, {10, 2495}, {10, 2493}, {10, 2491}, {10, 2489},
- {10, 2487}, {10, 2485}, {10, 2483}, {10, 2481}, {10, 2479}, {10, 2477},
- {10, 2475}, {10, 2473}, {10, 2471}, {10, 2469}, {10, 2467}, {10, 2465},
- {10, 2463}, {10, 2461}, {10, 2459}, {10, 2457}, {10, 2455}, {10, 2453},
- {10, 2451}, {10, 2449}, {10, 2447}, {10, 2445}, {10, 2443}, {10, 2441},
- {10, 2439}, {10, 2437}, {10, 2435}, {10, 2433}, {10, 2431}, {10, 2429},
- {10, 2427}, {10, 2425}, {10, 2423}, {10, 2421}, {10, 2419}, {10, 2417},
- {10, 2415}, {10, 2413}, {10, 2411}, {10, 2409}, {10, 2407}, {10, 2405},
- {10, 2403}, {10, 2401}, {10, 2399}, {10, 2397}, {10, 2395}, {10, 2393},
- {10, 2391}, {10, 2389}, {10, 2387}, {10, 2385}, {10, 2383}, {10, 2381},
- {10, 2379}, {10, 2377}, {10, 2375}, {10, 2373}, {10, 2371}, {10, 2369},
- {10, 2367}, {10, 2365}, {10, 2363}, {10, 2361}, {10, 2359}, {10, 2357},
- {10, 2355}, {10, 2353}, {10, 2351}, {10, 2349}, {10, 2347}, {10, 2345},
- {10, 2343}, {10, 2341}, {10, 2339}, {10, 2337}, {10, 2335}, {10, 2333},
- {10, 2331}, {10, 2329}, {10, 2327}, {10, 2325}, {10, 2323}, {10, 2321},
- {10, 2319}, {10, 2317}, {10, 2315}, {10, 2313}, {10, 2311}, {10, 2309},
- {10, 2307}, {10, 2305}, {10, 2303}, {10, 2301}, {10, 2299}, {10, 2297},
- {10, 2295}, {10, 2293}, {10, 2291}, {10, 2289}, {10, 2287}, {10, 2285},
- {10, 2283}, {10, 2281}, {10, 2279}, {10, 2277}, {10, 2275}, {10, 2273},
- {10, 2271}, {10, 2269}, {10, 2267}, {10, 2265}, {10, 2263}, {10, 2261},
- {10, 2259}, {10, 2257}, {10, 2255}, {10, 2253}, {10, 2251}, {10, 2249},
- {10, 2247}, {10, 2245}, {10, 2243}, {10, 2241}, {10, 2239}, {10, 2237},
- {10, 2235}, {10, 2233}, {10, 2231}, {10, 2229}, {10, 2227}, {10, 2225},
- {10, 2223}, {10, 2221}, {10, 2219}, {10, 2217}, {10, 2215}, {10, 2213},
- {10, 2211}, {10, 2209}, {10, 2207}, {10, 2205}, {10, 2203}, {10, 2201},
- {10, 2199}, {10, 2197}, {10, 2195}, {10, 2193}, {10, 2191}, {10, 2189},
- {10, 2187}, {10, 2185}, {10, 2183}, {10, 2181}, {10, 2179}, {10, 2177},
- {10, 2175}, {10, 2173}, {10, 2171}, {10, 2169}, {10, 2167}, {10, 2165},
- {10, 2163}, {10, 2161}, {10, 2159}, {10, 2157}, {10, 2155}, {10, 2153},
- {10, 2151}, {10, 2149}, {10, 2147}, {10, 2145}, {10, 2143}, {10, 2141},
- {10, 2139}, {10, 2137}, {10, 2135}, {10, 2133}, {10, 2131}, {10, 2129},
- {10, 2127}, {10, 2125}, {10, 2123}, {10, 2121}, {10, 2119}, {10, 2117},
- {10, 2115}, {10, 2113}, {10, 2111}, {10, 2109}, {10, 2107}, {10, 2105},
- {10, 2103}, {10, 2101}, {10, 2099}, {10, 2097}, {10, 2095}, {10, 2093},
- {10, 2091}, {10, 2089}, {10, 2087}, {10, 2085}, {10, 2083}, {10, 2081},
- {10, 2079}, {10, 2077}, {10, 2075}, {10, 2073}, {10, 2071}, {10, 2069},
- {10, 2067}, {10, 2065}, {10, 2063}, {10, 2061}, {10, 2059}, {10, 2057},
- {10, 2055}, {10, 2053}, {10, 2051}, {10, 2049}, {10, 2047}, {10, 2045},
- {10, 2043}, {10, 2041}, {10, 2039}, {10, 2037}, {10, 2035}, {10, 2033},
- {10, 2031}, {10, 2029}, {10, 2027}, {10, 2025}, {10, 2023}, {10, 2021},
- {10, 2019}, {10, 2017}, {10, 2015}, {10, 2013}, {10, 2011}, {10, 2009},
- {10, 2007}, {10, 2005}, {10, 2003}, {10, 2001}, {10, 1999}, {10, 1997},
- {10, 1995}, {10, 1993}, {10, 1991}, {10, 1989}, {10, 1987}, {10, 1985},
- {10, 1983}, {10, 1981}, {10, 1979}, {10, 1977}, {10, 1975}, {10, 1973},
- {10, 1971}, {10, 1969}, {10, 1967}, {10, 1965}, {10, 1963}, {10, 1961},
- {10, 1959}, {10, 1957}, {10, 1955}, {10, 1953}, {10, 1951}, {10, 1949},
- {10, 1947}, {10, 1945}, {10, 1943}, {10, 1941}, {10, 1939}, {10, 1937},
- {10, 1935}, {10, 1933}, {10, 1931}, {10, 1929}, {10, 1927}, {10, 1925},
- {10, 1923}, {10, 1921}, {10, 1919}, {10, 1917}, {10, 1915}, {10, 1913},
- {10, 1911}, {10, 1909}, {10, 1907}, {10, 1905}, {10, 1903}, {10, 1901},
- {10, 1899}, {10, 1897}, {10, 1895}, {10, 1893}, {10, 1891}, {10, 1889},
- {10, 1887}, {10, 1885}, {10, 1883}, {10, 1881}, {10, 1879}, {10, 1877},
- {10, 1875}, {10, 1873}, {10, 1871}, {10, 1869}, {10, 1867}, {10, 1865},
- {10, 1863}, {10, 1861}, {10, 1859}, {10, 1857}, {10, 1855}, {10, 1853},
- {10, 1851}, {10, 1849}, {10, 1847}, {10, 1845}, {10, 1843}, {10, 1841},
- {10, 1839}, {10, 1837}, {10, 1835}, {10, 1833}, {10, 1831}, {10, 1829},
- {10, 1827}, {10, 1825}, {10, 1823}, {10, 1821}, {10, 1819}, {10, 1817},
- {10, 1815}, {10, 1813}, {10, 1811}, {10, 1809}, {10, 1807}, {10, 1805},
- {10, 1803}, {10, 1801}, {10, 1799}, {10, 1797}, {10, 1795}, {10, 1793},
- {10, 1791}, {10, 1789}, {10, 1787}, {10, 1785}, {10, 1783}, {10, 1781},
- {10, 1779}, {10, 1777}, {10, 1775}, {10, 1773}, {10, 1771}, {10, 1769},
- {10, 1767}, {10, 1765}, {10, 1763}, {10, 1761}, {10, 1759}, {10, 1757},
- {10, 1755}, {10, 1753}, {10, 1751}, {10, 1749}, {10, 1747}, {10, 1745},
- {10, 1743}, {10, 1741}, {10, 1739}, {10, 1737}, {10, 1735}, {10, 1733},
- {10, 1731}, {10, 1729}, {10, 1727}, {10, 1725}, {10, 1723}, {10, 1721},
- {10, 1719}, {10, 1717}, {10, 1715}, {10, 1713}, {10, 1711}, {10, 1709},
- {10, 1707}, {10, 1705}, {10, 1703}, {10, 1701}, {10, 1699}, {10, 1697},
- {10, 1695}, {10, 1693}, {10, 1691}, {10, 1689}, {10, 1687}, {10, 1685},
- {10, 1683}, {10, 1681}, {10, 1679}, {10, 1677}, {10, 1675}, {10, 1673},
- {10, 1671}, {10, 1669}, {10, 1667}, {10, 1665}, {10, 1663}, {10, 1661},
- {10, 1659}, {10, 1657}, {10, 1655}, {10, 1653}, {10, 1651}, {10, 1649},
- {10, 1647}, {10, 1645}, {10, 1643}, {10, 1641}, {10, 1639}, {10, 1637},
- {10, 1635}, {10, 1633}, {10, 1631}, {10, 1629}, {10, 1627}, {10, 1625},
- {10, 1623}, {10, 1621}, {10, 1619}, {10, 1617}, {10, 1615}, {10, 1613},
- {10, 1611}, {10, 1609}, {10, 1607}, {10, 1605}, {10, 1603}, {10, 1601},
- {10, 1599}, {10, 1597}, {10, 1595}, {10, 1593}, {10, 1591}, {10, 1589},
- {10, 1587}, {10, 1585}, {10, 1583}, {10, 1581}, {10, 1579}, {10, 1577},
- {10, 1575}, {10, 1573}, {10, 1571}, {10, 1569}, {10, 1567}, {10, 1565},
- {10, 1563}, {10, 1561}, {10, 1559}, {10, 1557}, {10, 1555}, {10, 1553},
- {10, 1551}, {10, 1549}, {10, 1547}, {10, 1545}, {10, 1543}, {10, 1541},
- {10, 1539}, {10, 1537}, {10, 1535}, {10, 1533}, {10, 1531}, {10, 1529},
- {10, 1527}, {10, 1525}, {10, 1523}, {10, 1521}, {10, 1519}, {10, 1517},
- {10, 1515}, {10, 1513}, {10, 1511}, {10, 1509}, {10, 1507}, {10, 1505},
- {10, 1503}, {10, 1501}, {10, 1499}, {10, 1497}, {10, 1495}, {10, 1493},
- {10, 1491}, {10, 1489}, {10, 1487}, {10, 1485}, {10, 1483}, {10, 1481},
- {10, 1479}, {10, 1477}, {10, 1475}, {10, 1473}, {10, 1471}, {10, 1469},
- {10, 1467}, {10, 1465}, {10, 1463}, {10, 1461}, {10, 1459}, {10, 1457},
- {10, 1455}, {10, 1453}, {10, 1451}, {10, 1449}, {10, 1447}, {10, 1445},
- {10, 1443}, {10, 1441}, {10, 1439}, {10, 1437}, {10, 1435}, {10, 1433},
- {10, 1431}, {10, 1429}, {10, 1427}, {10, 1425}, {10, 1423}, {10, 1421},
- {10, 1419}, {10, 1417}, {10, 1415}, {10, 1413}, {10, 1411}, {10, 1409},
- {10, 1407}, {10, 1405}, {10, 1403}, {10, 1401}, {10, 1399}, {10, 1397},
- {10, 1395}, {10, 1393}, {10, 1391}, {10, 1389}, {10, 1387}, {10, 1385},
- {10, 1383}, {10, 1381}, {10, 1379}, {10, 1377}, {10, 1375}, {10, 1373},
- {10, 1371}, {10, 1369}, {10, 1367}, {10, 1365}, {10, 1363}, {10, 1361},
- {10, 1359}, {10, 1357}, {10, 1355}, {10, 1353}, {10, 1351}, {10, 1349},
- {10, 1347}, {10, 1345}, {10, 1343}, {10, 1341}, {10, 1339}, {10, 1337},
- {10, 1335}, {10, 1333}, {10, 1331}, {10, 1329}, {10, 1327}, {10, 1325},
- {10, 1323}, {10, 1321}, {10, 1319}, {10, 1317}, {10, 1315}, {10, 1313},
- {10, 1311}, {10, 1309}, {10, 1307}, {10, 1305}, {10, 1303}, {10, 1301},
- {10, 1299}, {10, 1297}, {10, 1295}, {10, 1293}, {10, 1291}, {10, 1289},
- {10, 1287}, {10, 1285}, {10, 1283}, {10, 1281}, {10, 1279}, {10, 1277},
- {10, 1275}, {10, 1273}, {10, 1271}, {10, 1269}, {10, 1267}, {10, 1265},
- {10, 1263}, {10, 1261}, {10, 1259}, {10, 1257}, {10, 1255}, {10, 1253},
- {10, 1251}, {10, 1249}, {10, 1247}, {10, 1245}, {10, 1243}, {10, 1241},
- {10, 1239}, {10, 1237}, {10, 1235}, {10, 1233}, {10, 1231}, {10, 1229},
- {10, 1227}, {10, 1225}, {10, 1223}, {10, 1221}, {10, 1219}, {10, 1217},
- {10, 1215}, {10, 1213}, {10, 1211}, {10, 1209}, {10, 1207}, {10, 1205},
- {10, 1203}, {10, 1201}, {10, 1199}, {10, 1197}, {10, 1195}, {10, 1193},
- {10, 1191}, {10, 1189}, {10, 1187}, {10, 1185}, {10, 1183}, {10, 1181},
- {10, 1179}, {10, 1177}, {10, 1175}, {10, 1173}, {10, 1171}, {10, 1169},
- {10, 1167}, {10, 1165}, {10, 1163}, {10, 1161}, {10, 1159}, {10, 1157},
- {10, 1155}, {10, 1153}, {10, 1151}, {10, 1149}, {10, 1147}, {10, 1145},
- {10, 1143}, {10, 1141}, {10, 1139}, {10, 1137}, {10, 1135}, {10, 1133},
- {10, 1131}, {10, 1129}, {10, 1127}, {10, 1125}, {10, 1123}, {10, 1121},
- {10, 1119}, {10, 1117}, {10, 1115}, {10, 1113}, {10, 1111}, {10, 1109},
- {10, 1107}, {10, 1105}, {10, 1103}, {10, 1101}, {10, 1099}, {10, 1097},
- {10, 1095}, {10, 1093}, {10, 1091}, {10, 1089}, {10, 1087}, {10, 1085},
- {10, 1083}, {10, 1081}, {10, 1079}, {10, 1077}, {10, 1075}, {10, 1073},
- {10, 1071}, {10, 1069}, {10, 1067}, {10, 1065}, {10, 1063}, {10, 1061},
- {10, 1059}, {10, 1057}, {10, 1055}, {10, 1053}, {10, 1051}, {10, 1049},
- {10, 1047}, {10, 1045}, {10, 1043}, {10, 1041}, {10, 1039}, {10, 1037},
- {10, 1035}, {10, 1033}, {10, 1031}, {10, 1029}, {10, 1027}, {10, 1025},
- {10, 1023}, {10, 1021}, {10, 1019}, {10, 1017}, {10, 1015}, {10, 1013},
- {10, 1011}, {10, 1009}, {10, 1007}, {10, 1005}, {10, 1003}, {10, 1001},
- {10, 999}, {10, 997}, {10, 995}, {10, 993}, {10, 991}, {10, 989},
- {10, 987}, {10, 985}, {10, 983}, {10, 981}, {10, 979}, {10, 977},
- {10, 975}, {10, 973}, {10, 971}, {10, 969}, {10, 967}, {10, 965},
- {10, 963}, {10, 961}, {10, 959}, {10, 957}, {10, 955}, {10, 953},
- {10, 951}, {10, 949}, {10, 947}, {10, 945}, {10, 943}, {10, 941},
- {10, 939}, {10, 937}, {10, 935}, {10, 933}, {10, 931}, {10, 929},
- {10, 927}, {10, 925}, {10, 923}, {10, 921}, {10, 919}, {10, 917},
- {10, 915}, {10, 913}, {10, 911}, {10, 909}, {10, 907}, {10, 905},
- {10, 903}, {10, 901}, {10, 899}, {10, 897}, {10, 895}, {10, 893},
- {10, 891}, {10, 889}, {10, 887}, {10, 885}, {10, 883}, {10, 881},
- {10, 879}, {10, 877}, {10, 875}, {10, 873}, {10, 871}, {10, 869},
- {10, 867}, {10, 865}, {10, 863}, {10, 861}, {10, 859}, {10, 857},
- {10, 855}, {10, 853}, {10, 851}, {10, 849}, {10, 847}, {10, 845},
- {10, 843}, {10, 841}, {10, 839}, {10, 837}, {10, 835}, {10, 833},
- {10, 831}, {10, 829}, {10, 827}, {10, 825}, {10, 823}, {10, 821},
- {10, 819}, {10, 817}, {10, 815}, {10, 813}, {10, 811}, {10, 809},
- {10, 807}, {10, 805}, {10, 803}, {10, 801}, {10, 799}, {10, 797},
- {10, 795}, {10, 793}, {10, 791}, {10, 789}, {10, 787}, {10, 785},
- {10, 783}, {10, 781}, {10, 779}, {10, 777}, {10, 775}, {10, 773},
- {10, 771}, {10, 769}, {10, 767}, {10, 765}, {10, 763}, {10, 761},
- {10, 759}, {10, 757}, {10, 755}, {10, 753}, {10, 751}, {10, 749},
- {10, 747}, {10, 745}, {10, 743}, {10, 741}, {10, 739}, {10, 737},
- {10, 735}, {10, 733}, {10, 731}, {10, 729}, {10, 727}, {10, 725},
- {10, 723}, {10, 721}, {10, 719}, {10, 717}, {10, 715}, {10, 713},
- {10, 711}, {10, 709}, {10, 707}, {10, 705}, {10, 703}, {10, 701},
- {10, 699}, {10, 697}, {10, 695}, {10, 693}, {10, 691}, {10, 689},
- {10, 687}, {10, 685}, {10, 683}, {10, 681}, {10, 679}, {10, 677},
- {10, 675}, {10, 673}, {10, 671}, {10, 669}, {10, 667}, {10, 665},
- {10, 663}, {10, 661}, {10, 659}, {10, 657}, {10, 655}, {10, 653},
- {10, 651}, {10, 649}, {10, 647}, {10, 645}, {10, 643}, {10, 641},
- {10, 639}, {10, 637}, {10, 635}, {10, 633}, {10, 631}, {10, 629},
- {10, 627}, {10, 625}, {10, 623}, {10, 621}, {10, 619}, {10, 617},
- {10, 615}, {10, 613}, {10, 611}, {10, 609}, {10, 607}, {10, 605},
- {10, 603}, {10, 601}, {10, 599}, {10, 597}, {10, 595}, {10, 593},
- {10, 591}, {10, 589}, {10, 587}, {10, 585}, {10, 583}, {10, 581},
- {10, 579}, {10, 577}, {10, 575}, {10, 573}, {10, 571}, {10, 569},
- {10, 567}, {10, 565}, {10, 563}, {10, 561}, {10, 559}, {10, 557},
- {10, 555}, {10, 553}, {10, 551}, {10, 549}, {10, 547}, {10, 545},
- {10, 543}, {10, 541}, {10, 539}, {10, 537}, {10, 535}, {10, 533},
- {10, 531}, {10, 529}, {10, 527}, {10, 525}, {10, 523}, {10, 521},
- {10, 519}, {10, 517}, {10, 515}, {10, 513}, {10, 511}, {10, 509},
- {10, 507}, {10, 505}, {10, 503}, {10, 501}, {10, 499}, {10, 497},
- {10, 495}, {10, 493}, {10, 491}, {10, 489}, {10, 487}, {10, 485},
- {10, 483}, {10, 481}, {10, 479}, {10, 477}, {10, 475}, {10, 473},
- {10, 471}, {10, 469}, {10, 467}, {10, 465}, {10, 463}, {10, 461},
- {10, 459}, {10, 457}, {10, 455}, {10, 453}, {10, 451}, {10, 449},
- {10, 447}, {10, 445}, {10, 443}, {10, 441}, {10, 439}, {10, 437},
- {10, 435}, {10, 433}, {10, 431}, {10, 429}, {10, 427}, {10, 425},
- {10, 423}, {10, 421}, {10, 419}, {10, 417}, {10, 415}, {10, 413},
- {10, 411}, {10, 409}, {10, 407}, {10, 405}, {10, 403}, {10, 401},
- {10, 399}, {10, 397}, {10, 395}, {10, 393}, {10, 391}, {10, 389},
- {10, 387}, {10, 385}, {10, 383}, {10, 381}, {10, 379}, {10, 377},
- {10, 375}, {10, 373}, {10, 371}, {10, 369}, {10, 367}, {10, 365},
- {10, 363}, {10, 361}, {10, 359}, {10, 357}, {10, 355}, {10, 353},
- {10, 351}, {10, 349}, {10, 347}, {10, 345}, {10, 343}, {10, 341},
- {10, 339}, {10, 337}, {10, 335}, {10, 333}, {10, 331}, {10, 329},
- {10, 327}, {10, 325}, {10, 323}, {10, 321}, {10, 319}, {10, 317},
- {10, 315}, {10, 313}, {10, 311}, {10, 309}, {10, 307}, {10, 305},
- {10, 303}, {10, 301}, {10, 299}, {10, 297}, {10, 295}, {10, 293},
- {10, 291}, {10, 289}, {10, 287}, {10, 285}, {10, 283}, {10, 281},
- {10, 279}, {10, 277}, {10, 275}, {10, 273}, {10, 271}, {10, 269},
- {10, 267}, {10, 265}, {10, 263}, {10, 261}, {10, 259}, {10, 257},
- {10, 255}, {10, 253}, {10, 251}, {10, 249}, {10, 247}, {10, 245},
- {10, 243}, {10, 241}, {10, 239}, {10, 237}, {10, 235}, {10, 233},
- {10, 231}, {10, 229}, {10, 227}, {10, 225}, {10, 223}, {10, 221},
- {10, 219}, {10, 217}, {10, 215}, {10, 213}, {10, 211}, {10, 209},
- {10, 207}, {10, 205}, {10, 203}, {10, 201}, {10, 199}, {10, 197},
- {10, 195}, {10, 193}, {10, 191}, {10, 189}, {10, 187}, {10, 185},
- {10, 183}, {10, 181}, {10, 179}, {10, 177}, {10, 175}, {10, 173},
- {10, 171}, {10, 169}, {10, 167}, {10, 165}, {10, 163}, {10, 161},
- {10, 159}, {10, 157}, {10, 155}, {10, 153}, {10, 151}, {10, 149},
- {10, 147}, {10, 145}, {10, 143}, {10, 141}, {10, 139}, {10, 137},
- {10, 135}, {10, 133}, {10, 131}, {10, 129}, {10, 127}, {10, 125},
- {10, 123}, {10, 121}, {10, 119}, {10, 117}, {10, 115}, {10, 113},
- {10, 111}, {10, 109}, {10, 107}, {10, 105}, {10, 103}, {10, 101},
- {10, 99}, {10, 97}, {10, 95}, {10, 93}, {10, 91}, {10, 89},
- {10, 87}, {10, 85}, {10, 83}, {10, 81}, {10, 79}, {10, 77},
- {10, 75}, {10, 73}, {10, 71}, {10, 69}, {10, 67}, {10, 65},
- {10, 63}, {10, 61}, {10, 59}, {10, 57}, {10, 55}, {10, 53},
- {10, 51}, {10, 49}, {10, 47}, {10, 45}, {10, 43}, {10, 41},
- {10, 39}, {10, 37}, {10, 35}, {10, 33}, {10, 31}, {10, 29},
- {10, 27}, {10, 25}, {10, 23}, {10, 21}, {10, 19}, {10, 17},
- {10, 15}, {10, 13}, {10, 11}, {10, 9}, {10, 7}, {10, 5},
- {10, 3}, {10, 1}, {9, 63}, {9, 61}, {9, 59}, {9, 57},
- {9, 55}, {9, 53}, {9, 51}, {9, 49}, {9, 47}, {9, 45},
- {9, 43}, {9, 41}, {9, 39}, {9, 37}, {9, 35}, {9, 33},
- {9, 31}, {9, 29}, {9, 27}, {9, 25}, {9, 23}, {9, 21},
- {9, 19}, {9, 17}, {9, 15}, {9, 13}, {9, 11}, {9, 9},
- {9, 7}, {9, 5}, {9, 3}, {9, 1}, {8, 31}, {8, 29},
- {8, 27}, {8, 25}, {8, 23}, {8, 21}, {8, 19}, {8, 17},
- {8, 15}, {8, 13}, {8, 11}, {8, 9}, {8, 7}, {8, 5},
- {8, 3}, {8, 1}, {7, 15}, {7, 13}, {7, 11}, {7, 9},
- {7, 7}, {7, 5}, {7, 3}, {7, 1}, {6, 7}, {6, 5},
- {6, 3}, {6, 1}, {5, 3}, {5, 1}, {4, 1}, {3, 1},
- {2, 1}, {1, 1}, {0, 0}, {1, 0}, {2, 0}, {3, 0},
- {4, 0}, {5, 0}, {5, 2}, {6, 0}, {6, 2}, {6, 4},
- {6, 6}, {7, 0}, {7, 2}, {7, 4}, {7, 6}, {7, 8},
- {7, 10}, {7, 12}, {7, 14}, {8, 0}, {8, 2}, {8, 4},
- {8, 6}, {8, 8}, {8, 10}, {8, 12}, {8, 14}, {8, 16},
- {8, 18}, {8, 20}, {8, 22}, {8, 24}, {8, 26}, {8, 28},
- {8, 30}, {9, 0}, {9, 2}, {9, 4}, {9, 6}, {9, 8},
- {9, 10}, {9, 12}, {9, 14}, {9, 16}, {9, 18}, {9, 20},
- {9, 22}, {9, 24}, {9, 26}, {9, 28}, {9, 30}, {9, 32},
- {9, 34}, {9, 36}, {9, 38}, {9, 40}, {9, 42}, {9, 44},
- {9, 46}, {9, 48}, {9, 50}, {9, 52}, {9, 54}, {9, 56},
- {9, 58}, {9, 60}, {9, 62}, {10, 0}, {10, 2}, {10, 4},
- {10, 6}, {10, 8}, {10, 10}, {10, 12}, {10, 14}, {10, 16},
- {10, 18}, {10, 20}, {10, 22}, {10, 24}, {10, 26}, {10, 28},
- {10, 30}, {10, 32}, {10, 34}, {10, 36}, {10, 38}, {10, 40},
- {10, 42}, {10, 44}, {10, 46}, {10, 48}, {10, 50}, {10, 52},
- {10, 54}, {10, 56}, {10, 58}, {10, 60}, {10, 62}, {10, 64},
- {10, 66}, {10, 68}, {10, 70}, {10, 72}, {10, 74}, {10, 76},
- {10, 78}, {10, 80}, {10, 82}, {10, 84}, {10, 86}, {10, 88},
- {10, 90}, {10, 92}, {10, 94}, {10, 96}, {10, 98}, {10, 100},
- {10, 102}, {10, 104}, {10, 106}, {10, 108}, {10, 110}, {10, 112},
- {10, 114}, {10, 116}, {10, 118}, {10, 120}, {10, 122}, {10, 124},
- {10, 126}, {10, 128}, {10, 130}, {10, 132}, {10, 134}, {10, 136},
- {10, 138}, {10, 140}, {10, 142}, {10, 144}, {10, 146}, {10, 148},
- {10, 150}, {10, 152}, {10, 154}, {10, 156}, {10, 158}, {10, 160},
- {10, 162}, {10, 164}, {10, 166}, {10, 168}, {10, 170}, {10, 172},
- {10, 174}, {10, 176}, {10, 178}, {10, 180}, {10, 182}, {10, 184},
- {10, 186}, {10, 188}, {10, 190}, {10, 192}, {10, 194}, {10, 196},
- {10, 198}, {10, 200}, {10, 202}, {10, 204}, {10, 206}, {10, 208},
- {10, 210}, {10, 212}, {10, 214}, {10, 216}, {10, 218}, {10, 220},
- {10, 222}, {10, 224}, {10, 226}, {10, 228}, {10, 230}, {10, 232},
- {10, 234}, {10, 236}, {10, 238}, {10, 240}, {10, 242}, {10, 244},
- {10, 246}, {10, 248}, {10, 250}, {10, 252}, {10, 254}, {10, 256},
- {10, 258}, {10, 260}, {10, 262}, {10, 264}, {10, 266}, {10, 268},
- {10, 270}, {10, 272}, {10, 274}, {10, 276}, {10, 278}, {10, 280},
- {10, 282}, {10, 284}, {10, 286}, {10, 288}, {10, 290}, {10, 292},
- {10, 294}, {10, 296}, {10, 298}, {10, 300}, {10, 302}, {10, 304},
- {10, 306}, {10, 308}, {10, 310}, {10, 312}, {10, 314}, {10, 316},
- {10, 318}, {10, 320}, {10, 322}, {10, 324}, {10, 326}, {10, 328},
- {10, 330}, {10, 332}, {10, 334}, {10, 336}, {10, 338}, {10, 340},
- {10, 342}, {10, 344}, {10, 346}, {10, 348}, {10, 350}, {10, 352},
- {10, 354}, {10, 356}, {10, 358}, {10, 360}, {10, 362}, {10, 364},
- {10, 366}, {10, 368}, {10, 370}, {10, 372}, {10, 374}, {10, 376},
- {10, 378}, {10, 380}, {10, 382}, {10, 384}, {10, 386}, {10, 388},
- {10, 390}, {10, 392}, {10, 394}, {10, 396}, {10, 398}, {10, 400},
- {10, 402}, {10, 404}, {10, 406}, {10, 408}, {10, 410}, {10, 412},
- {10, 414}, {10, 416}, {10, 418}, {10, 420}, {10, 422}, {10, 424},
- {10, 426}, {10, 428}, {10, 430}, {10, 432}, {10, 434}, {10, 436},
- {10, 438}, {10, 440}, {10, 442}, {10, 444}, {10, 446}, {10, 448},
- {10, 450}, {10, 452}, {10, 454}, {10, 456}, {10, 458}, {10, 460},
- {10, 462}, {10, 464}, {10, 466}, {10, 468}, {10, 470}, {10, 472},
- {10, 474}, {10, 476}, {10, 478}, {10, 480}, {10, 482}, {10, 484},
- {10, 486}, {10, 488}, {10, 490}, {10, 492}, {10, 494}, {10, 496},
- {10, 498}, {10, 500}, {10, 502}, {10, 504}, {10, 506}, {10, 508},
- {10, 510}, {10, 512}, {10, 514}, {10, 516}, {10, 518}, {10, 520},
- {10, 522}, {10, 524}, {10, 526}, {10, 528}, {10, 530}, {10, 532},
- {10, 534}, {10, 536}, {10, 538}, {10, 540}, {10, 542}, {10, 544},
- {10, 546}, {10, 548}, {10, 550}, {10, 552}, {10, 554}, {10, 556},
- {10, 558}, {10, 560}, {10, 562}, {10, 564}, {10, 566}, {10, 568},
- {10, 570}, {10, 572}, {10, 574}, {10, 576}, {10, 578}, {10, 580},
- {10, 582}, {10, 584}, {10, 586}, {10, 588}, {10, 590}, {10, 592},
- {10, 594}, {10, 596}, {10, 598}, {10, 600}, {10, 602}, {10, 604},
- {10, 606}, {10, 608}, {10, 610}, {10, 612}, {10, 614}, {10, 616},
- {10, 618}, {10, 620}, {10, 622}, {10, 624}, {10, 626}, {10, 628},
- {10, 630}, {10, 632}, {10, 634}, {10, 636}, {10, 638}, {10, 640},
- {10, 642}, {10, 644}, {10, 646}, {10, 648}, {10, 650}, {10, 652},
- {10, 654}, {10, 656}, {10, 658}, {10, 660}, {10, 662}, {10, 664},
- {10, 666}, {10, 668}, {10, 670}, {10, 672}, {10, 674}, {10, 676},
- {10, 678}, {10, 680}, {10, 682}, {10, 684}, {10, 686}, {10, 688},
- {10, 690}, {10, 692}, {10, 694}, {10, 696}, {10, 698}, {10, 700},
- {10, 702}, {10, 704}, {10, 706}, {10, 708}, {10, 710}, {10, 712},
- {10, 714}, {10, 716}, {10, 718}, {10, 720}, {10, 722}, {10, 724},
- {10, 726}, {10, 728}, {10, 730}, {10, 732}, {10, 734}, {10, 736},
- {10, 738}, {10, 740}, {10, 742}, {10, 744}, {10, 746}, {10, 748},
- {10, 750}, {10, 752}, {10, 754}, {10, 756}, {10, 758}, {10, 760},
- {10, 762}, {10, 764}, {10, 766}, {10, 768}, {10, 770}, {10, 772},
- {10, 774}, {10, 776}, {10, 778}, {10, 780}, {10, 782}, {10, 784},
- {10, 786}, {10, 788}, {10, 790}, {10, 792}, {10, 794}, {10, 796},
- {10, 798}, {10, 800}, {10, 802}, {10, 804}, {10, 806}, {10, 808},
- {10, 810}, {10, 812}, {10, 814}, {10, 816}, {10, 818}, {10, 820},
- {10, 822}, {10, 824}, {10, 826}, {10, 828}, {10, 830}, {10, 832},
- {10, 834}, {10, 836}, {10, 838}, {10, 840}, {10, 842}, {10, 844},
- {10, 846}, {10, 848}, {10, 850}, {10, 852}, {10, 854}, {10, 856},
- {10, 858}, {10, 860}, {10, 862}, {10, 864}, {10, 866}, {10, 868},
- {10, 870}, {10, 872}, {10, 874}, {10, 876}, {10, 878}, {10, 880},
- {10, 882}, {10, 884}, {10, 886}, {10, 888}, {10, 890}, {10, 892},
- {10, 894}, {10, 896}, {10, 898}, {10, 900}, {10, 902}, {10, 904},
- {10, 906}, {10, 908}, {10, 910}, {10, 912}, {10, 914}, {10, 916},
- {10, 918}, {10, 920}, {10, 922}, {10, 924}, {10, 926}, {10, 928},
- {10, 930}, {10, 932}, {10, 934}, {10, 936}, {10, 938}, {10, 940},
- {10, 942}, {10, 944}, {10, 946}, {10, 948}, {10, 950}, {10, 952},
- {10, 954}, {10, 956}, {10, 958}, {10, 960}, {10, 962}, {10, 964},
- {10, 966}, {10, 968}, {10, 970}, {10, 972}, {10, 974}, {10, 976},
- {10, 978}, {10, 980}, {10, 982}, {10, 984}, {10, 986}, {10, 988},
- {10, 990}, {10, 992}, {10, 994}, {10, 996}, {10, 998}, {10, 1000},
- {10, 1002}, {10, 1004}, {10, 1006}, {10, 1008}, {10, 1010}, {10, 1012},
- {10, 1014}, {10, 1016}, {10, 1018}, {10, 1020}, {10, 1022}, {10, 1024},
- {10, 1026}, {10, 1028}, {10, 1030}, {10, 1032}, {10, 1034}, {10, 1036},
- {10, 1038}, {10, 1040}, {10, 1042}, {10, 1044}, {10, 1046}, {10, 1048},
- {10, 1050}, {10, 1052}, {10, 1054}, {10, 1056}, {10, 1058}, {10, 1060},
- {10, 1062}, {10, 1064}, {10, 1066}, {10, 1068}, {10, 1070}, {10, 1072},
- {10, 1074}, {10, 1076}, {10, 1078}, {10, 1080}, {10, 1082}, {10, 1084},
- {10, 1086}, {10, 1088}, {10, 1090}, {10, 1092}, {10, 1094}, {10, 1096},
- {10, 1098}, {10, 1100}, {10, 1102}, {10, 1104}, {10, 1106}, {10, 1108},
- {10, 1110}, {10, 1112}, {10, 1114}, {10, 1116}, {10, 1118}, {10, 1120},
- {10, 1122}, {10, 1124}, {10, 1126}, {10, 1128}, {10, 1130}, {10, 1132},
- {10, 1134}, {10, 1136}, {10, 1138}, {10, 1140}, {10, 1142}, {10, 1144},
- {10, 1146}, {10, 1148}, {10, 1150}, {10, 1152}, {10, 1154}, {10, 1156},
- {10, 1158}, {10, 1160}, {10, 1162}, {10, 1164}, {10, 1166}, {10, 1168},
- {10, 1170}, {10, 1172}, {10, 1174}, {10, 1176}, {10, 1178}, {10, 1180},
- {10, 1182}, {10, 1184}, {10, 1186}, {10, 1188}, {10, 1190}, {10, 1192},
- {10, 1194}, {10, 1196}, {10, 1198}, {10, 1200}, {10, 1202}, {10, 1204},
- {10, 1206}, {10, 1208}, {10, 1210}, {10, 1212}, {10, 1214}, {10, 1216},
- {10, 1218}, {10, 1220}, {10, 1222}, {10, 1224}, {10, 1226}, {10, 1228},
- {10, 1230}, {10, 1232}, {10, 1234}, {10, 1236}, {10, 1238}, {10, 1240},
- {10, 1242}, {10, 1244}, {10, 1246}, {10, 1248}, {10, 1250}, {10, 1252},
- {10, 1254}, {10, 1256}, {10, 1258}, {10, 1260}, {10, 1262}, {10, 1264},
- {10, 1266}, {10, 1268}, {10, 1270}, {10, 1272}, {10, 1274}, {10, 1276},
- {10, 1278}, {10, 1280}, {10, 1282}, {10, 1284}, {10, 1286}, {10, 1288},
- {10, 1290}, {10, 1292}, {10, 1294}, {10, 1296}, {10, 1298}, {10, 1300},
- {10, 1302}, {10, 1304}, {10, 1306}, {10, 1308}, {10, 1310}, {10, 1312},
- {10, 1314}, {10, 1316}, {10, 1318}, {10, 1320}, {10, 1322}, {10, 1324},
- {10, 1326}, {10, 1328}, {10, 1330}, {10, 1332}, {10, 1334}, {10, 1336},
- {10, 1338}, {10, 1340}, {10, 1342}, {10, 1344}, {10, 1346}, {10, 1348},
- {10, 1350}, {10, 1352}, {10, 1354}, {10, 1356}, {10, 1358}, {10, 1360},
- {10, 1362}, {10, 1364}, {10, 1366}, {10, 1368}, {10, 1370}, {10, 1372},
- {10, 1374}, {10, 1376}, {10, 1378}, {10, 1380}, {10, 1382}, {10, 1384},
- {10, 1386}, {10, 1388}, {10, 1390}, {10, 1392}, {10, 1394}, {10, 1396},
- {10, 1398}, {10, 1400}, {10, 1402}, {10, 1404}, {10, 1406}, {10, 1408},
- {10, 1410}, {10, 1412}, {10, 1414}, {10, 1416}, {10, 1418}, {10, 1420},
- {10, 1422}, {10, 1424}, {10, 1426}, {10, 1428}, {10, 1430}, {10, 1432},
- {10, 1434}, {10, 1436}, {10, 1438}, {10, 1440}, {10, 1442}, {10, 1444},
- {10, 1446}, {10, 1448}, {10, 1450}, {10, 1452}, {10, 1454}, {10, 1456},
- {10, 1458}, {10, 1460}, {10, 1462}, {10, 1464}, {10, 1466}, {10, 1468},
- {10, 1470}, {10, 1472}, {10, 1474}, {10, 1476}, {10, 1478}, {10, 1480},
- {10, 1482}, {10, 1484}, {10, 1486}, {10, 1488}, {10, 1490}, {10, 1492},
- {10, 1494}, {10, 1496}, {10, 1498}, {10, 1500}, {10, 1502}, {10, 1504},
- {10, 1506}, {10, 1508}, {10, 1510}, {10, 1512}, {10, 1514}, {10, 1516},
- {10, 1518}, {10, 1520}, {10, 1522}, {10, 1524}, {10, 1526}, {10, 1528},
- {10, 1530}, {10, 1532}, {10, 1534}, {10, 1536}, {10, 1538}, {10, 1540},
- {10, 1542}, {10, 1544}, {10, 1546}, {10, 1548}, {10, 1550}, {10, 1552},
- {10, 1554}, {10, 1556}, {10, 1558}, {10, 1560}, {10, 1562}, {10, 1564},
- {10, 1566}, {10, 1568}, {10, 1570}, {10, 1572}, {10, 1574}, {10, 1576},
- {10, 1578}, {10, 1580}, {10, 1582}, {10, 1584}, {10, 1586}, {10, 1588},
- {10, 1590}, {10, 1592}, {10, 1594}, {10, 1596}, {10, 1598}, {10, 1600},
- {10, 1602}, {10, 1604}, {10, 1606}, {10, 1608}, {10, 1610}, {10, 1612},
- {10, 1614}, {10, 1616}, {10, 1618}, {10, 1620}, {10, 1622}, {10, 1624},
- {10, 1626}, {10, 1628}, {10, 1630}, {10, 1632}, {10, 1634}, {10, 1636},
- {10, 1638}, {10, 1640}, {10, 1642}, {10, 1644}, {10, 1646}, {10, 1648},
- {10, 1650}, {10, 1652}, {10, 1654}, {10, 1656}, {10, 1658}, {10, 1660},
- {10, 1662}, {10, 1664}, {10, 1666}, {10, 1668}, {10, 1670}, {10, 1672},
- {10, 1674}, {10, 1676}, {10, 1678}, {10, 1680}, {10, 1682}, {10, 1684},
- {10, 1686}, {10, 1688}, {10, 1690}, {10, 1692}, {10, 1694}, {10, 1696},
- {10, 1698}, {10, 1700}, {10, 1702}, {10, 1704}, {10, 1706}, {10, 1708},
- {10, 1710}, {10, 1712}, {10, 1714}, {10, 1716}, {10, 1718}, {10, 1720},
- {10, 1722}, {10, 1724}, {10, 1726}, {10, 1728}, {10, 1730}, {10, 1732},
- {10, 1734}, {10, 1736}, {10, 1738}, {10, 1740}, {10, 1742}, {10, 1744},
- {10, 1746}, {10, 1748}, {10, 1750}, {10, 1752}, {10, 1754}, {10, 1756},
- {10, 1758}, {10, 1760}, {10, 1762}, {10, 1764}, {10, 1766}, {10, 1768},
- {10, 1770}, {10, 1772}, {10, 1774}, {10, 1776}, {10, 1778}, {10, 1780},
- {10, 1782}, {10, 1784}, {10, 1786}, {10, 1788}, {10, 1790}, {10, 1792},
- {10, 1794}, {10, 1796}, {10, 1798}, {10, 1800}, {10, 1802}, {10, 1804},
- {10, 1806}, {10, 1808}, {10, 1810}, {10, 1812}, {10, 1814}, {10, 1816},
- {10, 1818}, {10, 1820}, {10, 1822}, {10, 1824}, {10, 1826}, {10, 1828},
- {10, 1830}, {10, 1832}, {10, 1834}, {10, 1836}, {10, 1838}, {10, 1840},
- {10, 1842}, {10, 1844}, {10, 1846}, {10, 1848}, {10, 1850}, {10, 1852},
- {10, 1854}, {10, 1856}, {10, 1858}, {10, 1860}, {10, 1862}, {10, 1864},
- {10, 1866}, {10, 1868}, {10, 1870}, {10, 1872}, {10, 1874}, {10, 1876},
- {10, 1878}, {10, 1880}, {10, 1882}, {10, 1884}, {10, 1886}, {10, 1888},
- {10, 1890}, {10, 1892}, {10, 1894}, {10, 1896}, {10, 1898}, {10, 1900},
- {10, 1902}, {10, 1904}, {10, 1906}, {10, 1908}, {10, 1910}, {10, 1912},
- {10, 1914}, {10, 1916}, {10, 1918}, {10, 1920}, {10, 1922}, {10, 1924},
- {10, 1926}, {10, 1928}, {10, 1930}, {10, 1932}, {10, 1934}, {10, 1936},
- {10, 1938}, {10, 1940}, {10, 1942}, {10, 1944}, {10, 1946}, {10, 1948},
- {10, 1950}, {10, 1952}, {10, 1954}, {10, 1956}, {10, 1958}, {10, 1960},
- {10, 1962}, {10, 1964}, {10, 1966}, {10, 1968}, {10, 1970}, {10, 1972},
- {10, 1974}, {10, 1976}, {10, 1978}, {10, 1980}, {10, 1982}, {10, 1984},
- {10, 1986}, {10, 1988}, {10, 1990}, {10, 1992}, {10, 1994}, {10, 1996},
- {10, 1998}, {10, 2000}, {10, 2002}, {10, 2004}, {10, 2006}, {10, 2008},
- {10, 2010}, {10, 2012}, {10, 2014}, {10, 2016}, {10, 2018}, {10, 2020},
- {10, 2022}, {10, 2024}, {10, 2026}, {10, 2028}, {10, 2030}, {10, 2032},
- {10, 2034}, {10, 2036}, {10, 2038}, {10, 2040}, {10, 2042}, {10, 2044},
- {10, 2046}, {10, 2048}, {10, 2050}, {10, 2052}, {10, 2054}, {10, 2056},
- {10, 2058}, {10, 2060}, {10, 2062}, {10, 2064}, {10, 2066}, {10, 2068},
- {10, 2070}, {10, 2072}, {10, 2074}, {10, 2076}, {10, 2078}, {10, 2080},
- {10, 2082}, {10, 2084}, {10, 2086}, {10, 2088}, {10, 2090}, {10, 2092},
- {10, 2094}, {10, 2096}, {10, 2098}, {10, 2100}, {10, 2102}, {10, 2104},
- {10, 2106}, {10, 2108}, {10, 2110}, {10, 2112}, {10, 2114}, {10, 2116},
- {10, 2118}, {10, 2120}, {10, 2122}, {10, 2124}, {10, 2126}, {10, 2128},
- {10, 2130}, {10, 2132}, {10, 2134}, {10, 2136}, {10, 2138}, {10, 2140},
- {10, 2142}, {10, 2144}, {10, 2146}, {10, 2148}, {10, 2150}, {10, 2152},
- {10, 2154}, {10, 2156}, {10, 2158}, {10, 2160}, {10, 2162}, {10, 2164},
- {10, 2166}, {10, 2168}, {10, 2170}, {10, 2172}, {10, 2174}, {10, 2176},
- {10, 2178}, {10, 2180}, {10, 2182}, {10, 2184}, {10, 2186}, {10, 2188},
- {10, 2190}, {10, 2192}, {10, 2194}, {10, 2196}, {10, 2198}, {10, 2200},
- {10, 2202}, {10, 2204}, {10, 2206}, {10, 2208}, {10, 2210}, {10, 2212},
- {10, 2214}, {10, 2216}, {10, 2218}, {10, 2220}, {10, 2222}, {10, 2224},
- {10, 2226}, {10, 2228}, {10, 2230}, {10, 2232}, {10, 2234}, {10, 2236},
- {10, 2238}, {10, 2240}, {10, 2242}, {10, 2244}, {10, 2246}, {10, 2248},
- {10, 2250}, {10, 2252}, {10, 2254}, {10, 2256}, {10, 2258}, {10, 2260},
- {10, 2262}, {10, 2264}, {10, 2266}, {10, 2268}, {10, 2270}, {10, 2272},
- {10, 2274}, {10, 2276}, {10, 2278}, {10, 2280}, {10, 2282}, {10, 2284},
- {10, 2286}, {10, 2288}, {10, 2290}, {10, 2292}, {10, 2294}, {10, 2296},
- {10, 2298}, {10, 2300}, {10, 2302}, {10, 2304}, {10, 2306}, {10, 2308},
- {10, 2310}, {10, 2312}, {10, 2314}, {10, 2316}, {10, 2318}, {10, 2320},
- {10, 2322}, {10, 2324}, {10, 2326}, {10, 2328}, {10, 2330}, {10, 2332},
- {10, 2334}, {10, 2336}, {10, 2338}, {10, 2340}, {10, 2342}, {10, 2344},
- {10, 2346}, {10, 2348}, {10, 2350}, {10, 2352}, {10, 2354}, {10, 2356},
- {10, 2358}, {10, 2360}, {10, 2362}, {10, 2364}, {10, 2366}, {10, 2368},
- {10, 2370}, {10, 2372}, {10, 2374}, {10, 2376}, {10, 2378}, {10, 2380},
- {10, 2382}, {10, 2384}, {10, 2386}, {10, 2388}, {10, 2390}, {10, 2392},
- {10, 2394}, {10, 2396}, {10, 2398}, {10, 2400}, {10, 2402}, {10, 2404},
- {10, 2406}, {10, 2408}, {10, 2410}, {10, 2412}, {10, 2414}, {10, 2416},
- {10, 2418}, {10, 2420}, {10, 2422}, {10, 2424}, {10, 2426}, {10, 2428},
- {10, 2430}, {10, 2432}, {10, 2434}, {10, 2436}, {10, 2438}, {10, 2440},
- {10, 2442}, {10, 2444}, {10, 2446}, {10, 2448}, {10, 2450}, {10, 2452},
- {10, 2454}, {10, 2456}, {10, 2458}, {10, 2460}, {10, 2462}, {10, 2464},
- {10, 2466}, {10, 2468}, {10, 2470}, {10, 2472}, {10, 2474}, {10, 2476},
- {10, 2478}, {10, 2480}, {10, 2482}, {10, 2484}, {10, 2486}, {10, 2488},
- {10, 2490}, {10, 2492}, {10, 2494}, {10, 2496}, {10, 2498}, {10, 2500},
- {10, 2502}, {10, 2504}, {10, 2506}, {10, 2508}, {10, 2510}, {10, 2512},
- {10, 2514}, {10, 2516}, {10, 2518}, {10, 2520}, {10, 2522}, {10, 2524},
- {10, 2526}, {10, 2528}, {10, 2530}, {10, 2532}, {10, 2534}, {10, 2536},
- {10, 2538}, {10, 2540}, {10, 2542}, {10, 2544}, {10, 2546}, {10, 2548},
- {10, 2550}, {10, 2552}, {10, 2554}, {10, 2556}, {10, 2558}, {10, 2560},
- {10, 2562}, {10, 2564}, {10, 2566}, {10, 2568}, {10, 2570}, {10, 2572},
- {10, 2574}, {10, 2576}, {10, 2578}, {10, 2580}, {10, 2582}, {10, 2584},
- {10, 2586}, {10, 2588}, {10, 2590}, {10, 2592}, {10, 2594}, {10, 2596},
- {10, 2598}, {10, 2600}, {10, 2602}, {10, 2604}, {10, 2606}, {10, 2608},
- {10, 2610}, {10, 2612}, {10, 2614}, {10, 2616}, {10, 2618}, {10, 2620},
- {10, 2622}, {10, 2624}, {10, 2626}, {10, 2628}, {10, 2630}, {10, 2632},
- {10, 2634}, {10, 2636}, {10, 2638}, {10, 2640}, {10, 2642}, {10, 2644},
- {10, 2646}, {10, 2648}, {10, 2650}, {10, 2652}, {10, 2654}, {10, 2656},
- {10, 2658}, {10, 2660}, {10, 2662}, {10, 2664}, {10, 2666}, {10, 2668},
- {10, 2670}, {10, 2672}, {10, 2674}, {10, 2676}, {10, 2678}, {10, 2680},
- {10, 2682}, {10, 2684}, {10, 2686}, {10, 2688}, {10, 2690}, {10, 2692},
- {10, 2694}, {10, 2696}, {10, 2698}, {10, 2700}, {10, 2702}, {10, 2704},
- {10, 2706}, {10, 2708}, {10, 2710}, {10, 2712}, {10, 2714}, {10, 2716},
- {10, 2718}, {10, 2720}, {10, 2722}, {10, 2724}, {10, 2726}, {10, 2728},
- {10, 2730}, {10, 2732}, {10, 2734}, {10, 2736}, {10, 2738}, {10, 2740},
- {10, 2742}, {10, 2744}, {10, 2746}, {10, 2748}, {10, 2750}, {10, 2752},
- {10, 2754}, {10, 2756}, {10, 2758}, {10, 2760}, {10, 2762}, {10, 2764},
- {10, 2766}, {10, 2768}, {10, 2770}, {10, 2772}, {10, 2774}, {10, 2776},
- {10, 2778}, {10, 2780}, {10, 2782}, {10, 2784}, {10, 2786}, {10, 2788},
- {10, 2790}, {10, 2792}, {10, 2794}, {10, 2796}, {10, 2798}, {10, 2800},
- {10, 2802}, {10, 2804}, {10, 2806}, {10, 2808}, {10, 2810}, {10, 2812},
- {10, 2814}, {10, 2816}, {10, 2818}, {10, 2820}, {10, 2822}, {10, 2824},
- {10, 2826}, {10, 2828}, {10, 2830}, {10, 2832}, {10, 2834}, {10, 2836},
- {10, 2838}, {10, 2840}, {10, 2842}, {10, 2844}, {10, 2846}, {10, 2848},
- {10, 2850}, {10, 2852}, {10, 2854}, {10, 2856}, {10, 2858}, {10, 2860},
- {10, 2862}, {10, 2864}, {10, 2866}, {10, 2868}, {10, 2870}, {10, 2872},
- {10, 2874}, {10, 2876}, {10, 2878}, {10, 2880}, {10, 2882}, {10, 2884},
- {10, 2886}, {10, 2888}, {10, 2890}, {10, 2892}, {10, 2894}, {10, 2896},
- {10, 2898}, {10, 2900}, {10, 2902}, {10, 2904}, {10, 2906}, {10, 2908},
- {10, 2910}, {10, 2912}, {10, 2914}, {10, 2916}, {10, 2918}, {10, 2920},
- {10, 2922}, {10, 2924}, {10, 2926}, {10, 2928}, {10, 2930}, {10, 2932},
- {10, 2934}, {10, 2936}, {10, 2938}, {10, 2940}, {10, 2942}, {10, 2944},
- {10, 2946}, {10, 2948}, {10, 2950}, {10, 2952}, {10, 2954}, {10, 2956},
- {10, 2958}, {10, 2960}, {10, 2962}, {10, 2964}, {10, 2966}, {10, 2968},
- {10, 2970}, {10, 2972}, {10, 2974}, {10, 2976}, {10, 2978}, {10, 2980},
- {10, 2982}, {10, 2984}, {10, 2986}, {10, 2988}, {10, 2990}, {10, 2992},
- {10, 2994}, {10, 2996}, {10, 2998}, {10, 3000}, {10, 3002}, {10, 3004},
- {10, 3006}, {10, 3008}, {10, 3010}, {10, 3012}, {10, 3014}, {10, 3016},
- {10, 3018}, {10, 3020}, {10, 3022}, {10, 3024}, {10, 3026}, {10, 3028},
- {10, 3030}, {10, 3032}, {10, 3034}, {10, 3036}, {10, 3038}, {10, 3040},
- {10, 3042}, {10, 3044}, {10, 3046}, {10, 3048}, {10, 3050}, {10, 3052},
- {10, 3054}, {10, 3056}, {10, 3058}, {10, 3060}, {10, 3062}, {10, 3064},
- {10, 3066}, {10, 3068}, {10, 3070}, {10, 3072}, {10, 3074}, {10, 3076},
- {10, 3078}, {10, 3080}, {10, 3082}, {10, 3084}, {10, 3086}, {10, 3088},
- {10, 3090}, {10, 3092}, {10, 3094}, {10, 3096}, {10, 3098}, {10, 3100},
- {10, 3102}, {10, 3104}, {10, 3106}, {10, 3108}, {10, 3110}, {10, 3112},
- {10, 3114}, {10, 3116}, {10, 3118}, {10, 3120}, {10, 3122}, {10, 3124},
- {10, 3126}, {10, 3128}, {10, 3130}, {10, 3132}, {10, 3134}, {10, 3136},
- {10, 3138}, {10, 3140}, {10, 3142}, {10, 3144}, {10, 3146}, {10, 3148},
- {10, 3150}, {10, 3152}, {10, 3154}, {10, 3156}, {10, 3158}, {10, 3160},
- {10, 3162}, {10, 3164}, {10, 3166}, {10, 3168}, {10, 3170}, {10, 3172},
- {10, 3174}, {10, 3176}, {10, 3178}, {10, 3180}, {10, 3182}, {10, 3184},
- {10, 3186}, {10, 3188}, {10, 3190}, {10, 3192}, {10, 3194}, {10, 3196},
- {10, 3198}, {10, 3200}, {10, 3202}, {10, 3204}, {10, 3206}, {10, 3208},
- {10, 3210}, {10, 3212}, {10, 3214}, {10, 3216}, {10, 3218}, {10, 3220},
- {10, 3222}, {10, 3224}, {10, 3226}, {10, 3228}, {10, 3230}, {10, 3232},
- {10, 3234}, {10, 3236}, {10, 3238}, {10, 3240}, {10, 3242}, {10, 3244},
- {10, 3246}, {10, 3248}, {10, 3250}, {10, 3252}, {10, 3254}, {10, 3256},
- {10, 3258}, {10, 3260}, {10, 3262}, {10, 3264}, {10, 3266}, {10, 3268},
- {10, 3270}, {10, 3272}, {10, 3274}, {10, 3276}, {10, 3278}, {10, 3280},
- {10, 3282}, {10, 3284}, {10, 3286}, {10, 3288}, {10, 3290}, {10, 3292},
- {10, 3294}, {10, 3296}, {10, 3298}, {10, 3300}, {10, 3302}, {10, 3304},
- {10, 3306}, {10, 3308}, {10, 3310}, {10, 3312}, {10, 3314}, {10, 3316},
- {10, 3318}, {10, 3320}, {10, 3322}, {10, 3324}, {10, 3326}, {10, 3328},
- {10, 3330}, {10, 3332}, {10, 3334}, {10, 3336}, {10, 3338}, {10, 3340},
- {10, 3342}, {10, 3344}, {10, 3346}, {10, 3348}, {10, 3350}, {10, 3352},
- {10, 3354}, {10, 3356}, {10, 3358}, {10, 3360}, {10, 3362}, {10, 3364},
- {10, 3366}, {10, 3368}, {10, 3370}, {10, 3372}, {10, 3374}, {10, 3376},
- {10, 3378}, {10, 3380}, {10, 3382}, {10, 3384}, {10, 3386}, {10, 3388},
- {10, 3390}, {10, 3392}, {10, 3394}, {10, 3396}, {10, 3398}, {10, 3400},
- {10, 3402}, {10, 3404}, {10, 3406}, {10, 3408}, {10, 3410}, {10, 3412},
- {10, 3414}, {10, 3416}, {10, 3418}, {10, 3420}, {10, 3422}, {10, 3424},
- {10, 3426}, {10, 3428}, {10, 3430}, {10, 3432}, {10, 3434}, {10, 3436},
- {10, 3438}, {10, 3440}, {10, 3442}, {10, 3444}, {10, 3446}, {10, 3448},
- {10, 3450}, {10, 3452}, {10, 3454}, {10, 3456}, {10, 3458}, {10, 3460},
- {10, 3462}, {10, 3464}, {10, 3466}, {10, 3468}, {10, 3470}, {10, 3472},
- {10, 3474}, {10, 3476}, {10, 3478}, {10, 3480}, {10, 3482}, {10, 3484},
- {10, 3486}, {10, 3488}, {10, 3490}, {10, 3492}, {10, 3494}, {10, 3496},
- {10, 3498}, {10, 3500}, {10, 3502}, {10, 3504}, {10, 3506}, {10, 3508},
- {10, 3510}, {10, 3512}, {10, 3514}, {10, 3516}, {10, 3518}, {10, 3520},
- {10, 3522}, {10, 3524}, {10, 3526}, {10, 3528}, {10, 3530}, {10, 3532},
- {10, 3534}, {10, 3536}, {10, 3538}, {10, 3540}, {10, 3542}, {10, 3544},
- {10, 3546}, {10, 3548}, {10, 3550}, {10, 3552}, {10, 3554}, {10, 3556},
- {10, 3558}, {10, 3560}, {10, 3562}, {10, 3564}, {10, 3566}, {10, 3568},
- {10, 3570}, {10, 3572}, {10, 3574}, {10, 3576}, {10, 3578}, {10, 3580},
- {10, 3582}, {10, 3584}, {10, 3586}, {10, 3588}, {10, 3590}, {10, 3592},
- {10, 3594}, {10, 3596}, {10, 3598}, {10, 3600}, {10, 3602}, {10, 3604},
- {10, 3606}, {10, 3608}, {10, 3610}, {10, 3612}, {10, 3614}, {10, 3616},
- {10, 3618}, {10, 3620}, {10, 3622}, {10, 3624}, {10, 3626}, {10, 3628},
- {10, 3630}, {10, 3632}, {10, 3634}, {10, 3636}, {10, 3638}, {10, 3640},
- {10, 3642}, {10, 3644}, {10, 3646}, {10, 3648}, {10, 3650}, {10, 3652},
- {10, 3654}, {10, 3656}, {10, 3658}, {10, 3660}, {10, 3662}, {10, 3664},
- {10, 3666}, {10, 3668}, {10, 3670}, {10, 3672}, {10, 3674}, {10, 3676},
- {10, 3678}, {10, 3680}, {10, 3682}, {10, 3684}, {10, 3686}, {10, 3688},
- {10, 3690}, {10, 3692}, {10, 3694}, {10, 3696}, {10, 3698}, {10, 3700},
- {10, 3702}, {10, 3704}, {10, 3706}, {10, 3708}, {10, 3710}, {10, 3712},
- {10, 3714}, {10, 3716}, {10, 3718}, {10, 3720}, {10, 3722}, {10, 3724},
- {10, 3726}, {10, 3728}, {10, 3730}, {10, 3732}, {10, 3734}, {10, 3736},
- {10, 3738}, {10, 3740}, {10, 3742}, {10, 3744}, {10, 3746}, {10, 3748},
- {10, 3750}, {10, 3752}, {10, 3754}, {10, 3756}, {10, 3758}, {10, 3760},
- {10, 3762}, {10, 3764}, {10, 3766}, {10, 3768}, {10, 3770}, {10, 3772},
- {10, 3774}, {10, 3776}, {10, 3778}, {10, 3780}, {10, 3782}, {10, 3784},
- {10, 3786}, {10, 3788}, {10, 3790}, {10, 3792}, {10, 3794}, {10, 3796},
- {10, 3798}, {10, 3800}, {10, 3802}, {10, 3804}, {10, 3806}, {10, 3808},
- {10, 3810}, {10, 3812}, {10, 3814}, {10, 3816}, {10, 3818}, {10, 3820},
- {10, 3822}, {10, 3824}, {10, 3826}, {10, 3828}, {10, 3830}, {10, 3832},
- {10, 3834}, {10, 3836}, {10, 3838}, {10, 3840}, {10, 3842}, {10, 3844},
- {10, 3846}, {10, 3848}, {10, 3850}, {10, 3852}, {10, 3854}, {10, 3856},
- {10, 3858}, {10, 3860}, {10, 3862}, {10, 3864}, {10, 3866}, {10, 3868},
- {10, 3870}, {10, 3872}, {10, 3874}, {10, 3876}, {10, 3878}, {10, 3880},
- {10, 3882}, {10, 3884}, {10, 3886}, {10, 3888}, {10, 3890}, {10, 3892},
- {10, 3894}, {10, 3896}, {10, 3898}, {10, 3900}, {10, 3902}, {10, 3904},
- {10, 3906}, {10, 3908}, {10, 3910}, {10, 3912}, {10, 3914}, {10, 3916},
- {10, 3918}, {10, 3920}, {10, 3922}, {10, 3924}, {10, 3926}, {10, 3928},
- {10, 3930}, {10, 3932}, {10, 3934}, {10, 3936}, {10, 3938}, {10, 3940},
- {10, 3942}, {10, 3944}, {10, 3946}, {10, 3948}, {10, 3950}, {10, 3952},
- {10, 3954}, {10, 3956}, {10, 3958}, {10, 3960}
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_DCT_VALUE_TOKENS_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/defaultcoefcounts.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/defaultcoefcounts.h
deleted file mode 100644
index 1e8e80484ae..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/defaultcoefcounts.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef VP8_ENCODER_DEFAULTCOEFCOUNTS_H_
-#define VP8_ENCODER_DEFAULTCOEFCOUNTS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Generated file, included by entropy.c */
-
-static const unsigned int default_coef_counts[BLOCK_TYPES]
- [COEF_BANDS]
- [PREV_COEF_CONTEXTS]
- [MAX_ENTROPY_TOKENS] =
-{
-
- {
- /* Block Type ( 0 ) */
- {
- /* Coeff Band ( 0 ) */
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- },
- {
- /* Coeff Band ( 1 ) */
- {30190, 26544, 225, 24, 4, 0, 0, 0, 0, 0, 0, 4171593,},
- {26846, 25157, 1241, 130, 26, 6, 1, 0, 0, 0, 0, 149987,},
- {10484, 9538, 1006, 160, 36, 18, 0, 0, 0, 0, 0, 15104,},
- },
- {
- /* Coeff Band ( 2 ) */
- {25842, 40456, 1126, 83, 11, 2, 0, 0, 0, 0, 0, 0,},
- {9338, 8010, 512, 73, 7, 3, 2, 0, 0, 0, 0, 43294,},
- {1047, 751, 149, 31, 13, 6, 1, 0, 0, 0, 0, 879,},
- },
- {
- /* Coeff Band ( 3 ) */
- {26136, 9826, 252, 13, 0, 0, 0, 0, 0, 0, 0, 0,},
- {8134, 5574, 191, 14, 2, 0, 0, 0, 0, 0, 0, 35302,},
- { 605, 677, 116, 9, 1, 0, 0, 0, 0, 0, 0, 611,},
- },
- {
- /* Coeff Band ( 4 ) */
- {10263, 15463, 283, 17, 0, 0, 0, 0, 0, 0, 0, 0,},
- {2773, 2191, 128, 9, 2, 2, 0, 0, 0, 0, 0, 10073,},
- { 134, 125, 32, 4, 0, 2, 0, 0, 0, 0, 0, 50,},
- },
- {
- /* Coeff Band ( 5 ) */
- {10483, 2663, 23, 1, 0, 0, 0, 0, 0, 0, 0, 0,},
- {2137, 1251, 27, 1, 1, 0, 0, 0, 0, 0, 0, 14362,},
- { 116, 156, 14, 2, 1, 0, 0, 0, 0, 0, 0, 190,},
- },
- {
- /* Coeff Band ( 6 ) */
- {40977, 27614, 412, 28, 0, 0, 0, 0, 0, 0, 0, 0,},
- {6113, 5213, 261, 22, 3, 0, 0, 0, 0, 0, 0, 26164,},
- { 382, 312, 50, 14, 2, 0, 0, 0, 0, 0, 0, 345,},
- },
- {
- /* Coeff Band ( 7 ) */
- { 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319,},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,},
- },
- },
- {
- /* Block Type ( 1 ) */
- {
- /* Coeff Band ( 0 ) */
- {3268, 19382, 1043, 250, 93, 82, 49, 26, 17, 8, 25, 82289,},
- {8758, 32110, 5436, 1832, 827, 668, 420, 153, 24, 0, 3, 52914,},
- {9337, 23725, 8487, 3954, 2107, 1836, 1069, 399, 59, 0, 0, 18620,},
- },
- {
- /* Coeff Band ( 1 ) */
- {12419, 8420, 452, 62, 9, 1, 0, 0, 0, 0, 0, 0,},
- {11715, 8705, 693, 92, 15, 7, 2, 0, 0, 0, 0, 53988,},
- {7603, 8585, 2306, 778, 270, 145, 39, 5, 0, 0, 0, 9136,},
- },
- {
- /* Coeff Band ( 2 ) */
- {15938, 14335, 1207, 184, 55, 13, 4, 1, 0, 0, 0, 0,},
- {7415, 6829, 1138, 244, 71, 26, 7, 0, 0, 0, 0, 9980,},
- {1580, 1824, 655, 241, 89, 46, 10, 2, 0, 0, 0, 429,},
- },
- {
- /* Coeff Band ( 3 ) */
- {19453, 5260, 201, 19, 0, 0, 0, 0, 0, 0, 0, 0,},
- {9173, 3758, 213, 22, 1, 1, 0, 0, 0, 0, 0, 9820,},
- {1689, 1277, 276, 51, 17, 4, 0, 0, 0, 0, 0, 679,},
- },
- {
- /* Coeff Band ( 4 ) */
- {12076, 10667, 620, 85, 19, 9, 5, 0, 0, 0, 0, 0,},
- {4665, 3625, 423, 55, 19, 9, 0, 0, 0, 0, 0, 5127,},
- { 415, 440, 143, 34, 20, 7, 2, 0, 0, 0, 0, 101,},
- },
- {
- /* Coeff Band ( 5 ) */
- {12183, 4846, 115, 11, 1, 0, 0, 0, 0, 0, 0, 0,},
- {4226, 3149, 177, 21, 2, 0, 0, 0, 0, 0, 0, 7157,},
- { 375, 621, 189, 51, 11, 4, 1, 0, 0, 0, 0, 198,},
- },
- {
- /* Coeff Band ( 6 ) */
- {61658, 37743, 1203, 94, 10, 3, 0, 0, 0, 0, 0, 0,},
- {15514, 11563, 903, 111, 14, 5, 0, 0, 0, 0, 0, 25195,},
- { 929, 1077, 291, 78, 14, 7, 1, 0, 0, 0, 0, 507,},
- },
- {
- /* Coeff Band ( 7 ) */
- { 0, 990, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 412, 13, 0, 0, 0, 0, 0, 0, 0, 0, 1641,},
- { 0, 18, 7, 1, 0, 0, 0, 0, 0, 0, 0, 30,},
- },
- },
- {
- /* Block Type ( 2 ) */
- {
- /* Coeff Band ( 0 ) */
- { 953, 24519, 628, 120, 28, 12, 4, 0, 0, 0, 0, 2248798,},
- {1525, 25654, 2647, 617, 239, 143, 42, 5, 0, 0, 0, 66837,},
- {1180, 11011, 3001, 1237, 532, 448, 239, 54, 5, 0, 0, 7122,},
- },
- {
- /* Coeff Band ( 1 ) */
- {1356, 2220, 67, 10, 4, 1, 0, 0, 0, 0, 0, 0,},
- {1450, 2544, 102, 18, 4, 3, 0, 0, 0, 0, 0, 57063,},
- {1182, 2110, 470, 130, 41, 21, 0, 0, 0, 0, 0, 6047,},
- },
- {
- /* Coeff Band ( 2 ) */
- { 370, 3378, 200, 30, 5, 4, 1, 0, 0, 0, 0, 0,},
- { 293, 1006, 131, 29, 11, 0, 0, 0, 0, 0, 0, 5404,},
- { 114, 387, 98, 23, 4, 8, 1, 0, 0, 0, 0, 236,},
- },
- {
- /* Coeff Band ( 3 ) */
- { 579, 194, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 395, 213, 5, 1, 0, 0, 0, 0, 0, 0, 0, 4157,},
- { 119, 122, 4, 0, 0, 0, 0, 0, 0, 0, 0, 300,},
- },
- {
- /* Coeff Band ( 4 ) */
- { 38, 557, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 21, 114, 12, 1, 0, 0, 0, 0, 0, 0, 0, 427,},
- { 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,},
- },
- {
- /* Coeff Band ( 5 ) */
- { 52, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 18, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652,},
- { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,},
- },
- {
- /* Coeff Band ( 6 ) */
- { 640, 569, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 25, 77, 2, 0, 0, 0, 0, 0, 0, 0, 0, 517,},
- { 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,},
- },
- {
- /* Coeff Band ( 7 ) */
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- },
- },
- {
- /* Block Type ( 3 ) */
- {
- /* Coeff Band ( 0 ) */
- {2506, 20161, 2707, 767, 261, 178, 107, 30, 14, 3, 0, 100694,},
- {8806, 36478, 8817, 3268, 1280, 850, 401, 114, 42, 0, 0, 58572,},
- {11003, 27214, 11798, 5716, 2482, 2072, 1048, 175, 32, 0, 0, 19284,},
- },
- {
- /* Coeff Band ( 1 ) */
- {9738, 11313, 959, 205, 70, 18, 11, 1, 0, 0, 0, 0,},
- {12628, 15085, 1507, 273, 52, 19, 9, 0, 0, 0, 0, 54280,},
- {10701, 15846, 5561, 1926, 813, 570, 249, 36, 0, 0, 0, 6460,},
- },
- {
- /* Coeff Band ( 2 ) */
- {6781, 22539, 2784, 634, 182, 123, 20, 4, 0, 0, 0, 0,},
- {6263, 11544, 2649, 790, 259, 168, 27, 5, 0, 0, 0, 20539,},
- {3109, 4075, 2031, 896, 457, 386, 158, 29, 0, 0, 0, 1138,},
- },
- {
- /* Coeff Band ( 3 ) */
- {11515, 4079, 465, 73, 5, 14, 2, 0, 0, 0, 0, 0,},
- {9361, 5834, 650, 96, 24, 8, 4, 0, 0, 0, 0, 22181,},
- {4343, 3974, 1360, 415, 132, 96, 14, 1, 0, 0, 0, 1267,},
- },
- {
- /* Coeff Band ( 4 ) */
- {4787, 9297, 823, 168, 44, 12, 4, 0, 0, 0, 0, 0,},
- {3619, 4472, 719, 198, 60, 31, 3, 0, 0, 0, 0, 8401,},
- {1157, 1175, 483, 182, 88, 31, 8, 0, 0, 0, 0, 268,},
- },
- {
- /* Coeff Band ( 5 ) */
- {8299, 1226, 32, 5, 1, 0, 0, 0, 0, 0, 0, 0,},
- {3502, 1568, 57, 4, 1, 1, 0, 0, 0, 0, 0, 9811,},
- {1055, 1070, 166, 29, 6, 1, 0, 0, 0, 0, 0, 527,},
- },
- {
- /* Coeff Band ( 6 ) */
- {27414, 27927, 1989, 347, 69, 26, 0, 0, 0, 0, 0, 0,},
- {5876, 10074, 1574, 341, 91, 24, 4, 0, 0, 0, 0, 21954,},
- {1571, 2171, 778, 324, 124, 65, 16, 0, 0, 0, 0, 979,},
- },
- {
- /* Coeff Band ( 7 ) */
- { 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
- { 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459,},
- { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,},
- },
- },
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_DEFAULTCOEFCOUNTS_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c
deleted file mode 100644
index d197f8f8166..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <limits.h>
-
-#include "denoising.h"
-
-#include "vp8/common/reconinter.h"
-#include "vpx/vpx_integer.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8_rtcd.h"
-
-static const unsigned int NOISE_MOTION_THRESHOLD = 25 * 25;
-/* SSE_DIFF_THRESHOLD is selected as ~95% confidence assuming
- * var(noise) ~= 100.
- */
-static const unsigned int SSE_DIFF_THRESHOLD = 16 * 16 * 20;
-static const unsigned int SSE_THRESHOLD = 16 * 16 * 40;
-static const unsigned int SSE_THRESHOLD_HIGH = 16 * 16 * 60;
-
-/*
- * The filter function was modified to reduce the computational complexity.
- * Step 1:
- * Instead of applying tap coefficients for each pixel, we calculated the
- * pixel adjustments vs. pixel diff value ahead of time.
- * adjustment = filtered_value - current_raw
- * = (filter_coefficient * diff + 128) >> 8
- * where
- * filter_coefficient = (255 << 8) / (256 + ((absdiff * 330) >> 3));
- * filter_coefficient += filter_coefficient /
- * (3 + motion_magnitude_adjustment);
- * filter_coefficient is clamped to 0 ~ 255.
- *
- * Step 2:
- * The adjustment vs. diff curve becomes flat very quick when diff increases.
- * This allowed us to use only several levels to approximate the curve without
- * changing the filtering algorithm too much.
- * The adjustments were further corrected by checking the motion magnitude.
- * The levels used are:
- * diff adjustment w/o motion correction adjustment w/ motion correction
- * [-255, -16] -6 -7
- * [-15, -8] -4 -5
- * [-7, -4] -3 -4
- * [-3, 3] diff diff
- * [4, 7] 3 4
- * [8, 15] 4 5
- * [16, 255] 6 7
- */
-
-int vp8_denoiser_filter_c(unsigned char *mc_running_avg_y, int mc_avg_y_stride,
- unsigned char *running_avg_y, int avg_y_stride,
- unsigned char *sig, int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising)
-{
- unsigned char *running_avg_y_start = running_avg_y;
- unsigned char *sig_start = sig;
- int sum_diff_thresh;
- int r, c;
- int sum_diff = 0;
- int adj_val[3] = {3, 4, 6};
- int shift_inc1 = 0;
- int shift_inc2 = 1;
- int col_sum[16] = {0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0};
- /* If motion_magnitude is small, making the denoiser more aggressive by
- * increasing the adjustment for each level. Add another increment for
- * blocks that are labeled for increase denoising. */
- if (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD)
- {
- if (increase_denoising) {
- shift_inc1 = 1;
- shift_inc2 = 2;
- }
- adj_val[0] += shift_inc2;
- adj_val[1] += shift_inc2;
- adj_val[2] += shift_inc2;
- }
-
- for (r = 0; r < 16; ++r)
- {
- for (c = 0; c < 16; ++c)
- {
- int diff = 0;
- int adjustment = 0;
- int absdiff = 0;
-
- diff = mc_running_avg_y[c] - sig[c];
- absdiff = abs(diff);
-
- // When |diff| <= |3 + shift_inc1|, use pixel value from
- // last denoised raw.
- if (absdiff <= 3 + shift_inc1)
- {
- running_avg_y[c] = mc_running_avg_y[c];
- col_sum[c] += diff;
- }
- else
- {
- if (absdiff >= 4 + shift_inc1 && absdiff <= 7)
- adjustment = adj_val[0];
- else if (absdiff >= 8 && absdiff <= 15)
- adjustment = adj_val[1];
- else
- adjustment = adj_val[2];
-
- if (diff > 0)
- {
- if ((sig[c] + adjustment) > 255)
- running_avg_y[c] = 255;
- else
- running_avg_y[c] = sig[c] + adjustment;
-
- col_sum[c] += adjustment;
- }
- else
- {
- if ((sig[c] - adjustment) < 0)
- running_avg_y[c] = 0;
- else
- running_avg_y[c] = sig[c] - adjustment;
-
- col_sum[c] -= adjustment;
- }
- }
- }
-
- /* Update pointers for next iteration. */
- sig += sig_stride;
- mc_running_avg_y += mc_avg_y_stride;
- running_avg_y += avg_y_stride;
- }
-
- for (c = 0; c < 16; ++c) {
- // Below we clip the value in the same way which SSE code use.
- // When adopting aggressive denoiser, the adj_val for each pixel
- // could be at most 8 (this is current max adjustment of the map).
- // In SSE code, we calculate the sum of adj_val for
- // the columns, so the sum could be upto 128(16 rows). However,
- // the range of the value is -128 ~ 127 in SSE code, that's why
- // we do this change in C code.
- // We don't do this for UV denoiser, since there are only 8 rows,
- // and max adjustments <= 8, so the sum of the columns will not
- // exceed 64.
- if (col_sum[c] >= 128) {
- col_sum[c] = 127;
- }
- sum_diff += col_sum[c];
- }
-
- sum_diff_thresh= SUM_DIFF_THRESHOLD;
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH;
- if (abs(sum_diff) > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising), check
- // if we can still apply some (weaker) temporal filtering to this block,
- // that would otherwise not be denoised at all. Simplest is to apply
- // an additional adjustment to running_avg_y to bring it closer to sig.
- // The adjustment is capped by a maximum delta, and chosen such that
- // in most cases the resulting sum_diff will be within the
- // accceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over threshold.
- int delta = ((abs(sum_diff) - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- sig -= sig_stride * 16;
- mc_running_avg_y -= mc_avg_y_stride * 16;
- running_avg_y -= avg_y_stride * 16;
- for (r = 0; r < 16; ++r) {
- for (c = 0; c < 16; ++c) {
- int diff = mc_running_avg_y[c] - sig[c];
- int adjustment = abs(diff);
- if (adjustment > delta)
- adjustment = delta;
- if (diff > 0) {
- // Bring denoised signal down.
- if (running_avg_y[c] - adjustment < 0)
- running_avg_y[c] = 0;
- else
- running_avg_y[c] = running_avg_y[c] - adjustment;
- col_sum[c] -= adjustment;
- } else if (diff < 0) {
- // Bring denoised signal up.
- if (running_avg_y[c] + adjustment > 255)
- running_avg_y[c] = 255;
- else
- running_avg_y[c] = running_avg_y[c] + adjustment;
- col_sum[c] += adjustment;
- }
- }
- // TODO(marpan): Check here if abs(sum_diff) has gone below the
- // threshold sum_diff_thresh, and if so, we can exit the row loop.
- sig += sig_stride;
- mc_running_avg_y += mc_avg_y_stride;
- running_avg_y += avg_y_stride;
- }
-
- sum_diff = 0;
- for (c = 0; c < 16; ++c) {
- if (col_sum[c] >= 128) {
- col_sum[c] = 127;
- }
- sum_diff += col_sum[c];
- }
-
- if (abs(sum_diff) > sum_diff_thresh)
- return COPY_BLOCK;
- } else {
- return COPY_BLOCK;
- }
- }
-
- vp8_copy_mem16x16(running_avg_y_start, avg_y_stride, sig_start, sig_stride);
- return FILTER_BLOCK;
-}
-
-int vp8_denoiser_filter_uv_c(unsigned char *mc_running_avg_uv,
- int mc_avg_uv_stride,
- unsigned char *running_avg_uv,
- int avg_uv_stride,
- unsigned char *sig,
- int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising) {
- unsigned char *running_avg_uv_start = running_avg_uv;
- unsigned char *sig_start = sig;
- int sum_diff_thresh;
- int r, c;
- int sum_diff = 0;
- int sum_block = 0;
- int adj_val[3] = {3, 4, 6};
- int shift_inc1 = 0;
- int shift_inc2 = 1;
- /* If motion_magnitude is small, making the denoiser more aggressive by
- * increasing the adjustment for each level. Add another increment for
- * blocks that are labeled for increase denoising. */
- if (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD_UV) {
- if (increase_denoising) {
- shift_inc1 = 1;
- shift_inc2 = 2;
- }
- adj_val[0] += shift_inc2;
- adj_val[1] += shift_inc2;
- adj_val[2] += shift_inc2;
- }
-
- // Avoid denoising color signal if its close to average level.
- for (r = 0; r < 8; ++r) {
- for (c = 0; c < 8; ++c) {
- sum_block += sig[c];
- }
- sig += sig_stride;
- }
- if (abs(sum_block - (128 * 8 * 8)) < SUM_DIFF_FROM_AVG_THRESH_UV) {
- return COPY_BLOCK;
- }
-
- sig -= sig_stride * 8;
- for (r = 0; r < 8; ++r) {
- for (c = 0; c < 8; ++c) {
- int diff = 0;
- int adjustment = 0;
- int absdiff = 0;
-
- diff = mc_running_avg_uv[c] - sig[c];
- absdiff = abs(diff);
-
- // When |diff| <= |3 + shift_inc1|, use pixel value from
- // last denoised raw.
- if (absdiff <= 3 + shift_inc1) {
- running_avg_uv[c] = mc_running_avg_uv[c];
- sum_diff += diff;
- } else {
- if (absdiff >= 4 && absdiff <= 7)
- adjustment = adj_val[0];
- else if (absdiff >= 8 && absdiff <= 15)
- adjustment = adj_val[1];
- else
- adjustment = adj_val[2];
- if (diff > 0) {
- if ((sig[c] + adjustment) > 255)
- running_avg_uv[c] = 255;
- else
- running_avg_uv[c] = sig[c] + adjustment;
- sum_diff += adjustment;
- } else {
- if ((sig[c] - adjustment) < 0)
- running_avg_uv[c] = 0;
- else
- running_avg_uv[c] = sig[c] - adjustment;
- sum_diff -= adjustment;
- }
- }
- }
- /* Update pointers for next iteration. */
- sig += sig_stride;
- mc_running_avg_uv += mc_avg_uv_stride;
- running_avg_uv += avg_uv_stride;
- }
-
- sum_diff_thresh= SUM_DIFF_THRESHOLD_UV;
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH_UV;
- if (abs(sum_diff) > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising), check
- // if we can still apply some (weaker) temporal filtering to this block,
- // that would otherwise not be denoised at all. Simplest is to apply
- // an additional adjustment to running_avg_y to bring it closer to sig.
- // The adjustment is capped by a maximum delta, and chosen such that
- // in most cases the resulting sum_diff will be within the
- // accceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over threshold.
- int delta = ((abs(sum_diff) - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- sig -= sig_stride * 8;
- mc_running_avg_uv -= mc_avg_uv_stride * 8;
- running_avg_uv -= avg_uv_stride * 8;
- for (r = 0; r < 8; ++r) {
- for (c = 0; c < 8; ++c) {
- int diff = mc_running_avg_uv[c] - sig[c];
- int adjustment = abs(diff);
- if (adjustment > delta)
- adjustment = delta;
- if (diff > 0) {
- // Bring denoised signal down.
- if (running_avg_uv[c] - adjustment < 0)
- running_avg_uv[c] = 0;
- else
- running_avg_uv[c] = running_avg_uv[c] - adjustment;
- sum_diff -= adjustment;
- } else if (diff < 0) {
- // Bring denoised signal up.
- if (running_avg_uv[c] + adjustment > 255)
- running_avg_uv[c] = 255;
- else
- running_avg_uv[c] = running_avg_uv[c] + adjustment;
- sum_diff += adjustment;
- }
- }
- // TODO(marpan): Check here if abs(sum_diff) has gone below the
- // threshold sum_diff_thresh, and if so, we can exit the row loop.
- sig += sig_stride;
- mc_running_avg_uv += mc_avg_uv_stride;
- running_avg_uv += avg_uv_stride;
- }
- if (abs(sum_diff) > sum_diff_thresh)
- return COPY_BLOCK;
- } else {
- return COPY_BLOCK;
- }
- }
-
- vp8_copy_mem8x8(running_avg_uv_start, avg_uv_stride, sig_start,
- sig_stride);
- return FILTER_BLOCK;
-}
-
-void vp8_denoiser_set_parameters(VP8_DENOISER *denoiser, int mode) {
- assert(mode > 0); // Denoiser is allocated only if mode > 0.
- if (mode == 1) {
- denoiser->denoiser_mode = kDenoiserOnYOnly;
- } else if (mode == 2) {
- denoiser->denoiser_mode = kDenoiserOnYUV;
- } else if (mode == 3) {
- denoiser->denoiser_mode = kDenoiserOnYUVAggressive;
- } else {
- denoiser->denoiser_mode = kDenoiserOnYUV;
- }
- if (denoiser->denoiser_mode != kDenoiserOnYUVAggressive) {
- denoiser->denoise_pars.scale_sse_thresh = 1;
- denoiser->denoise_pars.scale_motion_thresh = 8;
- denoiser->denoise_pars.scale_increase_filter = 0;
- denoiser->denoise_pars.denoise_mv_bias = 95;
- denoiser->denoise_pars.pickmode_mv_bias = 100;
- denoiser->denoise_pars.qp_thresh = 0;
- denoiser->denoise_pars.consec_zerolast = UINT_MAX;
- denoiser->denoise_pars.spatial_blur = 0;
- } else {
- denoiser->denoise_pars.scale_sse_thresh = 2;
- denoiser->denoise_pars.scale_motion_thresh = 16;
- denoiser->denoise_pars.scale_increase_filter = 1;
- denoiser->denoise_pars.denoise_mv_bias = 60;
- denoiser->denoise_pars.pickmode_mv_bias = 75;
- denoiser->denoise_pars.qp_thresh = 80;
- denoiser->denoise_pars.consec_zerolast = 15;
- denoiser->denoise_pars.spatial_blur = 0;
- }
-}
-
-int vp8_denoiser_allocate(VP8_DENOISER *denoiser, int width, int height,
- int num_mb_rows, int num_mb_cols, int mode)
-{
- int i;
- assert(denoiser);
- denoiser->num_mb_cols = num_mb_cols;
-
- for (i = 0; i < MAX_REF_FRAMES; i++)
- {
- denoiser->yv12_running_avg[i].flags = 0;
-
- if (vp8_yv12_alloc_frame_buffer(&(denoiser->yv12_running_avg[i]), width,
- height, VP8BORDERINPIXELS)
- < 0)
- {
- vp8_denoiser_free(denoiser);
- return 1;
- }
- memset(denoiser->yv12_running_avg[i].buffer_alloc, 0,
- denoiser->yv12_running_avg[i].frame_size);
-
- }
- denoiser->yv12_mc_running_avg.flags = 0;
-
- if (vp8_yv12_alloc_frame_buffer(&(denoiser->yv12_mc_running_avg), width,
- height, VP8BORDERINPIXELS) < 0)
- {
- vp8_denoiser_free(denoiser);
- return 1;
- }
-
- memset(denoiser->yv12_mc_running_avg.buffer_alloc, 0,
- denoiser->yv12_mc_running_avg.frame_size);
-
- if (vp8_yv12_alloc_frame_buffer(&denoiser->yv12_last_source, width,
- height, VP8BORDERINPIXELS) < 0) {
- vp8_denoiser_free(denoiser);
- return 1;
- }
- memset(denoiser->yv12_last_source.buffer_alloc, 0,
- denoiser->yv12_last_source.frame_size);
-
- denoiser->denoise_state = vpx_calloc((num_mb_rows * num_mb_cols), 1);
- memset(denoiser->denoise_state, 0, (num_mb_rows * num_mb_cols));
- vp8_denoiser_set_parameters(denoiser, mode);
- denoiser->nmse_source_diff = 0;
- denoiser->nmse_source_diff_count = 0;
- denoiser->qp_avg = 0;
- // QP threshold below which we can go up to aggressive mode.
- denoiser->qp_threshold_up = 80;
- // QP threshold above which we can go back down to normal mode.
- // For now keep this second threshold high, so not used currently.
- denoiser->qp_threshold_down = 128;
- // Bitrate thresholds and noise metric (nmse) thresholds for switching to
- // aggressive mode.
- // TODO(marpan): Adjust thresholds, including effect on resolution.
- denoiser->bitrate_threshold = 400000; // (bits/sec).
- denoiser->threshold_aggressive_mode = 80;
- if (width * height > 1280 * 720) {
- denoiser->bitrate_threshold = 3000000;
- denoiser->threshold_aggressive_mode = 200;
- } else if (width * height > 960 * 540) {
- denoiser->bitrate_threshold = 1200000;
- denoiser->threshold_aggressive_mode = 120;
- } else if (width * height > 640 * 480) {
- denoiser->bitrate_threshold = 600000;
- denoiser->threshold_aggressive_mode = 100;
- }
- return 0;
-}
-
-
-void vp8_denoiser_free(VP8_DENOISER *denoiser)
-{
- int i;
- assert(denoiser);
-
- for (i = 0; i < MAX_REF_FRAMES ; i++)
- {
- vp8_yv12_de_alloc_frame_buffer(&denoiser->yv12_running_avg[i]);
- }
- vp8_yv12_de_alloc_frame_buffer(&denoiser->yv12_mc_running_avg);
- vp8_yv12_de_alloc_frame_buffer(&denoiser->yv12_last_source);
- vpx_free(denoiser->denoise_state);
-}
-
-void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser,
- MACROBLOCK *x,
- unsigned int best_sse,
- unsigned int zero_mv_sse,
- int recon_yoffset,
- int recon_uvoffset,
- loop_filter_info_n *lfi_n,
- int mb_row,
- int mb_col,
- int block_index)
-
-{
- int mv_row;
- int mv_col;
- unsigned int motion_threshold;
- unsigned int motion_magnitude2;
- unsigned int sse_thresh;
- int sse_diff_thresh = 0;
- // Spatial loop filter: only applied selectively based on
- // temporal filter state of block relative to top/left neighbors.
- int apply_spatial_loop_filter = 1;
- MV_REFERENCE_FRAME frame = x->best_reference_frame;
- MV_REFERENCE_FRAME zero_frame = x->best_zeromv_reference_frame;
-
- enum vp8_denoiser_decision decision = FILTER_BLOCK;
- enum vp8_denoiser_decision decision_u = COPY_BLOCK;
- enum vp8_denoiser_decision decision_v = COPY_BLOCK;
-
- if (zero_frame)
- {
- YV12_BUFFER_CONFIG *src = &denoiser->yv12_running_avg[frame];
- YV12_BUFFER_CONFIG *dst = &denoiser->yv12_mc_running_avg;
- YV12_BUFFER_CONFIG saved_pre,saved_dst;
- MB_MODE_INFO saved_mbmi;
- MACROBLOCKD *filter_xd = &x->e_mbd;
- MB_MODE_INFO *mbmi = &filter_xd->mode_info_context->mbmi;
- int sse_diff = 0;
- // Bias on zero motion vector sse.
- const int zero_bias = denoiser->denoise_pars.denoise_mv_bias;
- zero_mv_sse = (unsigned int)((int64_t)zero_mv_sse * zero_bias / 100);
- sse_diff = zero_mv_sse - best_sse;
-
- saved_mbmi = *mbmi;
-
- /* Use the best MV for the compensation. */
- mbmi->ref_frame = x->best_reference_frame;
- mbmi->mode = x->best_sse_inter_mode;
- mbmi->mv = x->best_sse_mv;
- mbmi->need_to_clamp_mvs = x->need_to_clamp_best_mvs;
- mv_col = x->best_sse_mv.as_mv.col;
- mv_row = x->best_sse_mv.as_mv.row;
- // Bias to zero_mv if small amount of motion.
- // Note sse_diff_thresh is intialized to zero, so this ensures
- // we will always choose zero_mv for denoising if
- // zero_mv_see <= best_sse (i.e., sse_diff <= 0).
- if ((unsigned int)(mv_row * mv_row + mv_col * mv_col)
- <= NOISE_MOTION_THRESHOLD)
- sse_diff_thresh = (int)SSE_DIFF_THRESHOLD;
-
- if (frame == INTRA_FRAME ||
- sse_diff <= sse_diff_thresh)
- {
- /*
- * Handle intra blocks as referring to last frame with zero motion
- * and let the absolute pixel difference affect the filter factor.
- * Also consider small amount of motion as being random walk due
- * to noise, if it doesn't mean that we get a much bigger error.
- * Note that any changes to the mode info only affects the
- * denoising.
- */
- x->denoise_zeromv = 1;
- mbmi->ref_frame =
- x->best_zeromv_reference_frame;
-
- src = &denoiser->yv12_running_avg[zero_frame];
-
- mbmi->mode = ZEROMV;
- mbmi->mv.as_int = 0;
- x->best_sse_inter_mode = ZEROMV;
- x->best_sse_mv.as_int = 0;
- best_sse = zero_mv_sse;
- }
-
- saved_pre = filter_xd->pre;
- saved_dst = filter_xd->dst;
-
- /* Compensate the running average. */
- filter_xd->pre.y_buffer = src->y_buffer + recon_yoffset;
- filter_xd->pre.u_buffer = src->u_buffer + recon_uvoffset;
- filter_xd->pre.v_buffer = src->v_buffer + recon_uvoffset;
- /* Write the compensated running average to the destination buffer. */
- filter_xd->dst.y_buffer = dst->y_buffer + recon_yoffset;
- filter_xd->dst.u_buffer = dst->u_buffer + recon_uvoffset;
- filter_xd->dst.v_buffer = dst->v_buffer + recon_uvoffset;
-
- if (!x->skip)
- {
- vp8_build_inter_predictors_mb(filter_xd);
- }
- else
- {
- vp8_build_inter16x16_predictors_mb(filter_xd,
- filter_xd->dst.y_buffer,
- filter_xd->dst.u_buffer,
- filter_xd->dst.v_buffer,
- filter_xd->dst.y_stride,
- filter_xd->dst.uv_stride);
- }
- filter_xd->pre = saved_pre;
- filter_xd->dst = saved_dst;
- *mbmi = saved_mbmi;
-
- }
-
- mv_row = x->best_sse_mv.as_mv.row;
- mv_col = x->best_sse_mv.as_mv.col;
- motion_magnitude2 = mv_row * mv_row + mv_col * mv_col;
- motion_threshold = denoiser->denoise_pars.scale_motion_thresh *
- NOISE_MOTION_THRESHOLD;
-
- // If block is considered to be skin area, lower the motion threshold.
- // In current version set threshold = 1, so only denoise very low
- // (i.e., zero) mv on skin.
- if (x->is_skin)
- motion_threshold = 1;
-
- if (motion_magnitude2 <
- denoiser->denoise_pars.scale_increase_filter * NOISE_MOTION_THRESHOLD)
- x->increase_denoising = 1;
-
- sse_thresh = denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD;
- if (x->increase_denoising)
- sse_thresh = denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD_HIGH;
-
- if (best_sse > sse_thresh || motion_magnitude2 > motion_threshold)
- decision = COPY_BLOCK;
-
- if (decision == FILTER_BLOCK)
- {
- unsigned char *mc_running_avg_y =
- denoiser->yv12_mc_running_avg.y_buffer + recon_yoffset;
- int mc_avg_y_stride = denoiser->yv12_mc_running_avg.y_stride;
- unsigned char *running_avg_y =
- denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset;
- int avg_y_stride = denoiser->yv12_running_avg[INTRA_FRAME].y_stride;
-
- /* Filter. */
- decision = vp8_denoiser_filter(mc_running_avg_y, mc_avg_y_stride,
- running_avg_y, avg_y_stride,
- x->thismb, 16, motion_magnitude2,
- x->increase_denoising);
- denoiser->denoise_state[block_index] = motion_magnitude2 > 0 ?
- kFilterNonZeroMV : kFilterZeroMV;
- // Only denoise UV for zero motion, and if y channel was denoised.
- if (denoiser->denoiser_mode != kDenoiserOnYOnly &&
- motion_magnitude2 == 0 &&
- decision == FILTER_BLOCK) {
- unsigned char *mc_running_avg_u =
- denoiser->yv12_mc_running_avg.u_buffer + recon_uvoffset;
- unsigned char *running_avg_u =
- denoiser->yv12_running_avg[INTRA_FRAME].u_buffer + recon_uvoffset;
- unsigned char *mc_running_avg_v =
- denoiser->yv12_mc_running_avg.v_buffer + recon_uvoffset;
- unsigned char *running_avg_v =
- denoiser->yv12_running_avg[INTRA_FRAME].v_buffer + recon_uvoffset;
- int mc_avg_uv_stride = denoiser->yv12_mc_running_avg.uv_stride;
- int avg_uv_stride = denoiser->yv12_running_avg[INTRA_FRAME].uv_stride;
- int signal_stride = x->block[16].src_stride;
- decision_u =
- vp8_denoiser_filter_uv(mc_running_avg_u, mc_avg_uv_stride,
- running_avg_u, avg_uv_stride,
- x->block[16].src + *x->block[16].base_src,
- signal_stride, motion_magnitude2, 0);
- decision_v =
- vp8_denoiser_filter_uv(mc_running_avg_v, mc_avg_uv_stride,
- running_avg_v, avg_uv_stride,
- x->block[20].src + *x->block[20].base_src,
- signal_stride, motion_magnitude2, 0);
- }
- }
- if (decision == COPY_BLOCK)
- {
- /* No filtering of this block; it differs too much from the predictor,
- * or the motion vector magnitude is considered too big.
- */
- x->denoise_zeromv = 0;
- vp8_copy_mem16x16(
- x->thismb, 16,
- denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset,
- denoiser->yv12_running_avg[INTRA_FRAME].y_stride);
- denoiser->denoise_state[block_index] = kNoFilter;
- }
- if (denoiser->denoiser_mode != kDenoiserOnYOnly) {
- if (decision_u == COPY_BLOCK) {
- vp8_copy_mem8x8(
- x->block[16].src + *x->block[16].base_src, x->block[16].src_stride,
- denoiser->yv12_running_avg[INTRA_FRAME].u_buffer + recon_uvoffset,
- denoiser->yv12_running_avg[INTRA_FRAME].uv_stride);
- }
- if (decision_v == COPY_BLOCK) {
- vp8_copy_mem8x8(
- x->block[20].src + *x->block[20].base_src, x->block[16].src_stride,
- denoiser->yv12_running_avg[INTRA_FRAME].v_buffer + recon_uvoffset,
- denoiser->yv12_running_avg[INTRA_FRAME].uv_stride);
- }
- }
- // Option to selectively deblock the denoised signal, for y channel only.
- if (apply_spatial_loop_filter) {
- loop_filter_info lfi;
- int apply_filter_col = 0;
- int apply_filter_row = 0;
- int apply_filter = 0;
- int y_stride = denoiser->yv12_running_avg[INTRA_FRAME].y_stride;
- int uv_stride =denoiser->yv12_running_avg[INTRA_FRAME].uv_stride;
-
- // Fix filter level to some nominal value for now.
- int filter_level = 48;
-
- int hev_index = lfi_n->hev_thr_lut[INTER_FRAME][filter_level];
- lfi.mblim = lfi_n->mblim[filter_level];
- lfi.blim = lfi_n->blim[filter_level];
- lfi.lim = lfi_n->lim[filter_level];
- lfi.hev_thr = lfi_n->hev_thr[hev_index];
-
- // Apply filter if there is a difference in the denoiser filter state
- // between the current and left/top block, or if non-zero motion vector
- // is used for the motion-compensated filtering.
- if (mb_col > 0) {
- apply_filter_col = !((denoiser->denoise_state[block_index] ==
- denoiser->denoise_state[block_index - 1]) &&
- denoiser->denoise_state[block_index] != kFilterNonZeroMV);
- if (apply_filter_col) {
- // Filter left vertical edge.
- apply_filter = 1;
- vp8_loop_filter_mbv(
- denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset,
- NULL, NULL, y_stride, uv_stride, &lfi);
- }
- }
- if (mb_row > 0) {
- apply_filter_row = !((denoiser->denoise_state[block_index] ==
- denoiser->denoise_state[block_index - denoiser->num_mb_cols]) &&
- denoiser->denoise_state[block_index] != kFilterNonZeroMV);
- if (apply_filter_row) {
- // Filter top horizontal edge.
- apply_filter = 1;
- vp8_loop_filter_mbh(
- denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset,
- NULL, NULL, y_stride, uv_stride, &lfi);
- }
- }
- if (apply_filter) {
- // Update the signal block |x|. Pixel changes are only to top and/or
- // left boundary pixels: can we avoid full block copy here.
- vp8_copy_mem16x16(
- denoiser->yv12_running_avg[INTRA_FRAME].y_buffer + recon_yoffset,
- y_stride, x->thismb, 16);
- }
- }
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h
deleted file mode 100644
index 9a379a6a168..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef VP8_ENCODER_DENOISING_H_
-#define VP8_ENCODER_DENOISING_H_
-
-#include "block.h"
-#include "vp8/common/loopfilter.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define SUM_DIFF_THRESHOLD (16 * 16 * 2)
-#define SUM_DIFF_THRESHOLD_HIGH (600) // ~(16 * 16 * 1.5)
-#define MOTION_MAGNITUDE_THRESHOLD (8*3)
-
-#define SUM_DIFF_THRESHOLD_UV (96) // (8 * 8 * 1.5)
-#define SUM_DIFF_THRESHOLD_HIGH_UV (8 * 8 * 2)
-#define SUM_DIFF_FROM_AVG_THRESH_UV (8 * 8 * 8)
-#define MOTION_MAGNITUDE_THRESHOLD_UV (8*3)
-
-#define MAX_GF_ARF_DENOISE_RANGE (8)
-
-enum vp8_denoiser_decision
-{
- COPY_BLOCK,
- FILTER_BLOCK
-};
-
-enum vp8_denoiser_filter_state {
- kNoFilter,
- kFilterZeroMV,
- kFilterNonZeroMV
-};
-
-enum vp8_denoiser_mode {
- kDenoiserOff,
- kDenoiserOnYOnly,
- kDenoiserOnYUV,
- kDenoiserOnYUVAggressive,
- kDenoiserOnAdaptive
-};
-
-typedef struct {
- // Scale factor on sse threshold above which no denoising is done.
- unsigned int scale_sse_thresh;
- // Scale factor on motion magnitude threshold above which no
- // denoising is done.
- unsigned int scale_motion_thresh;
- // Scale factor on motion magnitude below which we increase the strength of
- // the temporal filter (in function vp8_denoiser_filter).
- unsigned int scale_increase_filter;
- // Scale factor to bias to ZEROMV for denoising.
- unsigned int denoise_mv_bias;
- // Scale factor to bias to ZEROMV for coding mode selection.
- unsigned int pickmode_mv_bias;
- // Quantizer threshold below which we use the segmentation map to switch off
- // loop filter for blocks that have been coded as ZEROMV-LAST a certain number
- // (consec_zerolast) of consecutive frames. Note that the delta-QP is set to
- // 0 when segmentation map is used for shutting off loop filter.
- unsigned int qp_thresh;
- // Threshold for number of consecutive frames for blocks coded as ZEROMV-LAST.
- unsigned int consec_zerolast;
- // Threshold for amount of spatial blur on Y channel. 0 means no spatial blur.
- unsigned int spatial_blur;
-} denoise_params;
-
-typedef struct vp8_denoiser
-{
- YV12_BUFFER_CONFIG yv12_running_avg[MAX_REF_FRAMES];
- YV12_BUFFER_CONFIG yv12_mc_running_avg;
- // TODO(marpan): Should remove yv12_last_source and use vp8_lookahead_peak.
- YV12_BUFFER_CONFIG yv12_last_source;
- unsigned char* denoise_state;
- int num_mb_cols;
- int denoiser_mode;
- int threshold_aggressive_mode;
- int nmse_source_diff;
- int nmse_source_diff_count;
- int qp_avg;
- int qp_threshold_up;
- int qp_threshold_down;
- int bitrate_threshold;
- denoise_params denoise_pars;
-} VP8_DENOISER;
-
-int vp8_denoiser_allocate(VP8_DENOISER *denoiser, int width, int height,
- int num_mb_rows, int num_mb_cols, int mode);
-
-void vp8_denoiser_free(VP8_DENOISER *denoiser);
-
-void vp8_denoiser_set_parameters(VP8_DENOISER *denoiser, int mode);
-
-void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser,
- MACROBLOCK *x,
- unsigned int best_sse,
- unsigned int zero_mv_sse,
- int recon_yoffset,
- int recon_uvoffset,
- loop_filter_info_n *lfi_n,
- int mb_row,
- int mb_col,
- int block_index);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_DENOISING_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.c
deleted file mode 100644
index d381d8ddf45..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.c
+++ /dev/null
@@ -1,1424 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "./vpx_dsp_rtcd.h"
-#include "encodemb.h"
-#include "encodemv.h"
-#include "vp8/common/common.h"
-#include "onyx_int.h"
-#include "vp8/common/extend.h"
-#include "vp8/common/entropymode.h"
-#include "vp8/common/quant_common.h"
-#include "segmentation.h"
-#include "vp8/common/setupintrarecon.h"
-#include "encodeintra.h"
-#include "vp8/common/reconinter.h"
-#include "rdopt.h"
-#include "pickinter.h"
-#include "vp8/common/findnearmv.h"
-#include <stdio.h>
-#include <limits.h>
-#include "vp8/common/invtrans.h"
-#include "vpx_ports/vpx_timer.h"
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
-#include "bitstream.h"
-#endif
-#include "encodeframe.h"
-
-extern void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ;
-extern void vp8_calc_ref_frame_costs(int *ref_frame_cost,
- int prob_intra,
- int prob_last,
- int prob_garf
- );
-extern void vp8_convert_rfct_to_prob(VP8_COMP *const cpi);
-extern void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex);
-extern void vp8_auto_select_speed(VP8_COMP *cpi);
-extern void vp8cx_init_mbrthread_data(VP8_COMP *cpi,
- MACROBLOCK *x,
- MB_ROW_COMP *mbr_ei,
- int count);
-static void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x );
-
-#ifdef MODE_STATS
-unsigned int inter_y_modes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-unsigned int inter_uv_modes[4] = {0, 0, 0, 0};
-unsigned int inter_b_modes[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-unsigned int y_modes[5] = {0, 0, 0, 0, 0};
-unsigned int uv_modes[4] = {0, 0, 0, 0};
-unsigned int b_modes[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-#endif
-
-
-/* activity_avg must be positive, or flat regions could get a zero weight
- * (infinite lambda), which confounds analysis.
- * This also avoids the need for divide by zero checks in
- * vp8_activity_masking().
- */
-#define VP8_ACTIVITY_AVG_MIN (64)
-
-/* This is used as a reference when computing the source variance for the
- * purposes of activity masking.
- * Eventually this should be replaced by custom no-reference routines,
- * which will be faster.
- */
-static const unsigned char VP8_VAR_OFFS[16]=
-{
- 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
-};
-
-
-/* Original activity measure from Tim T's code. */
-static unsigned int tt_activity_measure( VP8_COMP *cpi, MACROBLOCK *x )
-{
- unsigned int act;
- unsigned int sse;
- (void)cpi;
- /* TODO: This could also be done over smaller areas (8x8), but that would
- * require extensive changes elsewhere, as lambda is assumed to be fixed
- * over an entire MB in most of the code.
- * Another option is to compute four 8x8 variances, and pick a single
- * lambda using a non-linear combination (e.g., the smallest, or second
- * smallest, etc.).
- */
- act = vpx_variance16x16(x->src.y_buffer,
- x->src.y_stride, VP8_VAR_OFFS, 0, &sse);
- act = act<<4;
-
- /* If the region is flat, lower the activity some more. */
- if (act < 8<<12)
- act = act < 5<<12 ? act : 5<<12;
-
- return act;
-}
-
-/* Stub for alternative experimental activity measures. */
-static unsigned int alt_activity_measure( VP8_COMP *cpi,
- MACROBLOCK *x, int use_dc_pred )
-{
- return vp8_encode_intra(cpi,x, use_dc_pred);
-}
-
-
-/* Measure the activity of the current macroblock
- * What we measure here is TBD so abstracted to this function
- */
-#define ALT_ACT_MEASURE 1
-static unsigned int mb_activity_measure( VP8_COMP *cpi, MACROBLOCK *x,
- int mb_row, int mb_col)
-{
- unsigned int mb_activity;
-
- if ( ALT_ACT_MEASURE )
- {
- int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
-
- /* Or use and alternative. */
- mb_activity = alt_activity_measure( cpi, x, use_dc_pred );
- }
- else
- {
- /* Original activity measure from Tim T's code. */
- mb_activity = tt_activity_measure( cpi, x );
- }
-
- if ( mb_activity < VP8_ACTIVITY_AVG_MIN )
- mb_activity = VP8_ACTIVITY_AVG_MIN;
-
- return mb_activity;
-}
-
-/* Calculate an "average" mb activity value for the frame */
-#define ACT_MEDIAN 0
-static void calc_av_activity( VP8_COMP *cpi, int64_t activity_sum )
-{
-#if ACT_MEDIAN
- /* Find median: Simple n^2 algorithm for experimentation */
- {
- unsigned int median;
- unsigned int i,j;
- unsigned int * sortlist;
- unsigned int tmp;
-
- /* Create a list to sort to */
- CHECK_MEM_ERROR(sortlist,
- vpx_calloc(sizeof(unsigned int),
- cpi->common.MBs));
-
- /* Copy map to sort list */
- memcpy( sortlist, cpi->mb_activity_map,
- sizeof(unsigned int) * cpi->common.MBs );
-
-
- /* Ripple each value down to its correct position */
- for ( i = 1; i < cpi->common.MBs; i ++ )
- {
- for ( j = i; j > 0; j -- )
- {
- if ( sortlist[j] < sortlist[j-1] )
- {
- /* Swap values */
- tmp = sortlist[j-1];
- sortlist[j-1] = sortlist[j];
- sortlist[j] = tmp;
- }
- else
- break;
- }
- }
-
- /* Even number MBs so estimate median as mean of two either side. */
- median = ( 1 + sortlist[cpi->common.MBs >> 1] +
- sortlist[(cpi->common.MBs >> 1) + 1] ) >> 1;
-
- cpi->activity_avg = median;
-
- vpx_free(sortlist);
- }
-#else
- /* Simple mean for now */
- cpi->activity_avg = (unsigned int)(activity_sum/cpi->common.MBs);
-#endif
-
- if (cpi->activity_avg < VP8_ACTIVITY_AVG_MIN)
- cpi->activity_avg = VP8_ACTIVITY_AVG_MIN;
-
- /* Experimental code: return fixed value normalized for several clips */
- if ( ALT_ACT_MEASURE )
- cpi->activity_avg = 100000;
-}
-
-#define USE_ACT_INDEX 0
-#define OUTPUT_NORM_ACT_STATS 0
-
-#if USE_ACT_INDEX
-/* Calculate and activity index for each mb */
-static void calc_activity_index( VP8_COMP *cpi, MACROBLOCK *x )
-{
- VP8_COMMON *const cm = & cpi->common;
- int mb_row, mb_col;
-
- int64_t act;
- int64_t a;
- int64_t b;
-
-#if OUTPUT_NORM_ACT_STATS
- FILE *f = fopen("norm_act.stt", "a");
- fprintf(f, "\n%12d\n", cpi->activity_avg );
-#endif
-
- /* Reset pointers to start of activity map */
- x->mb_activity_ptr = cpi->mb_activity_map;
-
- /* Calculate normalized mb activity number. */
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
- {
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
- /* Read activity from the map */
- act = *(x->mb_activity_ptr);
-
- /* Calculate a normalized activity number */
- a = act + 4*cpi->activity_avg;
- b = 4*act + cpi->activity_avg;
-
- if ( b >= a )
- *(x->activity_ptr) = (int)((b + (a>>1))/a) - 1;
- else
- *(x->activity_ptr) = 1 - (int)((a + (b>>1))/b);
-
-#if OUTPUT_NORM_ACT_STATS
- fprintf(f, " %6d", *(x->mb_activity_ptr));
-#endif
- /* Increment activity map pointers */
- x->mb_activity_ptr++;
- }
-
-#if OUTPUT_NORM_ACT_STATS
- fprintf(f, "\n");
-#endif
-
- }
-
-#if OUTPUT_NORM_ACT_STATS
- fclose(f);
-#endif
-
-}
-#endif
-
-/* Loop through all MBs. Note activity of each, average activity and
- * calculate a normalized activity for each
- */
-static void build_activity_map( VP8_COMP *cpi )
-{
- MACROBLOCK *const x = & cpi->mb;
- MACROBLOCKD *xd = &x->e_mbd;
- VP8_COMMON *const cm = & cpi->common;
-
-#if ALT_ACT_MEASURE
- YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
- int recon_yoffset;
- int recon_y_stride = new_yv12->y_stride;
-#endif
-
- int mb_row, mb_col;
- unsigned int mb_activity;
- int64_t activity_sum = 0;
-
- /* for each macroblock row in image */
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
- {
-#if ALT_ACT_MEASURE
- /* reset above block coeffs */
- xd->up_available = (mb_row != 0);
- recon_yoffset = (mb_row * recon_y_stride * 16);
-#endif
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
-#if ALT_ACT_MEASURE
- xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
- xd->left_available = (mb_col != 0);
- recon_yoffset += 16;
-#endif
- /* Copy current mb to a buffer */
- vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
-
- /* measure activity */
- mb_activity = mb_activity_measure( cpi, x, mb_row, mb_col );
-
- /* Keep frame sum */
- activity_sum += mb_activity;
-
- /* Store MB level activity details. */
- *x->mb_activity_ptr = mb_activity;
-
- /* Increment activity map pointer */
- x->mb_activity_ptr++;
-
- /* adjust to the next column of source macroblocks */
- x->src.y_buffer += 16;
- }
-
-
- /* adjust to the next row of mbs */
- x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
-
-#if ALT_ACT_MEASURE
- /* extend the recon for intra prediction */
- vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16,
- xd->dst.u_buffer + 8, xd->dst.v_buffer + 8);
-#endif
-
- }
-
- /* Calculate an "average" MB activity */
- calc_av_activity(cpi, activity_sum);
-
-#if USE_ACT_INDEX
- /* Calculate an activity index number of each mb */
- calc_activity_index( cpi, x );
-#endif
-
-}
-
-/* Macroblock activity masking */
-void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x)
-{
-#if USE_ACT_INDEX
- x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2);
- x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
- x->errorperbit += (x->errorperbit==0);
-#else
- int64_t a;
- int64_t b;
- int64_t act = *(x->mb_activity_ptr);
-
- /* Apply the masking to the RD multiplier. */
- a = act + (2*cpi->activity_avg);
- b = (2*act) + cpi->activity_avg;
-
- x->rdmult = (unsigned int)(((int64_t)x->rdmult*b + (a>>1))/a);
- x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
- x->errorperbit += (x->errorperbit==0);
-#endif
-
- /* Activity based Zbin adjustment */
- adjust_act_zbin(cpi, x);
-}
-
-static
-void encode_mb_row(VP8_COMP *cpi,
- VP8_COMMON *cm,
- int mb_row,
- MACROBLOCK *x,
- MACROBLOCKD *xd,
- TOKENEXTRA **tp,
- int *segment_counts,
- int *totalrate)
-{
- int recon_yoffset, recon_uvoffset;
- int mb_col;
- int ref_fb_idx = cm->lst_fb_idx;
- int dst_fb_idx = cm->new_fb_idx;
- int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
- int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
- int map_index = (mb_row * cpi->common.mb_cols);
-
-#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- const int num_part = (1 << cm->multi_token_partition);
- TOKENEXTRA * tp_start = cpi->tok;
- vp8_writer *w;
-#endif
-
-#if CONFIG_MULTITHREAD
- const int nsync = cpi->mt_sync_range;
- const int rightmost_col = cm->mb_cols + nsync;
- volatile const int *last_row_current_mb_col;
- volatile int *current_mb_col = &cpi->mt_current_mb_col[mb_row];
-
- if ((cpi->b_multi_threaded != 0) && (mb_row != 0))
- last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1];
- else
- last_row_current_mb_col = &rightmost_col;
-#endif
-
-#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- if(num_part > 1)
- w= &cpi->bc[1 + (mb_row % num_part)];
- else
- w = &cpi->bc[1];
-#endif
-
- /* reset above block coeffs */
- xd->above_context = cm->above_context;
-
- xd->up_available = (mb_row != 0);
- recon_yoffset = (mb_row * recon_y_stride * 16);
- recon_uvoffset = (mb_row * recon_uv_stride * 8);
-
- cpi->tplist[mb_row].start = *tp;
- /* printf("Main mb_row = %d\n", mb_row); */
-
- /* Distance of Mb to the top & bottom edges, specified in 1/8th pel
- * units as they are always compared to values that are in 1/8th pel
- */
- xd->mb_to_top_edge = -((mb_row * 16) << 3);
- xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
-
- /* Set up limit values for vertical motion vector components
- * to prevent them extending beyond the UMV borders
- */
- x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
- + (VP8BORDERINPIXELS - 16);
-
- /* Set the mb activity pointer to the start of the row. */
- x->mb_activity_ptr = &cpi->mb_activity_map[map_index];
-
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
-
-#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- *tp = cpi->tok;
-#endif
- /* Distance of Mb to the left & right edges, specified in
- * 1/8th pel units as they are always compared to values
- * that are in 1/8th pel units
- */
- xd->mb_to_left_edge = -((mb_col * 16) << 3);
- xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
-
- /* Set up limit values for horizontal motion vector components
- * to prevent them extending beyond the UMV borders
- */
- x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
- + (VP8BORDERINPIXELS - 16);
-
- xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
- xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
- xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
- xd->left_available = (mb_col != 0);
-
- x->rddiv = cpi->RDDIV;
- x->rdmult = cpi->RDMULT;
-
- /* Copy current mb to a buffer */
- vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded != 0)
- {
- *current_mb_col = mb_col - 1; /* set previous MB done */
-
- if ((mb_col & (nsync - 1)) == 0)
- {
- while (mb_col > (*last_row_current_mb_col - nsync))
- {
- x86_pause_hint();
- thread_sleep(0);
- }
- }
- }
-#endif
-
- if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
- vp8_activity_masking(cpi, x);
-
- /* Is segmentation enabled */
- /* MB level adjustment to quantizer */
- if (xd->segmentation_enabled)
- {
- /* Code to set segment id in xd->mbmi.segment_id for current MB
- * (with range checking)
- */
- if (cpi->segmentation_map[map_index+mb_col] <= 3)
- xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col];
- else
- xd->mode_info_context->mbmi.segment_id = 0;
-
- vp8cx_mb_init_quantizer(cpi, x, 1);
- }
- else
- /* Set to Segment 0 by default */
- xd->mode_info_context->mbmi.segment_id = 0;
-
- x->active_ptr = cpi->active_map + map_index + mb_col;
-
- if (cm->frame_type == KEY_FRAME)
- {
- *totalrate += vp8cx_encode_intra_macroblock(cpi, x, tp);
-#ifdef MODE_STATS
- y_modes[xd->mbmi.mode] ++;
-#endif
- }
- else
- {
- *totalrate += vp8cx_encode_inter_macroblock(cpi, x, tp, recon_yoffset, recon_uvoffset, mb_row, mb_col);
-
-#ifdef MODE_STATS
- inter_y_modes[xd->mbmi.mode] ++;
-
- if (xd->mbmi.mode == SPLITMV)
- {
- int b;
-
- for (b = 0; b < xd->mbmi.partition_count; b++)
- {
- inter_b_modes[x->partition->bmi[b].mode] ++;
- }
- }
-
-#endif
-
- // Keep track of how many (consecutive) times a block is coded
- // as ZEROMV_LASTREF, for base layer frames.
- // Reset to 0 if its coded as anything else.
- if (cpi->current_layer == 0) {
- if (xd->mode_info_context->mbmi.mode == ZEROMV &&
- xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) {
- // Increment, check for wrap-around.
- if (cpi->consec_zero_last[map_index+mb_col] < 255)
- cpi->consec_zero_last[map_index+mb_col] += 1;
- if (cpi->consec_zero_last_mvbias[map_index+mb_col] < 255)
- cpi->consec_zero_last_mvbias[map_index+mb_col] += 1;
- } else {
- cpi->consec_zero_last[map_index+mb_col] = 0;
- cpi->consec_zero_last_mvbias[map_index+mb_col] = 0;
- }
- if (x->zero_last_dot_suppress)
- cpi->consec_zero_last_mvbias[map_index+mb_col] = 0;
- }
-
- /* Special case code for cyclic refresh
- * If cyclic update enabled then copy xd->mbmi.segment_id; (which
- * may have been updated based on mode during
- * vp8cx_encode_inter_macroblock()) back into the global
- * segmentation map
- */
- if ((cpi->current_layer == 0) &&
- (cpi->cyclic_refresh_mode_enabled &&
- xd->segmentation_enabled))
- {
- cpi->segmentation_map[map_index+mb_col] = xd->mode_info_context->mbmi.segment_id;
-
- /* If the block has been refreshed mark it as clean (the
- * magnitude of the -ve influences how long it will be before
- * we consider another refresh):
- * Else if it was coded (last frame 0,0) and has not already
- * been refreshed then mark it as a candidate for cleanup
- * next time (marked 0) else mark it as dirty (1).
- */
- if (xd->mode_info_context->mbmi.segment_id)
- cpi->cyclic_refresh_map[map_index+mb_col] = -1;
- else if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
- {
- if (cpi->cyclic_refresh_map[map_index+mb_col] == 1)
- cpi->cyclic_refresh_map[map_index+mb_col] = 0;
- }
- else
- cpi->cyclic_refresh_map[map_index+mb_col] = 1;
-
- }
- }
-
- cpi->tplist[mb_row].stop = *tp;
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- /* pack tokens for this MB */
- {
- int tok_count = *tp - tp_start;
- vp8_pack_tokens(w, tp_start, tok_count);
- }
-#endif
- /* Increment pointer into gf usage flags structure. */
- x->gf_active_ptr++;
-
- /* Increment the activity mask pointers. */
- x->mb_activity_ptr++;
-
- /* adjust to the next column of macroblocks */
- x->src.y_buffer += 16;
- x->src.u_buffer += 8;
- x->src.v_buffer += 8;
-
- recon_yoffset += 16;
- recon_uvoffset += 8;
-
- /* Keep track of segment usage */
- segment_counts[xd->mode_info_context->mbmi.segment_id] ++;
-
- /* skip to next mb */
- xd->mode_info_context++;
- x->partition_info++;
- xd->above_context++;
- }
-
- /* extend the recon for intra prediction */
- vp8_extend_mb_row( &cm->yv12_fb[dst_fb_idx],
- xd->dst.y_buffer + 16,
- xd->dst.u_buffer + 8,
- xd->dst.v_buffer + 8);
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded != 0)
- *current_mb_col = rightmost_col;
-#endif
-
- /* this is to account for the border */
- xd->mode_info_context++;
- x->partition_info++;
-}
-
-static void init_encode_frame_mb_context(VP8_COMP *cpi)
-{
- MACROBLOCK *const x = & cpi->mb;
- VP8_COMMON *const cm = & cpi->common;
- MACROBLOCKD *const xd = & x->e_mbd;
-
- /* GF active flags data structure */
- x->gf_active_ptr = (signed char *)cpi->gf_active_flags;
-
- /* Activity map pointer */
- x->mb_activity_ptr = cpi->mb_activity_map;
-
- x->act_zbin_adj = 0;
-
- x->partition_info = x->pi;
-
- xd->mode_info_context = cm->mi;
- xd->mode_info_stride = cm->mode_info_stride;
-
- xd->frame_type = cm->frame_type;
-
- /* reset intra mode contexts */
- if (cm->frame_type == KEY_FRAME)
- vp8_init_mbmode_probs(cm);
-
- /* Copy data over into macro block data structures. */
- x->src = * cpi->Source;
- xd->pre = cm->yv12_fb[cm->lst_fb_idx];
- xd->dst = cm->yv12_fb[cm->new_fb_idx];
-
- /* set up frame for intra coded blocks */
- vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]);
-
- vp8_build_block_offsets(x);
-
- xd->mode_info_context->mbmi.mode = DC_PRED;
- xd->mode_info_context->mbmi.uv_mode = DC_PRED;
-
- xd->left_context = &cm->left_context;
-
- x->mvc = cm->fc.mvc;
-
- memset(cm->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * cm->mb_cols);
-
- /* Special case treatment when GF and ARF are not sensible options
- * for reference
- */
- if (cpi->ref_frame_flags == VP8_LAST_FRAME)
- vp8_calc_ref_frame_costs(x->ref_frame_cost,
- cpi->prob_intra_coded,255,128);
- else if ((cpi->oxcf.number_of_layers > 1) &&
- (cpi->ref_frame_flags == VP8_GOLD_FRAME))
- vp8_calc_ref_frame_costs(x->ref_frame_cost,
- cpi->prob_intra_coded,1,255);
- else if ((cpi->oxcf.number_of_layers > 1) &&
- (cpi->ref_frame_flags == VP8_ALTR_FRAME))
- vp8_calc_ref_frame_costs(x->ref_frame_cost,
- cpi->prob_intra_coded,1,1);
- else
- vp8_calc_ref_frame_costs(x->ref_frame_cost,
- cpi->prob_intra_coded,
- cpi->prob_last_coded,
- cpi->prob_gf_coded);
-
- xd->fullpixel_mask = 0xffffffff;
- if(cm->full_pixel)
- xd->fullpixel_mask = 0xfffffff8;
-
- vp8_zero(x->coef_counts);
- vp8_zero(x->ymode_count);
- vp8_zero(x->uv_mode_count)
- x->prediction_error = 0;
- x->intra_error = 0;
- vp8_zero(x->count_mb_ref_frame_usage);
-}
-
-static void sum_coef_counts(MACROBLOCK *x, MACROBLOCK *x_thread)
-{
- int i = 0;
- do
- {
- int j = 0;
- do
- {
- int k = 0;
- do
- {
- /* at every context */
-
- /* calc probs and branch cts for this frame only */
- int t = 0; /* token/prob index */
-
- do
- {
- x->coef_counts [i][j][k][t] +=
- x_thread->coef_counts [i][j][k][t];
- }
- while (++t < ENTROPY_NODES);
- }
- while (++k < PREV_COEF_CONTEXTS);
- }
- while (++j < COEF_BANDS);
- }
- while (++i < BLOCK_TYPES);
-}
-
-void vp8_encode_frame(VP8_COMP *cpi)
-{
- int mb_row;
- MACROBLOCK *const x = & cpi->mb;
- VP8_COMMON *const cm = & cpi->common;
- MACROBLOCKD *const xd = & x->e_mbd;
- TOKENEXTRA *tp = cpi->tok;
- int segment_counts[MAX_MB_SEGMENTS];
- int totalrate;
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- BOOL_CODER * bc = &cpi->bc[1]; /* bc[0] is for control partition */
- const int num_part = (1 << cm->multi_token_partition);
-#endif
-
- memset(segment_counts, 0, sizeof(segment_counts));
- totalrate = 0;
-
- if (cpi->compressor_speed == 2)
- {
- if (cpi->oxcf.cpu_used < 0)
- cpi->Speed = -(cpi->oxcf.cpu_used);
- else
- vp8_auto_select_speed(cpi);
- }
-
- /* Functions setup for all frame types so we can use MC in AltRef */
- if(!cm->use_bilinear_mc_filter)
- {
- xd->subpixel_predict = vp8_sixtap_predict4x4;
- xd->subpixel_predict8x4 = vp8_sixtap_predict8x4;
- xd->subpixel_predict8x8 = vp8_sixtap_predict8x8;
- xd->subpixel_predict16x16 = vp8_sixtap_predict16x16;
- }
- else
- {
- xd->subpixel_predict = vp8_bilinear_predict4x4;
- xd->subpixel_predict8x4 = vp8_bilinear_predict8x4;
- xd->subpixel_predict8x8 = vp8_bilinear_predict8x8;
- xd->subpixel_predict16x16 = vp8_bilinear_predict16x16;
- }
-
- cpi->mb.skip_true_count = 0;
- cpi->tok_count = 0;
-
-#if 0
- /* Experimental code */
- cpi->frame_distortion = 0;
- cpi->last_mb_distortion = 0;
-#endif
-
- xd->mode_info_context = cm->mi;
-
- vp8_zero(cpi->mb.MVcount);
-
- vp8cx_frame_init_quantizer(cpi);
-
- vp8_initialize_rd_consts(cpi, x,
- vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
-
- vp8cx_initialize_me_consts(cpi, cm->base_qindex);
-
- if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
- {
- /* Initialize encode frame context. */
- init_encode_frame_mb_context(cpi);
-
- /* Build a frame level activity map */
- build_activity_map(cpi);
- }
-
- /* re-init encode frame context. */
- init_encode_frame_mb_context(cpi);
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- {
- int i;
- for(i = 0; i < num_part; i++)
- {
- vp8_start_encode(&bc[i], cpi->partition_d[i + 1],
- cpi->partition_d_end[i + 1]);
- bc[i].error = &cm->error;
- }
- }
-
-#endif
-
- {
- struct vpx_usec_timer emr_timer;
- vpx_usec_timer_start(&emr_timer);
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded)
- {
- int i;
-
- vp8cx_init_mbrthread_data(cpi, x, cpi->mb_row_ei,
- cpi->encoding_thread_count);
-
- for (i = 0; i < cm->mb_rows; i++)
- cpi->mt_current_mb_col[i] = -1;
-
- for (i = 0; i < cpi->encoding_thread_count; i++)
- {
- sem_post(&cpi->h_event_start_encoding[i]);
- }
-
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1))
- {
- vp8_zero(cm->left_context)
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- tp = cpi->tok;
-#else
- tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
-#endif
-
- encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
-
- /* adjust to the next row of mbs */
- x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
- x->src.u_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
- x->src.v_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
-
- xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
- x->partition_info += xd->mode_info_stride * cpi->encoding_thread_count;
- x->gf_active_ptr += cm->mb_cols * cpi->encoding_thread_count;
-
- if(mb_row == cm->mb_rows - 1)
- {
- sem_post(&cpi->h_event_end_encoding); /* signal frame encoding end */
- }
- }
-
- sem_wait(&cpi->h_event_end_encoding); /* wait for other threads to finish */
-
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
- {
- cpi->tok_count += (unsigned int)
- (cpi->tplist[mb_row].stop - cpi->tplist[mb_row].start);
- }
-
- if (xd->segmentation_enabled)
- {
- int j;
-
- if (xd->segmentation_enabled)
- {
- for (i = 0; i < cpi->encoding_thread_count; i++)
- {
- for (j = 0; j < 4; j++)
- segment_counts[j] += cpi->mb_row_ei[i].segment_counts[j];
- }
- }
- }
-
- for (i = 0; i < cpi->encoding_thread_count; i++)
- {
- int mode_count;
- int c_idx;
- totalrate += cpi->mb_row_ei[i].totalrate;
-
- cpi->mb.skip_true_count += cpi->mb_row_ei[i].mb.skip_true_count;
-
- for(mode_count = 0; mode_count < VP8_YMODES; mode_count++)
- cpi->mb.ymode_count[mode_count] +=
- cpi->mb_row_ei[i].mb.ymode_count[mode_count];
-
- for(mode_count = 0; mode_count < VP8_UV_MODES; mode_count++)
- cpi->mb.uv_mode_count[mode_count] +=
- cpi->mb_row_ei[i].mb.uv_mode_count[mode_count];
-
- for(c_idx = 0; c_idx < MVvals; c_idx++)
- {
- cpi->mb.MVcount[0][c_idx] +=
- cpi->mb_row_ei[i].mb.MVcount[0][c_idx];
- cpi->mb.MVcount[1][c_idx] +=
- cpi->mb_row_ei[i].mb.MVcount[1][c_idx];
- }
-
- cpi->mb.prediction_error +=
- cpi->mb_row_ei[i].mb.prediction_error;
- cpi->mb.intra_error += cpi->mb_row_ei[i].mb.intra_error;
-
- for(c_idx = 0; c_idx < MAX_REF_FRAMES; c_idx++)
- cpi->mb.count_mb_ref_frame_usage[c_idx] +=
- cpi->mb_row_ei[i].mb.count_mb_ref_frame_usage[c_idx];
-
- for(c_idx = 0; c_idx < MAX_ERROR_BINS; c_idx++)
- cpi->mb.error_bins[c_idx] +=
- cpi->mb_row_ei[i].mb.error_bins[c_idx];
-
- /* add up counts for each thread */
- sum_coef_counts(x, &cpi->mb_row_ei[i].mb);
- }
-
- }
- else
-#endif
- {
-
- /* for each macroblock row in image */
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
- {
- vp8_zero(cm->left_context)
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- tp = cpi->tok;
-#endif
-
- encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
-
- /* adjust to the next row of mbs */
- x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
- x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
- x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
- }
-
- cpi->tok_count = (unsigned int)(tp - cpi->tok);
- }
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- {
- int i;
- for(i = 0; i < num_part; i++)
- {
- vp8_stop_encode(&bc[i]);
- cpi->partition_sz[i+1] = bc[i].pos;
- }
- }
-#endif
-
- vpx_usec_timer_mark(&emr_timer);
- cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer);
- }
-
-
- // Work out the segment probabilities if segmentation is enabled
- // and needs to be updated
- if (xd->segmentation_enabled && xd->update_mb_segmentation_map)
- {
- int tot_count;
- int i;
-
- /* Set to defaults */
- memset(xd->mb_segment_tree_probs, 255 , sizeof(xd->mb_segment_tree_probs));
-
- tot_count = segment_counts[0] + segment_counts[1] + segment_counts[2] + segment_counts[3];
-
- if (tot_count)
- {
- xd->mb_segment_tree_probs[0] = ((segment_counts[0] + segment_counts[1]) * 255) / tot_count;
-
- tot_count = segment_counts[0] + segment_counts[1];
-
- if (tot_count > 0)
- {
- xd->mb_segment_tree_probs[1] = (segment_counts[0] * 255) / tot_count;
- }
-
- tot_count = segment_counts[2] + segment_counts[3];
-
- if (tot_count > 0)
- xd->mb_segment_tree_probs[2] = (segment_counts[2] * 255) / tot_count;
-
- /* Zero probabilities not allowed */
- for (i = 0; i < MB_FEATURE_TREE_PROBS; i ++)
- {
- if (xd->mb_segment_tree_probs[i] == 0)
- xd->mb_segment_tree_probs[i] = 1;
- }
- }
- }
-
- /* projected_frame_size in units of BYTES */
- cpi->projected_frame_size = totalrate >> 8;
-
- /* Make a note of the percentage MBs coded Intra. */
- if (cm->frame_type == KEY_FRAME)
- {
- cpi->this_frame_percent_intra = 100;
- }
- else
- {
- int tot_modes;
-
- tot_modes = cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME]
- + cpi->mb.count_mb_ref_frame_usage[LAST_FRAME]
- + cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME]
- + cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
-
- if (tot_modes)
- cpi->this_frame_percent_intra =
- cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME] * 100 / tot_modes;
-
- }
-
-#if ! CONFIG_REALTIME_ONLY
- /* Adjust the projected reference frame usage probability numbers to
- * reflect what we have just seen. This may be useful when we make
- * multiple iterations of the recode loop rather than continuing to use
- * values from the previous frame.
- */
- if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
- (!cm->refresh_alt_ref_frame && !cm->refresh_golden_frame)))
- {
- vp8_convert_rfct_to_prob(cpi);
- }
-#endif
-}
-void vp8_setup_block_ptrs(MACROBLOCK *x)
-{
- int r, c;
- int i;
-
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- x->block[r*4+c].src_diff = x->src_diff + r * 4 * 16 + c * 4;
- }
- }
-
- for (r = 0; r < 2; r++)
- {
- for (c = 0; c < 2; c++)
- {
- x->block[16 + r*2+c].src_diff = x->src_diff + 256 + r * 4 * 8 + c * 4;
- }
- }
-
-
- for (r = 0; r < 2; r++)
- {
- for (c = 0; c < 2; c++)
- {
- x->block[20 + r*2+c].src_diff = x->src_diff + 320 + r * 4 * 8 + c * 4;
- }
- }
-
- x->block[24].src_diff = x->src_diff + 384;
-
-
- for (i = 0; i < 25; i++)
- {
- x->block[i].coeff = x->coeff + i * 16;
- }
-}
-
-void vp8_build_block_offsets(MACROBLOCK *x)
-{
- int block = 0;
- int br, bc;
-
- vp8_build_block_doffsets(&x->e_mbd);
-
- /* y blocks */
- x->thismb_ptr = &x->thismb[0];
- for (br = 0; br < 4; br++)
- {
- for (bc = 0; bc < 4; bc++)
- {
- BLOCK *this_block = &x->block[block];
- this_block->base_src = &x->thismb_ptr;
- this_block->src_stride = 16;
- this_block->src = 4 * br * 16 + 4 * bc;
- ++block;
- }
- }
-
- /* u blocks */
- for (br = 0; br < 2; br++)
- {
- for (bc = 0; bc < 2; bc++)
- {
- BLOCK *this_block = &x->block[block];
- this_block->base_src = &x->src.u_buffer;
- this_block->src_stride = x->src.uv_stride;
- this_block->src = 4 * br * this_block->src_stride + 4 * bc;
- ++block;
- }
- }
-
- /* v blocks */
- for (br = 0; br < 2; br++)
- {
- for (bc = 0; bc < 2; bc++)
- {
- BLOCK *this_block = &x->block[block];
- this_block->base_src = &x->src.v_buffer;
- this_block->src_stride = x->src.uv_stride;
- this_block->src = 4 * br * this_block->src_stride + 4 * bc;
- ++block;
- }
- }
-}
-
-static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x)
-{
- const MACROBLOCKD *xd = & x->e_mbd;
- const MB_PREDICTION_MODE m = xd->mode_info_context->mbmi.mode;
- const MB_PREDICTION_MODE uvm = xd->mode_info_context->mbmi.uv_mode;
-
-#ifdef MODE_STATS
- const int is_key = cpi->common.frame_type == KEY_FRAME;
-
- ++ (is_key ? uv_modes : inter_uv_modes)[uvm];
-
- if (m == B_PRED)
- {
- unsigned int *const bct = is_key ? b_modes : inter_b_modes;
-
- int b = 0;
-
- do
- {
- ++ bct[xd->block[b].bmi.mode];
- }
- while (++b < 16);
- }
-
-#else
- (void)cpi;
-#endif
-
- ++x->ymode_count[m];
- ++x->uv_mode_count[uvm];
-
-}
-
-/* Experimental stub function to create a per MB zbin adjustment based on
- * some previously calculated measure of MB activity.
- */
-static void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x )
-{
-#if USE_ACT_INDEX
- x->act_zbin_adj = *(x->mb_activity_ptr);
-#else
- int64_t a;
- int64_t b;
- int64_t act = *(x->mb_activity_ptr);
-
- /* Apply the masking to the RD multiplier. */
- a = act + 4*cpi->activity_avg;
- b = 4*act + cpi->activity_avg;
-
- if ( act > cpi->activity_avg )
- x->act_zbin_adj = (int)(((int64_t)b + (a>>1))/a) - 1;
- else
- x->act_zbin_adj = 1 - (int)(((int64_t)a + (b>>1))/b);
-#endif
-}
-
-int vp8cx_encode_intra_macroblock(VP8_COMP *cpi, MACROBLOCK *x,
- TOKENEXTRA **t)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- int rate;
-
- if (cpi->sf.RD && cpi->compressor_speed != 2)
- vp8_rd_pick_intra_mode(x, &rate);
- else
- vp8_pick_intra_mode(x, &rate);
-
- if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
- {
- adjust_act_zbin( cpi, x );
- vp8_update_zbin_extra(cpi, x);
- }
-
- if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED)
- vp8_encode_intra4x4mby(x);
- else
- vp8_encode_intra16x16mby(x);
-
- vp8_encode_intra16x16mbuv(x);
-
- sum_intra_stats(cpi, x);
-
- vp8_tokenize_mb(cpi, x, t);
-
- if (xd->mode_info_context->mbmi.mode != B_PRED)
- vp8_inverse_transform_mby(xd);
-
- vp8_dequant_idct_add_uv_block
- (xd->qcoeff+16*16, xd->dequant_uv,
- xd->dst.u_buffer, xd->dst.v_buffer,
- xd->dst.uv_stride, xd->eobs+16);
- return rate;
-}
-#ifdef SPEEDSTATS
-extern int cnt_pm;
-#endif
-
-extern void vp8_fix_contexts(MACROBLOCKD *x);
-
-int vp8cx_encode_inter_macroblock
-(
- VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
- int recon_yoffset, int recon_uvoffset,
- int mb_row, int mb_col
-)
-{
- MACROBLOCKD *const xd = &x->e_mbd;
- int intra_error = 0;
- int rate;
- int distortion;
-
- x->skip = 0;
-
- if (xd->segmentation_enabled)
- x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context->mbmi.segment_id];
- else
- x->encode_breakout = cpi->oxcf.encode_breakout;
-
-#if CONFIG_TEMPORAL_DENOISING
- /* Reset the best sse mode/mv for each macroblock. */
- x->best_reference_frame = INTRA_FRAME;
- x->best_zeromv_reference_frame = INTRA_FRAME;
- x->best_sse_inter_mode = 0;
- x->best_sse_mv.as_int = 0;
- x->need_to_clamp_best_mvs = 0;
-#endif
-
- if (cpi->sf.RD)
- {
- int zbin_mode_boost_enabled = x->zbin_mode_boost_enabled;
-
- /* Are we using the fast quantizer for the mode selection? */
- if(cpi->sf.use_fastquant_for_pick)
- {
- x->quantize_b = vp8_fast_quantize_b;
-
- /* the fast quantizer does not use zbin_extra, so
- * do not recalculate */
- x->zbin_mode_boost_enabled = 0;
- }
- vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate,
- &distortion, &intra_error, mb_row, mb_col);
-
- /* switch back to the regular quantizer for the encode */
- if (cpi->sf.improved_quant)
- {
- x->quantize_b = vp8_regular_quantize_b;
- }
-
- /* restore cpi->zbin_mode_boost_enabled */
- x->zbin_mode_boost_enabled = zbin_mode_boost_enabled;
-
- }
- else
- {
- vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate,
- &distortion, &intra_error, mb_row, mb_col);
- }
-
- x->prediction_error += distortion;
- x->intra_error += intra_error;
-
- if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
- {
- /* Adjust the zbin based on this MB rate. */
- adjust_act_zbin( cpi, x );
- }
-
-#if 0
- /* Experimental RD code */
- cpi->frame_distortion += distortion;
- cpi->last_mb_distortion = distortion;
-#endif
-
- /* MB level adjutment to quantizer setup */
- if (xd->segmentation_enabled)
- {
- /* If cyclic update enabled */
- if (cpi->current_layer == 0 && cpi->cyclic_refresh_mode_enabled)
- {
- /* Clear segment_id back to 0 if not coded (last frame 0,0) */
- if ((xd->mode_info_context->mbmi.segment_id == 1) &&
- ((xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) || (xd->mode_info_context->mbmi.mode != ZEROMV)))
- {
- xd->mode_info_context->mbmi.segment_id = 0;
-
- /* segment_id changed, so update */
- vp8cx_mb_init_quantizer(cpi, x, 1);
- }
- }
- }
-
- {
- /* Experimental code.
- * Special case for gf and arf zeromv modes, for 1 temporal layer.
- * Increase zbin size to supress noise.
- */
- x->zbin_mode_boost = 0;
- if (x->zbin_mode_boost_enabled)
- {
- if ( xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME )
- {
- if (xd->mode_info_context->mbmi.mode == ZEROMV)
- {
- if (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME &&
- cpi->oxcf.number_of_layers == 1)
- x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
- else
- x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
- }
- else if (xd->mode_info_context->mbmi.mode == SPLITMV)
- x->zbin_mode_boost = 0;
- else
- x->zbin_mode_boost = MV_ZBIN_BOOST;
- }
- }
-
- /* The fast quantizer doesn't use zbin_extra, only do so with
- * the regular quantizer. */
- if (cpi->sf.improved_quant)
- vp8_update_zbin_extra(cpi, x);
- }
-
- x->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++;
-
- if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
- {
- vp8_encode_intra16x16mbuv(x);
-
- if (xd->mode_info_context->mbmi.mode == B_PRED)
- {
- vp8_encode_intra4x4mby(x);
- }
- else
- {
- vp8_encode_intra16x16mby(x);
- }
-
- sum_intra_stats(cpi, x);
- }
- else
- {
- int ref_fb_idx;
-
- if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)
- ref_fb_idx = cpi->common.lst_fb_idx;
- else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME)
- ref_fb_idx = cpi->common.gld_fb_idx;
- else
- ref_fb_idx = cpi->common.alt_fb_idx;
-
- xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoffset;
- xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
- xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
-
- if (!x->skip)
- {
- vp8_encode_inter16x16(x);
- }
- else
- vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
- xd->dst.u_buffer, xd->dst.v_buffer,
- xd->dst.y_stride, xd->dst.uv_stride);
-
- }
-
- if (!x->skip)
- {
- vp8_tokenize_mb(cpi, x, t);
-
- if (xd->mode_info_context->mbmi.mode != B_PRED)
- vp8_inverse_transform_mby(xd);
-
- vp8_dequant_idct_add_uv_block
- (xd->qcoeff+16*16, xd->dequant_uv,
- xd->dst.u_buffer, xd->dst.v_buffer,
- xd->dst.uv_stride, xd->eobs+16);
- }
- else
- {
- /* always set mb_skip_coeff as it is needed by the loopfilter */
- xd->mode_info_context->mbmi.mb_skip_coeff = 1;
-
- if (cpi->common.mb_no_coeff_skip)
- {
- x->skip_true_count ++;
- vp8_fix_contexts(xd);
- }
- else
- {
- vp8_stuff_mb(cpi, x, t);
- }
- }
-
- return rate;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.h
deleted file mode 100644
index e185c1035c0..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeframe.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-#ifndef VP8_ENCODER_ENCODEFRAME_H_
-#define VP8_ENCODER_ENCODEFRAME_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern void vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x);
-
-extern void vp8_build_block_offsets(MACROBLOCK *x);
-
-extern void vp8_setup_block_ptrs(MACROBLOCK *x);
-
-extern void vp8_encode_frame(VP8_COMP *cpi);
-
-extern int vp8cx_encode_inter_macroblock(VP8_COMP *cpi, MACROBLOCK *x,
- TOKENEXTRA **t,
- int recon_yoffset, int recon_uvoffset,
- int mb_row, int mb_col);
-
-extern int vp8cx_encode_intra_macroblock(VP8_COMP *cpi, MACROBLOCK *x,
- TOKENEXTRA **t);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_ENCODEFRAME_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.c
deleted file mode 100644
index e2de5eecbc4..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "./vpx_dsp_rtcd.h"
-#include "quantize.h"
-#include "vp8/common/reconintra4x4.h"
-#include "encodemb.h"
-#include "vp8/common/invtrans.h"
-#include "encodeintra.h"
-
-
-int vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred)
-{
-
- int i;
- int intra_pred_var = 0;
- (void) cpi;
-
- if (use_dc_pred)
- {
- x->e_mbd.mode_info_context->mbmi.mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
-
- vp8_encode_intra16x16mby(x);
-
- vp8_inverse_transform_mby(&x->e_mbd);
- }
- else
- {
- for (i = 0; i < 16; i++)
- {
- x->e_mbd.block[i].bmi.as_mode = B_DC_PRED;
- vp8_encode_intra4x4block(x, i);
- }
- }
-
- intra_pred_var = vpx_get_mb_ss(x->src_diff);
-
- return intra_pred_var;
-}
-
-void vp8_encode_intra4x4block(MACROBLOCK *x, int ib)
-{
- BLOCKD *b = &x->e_mbd.block[ib];
- BLOCK *be = &x->block[ib];
- int dst_stride = x->e_mbd.dst.y_stride;
- unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
- unsigned char *Above = dst - dst_stride;
- unsigned char *yleft = dst - 1;
- unsigned char top_left = Above[-1];
-
- vp8_intra4x4_predict(Above, yleft, dst_stride, b->bmi.as_mode,
- b->predictor, 16, top_left);
-
- vp8_subtract_b(be, b, 16);
-
- x->short_fdct4x4(be->src_diff, be->coeff, 32);
-
- x->quantize_b(be, b);
-
- if (*b->eob > 1)
- {
- vp8_short_idct4x4llm(b->dqcoeff, b->predictor, 16, dst, dst_stride);
- }
- else
- {
- vp8_dc_only_idct_add(b->dqcoeff[0], b->predictor, 16, dst, dst_stride);
- }
-}
-
-void vp8_encode_intra4x4mby(MACROBLOCK *mb)
-{
- int i;
-
- MACROBLOCKD *xd = &mb->e_mbd;
- intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
-
- for (i = 0; i < 16; i++)
- vp8_encode_intra4x4block(mb, i);
- return;
-}
-
-void vp8_encode_intra16x16mby(MACROBLOCK *x)
-{
- BLOCK *b = &x->block[0];
- MACROBLOCKD *xd = &x->e_mbd;
-
- vp8_build_intra_predictors_mby_s(xd,
- xd->dst.y_buffer - xd->dst.y_stride,
- xd->dst.y_buffer - 1,
- xd->dst.y_stride,
- xd->dst.y_buffer,
- xd->dst.y_stride);
-
- vp8_subtract_mby(x->src_diff, *(b->base_src),
- b->src_stride, xd->dst.y_buffer, xd->dst.y_stride);
-
- vp8_transform_intra_mby(x);
-
- vp8_quantize_mby(x);
-
- if (x->optimize)
- vp8_optimize_mby(x);
-}
-
-void vp8_encode_intra16x16mbuv(MACROBLOCK *x)
-{
- MACROBLOCKD *xd = &x->e_mbd;
-
- vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride,
- xd->dst.v_buffer - xd->dst.uv_stride,
- xd->dst.u_buffer - 1,
- xd->dst.v_buffer - 1,
- xd->dst.uv_stride,
- xd->dst.u_buffer, xd->dst.v_buffer,
- xd->dst.uv_stride);
-
- vp8_subtract_mbuv(x->src_diff, x->src.u_buffer,
- x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer,
- xd->dst.v_buffer, xd->dst.uv_stride);
-
- vp8_transform_mbuv(x);
-
- vp8_quantize_mbuv(x);
-
- if (x->optimize)
- vp8_optimize_mbuv(x);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.h
deleted file mode 100644
index a8d0284d29b..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodeintra.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_ENCODEINTRA_H_
-#define VP8_ENCODER_ENCODEINTRA_H_
-#include "onyx_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred);
-void vp8_encode_intra16x16mby(MACROBLOCK *x);
-void vp8_encode_intra16x16mbuv(MACROBLOCK *x);
-void vp8_encode_intra4x4mby(MACROBLOCK *mb);
-void vp8_encode_intra4x4block(MACROBLOCK *x, int ib);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_ENCODEINTRA_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.c
deleted file mode 100644
index dfd0a237a5f..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.c
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "encodemb.h"
-#include "vp8/common/reconinter.h"
-#include "quantize.h"
-#include "tokenize.h"
-#include "vp8/common/invtrans.h"
-#include "vpx_mem/vpx_mem.h"
-#include "rdopt.h"
-
-void vp8_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch)
-{
- unsigned char *src_ptr = (*(be->base_src) + be->src);
- short *diff_ptr = be->src_diff;
- unsigned char *pred_ptr = bd->predictor;
- int src_stride = be->src_stride;
-
- int r, c;
-
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- diff_ptr[c] = src_ptr[c] - pred_ptr[c];
- }
-
- diff_ptr += pitch;
- pred_ptr += pitch;
- src_ptr += src_stride;
- }
-}
-
-void vp8_subtract_mbuv_c(short *diff, unsigned char *usrc, unsigned char *vsrc,
- int src_stride, unsigned char *upred,
- unsigned char *vpred, int pred_stride)
-{
- short *udiff = diff + 256;
- short *vdiff = diff + 320;
-
- int r, c;
-
- for (r = 0; r < 8; r++)
- {
- for (c = 0; c < 8; c++)
- {
- udiff[c] = usrc[c] - upred[c];
- }
-
- udiff += 8;
- upred += pred_stride;
- usrc += src_stride;
- }
-
- for (r = 0; r < 8; r++)
- {
- for (c = 0; c < 8; c++)
- {
- vdiff[c] = vsrc[c] - vpred[c];
- }
-
- vdiff += 8;
- vpred += pred_stride;
- vsrc += src_stride;
- }
-}
-
-void vp8_subtract_mby_c(short *diff, unsigned char *src, int src_stride,
- unsigned char *pred, int pred_stride)
-{
- int r, c;
-
- for (r = 0; r < 16; r++)
- {
- for (c = 0; c < 16; c++)
- {
- diff[c] = src[c] - pred[c];
- }
-
- diff += 16;
- pred += pred_stride;
- src += src_stride;
- }
-}
-
-static void vp8_subtract_mb(MACROBLOCK *x)
-{
- BLOCK *b = &x->block[0];
-
- vp8_subtract_mby(x->src_diff, *(b->base_src),
- b->src_stride, x->e_mbd.dst.y_buffer, x->e_mbd.dst.y_stride);
- vp8_subtract_mbuv(x->src_diff, x->src.u_buffer,
- x->src.v_buffer, x->src.uv_stride, x->e_mbd.dst.u_buffer,
- x->e_mbd.dst.v_buffer, x->e_mbd.dst.uv_stride);
-}
-
-static void build_dcblock(MACROBLOCK *x)
-{
- short *src_diff_ptr = &x->src_diff[384];
- int i;
-
- for (i = 0; i < 16; i++)
- {
- src_diff_ptr[i] = x->coeff[i * 16];
- }
-}
-
-void vp8_transform_mbuv(MACROBLOCK *x)
-{
- int i;
-
- for (i = 16; i < 24; i += 2)
- {
- x->short_fdct8x4(&x->block[i].src_diff[0],
- &x->block[i].coeff[0], 16);
- }
-}
-
-
-void vp8_transform_intra_mby(MACROBLOCK *x)
-{
- int i;
-
- for (i = 0; i < 16; i += 2)
- {
- x->short_fdct8x4(&x->block[i].src_diff[0],
- &x->block[i].coeff[0], 32);
- }
-
- /* build dc block from 16 y dc values */
- build_dcblock(x);
-
- /* do 2nd order transform on the dc block */
- x->short_walsh4x4(&x->block[24].src_diff[0],
- &x->block[24].coeff[0], 8);
-
-}
-
-
-static void transform_mb(MACROBLOCK *x)
-{
- int i;
-
- for (i = 0; i < 16; i += 2)
- {
- x->short_fdct8x4(&x->block[i].src_diff[0],
- &x->block[i].coeff[0], 32);
- }
-
- /* build dc block from 16 y dc values */
- if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV)
- build_dcblock(x);
-
- for (i = 16; i < 24; i += 2)
- {
- x->short_fdct8x4(&x->block[i].src_diff[0],
- &x->block[i].coeff[0], 16);
- }
-
- /* do 2nd order transform on the dc block */
- if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV)
- x->short_walsh4x4(&x->block[24].src_diff[0],
- &x->block[24].coeff[0], 8);
-
-}
-
-
-static void transform_mby(MACROBLOCK *x)
-{
- int i;
-
- for (i = 0; i < 16; i += 2)
- {
- x->short_fdct8x4(&x->block[i].src_diff[0],
- &x->block[i].coeff[0], 32);
- }
-
- /* build dc block from 16 y dc values */
- if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV)
- {
- build_dcblock(x);
- x->short_walsh4x4(&x->block[24].src_diff[0],
- &x->block[24].coeff[0], 8);
- }
-}
-
-
-
-#define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF )
-
-typedef struct vp8_token_state vp8_token_state;
-
-struct vp8_token_state{
- int rate;
- int error;
- signed char next;
- signed char token;
- short qc;
-};
-
-/* TODO: experiments to find optimal multiple numbers */
-#define Y1_RD_MULT 4
-#define UV_RD_MULT 2
-#define Y2_RD_MULT 16
-
-static const int plane_rd_mult[4]=
-{
- Y1_RD_MULT,
- Y2_RD_MULT,
- UV_RD_MULT,
- Y1_RD_MULT
-};
-
-static void optimize_b(MACROBLOCK *mb, int ib, int type,
- ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
-{
- BLOCK *b;
- BLOCKD *d;
- vp8_token_state tokens[17][2];
- unsigned best_mask[2];
- const short *dequant_ptr;
- const short *coeff_ptr;
- short *qcoeff_ptr;
- short *dqcoeff_ptr;
- int eob;
- int i0;
- int rc;
- int x;
- int sz = 0;
- int next;
- int rdmult;
- int rddiv;
- int final_eob;
- int rd_cost0;
- int rd_cost1;
- int rate0;
- int rate1;
- int error0;
- int error1;
- int t0;
- int t1;
- int best;
- int band;
- int pt;
- int i;
- int err_mult = plane_rd_mult[type];
-
- b = &mb->block[ib];
- d = &mb->e_mbd.block[ib];
-
- dequant_ptr = d->dequant;
- coeff_ptr = b->coeff;
- qcoeff_ptr = d->qcoeff;
- dqcoeff_ptr = d->dqcoeff;
- i0 = !type;
- eob = *d->eob;
-
- /* Now set up a Viterbi trellis to evaluate alternative roundings. */
- rdmult = mb->rdmult * err_mult;
- if(mb->e_mbd.mode_info_context->mbmi.ref_frame==INTRA_FRAME)
- rdmult = (rdmult * 9)>>4;
-
- rddiv = mb->rddiv;
- best_mask[0] = best_mask[1] = 0;
- /* Initialize the sentinel node of the trellis. */
- tokens[eob][0].rate = 0;
- tokens[eob][0].error = 0;
- tokens[eob][0].next = 16;
- tokens[eob][0].token = DCT_EOB_TOKEN;
- tokens[eob][0].qc = 0;
- *(tokens[eob] + 1) = *(tokens[eob] + 0);
- next = eob;
- for (i = eob; i-- > i0;)
- {
- int base_bits;
- int d2;
- int dx;
-
- rc = vp8_default_zig_zag1d[i];
- x = qcoeff_ptr[rc];
- /* Only add a trellis state for non-zero coefficients. */
- if (x)
- {
- int shortcut=0;
- error0 = tokens[next][0].error;
- error1 = tokens[next][1].error;
- /* Evaluate the first possibility for this state. */
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
- t0 = (vp8_dct_value_tokens_ptr + x)->Token;
- /* Consider both possible successor states. */
- if (next < 16)
- {
- band = vp8_coef_bands[i + 1];
- pt = vp8_prev_token_class[t0];
- rate0 +=
- mb->token_costs[type][band][pt][tokens[next][0].token];
- rate1 +=
- mb->token_costs[type][band][pt][tokens[next][1].token];
- }
- rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
- if (rd_cost0 == rd_cost1)
- {
- rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
- }
- /* And pick the best. */
- best = rd_cost1 < rd_cost0;
- base_bits = *(vp8_dct_value_cost_ptr + x);
- dx = dqcoeff_ptr[rc] - coeff_ptr[rc];
- d2 = dx*dx;
- tokens[i][0].rate = base_bits + (best ? rate1 : rate0);
- tokens[i][0].error = d2 + (best ? error1 : error0);
- tokens[i][0].next = next;
- tokens[i][0].token = t0;
- tokens[i][0].qc = x;
- best_mask[0] |= best << i;
- /* Evaluate the second possibility for this state. */
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
-
- if((abs(x)*dequant_ptr[rc]>abs(coeff_ptr[rc])) &&
- (abs(x)*dequant_ptr[rc]<abs(coeff_ptr[rc])+dequant_ptr[rc]))
- shortcut = 1;
- else
- shortcut = 0;
-
- if(shortcut)
- {
- sz = -(x < 0);
- x -= 2*sz + 1;
- }
-
- /* Consider both possible successor states. */
- if (!x)
- {
- /* If we reduced this coefficient to zero, check to see if
- * we need to move the EOB back here.
- */
- t0 = tokens[next][0].token == DCT_EOB_TOKEN ?
- DCT_EOB_TOKEN : ZERO_TOKEN;
- t1 = tokens[next][1].token == DCT_EOB_TOKEN ?
- DCT_EOB_TOKEN : ZERO_TOKEN;
- }
- else
- {
- t0=t1 = (vp8_dct_value_tokens_ptr + x)->Token;
- }
- if (next < 16)
- {
- band = vp8_coef_bands[i + 1];
- if(t0!=DCT_EOB_TOKEN)
- {
- pt = vp8_prev_token_class[t0];
- rate0 += mb->token_costs[type][band][pt][
- tokens[next][0].token];
- }
- if(t1!=DCT_EOB_TOKEN)
- {
- pt = vp8_prev_token_class[t1];
- rate1 += mb->token_costs[type][band][pt][
- tokens[next][1].token];
- }
- }
-
- rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
- if (rd_cost0 == rd_cost1)
- {
- rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
- }
- /* And pick the best. */
- best = rd_cost1 < rd_cost0;
- base_bits = *(vp8_dct_value_cost_ptr + x);
-
- if(shortcut)
- {
- dx -= (dequant_ptr[rc] + sz) ^ sz;
- d2 = dx*dx;
- }
- tokens[i][1].rate = base_bits + (best ? rate1 : rate0);
- tokens[i][1].error = d2 + (best ? error1 : error0);
- tokens[i][1].next = next;
- tokens[i][1].token =best?t1:t0;
- tokens[i][1].qc = x;
- best_mask[1] |= best << i;
- /* Finally, make this the new head of the trellis. */
- next = i;
- }
- /* There's no choice to make for a zero coefficient, so we don't
- * add a new trellis node, but we do need to update the costs.
- */
- else
- {
- band = vp8_coef_bands[i + 1];
- t0 = tokens[next][0].token;
- t1 = tokens[next][1].token;
- /* Update the cost of each path if we're past the EOB token. */
- if (t0 != DCT_EOB_TOKEN)
- {
- tokens[next][0].rate += mb->token_costs[type][band][0][t0];
- tokens[next][0].token = ZERO_TOKEN;
- }
- if (t1 != DCT_EOB_TOKEN)
- {
- tokens[next][1].rate += mb->token_costs[type][band][0][t1];
- tokens[next][1].token = ZERO_TOKEN;
- }
- /* Don't update next, because we didn't add a new node. */
- }
- }
-
- /* Now pick the best path through the whole trellis. */
- band = vp8_coef_bands[i + 1];
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
- error0 = tokens[next][0].error;
- error1 = tokens[next][1].error;
- t0 = tokens[next][0].token;
- t1 = tokens[next][1].token;
- rate0 += mb->token_costs[type][band][pt][t0];
- rate1 += mb->token_costs[type][band][pt][t1];
- rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
- if (rd_cost0 == rd_cost1)
- {
- rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
- rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
- }
- best = rd_cost1 < rd_cost0;
- final_eob = i0 - 1;
- for (i = next; i < eob; i = next)
- {
- x = tokens[i][best].qc;
- if (x)
- final_eob = i;
- rc = vp8_default_zig_zag1d[i];
- qcoeff_ptr[rc] = x;
- dqcoeff_ptr[rc] = x * dequant_ptr[rc];
- next = tokens[i][best].next;
- best = (best_mask[best] >> i) & 1;
- }
- final_eob++;
-
- *a = *l = (final_eob != !type);
- *d->eob = (char)final_eob;
-}
-static void check_reset_2nd_coeffs(MACROBLOCKD *x, int type,
- ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
-{
- int sum=0;
- int i;
- BLOCKD *bd = &x->block[24];
-
- if(bd->dequant[0]>=35 && bd->dequant[1]>=35)
- return;
-
- for(i=0;i<(*bd->eob);i++)
- {
- int coef = bd->dqcoeff[vp8_default_zig_zag1d[i]];
- sum+= (coef>=0)?coef:-coef;
- if(sum>=35)
- return;
- }
- /**************************************************************************
- our inverse hadamard transform effectively is weighted sum of all 16 inputs
- with weight either 1 or -1. It has a last stage scaling of (sum+3)>>3. And
- dc only idct is (dc+4)>>3. So if all the sums are between -35 and 29, the
- output after inverse wht and idct will be all zero. A sum of absolute value
- smaller than 35 guarantees all 16 different (+1/-1) weighted sums in wht
- fall between -35 and +35.
- **************************************************************************/
- if(sum < 35)
- {
- for(i=0;i<(*bd->eob);i++)
- {
- int rc = vp8_default_zig_zag1d[i];
- bd->qcoeff[rc]=0;
- bd->dqcoeff[rc]=0;
- }
- *bd->eob = 0;
- *a = *l = (*bd->eob != !type);
- }
-}
-
-static void optimize_mb(MACROBLOCK *x)
-{
- int b;
- int type;
- int has_2nd_order;
-
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
-
- memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
- && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
- type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
-
- for (b = 0; b < 16; b++)
- {
- optimize_b(x, b, type,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-
- for (b = 16; b < 24; b++)
- {
- optimize_b(x, b, PLANE_TYPE_UV,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-
- if (has_2nd_order)
- {
- b=24;
- optimize_b(x, b, PLANE_TYPE_Y2,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-}
-
-
-void vp8_optimize_mby(MACROBLOCK *x)
-{
- int b;
- int type;
- int has_2nd_order;
-
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
-
- if (!x->e_mbd.above_context)
- return;
-
- if (!x->e_mbd.left_context)
- return;
-
- memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
- && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
- type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
-
- for (b = 0; b < 16; b++)
- {
- optimize_b(x, b, type,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-
-
- if (has_2nd_order)
- {
- b=24;
- optimize_b(x, b, PLANE_TYPE_Y2,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-}
-
-void vp8_optimize_mbuv(MACROBLOCK *x)
-{
- int b;
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
-
- if (!x->e_mbd.above_context)
- return;
-
- if (!x->e_mbd.left_context)
- return;
-
- memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- for (b = 16; b < 24; b++)
- {
- optimize_b(x, b, PLANE_TYPE_UV,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
- }
-}
-
-void vp8_encode_inter16x16(MACROBLOCK *x)
-{
- vp8_build_inter_predictors_mb(&x->e_mbd);
-
- vp8_subtract_mb(x);
-
- transform_mb(x);
-
- vp8_quantize_mb(x);
-
- if (x->optimize)
- optimize_mb(x);
-}
-
-/* this funciton is used by first pass only */
-void vp8_encode_inter16x16y(MACROBLOCK *x)
-{
- BLOCK *b = &x->block[0];
-
- vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.dst.y_buffer,
- x->e_mbd.dst.y_stride);
-
- vp8_subtract_mby(x->src_diff, *(b->base_src),
- b->src_stride, x->e_mbd.dst.y_buffer, x->e_mbd.dst.y_stride);
-
- transform_mby(x);
-
- vp8_quantize_mby(x);
-
- vp8_inverse_transform_mby(&x->e_mbd);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.h
deleted file mode 100644
index 0b3ec875e7a..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemb.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_ENCODEMB_H_
-#define VP8_ENCODER_ENCODEMB_H_
-
-#include "onyx_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-void vp8_encode_inter16x16(MACROBLOCK *x);
-
-void vp8_build_dcblock(MACROBLOCK *b);
-void vp8_transform_mb(MACROBLOCK *mb);
-void vp8_transform_mbuv(MACROBLOCK *x);
-void vp8_transform_intra_mby(MACROBLOCK *x);
-
-void vp8_optimize_mby(MACROBLOCK *x);
-void vp8_optimize_mbuv(MACROBLOCK *x);
-void vp8_encode_inter16x16y(MACROBLOCK *x);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_ENCODEMB_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.c
deleted file mode 100644
index 2a74ff4ae3a..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vp8/common/common.h"
-#include "encodemv.h"
-#include "vp8/common/entropymode.h"
-#include "vp8/common/systemdependent.h"
-
-#include <math.h>
-
-#ifdef VP8_ENTROPY_STATS
-extern unsigned int active_section;
-#endif
-
-static void encode_mvcomponent(
- vp8_writer *const w,
- const int v,
- const struct mv_context *mvc
-)
-{
- const vp8_prob *p = mvc->prob;
- const int x = v < 0 ? -v : v;
-
- if (x < mvnum_short) /* Small */
- {
- vp8_write(w, 0, p [mvpis_short]);
- vp8_treed_write(w, vp8_small_mvtree, p + MVPshort, x, 3);
-
- if (!x)
- return; /* no sign bit */
- }
- else /* Large */
- {
- int i = 0;
-
- vp8_write(w, 1, p [mvpis_short]);
-
- do
- vp8_write(w, (x >> i) & 1, p [MVPbits + i]);
-
- while (++i < 3);
-
- i = mvlong_width - 1; /* Skip bit 3, which is sometimes implicit */
-
- do
- vp8_write(w, (x >> i) & 1, p [MVPbits + i]);
-
- while (--i > 3);
-
- if (x & 0xFFF0)
- vp8_write(w, (x >> 3) & 1, p [MVPbits + 3]);
- }
-
- vp8_write(w, v < 0, p [MVPsign]);
-}
-#if 0
-static int max_mv_r = 0;
-static int max_mv_c = 0;
-#endif
-void vp8_encode_motion_vector(vp8_writer *w, const MV *mv, const MV_CONTEXT *mvc)
-{
-
-#if 0
- {
- if (abs(mv->row >> 1) > max_mv_r)
- {
- FILE *f = fopen("maxmv.stt", "a");
- max_mv_r = abs(mv->row >> 1);
- fprintf(f, "New Mv Row Max %6d\n", (mv->row >> 1));
-
- if ((abs(mv->row) / 2) != max_mv_r)
- fprintf(f, "MV Row conversion error %6d\n", abs(mv->row) / 2);
-
- fclose(f);
- }
-
- if (abs(mv->col >> 1) > max_mv_c)
- {
- FILE *f = fopen("maxmv.stt", "a");
- fprintf(f, "New Mv Col Max %6d\n", (mv->col >> 1));
- max_mv_c = abs(mv->col >> 1);
- fclose(f);
- }
- }
-#endif
-
- encode_mvcomponent(w, mv->row >> 1, &mvc[0]);
- encode_mvcomponent(w, mv->col >> 1, &mvc[1]);
-}
-
-
-static unsigned int cost_mvcomponent(const int v, const struct mv_context *mvc)
-{
- const vp8_prob *p = mvc->prob;
- const int x = v;
- unsigned int cost;
-
- if (x < mvnum_short)
- {
- cost = vp8_cost_zero(p [mvpis_short])
- + vp8_treed_cost(vp8_small_mvtree, p + MVPshort, x, 3);
-
- if (!x)
- return cost;
- }
- else
- {
- int i = 0;
- cost = vp8_cost_one(p [mvpis_short]);
-
- do
- cost += vp8_cost_bit(p [MVPbits + i], (x >> i) & 1);
-
- while (++i < 3);
-
- i = mvlong_width - 1; /* Skip bit 3, which is sometimes implicit */
-
- do
- cost += vp8_cost_bit(p [MVPbits + i], (x >> i) & 1);
-
- while (--i > 3);
-
- if (x & 0xFFF0)
- cost += vp8_cost_bit(p [MVPbits + 3], (x >> 3) & 1);
- }
-
- return cost; /* + vp8_cost_bit( p [MVPsign], v < 0); */
-}
-
-void vp8_build_component_cost_table(int *mvcost[2], const MV_CONTEXT *mvc, int mvc_flag[2])
-{
- int i = 1;
- unsigned int cost0 = 0;
- unsigned int cost1 = 0;
-
- vp8_clear_system_state();
-
- i = 1;
-
- if (mvc_flag[0])
- {
- mvcost [0] [0] = cost_mvcomponent(0, &mvc[0]);
-
- do
- {
- cost0 = cost_mvcomponent(i, &mvc[0]);
-
- mvcost [0] [i] = cost0 + vp8_cost_zero(mvc[0].prob[MVPsign]);
- mvcost [0] [-i] = cost0 + vp8_cost_one(mvc[0].prob[MVPsign]);
- }
- while (++i <= mv_max);
- }
-
- i = 1;
-
- if (mvc_flag[1])
- {
- mvcost [1] [0] = cost_mvcomponent(0, &mvc[1]);
-
- do
- {
- cost1 = cost_mvcomponent(i, &mvc[1]);
-
- mvcost [1] [i] = cost1 + vp8_cost_zero(mvc[1].prob[MVPsign]);
- mvcost [1] [-i] = cost1 + vp8_cost_one(mvc[1].prob[MVPsign]);
- }
- while (++i <= mv_max);
- }
-}
-
-
-/* Motion vector probability table update depends on benefit.
- * Small correction allows for the fact that an update to an MV probability
- * may have benefit in subsequent frames as well as the current one.
- */
-#define MV_PROB_UPDATE_CORRECTION -1
-
-
-static void calc_prob(vp8_prob *p, const unsigned int ct[2])
-{
- const unsigned int tot = ct[0] + ct[1];
-
- if (tot)
- {
- const vp8_prob x = ((ct[0] * 255) / tot) & -2;
- *p = x ? x : 1;
- }
-}
-
-static void update(
- vp8_writer *const w,
- const unsigned int ct[2],
- vp8_prob *const cur_p,
- const vp8_prob new_p,
- const vp8_prob update_p,
- int *updated
-)
-{
- const int cur_b = vp8_cost_branch(ct, *cur_p);
- const int new_b = vp8_cost_branch(ct, new_p);
- const int cost = 7 + MV_PROB_UPDATE_CORRECTION + ((vp8_cost_one(update_p) - vp8_cost_zero(update_p) + 128) >> 8);
-
- if (cur_b - new_b > cost)
- {
- *cur_p = new_p;
- vp8_write(w, 1, update_p);
- vp8_write_literal(w, new_p >> 1, 7);
- *updated = 1;
-
- }
- else
- vp8_write(w, 0, update_p);
-}
-
-static void write_component_probs(
- vp8_writer *const w,
- struct mv_context *cur_mvc,
- const struct mv_context *default_mvc_,
- const struct mv_context *update_mvc,
- const unsigned int events [MVvals],
- unsigned int rc,
- int *updated
-)
-{
- vp8_prob *Pcur = cur_mvc->prob;
- const vp8_prob *default_mvc = default_mvc_->prob;
- const vp8_prob *Pupdate = update_mvc->prob;
- unsigned int is_short_ct[2], sign_ct[2];
-
- unsigned int bit_ct [mvlong_width] [2];
-
- unsigned int short_ct [mvnum_short];
- unsigned int short_bct [mvnum_short-1] [2];
-
- vp8_prob Pnew [MVPcount];
-
- (void) rc;
- vp8_copy_array(Pnew, default_mvc, MVPcount);
-
- vp8_zero(is_short_ct)
- vp8_zero(sign_ct)
- vp8_zero(bit_ct)
- vp8_zero(short_ct)
- vp8_zero(short_bct)
-
-
- /* j=0 */
- {
- const int c = events [mv_max];
-
- is_short_ct [0] += c; /* Short vector */
- short_ct [0] += c; /* Magnitude distribution */
- }
-
- /* j: 1 ~ mv_max (1023) */
- {
- int j = 1;
-
- do
- {
- const int c1 = events [mv_max + j]; /* positive */
- const int c2 = events [mv_max - j]; /* negative */
- const int c = c1 + c2;
- int a = j;
-
- sign_ct [0] += c1;
- sign_ct [1] += c2;
-
- if (a < mvnum_short)
- {
- is_short_ct [0] += c; /* Short vector */
- short_ct [a] += c; /* Magnitude distribution */
- }
- else
- {
- int k = mvlong_width - 1;
- is_short_ct [1] += c; /* Long vector */
-
- /* bit 3 not always encoded. */
- do
- bit_ct [k] [(a >> k) & 1] += c;
-
- while (--k >= 0);
- }
- }
- while (++j <= mv_max);
- }
-
- calc_prob(Pnew + mvpis_short, is_short_ct);
-
- calc_prob(Pnew + MVPsign, sign_ct);
-
- {
- vp8_prob p [mvnum_short - 1]; /* actually only need branch ct */
- int j = 0;
-
- vp8_tree_probs_from_distribution(
- 8, vp8_small_mvencodings, vp8_small_mvtree,
- p, short_bct, short_ct,
- 256, 1
- );
-
- do
- calc_prob(Pnew + MVPshort + j, short_bct[j]);
-
- while (++j < mvnum_short - 1);
- }
-
- {
- int j = 0;
-
- do
- calc_prob(Pnew + MVPbits + j, bit_ct[j]);
-
- while (++j < mvlong_width);
- }
-
- update(w, is_short_ct, Pcur + mvpis_short, Pnew[mvpis_short], *Pupdate++, updated);
-
- update(w, sign_ct, Pcur + MVPsign, Pnew[MVPsign], *Pupdate++, updated);
-
- {
- const vp8_prob *const new_p = Pnew + MVPshort;
- vp8_prob *const cur_p = Pcur + MVPshort;
-
- int j = 0;
-
- do
-
- update(w, short_bct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
- while (++j < mvnum_short - 1);
- }
-
- {
- const vp8_prob *const new_p = Pnew + MVPbits;
- vp8_prob *const cur_p = Pcur + MVPbits;
-
- int j = 0;
-
- do
-
- update(w, bit_ct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
- while (++j < mvlong_width);
- }
-}
-
-void vp8_write_mvprobs(VP8_COMP *cpi)
-{
- vp8_writer *const w = cpi->bc;
- MV_CONTEXT *mvc = cpi->common.fc.mvc;
- int flags[2] = {0, 0};
-#ifdef VP8_ENTROPY_STATS
- active_section = 4;
-#endif
- write_component_probs(
- w, &mvc[0], &vp8_default_mv_context[0], &vp8_mv_update_probs[0],
- cpi->mb.MVcount[0], 0, &flags[0]
- );
- write_component_probs(
- w, &mvc[1], &vp8_default_mv_context[1], &vp8_mv_update_probs[1],
- cpi->mb.MVcount[1], 1, &flags[1]
- );
-
- if (flags[0] || flags[1])
- vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flags);
-
-#ifdef VP8_ENTROPY_STATS
- active_section = 5;
-#endif
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.h
deleted file mode 100644
index 722162ba212..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/encodemv.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_ENCODEMV_H_
-#define VP8_ENCODER_ENCODEMV_H_
-
-#include "onyx_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void vp8_write_mvprobs(VP8_COMP *);
-void vp8_encode_motion_vector(vp8_writer *, const MV *, const MV_CONTEXT *);
-void vp8_build_component_cost_table(int *mvcost[2], const MV_CONTEXT *mvc, int mvc_flag[2]);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_ENCODEMV_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ethreading.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ethreading.c
deleted file mode 100644
index 4e234ccd58b..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ethreading.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "onyx_int.h"
-#include "vp8/common/threading.h"
-#include "vp8/common/common.h"
-#include "vp8/common/extend.h"
-#include "bitstream.h"
-#include "encodeframe.h"
-
-#if CONFIG_MULTITHREAD
-
-extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x, int ok_to_skip);
-
-static THREAD_FUNCTION thread_loopfilter(void *p_data)
-{
- VP8_COMP *cpi = (VP8_COMP *)(((LPFTHREAD_DATA *)p_data)->ptr1);
- VP8_COMMON *cm = &cpi->common;
-
- while (1)
- {
- if (cpi->b_multi_threaded == 0)
- break;
-
- if (sem_wait(&cpi->h_event_start_lpf) == 0)
- {
- if (cpi->b_multi_threaded == 0) /* we're shutting down */
- break;
-
- vp8_loopfilter_frame(cpi, cm);
-
- sem_post(&cpi->h_event_end_lpf);
- }
- }
-
- return 0;
-}
-
-static
-THREAD_FUNCTION thread_encoding_proc(void *p_data)
-{
- int ithread = ((ENCODETHREAD_DATA *)p_data)->ithread;
- VP8_COMP *cpi = (VP8_COMP *)(((ENCODETHREAD_DATA *)p_data)->ptr1);
- MB_ROW_COMP *mbri = (MB_ROW_COMP *)(((ENCODETHREAD_DATA *)p_data)->ptr2);
- ENTROPY_CONTEXT_PLANES mb_row_left_context;
-
- while (1)
- {
- if (cpi->b_multi_threaded == 0)
- break;
-
- if (sem_wait(&cpi->h_event_start_encoding[ithread]) == 0)
- {
- const int nsync = cpi->mt_sync_range;
- VP8_COMMON *cm = &cpi->common;
- int mb_row;
- MACROBLOCK *x = &mbri->mb;
- MACROBLOCKD *xd = &x->e_mbd;
- TOKENEXTRA *tp ;
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- TOKENEXTRA *tp_start = cpi->tok + (1 + ithread) * (16 * 24);
- const int num_part = (1 << cm->multi_token_partition);
-#endif
-
- int *segment_counts = mbri->segment_counts;
- int *totalrate = &mbri->totalrate;
-
- if (cpi->b_multi_threaded == 0) /* we're shutting down */
- break;
-
- for (mb_row = ithread + 1; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1))
- {
-
- int recon_yoffset, recon_uvoffset;
- int mb_col;
- int ref_fb_idx = cm->lst_fb_idx;
- int dst_fb_idx = cm->new_fb_idx;
- int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
- int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
- int map_index = (mb_row * cm->mb_cols);
- volatile const int *last_row_current_mb_col;
- volatile int *current_mb_col = &cpi->mt_current_mb_col[mb_row];
-
-#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- vp8_writer *w = &cpi->bc[1 + (mb_row % num_part)];
-#else
- tp = cpi->tok + (mb_row * (cm->mb_cols * 16 * 24));
- cpi->tplist[mb_row].start = tp;
-#endif
-
- last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1];
-
- /* reset above block coeffs */
- xd->above_context = cm->above_context;
- xd->left_context = &mb_row_left_context;
-
- vp8_zero(mb_row_left_context);
-
- xd->up_available = (mb_row != 0);
- recon_yoffset = (mb_row * recon_y_stride * 16);
- recon_uvoffset = (mb_row * recon_uv_stride * 8);
-
- /* Set the mb activity pointer to the start of the row. */
- x->mb_activity_ptr = &cpi->mb_activity_map[map_index];
-
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
- *current_mb_col = mb_col - 1;
-
- if ((mb_col & (nsync - 1)) == 0)
- {
- while (mb_col > (*last_row_current_mb_col - nsync))
- {
- x86_pause_hint();
- thread_sleep(0);
- }
- }
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- tp = tp_start;
-#endif
-
- /* Distance of Mb to the various image edges.
- * These specified to 8th pel as they are always compared
- * to values that are in 1/8th pel units
- */
- xd->mb_to_left_edge = -((mb_col * 16) << 3);
- xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
- xd->mb_to_top_edge = -((mb_row * 16) << 3);
- xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
-
- /* Set up limit values for motion vectors used to prevent
- * them extending outside the UMV borders
- */
- x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
- x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
-
- xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
- xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
- xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
- xd->left_available = (mb_col != 0);
-
- x->rddiv = cpi->RDDIV;
- x->rdmult = cpi->RDMULT;
-
- /* Copy current mb to a buffer */
- vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
-
- if (cpi->oxcf.tuning == VP8_TUNE_SSIM)
- vp8_activity_masking(cpi, x);
-
- /* Is segmentation enabled */
- /* MB level adjustment to quantizer */
- if (xd->segmentation_enabled)
- {
- /* Code to set segment id in xd->mbmi.segment_id for
- * current MB (with range checking)
- */
- if (cpi->segmentation_map[map_index + mb_col] <= 3)
- xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index + mb_col];
- else
- xd->mode_info_context->mbmi.segment_id = 0;
-
- vp8cx_mb_init_quantizer(cpi, x, 1);
- }
- else
- /* Set to Segment 0 by default */
- xd->mode_info_context->mbmi.segment_id = 0;
-
- x->active_ptr = cpi->active_map + map_index + mb_col;
-
- if (cm->frame_type == KEY_FRAME)
- {
- *totalrate += vp8cx_encode_intra_macroblock(cpi, x, &tp);
-#ifdef MODE_STATS
- y_modes[xd->mbmi.mode] ++;
-#endif
- }
- else
- {
- *totalrate += vp8cx_encode_inter_macroblock(cpi, x, &tp, recon_yoffset, recon_uvoffset, mb_row, mb_col);
-
-#ifdef MODE_STATS
- inter_y_modes[xd->mbmi.mode] ++;
-
- if (xd->mbmi.mode == SPLITMV)
- {
- int b;
-
- for (b = 0; b < xd->mbmi.partition_count; b++)
- {
- inter_b_modes[x->partition->bmi[b].mode] ++;
- }
- }
-
-#endif
- // Keep track of how many (consecutive) times a block
- // is coded as ZEROMV_LASTREF, for base layer frames.
- // Reset to 0 if its coded as anything else.
- if (cpi->current_layer == 0) {
- if (xd->mode_info_context->mbmi.mode == ZEROMV &&
- xd->mode_info_context->mbmi.ref_frame ==
- LAST_FRAME) {
- // Increment, check for wrap-around.
- if (cpi->consec_zero_last[map_index+mb_col] < 255)
- cpi->consec_zero_last[map_index+mb_col] += 1;
- if (cpi->consec_zero_last_mvbias[map_index+mb_col] < 255)
- cpi->consec_zero_last_mvbias[map_index+mb_col] += 1;
- } else {
- cpi->consec_zero_last[map_index+mb_col] = 0;
- cpi->consec_zero_last_mvbias[map_index+mb_col] = 0;
- }
- if (x->zero_last_dot_suppress)
- cpi->consec_zero_last_mvbias[map_index+mb_col] = 0;
- }
-
- /* Special case code for cyclic refresh
- * If cyclic update enabled then copy
- * xd->mbmi.segment_id; (which may have been updated
- * based on mode during
- * vp8cx_encode_inter_macroblock()) back into the
- * global segmentation map
- */
- if ((cpi->current_layer == 0) &&
- (cpi->cyclic_refresh_mode_enabled &&
- xd->segmentation_enabled))
- {
- const MB_MODE_INFO * mbmi = &xd->mode_info_context->mbmi;
- cpi->segmentation_map[map_index + mb_col] = mbmi->segment_id;
-
- /* If the block has been refreshed mark it as clean
- * (the magnitude of the -ve influences how long it
- * will be before we consider another refresh):
- * Else if it was coded (last frame 0,0) and has
- * not already been refreshed then mark it as a
- * candidate for cleanup next time (marked 0) else
- * mark it as dirty (1).
- */
- if (mbmi->segment_id)
- cpi->cyclic_refresh_map[map_index + mb_col] = -1;
- else if ((mbmi->mode == ZEROMV) && (mbmi->ref_frame == LAST_FRAME))
- {
- if (cpi->cyclic_refresh_map[map_index + mb_col] == 1)
- cpi->cyclic_refresh_map[map_index + mb_col] = 0;
- }
- else
- cpi->cyclic_refresh_map[map_index + mb_col] = 1;
-
- }
- }
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- /* pack tokens for this MB */
- {
- int tok_count = tp - tp_start;
- vp8_pack_tokens(w, tp_start, tok_count);
- }
-#else
- cpi->tplist[mb_row].stop = tp;
-#endif
- /* Increment pointer into gf usage flags structure. */
- x->gf_active_ptr++;
-
- /* Increment the activity mask pointers. */
- x->mb_activity_ptr++;
-
- /* adjust to the next column of macroblocks */
- x->src.y_buffer += 16;
- x->src.u_buffer += 8;
- x->src.v_buffer += 8;
-
- recon_yoffset += 16;
- recon_uvoffset += 8;
-
- /* Keep track of segment usage */
- segment_counts[xd->mode_info_context->mbmi.segment_id]++;
-
- /* skip to next mb */
- xd->mode_info_context++;
- x->partition_info++;
- xd->above_context++;
- }
-
- vp8_extend_mb_row( &cm->yv12_fb[dst_fb_idx],
- xd->dst.y_buffer + 16,
- xd->dst.u_buffer + 8,
- xd->dst.v_buffer + 8);
-
- *current_mb_col = mb_col + nsync;
-
- /* this is to account for the border */
- xd->mode_info_context++;
- x->partition_info++;
-
- x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
- x->src.u_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
- x->src.v_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
-
- xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
- x->partition_info += xd->mode_info_stride * cpi->encoding_thread_count;
- x->gf_active_ptr += cm->mb_cols * cpi->encoding_thread_count;
-
- if (mb_row == cm->mb_rows - 1)
- {
- sem_post(&cpi->h_event_end_encoding); /* signal frame encoding end */
- }
- }
- }
- }
-
- /* printf("exit thread %d\n", ithread); */
- return 0;
-}
-
-static void setup_mbby_copy(MACROBLOCK *mbdst, MACROBLOCK *mbsrc)
-{
-
- MACROBLOCK *x = mbsrc;
- MACROBLOCK *z = mbdst;
- int i;
-
- z->ss = x->ss;
- z->ss_count = x->ss_count;
- z->searches_per_step = x->searches_per_step;
- z->errorperbit = x->errorperbit;
-
- z->sadperbit16 = x->sadperbit16;
- z->sadperbit4 = x->sadperbit4;
-
- /*
- z->mv_col_min = x->mv_col_min;
- z->mv_col_max = x->mv_col_max;
- z->mv_row_min = x->mv_row_min;
- z->mv_row_max = x->mv_row_max;
- */
-
- z->short_fdct4x4 = x->short_fdct4x4;
- z->short_fdct8x4 = x->short_fdct8x4;
- z->short_walsh4x4 = x->short_walsh4x4;
- z->quantize_b = x->quantize_b;
- z->optimize = x->optimize;
-
- /*
- z->mvc = x->mvc;
- z->src.y_buffer = x->src.y_buffer;
- z->src.u_buffer = x->src.u_buffer;
- z->src.v_buffer = x->src.v_buffer;
- */
-
- z->mvcost[0] = x->mvcost[0];
- z->mvcost[1] = x->mvcost[1];
- z->mvsadcost[0] = x->mvsadcost[0];
- z->mvsadcost[1] = x->mvsadcost[1];
-
- z->token_costs = x->token_costs;
- z->inter_bmode_costs = x->inter_bmode_costs;
- z->mbmode_cost = x->mbmode_cost;
- z->intra_uv_mode_cost = x->intra_uv_mode_cost;
- z->bmode_costs = x->bmode_costs;
-
- for (i = 0; i < 25; i++)
- {
- z->block[i].quant = x->block[i].quant;
- z->block[i].quant_fast = x->block[i].quant_fast;
- z->block[i].quant_shift = x->block[i].quant_shift;
- z->block[i].zbin = x->block[i].zbin;
- z->block[i].zrun_zbin_boost = x->block[i].zrun_zbin_boost;
- z->block[i].round = x->block[i].round;
- z->block[i].src_stride = x->block[i].src_stride;
- }
-
- z->q_index = x->q_index;
- z->act_zbin_adj = x->act_zbin_adj;
- z->last_act_zbin_adj = x->last_act_zbin_adj;
-
- {
- MACROBLOCKD *xd = &x->e_mbd;
- MACROBLOCKD *zd = &z->e_mbd;
-
- /*
- zd->mode_info_context = xd->mode_info_context;
- zd->mode_info = xd->mode_info;
-
- zd->mode_info_stride = xd->mode_info_stride;
- zd->frame_type = xd->frame_type;
- zd->up_available = xd->up_available ;
- zd->left_available = xd->left_available;
- zd->left_context = xd->left_context;
- zd->last_frame_dc = xd->last_frame_dc;
- zd->last_frame_dccons = xd->last_frame_dccons;
- zd->gold_frame_dc = xd->gold_frame_dc;
- zd->gold_frame_dccons = xd->gold_frame_dccons;
- zd->mb_to_left_edge = xd->mb_to_left_edge;
- zd->mb_to_right_edge = xd->mb_to_right_edge;
- zd->mb_to_top_edge = xd->mb_to_top_edge ;
- zd->mb_to_bottom_edge = xd->mb_to_bottom_edge;
- zd->gf_active_ptr = xd->gf_active_ptr;
- zd->frames_since_golden = xd->frames_since_golden;
- zd->frames_till_alt_ref_frame = xd->frames_till_alt_ref_frame;
- */
- zd->subpixel_predict = xd->subpixel_predict;
- zd->subpixel_predict8x4 = xd->subpixel_predict8x4;
- zd->subpixel_predict8x8 = xd->subpixel_predict8x8;
- zd->subpixel_predict16x16 = xd->subpixel_predict16x16;
- zd->segmentation_enabled = xd->segmentation_enabled;
- zd->mb_segement_abs_delta = xd->mb_segement_abs_delta;
- memcpy(zd->segment_feature_data, xd->segment_feature_data,
- sizeof(xd->segment_feature_data));
-
- memcpy(zd->dequant_y1_dc, xd->dequant_y1_dc, sizeof(xd->dequant_y1_dc));
- memcpy(zd->dequant_y1, xd->dequant_y1, sizeof(xd->dequant_y1));
- memcpy(zd->dequant_y2, xd->dequant_y2, sizeof(xd->dequant_y2));
- memcpy(zd->dequant_uv, xd->dequant_uv, sizeof(xd->dequant_uv));
-
-#if 1
- /*TODO: Remove dequant from BLOCKD. This is a temporary solution until
- * the quantizer code uses a passed in pointer to the dequant constants.
- * This will also require modifications to the x86 and neon assembly.
- * */
- for (i = 0; i < 16; i++)
- zd->block[i].dequant = zd->dequant_y1;
- for (i = 16; i < 24; i++)
- zd->block[i].dequant = zd->dequant_uv;
- zd->block[24].dequant = zd->dequant_y2;
-#endif
-
-
- memcpy(z->rd_threshes, x->rd_threshes, sizeof(x->rd_threshes));
- memcpy(z->rd_thresh_mult, x->rd_thresh_mult, sizeof(x->rd_thresh_mult));
-
- z->zbin_over_quant = x->zbin_over_quant;
- z->zbin_mode_boost_enabled = x->zbin_mode_boost_enabled;
- z->zbin_mode_boost = x->zbin_mode_boost;
-
- memset(z->error_bins, 0, sizeof(z->error_bins));
- }
-}
-
-void vp8cx_init_mbrthread_data(VP8_COMP *cpi,
- MACROBLOCK *x,
- MB_ROW_COMP *mbr_ei,
- int count
- )
-{
-
- VP8_COMMON *const cm = & cpi->common;
- MACROBLOCKD *const xd = & x->e_mbd;
- int i;
-
- for (i = 0; i < count; i++)
- {
- MACROBLOCK *mb = & mbr_ei[i].mb;
- MACROBLOCKD *mbd = &mb->e_mbd;
-
- mbd->subpixel_predict = xd->subpixel_predict;
- mbd->subpixel_predict8x4 = xd->subpixel_predict8x4;
- mbd->subpixel_predict8x8 = xd->subpixel_predict8x8;
- mbd->subpixel_predict16x16 = xd->subpixel_predict16x16;
- mb->gf_active_ptr = x->gf_active_ptr;
-
- memset(mbr_ei[i].segment_counts, 0, sizeof(mbr_ei[i].segment_counts));
- mbr_ei[i].totalrate = 0;
-
- mb->partition_info = x->pi + x->e_mbd.mode_info_stride * (i + 1);
-
- mbd->mode_info_context = cm->mi + x->e_mbd.mode_info_stride * (i + 1);
- mbd->mode_info_stride = cm->mode_info_stride;
-
- mbd->frame_type = cm->frame_type;
-
- mb->src = * cpi->Source;
- mbd->pre = cm->yv12_fb[cm->lst_fb_idx];
- mbd->dst = cm->yv12_fb[cm->new_fb_idx];
-
- mb->src.y_buffer += 16 * x->src.y_stride * (i + 1);
- mb->src.u_buffer += 8 * x->src.uv_stride * (i + 1);
- mb->src.v_buffer += 8 * x->src.uv_stride * (i + 1);
-
- vp8_build_block_offsets(mb);
-
- mbd->left_context = &cm->left_context;
- mb->mvc = cm->fc.mvc;
-
- setup_mbby_copy(&mbr_ei[i].mb, x);
-
- mbd->fullpixel_mask = 0xffffffff;
- if(cm->full_pixel)
- mbd->fullpixel_mask = 0xfffffff8;
-
- vp8_zero(mb->coef_counts);
- vp8_zero(x->ymode_count);
- mb->skip_true_count = 0;
- vp8_zero(mb->MVcount);
- mb->prediction_error = 0;
- mb->intra_error = 0;
- vp8_zero(mb->count_mb_ref_frame_usage);
- mb->mbs_tested_so_far = 0;
- mb->mbs_zero_last_dot_suppress = 0;
- }
-}
-
-int vp8cx_create_encoder_threads(VP8_COMP *cpi)
-{
- const VP8_COMMON * cm = &cpi->common;
-
- cpi->b_multi_threaded = 0;
- cpi->encoding_thread_count = 0;
- cpi->b_lpf_running = 0;
-
- if (cm->processor_core_count > 1 && cpi->oxcf.multi_threaded > 1)
- {
- int ithread;
- int th_count = cpi->oxcf.multi_threaded - 1;
- int rc = 0;
-
- /* don't allocate more threads than cores available */
- if (cpi->oxcf.multi_threaded > cm->processor_core_count)
- th_count = cm->processor_core_count - 1;
-
- /* we have th_count + 1 (main) threads processing one row each */
- /* no point to have more threads than the sync range allows */
- if(th_count > ((cm->mb_cols / cpi->mt_sync_range) - 1))
- {
- th_count = (cm->mb_cols / cpi->mt_sync_range) - 1;
- }
-
- if(th_count == 0)
- return 0;
-
- CHECK_MEM_ERROR(cpi->h_encoding_thread,
- vpx_malloc(sizeof(pthread_t) * th_count));
- CHECK_MEM_ERROR(cpi->h_event_start_encoding,
- vpx_malloc(sizeof(sem_t) * th_count));
- CHECK_MEM_ERROR(cpi->mb_row_ei,
- vpx_memalign(32, sizeof(MB_ROW_COMP) * th_count));
- memset(cpi->mb_row_ei, 0, sizeof(MB_ROW_COMP) * th_count);
- CHECK_MEM_ERROR(cpi->en_thread_data,
- vpx_malloc(sizeof(ENCODETHREAD_DATA) * th_count));
-
- sem_init(&cpi->h_event_end_encoding, 0, 0);
-
- cpi->b_multi_threaded = 1;
- cpi->encoding_thread_count = th_count;
-
- /*
- printf("[VP8:] multi_threaded encoding is enabled with %d threads\n\n",
- (cpi->encoding_thread_count +1));
- */
-
- for (ithread = 0; ithread < th_count; ithread++)
- {
- ENCODETHREAD_DATA *ethd = &cpi->en_thread_data[ithread];
-
- /* Setup block ptrs and offsets */
- vp8_setup_block_ptrs(&cpi->mb_row_ei[ithread].mb);
- vp8_setup_block_dptrs(&cpi->mb_row_ei[ithread].mb.e_mbd);
-
- sem_init(&cpi->h_event_start_encoding[ithread], 0, 0);
-
- ethd->ithread = ithread;
- ethd->ptr1 = (void *)cpi;
- ethd->ptr2 = (void *)&cpi->mb_row_ei[ithread];
-
- rc = pthread_create(&cpi->h_encoding_thread[ithread], 0,
- thread_encoding_proc, ethd);
- if(rc)
- break;
- }
-
- if(rc)
- {
- /* shutdown other threads */
- cpi->b_multi_threaded = 0;
- for(--ithread; ithread >= 0; ithread--)
- {
- pthread_join(cpi->h_encoding_thread[ithread], 0);
- sem_destroy(&cpi->h_event_start_encoding[ithread]);
- }
- sem_destroy(&cpi->h_event_end_encoding);
-
- /* free thread related resources */
- vpx_free(cpi->h_event_start_encoding);
- vpx_free(cpi->h_encoding_thread);
- vpx_free(cpi->mb_row_ei);
- vpx_free(cpi->en_thread_data);
-
- return -1;
- }
-
-
- {
- LPFTHREAD_DATA * lpfthd = &cpi->lpf_thread_data;
-
- sem_init(&cpi->h_event_start_lpf, 0, 0);
- sem_init(&cpi->h_event_end_lpf, 0, 0);
-
- lpfthd->ptr1 = (void *)cpi;
- rc = pthread_create(&cpi->h_filter_thread, 0, thread_loopfilter,
- lpfthd);
-
- if(rc)
- {
- /* shutdown other threads */
- cpi->b_multi_threaded = 0;
- for(--ithread; ithread >= 0; ithread--)
- {
- sem_post(&cpi->h_event_start_encoding[ithread]);
- pthread_join(cpi->h_encoding_thread[ithread], 0);
- sem_destroy(&cpi->h_event_start_encoding[ithread]);
- }
- sem_destroy(&cpi->h_event_end_encoding);
- sem_destroy(&cpi->h_event_end_lpf);
- sem_destroy(&cpi->h_event_start_lpf);
-
- /* free thread related resources */
- vpx_free(cpi->h_event_start_encoding);
- vpx_free(cpi->h_encoding_thread);
- vpx_free(cpi->mb_row_ei);
- vpx_free(cpi->en_thread_data);
-
- return -2;
- }
- }
- }
- return 0;
-}
-
-void vp8cx_remove_encoder_threads(VP8_COMP *cpi)
-{
- if (cpi->b_multi_threaded)
- {
- /* shutdown other threads */
- cpi->b_multi_threaded = 0;
- {
- int i;
-
- for (i = 0; i < cpi->encoding_thread_count; i++)
- {
- sem_post(&cpi->h_event_start_encoding[i]);
- pthread_join(cpi->h_encoding_thread[i], 0);
-
- sem_destroy(&cpi->h_event_start_encoding[i]);
- }
-
- sem_post(&cpi->h_event_start_lpf);
- pthread_join(cpi->h_filter_thread, 0);
- }
-
- sem_destroy(&cpi->h_event_end_encoding);
- sem_destroy(&cpi->h_event_end_lpf);
- sem_destroy(&cpi->h_event_start_lpf);
-
- /* free thread related resources */
- vpx_free(cpi->h_event_start_encoding);
- vpx_free(cpi->h_encoding_thread);
- vpx_free(cpi->mb_row_ei);
- vpx_free(cpi->en_thread_data);
- }
-}
-#endif
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.c
deleted file mode 100644
index 3deb4abb337..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.c
+++ /dev/null
@@ -1,3368 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <math.h>
-#include <limits.h>
-#include <stdio.h>
-
-#include "./vpx_dsp_rtcd.h"
-#include "./vpx_scale_rtcd.h"
-#include "block.h"
-#include "onyx_int.h"
-#include "vp8/common/variance.h"
-#include "encodeintra.h"
-#include "vp8/common/setupintrarecon.h"
-#include "vp8/common/systemdependent.h"
-#include "mcomp.h"
-#include "firstpass.h"
-#include "vpx_scale/vpx_scale.h"
-#include "encodemb.h"
-#include "vp8/common/extend.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/swapyv12buffer.h"
-#include "rdopt.h"
-#include "vp8/common/quant_common.h"
-#include "encodemv.h"
-#include "encodeframe.h"
-
-/* #define OUTPUT_FPF 1 */
-
-extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi);
-
-#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
-extern int vp8_kf_boost_qadjustment[QINDEX_RANGE];
-
-extern const int vp8_gf_boost_qadjustment[QINDEX_RANGE];
-
-#define IIFACTOR 1.5
-#define IIKFACTOR1 1.40
-#define IIKFACTOR2 1.5
-#define RMAX 14.0
-#define GF_RMAX 48.0
-
-#define KF_MB_INTRA_MIN 300
-#define GF_MB_INTRA_MIN 200
-
-#define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001)
-
-#define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
-#define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0
-
-#define NEW_BOOST 1
-
-static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3};
-static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3};
-
-
-static const int cq_level[QINDEX_RANGE] =
-{
- 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
- 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
- 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
- 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
- 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
- 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
- 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
- 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
-};
-
-static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame);
-
-/* Resets the first pass file to the given position using a relative seek
- * from the current position
- */
-static void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position)
-{
- cpi->twopass.stats_in = Position;
-}
-
-static int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
-{
- if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
- return EOF;
-
- *next_frame = *cpi->twopass.stats_in;
- return 1;
-}
-
-/* Read frame stats at an offset from the current position */
-static int read_frame_stats( VP8_COMP *cpi,
- FIRSTPASS_STATS *frame_stats,
- int offset )
-{
- FIRSTPASS_STATS * fps_ptr = cpi->twopass.stats_in;
-
- /* Check legality of offset */
- if ( offset >= 0 )
- {
- if ( &fps_ptr[offset] >= cpi->twopass.stats_in_end )
- return EOF;
- }
- else if ( offset < 0 )
- {
- if ( &fps_ptr[offset] < cpi->twopass.stats_in_start )
- return EOF;
- }
-
- *frame_stats = fps_ptr[offset];
- return 1;
-}
-
-static int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps)
-{
- if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
- return EOF;
-
- *fps = *cpi->twopass.stats_in;
- cpi->twopass.stats_in =
- (void*)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS));
- return 1;
-}
-
-static void output_stats(const VP8_COMP *cpi,
- struct vpx_codec_pkt_list *pktlist,
- FIRSTPASS_STATS *stats)
-{
- struct vpx_codec_cx_pkt pkt;
- (void)cpi;
- pkt.kind = VPX_CODEC_STATS_PKT;
- pkt.data.twopass_stats.buf = stats;
- pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS);
- vpx_codec_pkt_list_add(pktlist, &pkt);
-
-/* TEMP debug code */
-#if OUTPUT_FPF
-
- {
- FILE *fpfile;
- fpfile = fopen("firstpass.stt", "a");
-
- fprintf(fpfile, "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f"
- " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
- " %12.0f %12.0f %12.4f\n",
- stats->frame,
- stats->intra_error,
- stats->coded_error,
- stats->ssim_weighted_pred_err,
- stats->pcnt_inter,
- stats->pcnt_motion,
- stats->pcnt_second_ref,
- stats->pcnt_neutral,
- stats->MVr,
- stats->mvr_abs,
- stats->MVc,
- stats->mvc_abs,
- stats->MVrv,
- stats->MVcv,
- stats->mv_in_out_count,
- stats->new_mv_count,
- stats->count,
- stats->duration);
- fclose(fpfile);
- }
-#endif
-}
-
-static void zero_stats(FIRSTPASS_STATS *section)
-{
- section->frame = 0.0;
- section->intra_error = 0.0;
- section->coded_error = 0.0;
- section->ssim_weighted_pred_err = 0.0;
- section->pcnt_inter = 0.0;
- section->pcnt_motion = 0.0;
- section->pcnt_second_ref = 0.0;
- section->pcnt_neutral = 0.0;
- section->MVr = 0.0;
- section->mvr_abs = 0.0;
- section->MVc = 0.0;
- section->mvc_abs = 0.0;
- section->MVrv = 0.0;
- section->MVcv = 0.0;
- section->mv_in_out_count = 0.0;
- section->new_mv_count = 0.0;
- section->count = 0.0;
- section->duration = 1.0;
-}
-
-static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame)
-{
- section->frame += frame->frame;
- section->intra_error += frame->intra_error;
- section->coded_error += frame->coded_error;
- section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
- section->pcnt_inter += frame->pcnt_inter;
- section->pcnt_motion += frame->pcnt_motion;
- section->pcnt_second_ref += frame->pcnt_second_ref;
- section->pcnt_neutral += frame->pcnt_neutral;
- section->MVr += frame->MVr;
- section->mvr_abs += frame->mvr_abs;
- section->MVc += frame->MVc;
- section->mvc_abs += frame->mvc_abs;
- section->MVrv += frame->MVrv;
- section->MVcv += frame->MVcv;
- section->mv_in_out_count += frame->mv_in_out_count;
- section->new_mv_count += frame->new_mv_count;
- section->count += frame->count;
- section->duration += frame->duration;
-}
-
-static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame)
-{
- section->frame -= frame->frame;
- section->intra_error -= frame->intra_error;
- section->coded_error -= frame->coded_error;
- section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
- section->pcnt_inter -= frame->pcnt_inter;
- section->pcnt_motion -= frame->pcnt_motion;
- section->pcnt_second_ref -= frame->pcnt_second_ref;
- section->pcnt_neutral -= frame->pcnt_neutral;
- section->MVr -= frame->MVr;
- section->mvr_abs -= frame->mvr_abs;
- section->MVc -= frame->MVc;
- section->mvc_abs -= frame->mvc_abs;
- section->MVrv -= frame->MVrv;
- section->MVcv -= frame->MVcv;
- section->mv_in_out_count -= frame->mv_in_out_count;
- section->new_mv_count -= frame->new_mv_count;
- section->count -= frame->count;
- section->duration -= frame->duration;
-}
-
-static void avg_stats(FIRSTPASS_STATS *section)
-{
- if (section->count < 1.0)
- return;
-
- section->intra_error /= section->count;
- section->coded_error /= section->count;
- section->ssim_weighted_pred_err /= section->count;
- section->pcnt_inter /= section->count;
- section->pcnt_second_ref /= section->count;
- section->pcnt_neutral /= section->count;
- section->pcnt_motion /= section->count;
- section->MVr /= section->count;
- section->mvr_abs /= section->count;
- section->MVc /= section->count;
- section->mvc_abs /= section->count;
- section->MVrv /= section->count;
- section->MVcv /= section->count;
- section->mv_in_out_count /= section->count;
- section->duration /= section->count;
-}
-
-/* Calculate a modified Error used in distributing bits between easier
- * and harder frames
- */
-static double calculate_modified_err(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
-{
- double av_err = ( cpi->twopass.total_stats.ssim_weighted_pred_err /
- cpi->twopass.total_stats.count );
- double this_err = this_frame->ssim_weighted_pred_err;
- double modified_err;
-
- if (this_err > av_err)
- modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW1);
- else
- modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW2);
-
- return modified_err;
-}
-
-static const double weight_table[256] = {
-0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
-0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
-0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
-0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
-0.020000, 0.031250, 0.062500, 0.093750, 0.125000, 0.156250, 0.187500, 0.218750,
-0.250000, 0.281250, 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750,
-0.500000, 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750,
-0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500, 0.968750,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
-1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000
-};
-
-static double simple_weight(YV12_BUFFER_CONFIG *source)
-{
- int i, j;
-
- unsigned char *src = source->y_buffer;
- double sum_weights = 0.0;
-
- /* Loop throught the Y plane raw examining levels and creating a weight
- * for the image
- */
- i = source->y_height;
- do
- {
- j = source->y_width;
- do
- {
- sum_weights += weight_table[ *src];
- src++;
- }while(--j);
- src -= source->y_width;
- src += source->y_stride;
- }while(--i);
-
- sum_weights /= (source->y_height * source->y_width);
-
- return sum_weights;
-}
-
-
-/* This function returns the current per frame maximum bitrate target */
-static int frame_max_bits(VP8_COMP *cpi)
-{
- /* Max allocation for a single frame based on the max section guidelines
- * passed in and how many bits are left
- */
- int max_bits;
-
- /* For CBR we need to also consider buffer fullness.
- * If we are running below the optimal level then we need to gradually
- * tighten up on max_bits.
- */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- double buffer_fullness_ratio = (double)cpi->buffer_level / DOUBLE_DIVIDE_CHECK((double)cpi->oxcf.optimal_buffer_level);
-
- /* For CBR base this on the target average bits per frame plus the
- * maximum sedction rate passed in by the user
- */
- max_bits = (int)(cpi->av_per_frame_bandwidth * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
-
- /* If our buffer is below the optimum level */
- if (buffer_fullness_ratio < 1.0)
- {
- /* The lower of max_bits / 4 or cpi->av_per_frame_bandwidth / 4. */
- int min_max_bits = ((cpi->av_per_frame_bandwidth >> 2) < (max_bits >> 2)) ? cpi->av_per_frame_bandwidth >> 2 : max_bits >> 2;
-
- max_bits = (int)(max_bits * buffer_fullness_ratio);
-
- /* Lowest value we will set ... which should allow the buffer to
- * refill.
- */
- if (max_bits < min_max_bits)
- max_bits = min_max_bits;
- }
- }
- /* VBR */
- else
- {
- /* For VBR base this on the bits and frames left plus the
- * two_pass_vbrmax_section rate passed in by the user
- */
- max_bits = (int)(((double)cpi->twopass.bits_left / (cpi->twopass.total_stats.count - (double)cpi->common.current_video_frame)) * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
- }
-
- /* Trap case where we are out of bits */
- if (max_bits < 0)
- max_bits = 0;
-
- return max_bits;
-}
-
-void vp8_init_first_pass(VP8_COMP *cpi)
-{
- zero_stats(&cpi->twopass.total_stats);
-}
-
-void vp8_end_first_pass(VP8_COMP *cpi)
-{
- output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats);
-}
-
-static void zz_motion_search( VP8_COMP *cpi, MACROBLOCK * x,
- YV12_BUFFER_CONFIG * raw_buffer,
- int * raw_motion_err,
- YV12_BUFFER_CONFIG * recon_buffer,
- int * best_motion_err, int recon_yoffset)
-{
- MACROBLOCKD * const xd = & x->e_mbd;
- BLOCK *b = &x->block[0];
- BLOCKD *d = &x->e_mbd.block[0];
-
- unsigned char *src_ptr = (*(b->base_src) + b->src);
- int src_stride = b->src_stride;
- unsigned char *raw_ptr;
- int raw_stride = raw_buffer->y_stride;
- unsigned char *ref_ptr;
- int ref_stride = x->e_mbd.pre.y_stride;
- (void)cpi;
-
- /* Set up pointers for this macro block raw buffer */
- raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset
- + d->offset);
- vpx_mse16x16(src_ptr, src_stride, raw_ptr, raw_stride,
- (unsigned int *)(raw_motion_err));
-
- /* Set up pointers for this macro block recon buffer */
- xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
- ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset );
- vpx_mse16x16(src_ptr, src_stride, ref_ptr, ref_stride,
- (unsigned int *)(best_motion_err));
-}
-
-static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
- int_mv *ref_mv, MV *best_mv,
- YV12_BUFFER_CONFIG *recon_buffer,
- int *best_motion_err, int recon_yoffset )
-{
- MACROBLOCKD *const xd = & x->e_mbd;
- BLOCK *b = &x->block[0];
- BLOCKD *d = &x->e_mbd.block[0];
- int num00;
-
- int_mv tmp_mv;
- int_mv ref_mv_full;
-
- int tmp_err;
- int step_param = 3; /* Dont search over full range for first pass */
- int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
- int n;
- vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16];
- int new_mv_mode_penalty = 256;
-
- /* override the default variance function to use MSE */
- v_fn_ptr.vf = vpx_mse16x16;
-
- /* Set up pointers for this macro block recon buffer */
- xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
-
- /* Initial step/diamond search centred on best mv */
- tmp_mv.as_int = 0;
- ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3;
- ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3;
- tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
- x->sadperbit16, &num00, &v_fn_ptr,
- x->mvcost, ref_mv);
- if ( tmp_err < INT_MAX-new_mv_mode_penalty )
- tmp_err += new_mv_mode_penalty;
-
- if (tmp_err < *best_motion_err)
- {
- *best_motion_err = tmp_err;
- best_mv->row = tmp_mv.as_mv.row;
- best_mv->col = tmp_mv.as_mv.col;
- }
-
- /* Further step/diamond searches as necessary */
- n = num00;
- num00 = 0;
-
- while (n < further_steps)
- {
- n++;
-
- if (num00)
- num00--;
- else
- {
- tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
- step_param + n, x->sadperbit16,
- &num00, &v_fn_ptr, x->mvcost,
- ref_mv);
- if ( tmp_err < INT_MAX-new_mv_mode_penalty )
- tmp_err += new_mv_mode_penalty;
-
- if (tmp_err < *best_motion_err)
- {
- *best_motion_err = tmp_err;
- best_mv->row = tmp_mv.as_mv.row;
- best_mv->col = tmp_mv.as_mv.col;
- }
- }
- }
-}
-
-void vp8_first_pass(VP8_COMP *cpi)
-{
- int mb_row, mb_col;
- MACROBLOCK *const x = & cpi->mb;
- VP8_COMMON *const cm = & cpi->common;
- MACROBLOCKD *const xd = & x->e_mbd;
-
- int recon_yoffset, recon_uvoffset;
- YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
- YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
- YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
- int recon_y_stride = lst_yv12->y_stride;
- int recon_uv_stride = lst_yv12->uv_stride;
- int64_t intra_error = 0;
- int64_t coded_error = 0;
-
- int sum_mvr = 0, sum_mvc = 0;
- int sum_mvr_abs = 0, sum_mvc_abs = 0;
- int sum_mvrs = 0, sum_mvcs = 0;
- int mvcount = 0;
- int intercount = 0;
- int second_ref_count = 0;
- int intrapenalty = 256;
- int neutral_count = 0;
- int new_mv_count = 0;
- int sum_in_vectors = 0;
- uint32_t lastmv_as_int = 0;
-
- int_mv zero_ref_mv;
-
- zero_ref_mv.as_int = 0;
-
- vp8_clear_system_state();
-
- x->src = * cpi->Source;
- xd->pre = *lst_yv12;
- xd->dst = *new_yv12;
-
- x->partition_info = x->pi;
-
- xd->mode_info_context = cm->mi;
-
- if(!cm->use_bilinear_mc_filter)
- {
- xd->subpixel_predict = vp8_sixtap_predict4x4;
- xd->subpixel_predict8x4 = vp8_sixtap_predict8x4;
- xd->subpixel_predict8x8 = vp8_sixtap_predict8x8;
- xd->subpixel_predict16x16 = vp8_sixtap_predict16x16;
- }
- else
- {
- xd->subpixel_predict = vp8_bilinear_predict4x4;
- xd->subpixel_predict8x4 = vp8_bilinear_predict8x4;
- xd->subpixel_predict8x8 = vp8_bilinear_predict8x8;
- xd->subpixel_predict16x16 = vp8_bilinear_predict16x16;
- }
-
- vp8_build_block_offsets(x);
-
- /* set up frame new frame for intra coded blocks */
- vp8_setup_intra_recon(new_yv12);
- vp8cx_frame_init_quantizer(cpi);
-
- /* Initialise the MV cost table to the defaults */
- {
- int flag[2] = {1, 1};
- vp8_initialize_rd_consts(cpi, x, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
- memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
- vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
- }
-
- /* for each macroblock row in image */
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
- {
- int_mv best_ref_mv;
-
- best_ref_mv.as_int = 0;
-
- /* reset above block coeffs */
- xd->up_available = (mb_row != 0);
- recon_yoffset = (mb_row * recon_y_stride * 16);
- recon_uvoffset = (mb_row * recon_uv_stride * 8);
-
- /* Set up limit values for motion vectors to prevent them extending
- * outside the UMV borders
- */
- x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
-
-
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
- int this_error;
- int gf_motion_error = INT_MAX;
- int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
-
- xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
- xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset;
- xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
- xd->left_available = (mb_col != 0);
-
- /* Copy current mb to a buffer */
- vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
-
- /* do intra 16x16 prediction */
- this_error = vp8_encode_intra(cpi, x, use_dc_pred);
-
- /* "intrapenalty" below deals with situations where the intra
- * and inter error scores are very low (eg a plain black frame)
- * We do not have special cases in first pass for 0,0 and
- * nearest etc so all inter modes carry an overhead cost
- * estimate fot the mv. When the error score is very low this
- * causes us to pick all or lots of INTRA modes and throw lots
- * of key frames. This penalty adds a cost matching that of a
- * 0,0 mv to the intra case.
- */
- this_error += intrapenalty;
-
- /* Cumulative intra error total */
- intra_error += (int64_t)this_error;
-
- /* Set up limit values for motion vectors to prevent them
- * extending outside the UMV borders
- */
- x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
- x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
-
- /* Other than for the first frame do a motion search */
- if (cm->current_video_frame > 0)
- {
- BLOCKD *d = &x->e_mbd.block[0];
- MV tmp_mv = {0, 0};
- int tmp_err;
- int motion_error = INT_MAX;
- int raw_motion_error = INT_MAX;
-
- /* Simple 0,0 motion with no mv overhead */
- zz_motion_search( cpi, x, cpi->last_frame_unscaled_source,
- &raw_motion_error, lst_yv12, &motion_error,
- recon_yoffset );
- d->bmi.mv.as_mv.row = 0;
- d->bmi.mv.as_mv.col = 0;
-
- if (raw_motion_error < cpi->oxcf.encode_breakout)
- goto skip_motion_search;
-
- /* Test last reference frame using the previous best mv as the
- * starting point (best reference) for the search
- */
- first_pass_motion_search(cpi, x, &best_ref_mv,
- &d->bmi.mv.as_mv, lst_yv12,
- &motion_error, recon_yoffset);
-
- /* If the current best reference mv is not centred on 0,0
- * then do a 0,0 based search as well
- */
- if (best_ref_mv.as_int)
- {
- tmp_err = INT_MAX;
- first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv,
- lst_yv12, &tmp_err, recon_yoffset);
-
- if ( tmp_err < motion_error )
- {
- motion_error = tmp_err;
- d->bmi.mv.as_mv.row = tmp_mv.row;
- d->bmi.mv.as_mv.col = tmp_mv.col;
- }
- }
-
- /* Experimental search in a second reference frame ((0,0)
- * based only)
- */
- if (cm->current_video_frame > 1)
- {
- first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12, &gf_motion_error, recon_yoffset);
-
- if ((gf_motion_error < motion_error) && (gf_motion_error < this_error))
- {
- second_ref_count++;
- }
-
- /* Reset to last frame as reference buffer */
- xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset;
- xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset;
- xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset;
- }
-
-skip_motion_search:
- /* Intra assumed best */
- best_ref_mv.as_int = 0;
-
- if (motion_error <= this_error)
- {
- /* Keep a count of cases where the inter and intra were
- * very close and very low. This helps with scene cut
- * detection for example in cropped clips with black bars
- * at the sides or top and bottom.
- */
- if( (((this_error-intrapenalty) * 9) <=
- (motion_error*10)) &&
- (this_error < (2*intrapenalty)) )
- {
- neutral_count++;
- }
-
- d->bmi.mv.as_mv.row *= 8;
- d->bmi.mv.as_mv.col *= 8;
- this_error = motion_error;
- vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv);
- vp8_encode_inter16x16y(x);
- sum_mvr += d->bmi.mv.as_mv.row;
- sum_mvr_abs += abs(d->bmi.mv.as_mv.row);
- sum_mvc += d->bmi.mv.as_mv.col;
- sum_mvc_abs += abs(d->bmi.mv.as_mv.col);
- sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row;
- sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col;
- intercount++;
-
- best_ref_mv.as_int = d->bmi.mv.as_int;
-
- /* Was the vector non-zero */
- if (d->bmi.mv.as_int)
- {
- mvcount++;
-
- /* Was it different from the last non zero vector */
- if ( d->bmi.mv.as_int != lastmv_as_int )
- new_mv_count++;
- lastmv_as_int = d->bmi.mv.as_int;
-
- /* Does the Row vector point inwards or outwards */
- if (mb_row < cm->mb_rows / 2)
- {
- if (d->bmi.mv.as_mv.row > 0)
- sum_in_vectors--;
- else if (d->bmi.mv.as_mv.row < 0)
- sum_in_vectors++;
- }
- else if (mb_row > cm->mb_rows / 2)
- {
- if (d->bmi.mv.as_mv.row > 0)
- sum_in_vectors++;
- else if (d->bmi.mv.as_mv.row < 0)
- sum_in_vectors--;
- }
-
- /* Does the Row vector point inwards or outwards */
- if (mb_col < cm->mb_cols / 2)
- {
- if (d->bmi.mv.as_mv.col > 0)
- sum_in_vectors--;
- else if (d->bmi.mv.as_mv.col < 0)
- sum_in_vectors++;
- }
- else if (mb_col > cm->mb_cols / 2)
- {
- if (d->bmi.mv.as_mv.col > 0)
- sum_in_vectors++;
- else if (d->bmi.mv.as_mv.col < 0)
- sum_in_vectors--;
- }
- }
- }
- }
-
- coded_error += (int64_t)this_error;
-
- /* adjust to the next column of macroblocks */
- x->src.y_buffer += 16;
- x->src.u_buffer += 8;
- x->src.v_buffer += 8;
-
- recon_yoffset += 16;
- recon_uvoffset += 8;
- }
-
- /* adjust to the next row of mbs */
- x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
- x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
- x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
-
- /* extend the recon for intra prediction */
- vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8);
- vp8_clear_system_state();
- }
-
- vp8_clear_system_state();
- {
- double weight = 0.0;
-
- FIRSTPASS_STATS fps;
-
- fps.frame = cm->current_video_frame ;
- fps.intra_error = (double)(intra_error >> 8);
- fps.coded_error = (double)(coded_error >> 8);
- weight = simple_weight(cpi->Source);
-
-
- if (weight < 0.1)
- weight = 0.1;
-
- fps.ssim_weighted_pred_err = fps.coded_error * weight;
-
- fps.pcnt_inter = 0.0;
- fps.pcnt_motion = 0.0;
- fps.MVr = 0.0;
- fps.mvr_abs = 0.0;
- fps.MVc = 0.0;
- fps.mvc_abs = 0.0;
- fps.MVrv = 0.0;
- fps.MVcv = 0.0;
- fps.mv_in_out_count = 0.0;
- fps.new_mv_count = 0.0;
- fps.count = 1.0;
-
- fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs;
- fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs;
- fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs;
-
- if (mvcount > 0)
- {
- fps.MVr = (double)sum_mvr / (double)mvcount;
- fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount;
- fps.MVc = (double)sum_mvc / (double)mvcount;
- fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount;
- fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) / (double)mvcount;
- fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) / (double)mvcount;
- fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2);
- fps.new_mv_count = new_mv_count;
-
- fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs;
- }
-
- /* TODO: handle the case when duration is set to 0, or something less
- * than the full time between subsequent cpi->source_time_stamps
- */
- fps.duration = (double)(cpi->source->ts_end
- - cpi->source->ts_start);
-
- /* don't want to do output stats with a stack variable! */
- memcpy(&cpi->twopass.this_frame_stats,
- &fps,
- sizeof(FIRSTPASS_STATS));
- output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats);
- accumulate_stats(&cpi->twopass.total_stats, &fps);
- }
-
- /* Copy the previous Last Frame into the GF buffer if specific
- * conditions for doing so are met
- */
- if ((cm->current_video_frame > 0) &&
- (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) &&
- ((cpi->twopass.this_frame_stats.intra_error /
- DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) >
- 2.0))
- {
- vp8_yv12_copy_frame(lst_yv12, gld_yv12);
- }
-
- /* swap frame pointers so last frame refers to the frame we just
- * compressed
- */
- vp8_swap_yv12_buffer(lst_yv12, new_yv12);
- vp8_yv12_extend_frame_borders(lst_yv12);
-
- /* Special case for the first frame. Copy into the GF buffer as a
- * second reference.
- */
- if (cm->current_video_frame == 0)
- {
- vp8_yv12_copy_frame(lst_yv12, gld_yv12);
- }
-
-
- /* use this to see what the first pass reconstruction looks like */
- if (0)
- {
- char filename[512];
- FILE *recon_file;
- sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
-
- if (cm->current_video_frame == 0)
- recon_file = fopen(filename, "wb");
- else
- recon_file = fopen(filename, "ab");
-
- (void) fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1,
- recon_file);
- fclose(recon_file);
- }
-
- cm->current_video_frame++;
-
-}
-extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
-
-/* Estimate a cost per mb attributable to overheads such as the coding of
- * modes and motion vectors.
- * Currently simplistic in its assumptions for testing.
- */
-
-static double bitcost( double prob )
-{
- if (prob > 0.000122)
- return -log(prob) / log(2.0);
- else
- return 13.0;
-}
-static int64_t estimate_modemvcost(VP8_COMP *cpi,
- FIRSTPASS_STATS * fpstats)
-{
- int mv_cost;
- int64_t mode_cost;
-
- double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
- double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
- double av_intra = (1.0 - av_pct_inter);
-
- double zz_cost;
- double motion_cost;
- double intra_cost;
-
- zz_cost = bitcost(av_pct_inter - av_pct_motion);
- motion_cost = bitcost(av_pct_motion);
- intra_cost = bitcost(av_intra);
-
- /* Estimate of extra bits per mv overhead for mbs
- * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb
- */
- mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
-
- /* Crude estimate of overhead cost from modes
- * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb
- */
- mode_cost = (int64_t)((((av_pct_inter - av_pct_motion) * zz_cost) +
- (av_pct_motion * motion_cost) +
- (av_intra * intra_cost)) * cpi->common.MBs) * 512;
-
- return mv_cost + mode_cost;
-}
-
-static double calc_correction_factor( double err_per_mb,
- double err_devisor,
- double pt_low,
- double pt_high,
- int Q )
-{
- double power_term;
- double error_term = err_per_mb / err_devisor;
- double correction_factor;
-
- /* Adjustment based on Q to power term. */
- power_term = pt_low + (Q * 0.01);
- power_term = (power_term > pt_high) ? pt_high : power_term;
-
- /* Adjustments to error term */
- /* TBD */
-
- /* Calculate correction factor */
- correction_factor = pow(error_term, power_term);
-
- /* Clip range */
- correction_factor =
- (correction_factor < 0.05)
- ? 0.05 : (correction_factor > 5.0) ? 5.0 : correction_factor;
-
- return correction_factor;
-}
-
-static int estimate_max_q(VP8_COMP *cpi,
- FIRSTPASS_STATS * fpstats,
- int section_target_bandwitdh,
- int overhead_bits )
-{
- int Q;
- int num_mbs = cpi->common.MBs;
- int target_norm_bits_per_mb;
-
- double section_err = (fpstats->coded_error / fpstats->count);
- double err_per_mb = section_err / num_mbs;
- double err_correction_factor;
- double speed_correction = 1.0;
- int overhead_bits_per_mb;
-
- if (section_target_bandwitdh <= 0)
- return cpi->twopass.maxq_max_limit; /* Highest value allowed */
-
- target_norm_bits_per_mb =
- (section_target_bandwitdh < (1 << 20))
- ? (512 * section_target_bandwitdh) / num_mbs
- : 512 * (section_target_bandwitdh / num_mbs);
-
- /* Calculate a corrective factor based on a rolling ratio of bits spent
- * vs target bits
- */
- if ((cpi->rolling_target_bits > 0) &&
- (cpi->active_worst_quality < cpi->worst_quality))
- {
- double rolling_ratio;
-
- rolling_ratio = (double)cpi->rolling_actual_bits /
- (double)cpi->rolling_target_bits;
-
- if (rolling_ratio < 0.95)
- cpi->twopass.est_max_qcorrection_factor -= 0.005;
- else if (rolling_ratio > 1.05)
- cpi->twopass.est_max_qcorrection_factor += 0.005;
-
- cpi->twopass.est_max_qcorrection_factor =
- (cpi->twopass.est_max_qcorrection_factor < 0.1)
- ? 0.1
- : (cpi->twopass.est_max_qcorrection_factor > 10.0)
- ? 10.0 : cpi->twopass.est_max_qcorrection_factor;
- }
-
- /* Corrections for higher compression speed settings
- * (reduced compression expected)
- */
- if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
- {
- if (cpi->oxcf.cpu_used <= 5)
- speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
- else
- speed_correction = 1.25;
- }
-
- /* Estimate of overhead bits per mb */
- /* Correction to overhead bits for min allowed Q. */
- overhead_bits_per_mb = overhead_bits / num_mbs;
- overhead_bits_per_mb = (int)(overhead_bits_per_mb *
- pow( 0.98, (double)cpi->twopass.maxq_min_limit ));
-
- /* Try and pick a max Q that will be high enough to encode the
- * content at the given rate.
- */
- for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; Q++)
- {
- int bits_per_mb_at_this_q;
-
- /* Error per MB based correction factor */
- err_correction_factor =
- calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
-
- bits_per_mb_at_this_q =
- vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
-
- bits_per_mb_at_this_q = (int)(.5 + err_correction_factor
- * speed_correction * cpi->twopass.est_max_qcorrection_factor
- * cpi->twopass.section_max_qfactor
- * (double)bits_per_mb_at_this_q);
-
- /* Mode and motion overhead */
- /* As Q rises in real encode loop rd code will force overhead down
- * We make a crude adjustment for this here as *.98 per Q step.
- */
- overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
-
- if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
- break;
- }
-
- /* Restriction on active max q for constrained quality mode. */
- if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
- (Q < cpi->cq_target_quality) )
- {
- Q = cpi->cq_target_quality;
- }
-
- /* Adjust maxq_min_limit and maxq_max_limit limits based on
- * average q observed in clip for non kf/gf.arf frames
- * Give average a chance to settle though.
- */
- if ( (cpi->ni_frames >
- ((int)cpi->twopass.total_stats.count >> 8)) &&
- (cpi->ni_frames > 150) )
- {
- cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality)
- ? (cpi->ni_av_qi + 32) : cpi->worst_quality;
- cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality)
- ? (cpi->ni_av_qi - 32) : cpi->best_quality;
- }
-
- return Q;
-}
-
-/* For cq mode estimate a cq level that matches the observed
- * complexity and data rate.
- */
-static int estimate_cq( VP8_COMP *cpi,
- FIRSTPASS_STATS * fpstats,
- int section_target_bandwitdh,
- int overhead_bits )
-{
- int Q;
- int num_mbs = cpi->common.MBs;
- int target_norm_bits_per_mb;
-
- double section_err = (fpstats->coded_error / fpstats->count);
- double err_per_mb = section_err / num_mbs;
- double err_correction_factor;
- double speed_correction = 1.0;
- double clip_iiratio;
- double clip_iifactor;
- int overhead_bits_per_mb;
-
- if (0)
- {
- FILE *f = fopen("epmp.stt", "a");
- fprintf(f, "%10.2f\n", err_per_mb );
- fclose(f);
- }
-
- target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
- ? (512 * section_target_bandwitdh) / num_mbs
- : 512 * (section_target_bandwitdh / num_mbs);
-
- /* Estimate of overhead bits per mb */
- overhead_bits_per_mb = overhead_bits / num_mbs;
-
- /* Corrections for higher compression speed settings
- * (reduced compression expected)
- */
- if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
- {
- if (cpi->oxcf.cpu_used <= 5)
- speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
- else
- speed_correction = 1.25;
- }
-
- /* II ratio correction factor for clip as a whole */
- clip_iiratio = cpi->twopass.total_stats.intra_error /
- DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error);
- clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025);
- if (clip_iifactor < 0.80)
- clip_iifactor = 0.80;
-
- /* Try and pick a Q that can encode the content at the given rate. */
- for (Q = 0; Q < MAXQ; Q++)
- {
- int bits_per_mb_at_this_q;
-
- /* Error per MB based correction factor */
- err_correction_factor =
- calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q);
-
- bits_per_mb_at_this_q =
- vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
-
- bits_per_mb_at_this_q =
- (int)( .5 + err_correction_factor *
- speed_correction *
- clip_iifactor *
- (double)bits_per_mb_at_this_q);
-
- /* Mode and motion overhead */
- /* As Q rises in real encode loop rd code will force overhead down
- * We make a crude adjustment for this here as *.98 per Q step.
- */
- overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
-
- if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
- break;
- }
-
- /* Clip value to range "best allowed to (worst allowed - 1)" */
- Q = cq_level[Q];
- if ( Q >= cpi->worst_quality )
- Q = cpi->worst_quality - 1;
- if ( Q < cpi->best_quality )
- Q = cpi->best_quality;
-
- return Q;
-}
-
-static int estimate_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh)
-{
- int Q;
- int num_mbs = cpi->common.MBs;
- int target_norm_bits_per_mb;
-
- double err_per_mb = section_err / num_mbs;
- double err_correction_factor;
- double speed_correction = 1.0;
-
- target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) ? (512 * section_target_bandwitdh) / num_mbs : 512 * (section_target_bandwitdh / num_mbs);
-
- /* Corrections for higher compression speed settings
- * (reduced compression expected)
- */
- if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
- {
- if (cpi->oxcf.cpu_used <= 5)
- speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
- else
- speed_correction = 1.25;
- }
-
- /* Try and pick a Q that can encode the content at the given rate. */
- for (Q = 0; Q < MAXQ; Q++)
- {
- int bits_per_mb_at_this_q;
-
- /* Error per MB based correction factor */
- err_correction_factor =
- calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
-
- bits_per_mb_at_this_q =
- (int)( .5 + ( err_correction_factor *
- speed_correction *
- cpi->twopass.est_max_qcorrection_factor *
- (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0 ) );
-
- if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
- break;
- }
-
- return Q;
-}
-
-/* Estimate a worst case Q for a KF group */
-static int estimate_kf_group_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh, double group_iiratio)
-{
- int Q;
- int num_mbs = cpi->common.MBs;
- int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs;
- int bits_per_mb_at_this_q;
-
- double err_per_mb = section_err / num_mbs;
- double err_correction_factor;
- double speed_correction = 1.0;
- double current_spend_ratio = 1.0;
-
- double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90;
- double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80;
-
- double iiratio_correction_factor = 1.0;
-
- double combined_correction_factor;
-
- /* Trap special case where the target is <= 0 */
- if (target_norm_bits_per_mb <= 0)
- return MAXQ * 2;
-
- /* Calculate a corrective factor based on a rolling ratio of bits spent
- * vs target bits
- * This is clamped to the range 0.1 to 10.0
- */
- if (cpi->long_rolling_target_bits <= 0)
- current_spend_ratio = 10.0;
- else
- {
- current_spend_ratio = (double)cpi->long_rolling_actual_bits / (double)cpi->long_rolling_target_bits;
- current_spend_ratio = (current_spend_ratio > 10.0) ? 10.0 : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio;
- }
-
- /* Calculate a correction factor based on the quality of prediction in
- * the sequence as indicated by intra_inter error score ratio (IIRatio)
- * The idea here is to favour subsampling in the hardest sections vs
- * the easyest.
- */
- iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1);
-
- if (iiratio_correction_factor < 0.5)
- iiratio_correction_factor = 0.5;
-
- /* Corrections for higher compression speed settings
- * (reduced compression expected)
- */
- if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
- {
- if (cpi->oxcf.cpu_used <= 5)
- speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
- else
- speed_correction = 1.25;
- }
-
- /* Combine the various factors calculated above */
- combined_correction_factor = speed_correction * iiratio_correction_factor * current_spend_ratio;
-
- /* Try and pick a Q that should be high enough to encode the content at
- * the given rate.
- */
- for (Q = 0; Q < MAXQ; Q++)
- {
- /* Error per MB based correction factor */
- err_correction_factor =
- calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q);
-
- bits_per_mb_at_this_q =
- (int)(.5 + ( err_correction_factor *
- combined_correction_factor *
- (double)vp8_bits_per_mb[INTER_FRAME][Q]) );
-
- if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
- break;
- }
-
- /* If we could not hit the target even at Max Q then estimate what Q
- * would have been required
- */
- while ((bits_per_mb_at_this_q > target_norm_bits_per_mb) && (Q < (MAXQ * 2)))
- {
-
- bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q);
- Q++;
- }
-
- if (0)
- {
- FILE *f = fopen("estkf_q.stt", "a");
- fprintf(f, "%8d %8d %8d %8.2f %8.3f %8.2f %8.3f %8.3f %8.3f %8d\n", cpi->common.current_video_frame, bits_per_mb_at_this_q,
- target_norm_bits_per_mb, err_per_mb, err_correction_factor,
- current_spend_ratio, group_iiratio, iiratio_correction_factor,
- (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level, Q);
- fclose(f);
- }
-
- return Q;
-}
-
-void vp8_init_second_pass(VP8_COMP *cpi)
-{
- FIRSTPASS_STATS this_frame;
- FIRSTPASS_STATS *start_pos;
-
- double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
-
- zero_stats(&cpi->twopass.total_stats);
- zero_stats(&cpi->twopass.total_left_stats);
-
- if (!cpi->twopass.stats_in_end)
- return;
-
- cpi->twopass.total_stats = *cpi->twopass.stats_in_end;
- cpi->twopass.total_left_stats = cpi->twopass.total_stats;
-
- /* each frame can have a different duration, as the frame rate in the
- * source isn't guaranteed to be constant. The frame rate prior to
- * the first frame encoded in the second pass is a guess. However the
- * sum duration is not. Its calculated based on the actual durations of
- * all frames from the first pass.
- */
- vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count / cpi->twopass.total_stats.duration);
-
- cpi->output_framerate = cpi->framerate;
- cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0) ;
- cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * two_pass_min_rate / 10000000.0);
-
- /* Calculate a minimum intra value to be used in determining the IIratio
- * scores used in the second pass. We have this minimum to make sure
- * that clips that are static but "low complexity" in the intra domain
- * are still boosted appropriately for KF/GF/ARF
- */
- cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
- cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
-
- /* Scan the first pass file and calculate an average Intra / Inter error
- * score ratio for the sequence
- */
- {
- double sum_iiratio = 0.0;
- double IIRatio;
-
- start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
-
- while (input_stats(cpi, &this_frame) != EOF)
- {
- IIRatio = this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error);
- IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio;
- sum_iiratio += IIRatio;
- }
-
- cpi->twopass.avg_iiratio = sum_iiratio / DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count);
-
- /* Reset file position */
- reset_fpf_position(cpi, start_pos);
- }
-
- /* Scan the first pass file and calculate a modified total error based
- * upon the bias/power function used to allocate bits
- */
- {
- start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
-
- cpi->twopass.modified_error_total = 0.0;
- cpi->twopass.modified_error_used = 0.0;
-
- while (input_stats(cpi, &this_frame) != EOF)
- {
- cpi->twopass.modified_error_total += calculate_modified_err(cpi, &this_frame);
- }
- cpi->twopass.modified_error_left = cpi->twopass.modified_error_total;
-
- reset_fpf_position(cpi, start_pos); /* Reset file position */
-
- }
-}
-
-void vp8_end_second_pass(VP8_COMP *cpi)
-{
- (void)cpi;
-}
-
-/* This function gives and estimate of how badly we believe the prediction
- * quality is decaying from frame to frame.
- */
-static double get_prediction_decay_rate(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
-{
- double prediction_decay_rate;
- double motion_decay;
- double motion_pct = next_frame->pcnt_motion;
- (void)cpi;
-
- /* Initial basis is the % mbs inter coded */
- prediction_decay_rate = next_frame->pcnt_inter;
-
- /* High % motion -> somewhat higher decay rate */
- motion_decay = (1.0 - (motion_pct / 20.0));
- if (motion_decay < prediction_decay_rate)
- prediction_decay_rate = motion_decay;
-
- /* Adjustment to decay rate based on speed of motion */
- {
- double this_mv_rabs;
- double this_mv_cabs;
- double distance_factor;
-
- this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct);
- this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct);
-
- distance_factor = sqrt((this_mv_rabs * this_mv_rabs) +
- (this_mv_cabs * this_mv_cabs)) / 250.0;
- distance_factor = ((distance_factor > 1.0)
- ? 0.0 : (1.0 - distance_factor));
- if (distance_factor < prediction_decay_rate)
- prediction_decay_rate = distance_factor;
- }
-
- return prediction_decay_rate;
-}
-
-/* Function to test for a condition where a complex transition is followed
- * by a static section. For example in slide shows where there is a fade
- * between slides. This is to help with more optimal kf and gf positioning.
- */
-static int detect_transition_to_still(
- VP8_COMP *cpi,
- int frame_interval,
- int still_interval,
- double loop_decay_rate,
- double decay_accumulator )
-{
- int trans_to_still = 0;
-
- /* Break clause to detect very still sections after motion
- * For example a static image after a fade or other transition
- * instead of a clean scene cut.
- */
- if ( (frame_interval > MIN_GF_INTERVAL) &&
- (loop_decay_rate >= 0.999) &&
- (decay_accumulator < 0.9) )
- {
- int j;
- FIRSTPASS_STATS * position = cpi->twopass.stats_in;
- FIRSTPASS_STATS tmp_next_frame;
- double decay_rate;
-
- /* Look ahead a few frames to see if static condition persists... */
- for ( j = 0; j < still_interval; j++ )
- {
- if (EOF == input_stats(cpi, &tmp_next_frame))
- break;
-
- decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame);
- if ( decay_rate < 0.999 )
- break;
- }
- /* Reset file position */
- reset_fpf_position(cpi, position);
-
- /* Only if it does do we signal a transition to still */
- if ( j == still_interval )
- trans_to_still = 1;
- }
-
- return trans_to_still;
-}
-
-/* This function detects a flash through the high relative pcnt_second_ref
- * score in the frame following a flash frame. The offset passed in should
- * reflect this
- */
-static int detect_flash( VP8_COMP *cpi, int offset )
-{
- FIRSTPASS_STATS next_frame;
-
- int flash_detected = 0;
-
- /* Read the frame data. */
- /* The return is 0 (no flash detected) if not a valid frame */
- if ( read_frame_stats(cpi, &next_frame, offset) != EOF )
- {
- /* What we are looking for here is a situation where there is a
- * brief break in prediction (such as a flash) but subsequent frames
- * are reasonably well predicted by an earlier (pre flash) frame.
- * The recovery after a flash is indicated by a high pcnt_second_ref
- * comapred to pcnt_inter.
- */
- if ( (next_frame.pcnt_second_ref > next_frame.pcnt_inter) &&
- (next_frame.pcnt_second_ref >= 0.5 ) )
- {
- flash_detected = 1;
-
- /*if (1)
- {
- FILE *f = fopen("flash.stt", "a");
- fprintf(f, "%8.0f %6.2f %6.2f\n",
- next_frame.frame,
- next_frame.pcnt_inter,
- next_frame.pcnt_second_ref);
- fclose(f);
- }*/
- }
- }
-
- return flash_detected;
-}
-
-/* Update the motion related elements to the GF arf boost calculation */
-static void accumulate_frame_motion_stats(
- VP8_COMP *cpi,
- FIRSTPASS_STATS * this_frame,
- double * this_frame_mv_in_out,
- double * mv_in_out_accumulator,
- double * abs_mv_in_out_accumulator,
- double * mv_ratio_accumulator )
-{
- double this_frame_mvr_ratio;
- double this_frame_mvc_ratio;
- double motion_pct;
- (void)cpi;
-
- /* Accumulate motion stats. */
- motion_pct = this_frame->pcnt_motion;
-
- /* Accumulate Motion In/Out of frame stats */
- *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct;
- *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct;
- *abs_mv_in_out_accumulator +=
- fabs(this_frame->mv_in_out_count * motion_pct);
-
- /* Accumulate a measure of how uniform (or conversely how random)
- * the motion field is. (A ratio of absmv / mv)
- */
- if (motion_pct > 0.05)
- {
- this_frame_mvr_ratio = fabs(this_frame->mvr_abs) /
- DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr));
-
- this_frame_mvc_ratio = fabs(this_frame->mvc_abs) /
- DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc));
-
- *mv_ratio_accumulator +=
- (this_frame_mvr_ratio < this_frame->mvr_abs)
- ? (this_frame_mvr_ratio * motion_pct)
- : this_frame->mvr_abs * motion_pct;
-
- *mv_ratio_accumulator +=
- (this_frame_mvc_ratio < this_frame->mvc_abs)
- ? (this_frame_mvc_ratio * motion_pct)
- : this_frame->mvc_abs * motion_pct;
-
- }
-}
-
-/* Calculate a baseline boost number for the current frame. */
-static double calc_frame_boost(
- VP8_COMP *cpi,
- FIRSTPASS_STATS * this_frame,
- double this_frame_mv_in_out )
-{
- double frame_boost;
-
- /* Underlying boost factor is based on inter intra error ratio */
- if (this_frame->intra_error > cpi->twopass.gf_intra_err_min)
- frame_boost = (IIFACTOR * this_frame->intra_error /
- DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
- else
- frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min /
- DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
-
- /* Increase boost for frames where new data coming into frame
- * (eg zoom out). Slightly reduce boost if there is a net balance
- * of motion out of the frame (zoom in).
- * The range for this_frame_mv_in_out is -1.0 to +1.0
- */
- if (this_frame_mv_in_out > 0.0)
- frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
- /* In extreme case boost is halved */
- else
- frame_boost += frame_boost * (this_frame_mv_in_out / 2.0);
-
- /* Clip to maximum */
- if (frame_boost > GF_RMAX)
- frame_boost = GF_RMAX;
-
- return frame_boost;
-}
-
-#if NEW_BOOST
-static int calc_arf_boost(
- VP8_COMP *cpi,
- int offset,
- int f_frames,
- int b_frames,
- int *f_boost,
- int *b_boost )
-{
- FIRSTPASS_STATS this_frame;
-
- int i;
- double boost_score = 0.0;
- double mv_ratio_accumulator = 0.0;
- double decay_accumulator = 1.0;
- double this_frame_mv_in_out = 0.0;
- double mv_in_out_accumulator = 0.0;
- double abs_mv_in_out_accumulator = 0.0;
- double r;
- int flash_detected = 0;
-
- /* Search forward from the proposed arf/next gf position */
- for ( i = 0; i < f_frames; i++ )
- {
- if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
- break;
-
- /* Update the motion related elements to the boost calculation */
- accumulate_frame_motion_stats( cpi, &this_frame,
- &this_frame_mv_in_out, &mv_in_out_accumulator,
- &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
-
- /* Calculate the baseline boost number for this frame */
- r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
-
- /* We want to discount the the flash frame itself and the recovery
- * frame that follows as both will have poor scores.
- */
- flash_detected = detect_flash(cpi, (i+offset)) ||
- detect_flash(cpi, (i+offset+1));
-
- /* Cumulative effect of prediction quality decay */
- if ( !flash_detected )
- {
- decay_accumulator =
- decay_accumulator *
- get_prediction_decay_rate(cpi, &this_frame);
- decay_accumulator =
- decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
- }
- boost_score += (decay_accumulator * r);
-
- /* Break out conditions. */
- if ( (!flash_detected) &&
- ((mv_ratio_accumulator > 100.0) ||
- (abs_mv_in_out_accumulator > 3.0) ||
- (mv_in_out_accumulator < -2.0) ) )
- {
- break;
- }
- }
-
- *f_boost = (int)(boost_score * 100.0) >> 4;
-
- /* Reset for backward looking loop */
- boost_score = 0.0;
- mv_ratio_accumulator = 0.0;
- decay_accumulator = 1.0;
- this_frame_mv_in_out = 0.0;
- mv_in_out_accumulator = 0.0;
- abs_mv_in_out_accumulator = 0.0;
-
- /* Search forward from the proposed arf/next gf position */
- for ( i = -1; i >= -b_frames; i-- )
- {
- if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
- break;
-
- /* Update the motion related elements to the boost calculation */
- accumulate_frame_motion_stats( cpi, &this_frame,
- &this_frame_mv_in_out, &mv_in_out_accumulator,
- &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
-
- /* Calculate the baseline boost number for this frame */
- r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
-
- /* We want to discount the the flash frame itself and the recovery
- * frame that follows as both will have poor scores.
- */
- flash_detected = detect_flash(cpi, (i+offset)) ||
- detect_flash(cpi, (i+offset+1));
-
- /* Cumulative effect of prediction quality decay */
- if ( !flash_detected )
- {
- decay_accumulator =
- decay_accumulator *
- get_prediction_decay_rate(cpi, &this_frame);
- decay_accumulator =
- decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
- }
-
- boost_score += (decay_accumulator * r);
-
- /* Break out conditions. */
- if ( (!flash_detected) &&
- ((mv_ratio_accumulator > 100.0) ||
- (abs_mv_in_out_accumulator > 3.0) ||
- (mv_in_out_accumulator < -2.0) ) )
- {
- break;
- }
- }
- *b_boost = (int)(boost_score * 100.0) >> 4;
-
- return (*f_boost + *b_boost);
-}
-#endif
-
-/* Analyse and define a gf/arf group . */
-static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
-{
- FIRSTPASS_STATS next_frame;
- FIRSTPASS_STATS *start_pos;
- int i;
- double r;
- double boost_score = 0.0;
- double old_boost_score = 0.0;
- double gf_group_err = 0.0;
- double gf_first_frame_err = 0.0;
- double mod_frame_err = 0.0;
-
- double mv_ratio_accumulator = 0.0;
- double decay_accumulator = 1.0;
-
- double loop_decay_rate = 1.00; /* Starting decay rate */
-
- double this_frame_mv_in_out = 0.0;
- double mv_in_out_accumulator = 0.0;
- double abs_mv_in_out_accumulator = 0.0;
- double mod_err_per_mb_accumulator = 0.0;
-
- int max_bits = frame_max_bits(cpi); /* Max for a single frame */
-
- unsigned int allow_alt_ref =
- cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
-
- int alt_boost = 0;
- int f_boost = 0;
- int b_boost = 0;
- int flash_detected;
-
- cpi->twopass.gf_group_bits = 0;
- cpi->twopass.gf_decay_rate = 0;
-
- vp8_clear_system_state();
-
- start_pos = cpi->twopass.stats_in;
-
- memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */
-
- /* Load stats for the current frame. */
- mod_frame_err = calculate_modified_err(cpi, this_frame);
-
- /* Note the error of the frame at the start of the group (this will be
- * the GF frame error if we code a normal gf
- */
- gf_first_frame_err = mod_frame_err;
-
- /* Special treatment if the current frame is a key frame (which is also
- * a gf). If it is then its error score (and hence bit allocation) need
- * to be subtracted out from the calculation for the GF group
- */
- if (cpi->common.frame_type == KEY_FRAME)
- gf_group_err -= gf_first_frame_err;
-
- /* Scan forward to try and work out how many frames the next gf group
- * should contain and what level of boost is appropriate for the GF
- * or ARF that will be coded with the group
- */
- i = 0;
-
- while (((i < cpi->twopass.static_scene_max_gf_interval) ||
- ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
- (i < cpi->twopass.frames_to_key))
- {
- i++;
-
- /* Accumulate error score of frames in this gf group */
- mod_frame_err = calculate_modified_err(cpi, this_frame);
-
- gf_group_err += mod_frame_err;
-
- mod_err_per_mb_accumulator +=
- mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs);
-
- if (EOF == input_stats(cpi, &next_frame))
- break;
-
- /* Test for the case where there is a brief flash but the prediction
- * quality back to an earlier frame is then restored.
- */
- flash_detected = detect_flash(cpi, 0);
-
- /* Update the motion related elements to the boost calculation */
- accumulate_frame_motion_stats( cpi, &next_frame,
- &this_frame_mv_in_out, &mv_in_out_accumulator,
- &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
-
- /* Calculate a baseline boost number for this frame */
- r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out );
-
- /* Cumulative effect of prediction quality decay */
- if ( !flash_detected )
- {
- loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
- decay_accumulator = decay_accumulator * loop_decay_rate;
- decay_accumulator =
- decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
- }
- boost_score += (decay_accumulator * r);
-
- /* Break clause to detect very still sections after motion
- * For example a staic image after a fade or other transition.
- */
- if ( detect_transition_to_still( cpi, i, 5,
- loop_decay_rate,
- decay_accumulator ) )
- {
- allow_alt_ref = 0;
- boost_score = old_boost_score;
- break;
- }
-
- /* Break out conditions. */
- if (
- /* Break at cpi->max_gf_interval unless almost totally static */
- (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) ||
- (
- /* Dont break out with a very short interval */
- (i > MIN_GF_INTERVAL) &&
- /* Dont break out very close to a key frame */
- ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
- ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
- (!flash_detected) &&
- ((mv_ratio_accumulator > 100.0) ||
- (abs_mv_in_out_accumulator > 3.0) ||
- (mv_in_out_accumulator < -2.0) ||
- ((boost_score - old_boost_score) < 2.0))
- ) )
- {
- boost_score = old_boost_score;
- break;
- }
-
- memcpy(this_frame, &next_frame, sizeof(*this_frame));
-
- old_boost_score = boost_score;
- }
-
- cpi->twopass.gf_decay_rate =
- (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0;
-
- /* When using CBR apply additional buffer related upper limits */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- double max_boost;
-
- /* For cbr apply buffer related limits */
- if (cpi->drop_frames_allowed)
- {
- int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark *
- (cpi->oxcf.optimal_buffer_level / 100);
-
- if (cpi->buffer_level > df_buffer_level)
- max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
- else
- max_boost = 0.0;
- }
- else if (cpi->buffer_level > 0)
- {
- max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
- }
- else
- {
- max_boost = 0.0;
- }
-
- if (boost_score > max_boost)
- boost_score = max_boost;
- }
-
- /* Dont allow conventional gf too near the next kf */
- if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)
- {
- while (i < cpi->twopass.frames_to_key)
- {
- i++;
-
- if (EOF == input_stats(cpi, this_frame))
- break;
-
- if (i < cpi->twopass.frames_to_key)
- {
- mod_frame_err = calculate_modified_err(cpi, this_frame);
- gf_group_err += mod_frame_err;
- }
- }
- }
-
- cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
-
-#if NEW_BOOST
- /* Alterrnative boost calculation for alt ref */
- alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost );
-#endif
-
- /* Should we use the alternate refernce frame */
- if (allow_alt_ref &&
- (i >= MIN_GF_INTERVAL) &&
- /* dont use ARF very near next kf */
- (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
-#if NEW_BOOST
- ((next_frame.pcnt_inter > 0.75) ||
- (next_frame.pcnt_second_ref > 0.5)) &&
- ((mv_in_out_accumulator / (double)i > -0.2) ||
- (mv_in_out_accumulator > -2.0)) &&
- (b_boost > 100) &&
- (f_boost > 100) )
-#else
- (next_frame.pcnt_inter > 0.75) &&
- ((mv_in_out_accumulator / (double)i > -0.2) ||
- (mv_in_out_accumulator > -2.0)) &&
- (cpi->gfu_boost > 100) &&
- (cpi->twopass.gf_decay_rate <=
- (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) )
-#endif
- {
- int Boost;
- int allocation_chunks;
- int Q = (cpi->oxcf.fixed_q < 0)
- ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
- int tmp_q;
- int arf_frame_bits = 0;
- int group_bits;
-
-#if NEW_BOOST
- cpi->gfu_boost = alt_boost;
-#endif
-
- /* Estimate the bits to be allocated to the group as a whole */
- if ((cpi->twopass.kf_group_bits > 0) &&
- (cpi->twopass.kf_group_error_left > 0))
- {
- group_bits = (int)((double)cpi->twopass.kf_group_bits *
- (gf_group_err / (double)cpi->twopass.kf_group_error_left));
- }
- else
- group_bits = 0;
-
- /* Boost for arf frame */
-#if NEW_BOOST
- Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
-#else
- Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
-#endif
- Boost += (i * 50);
-
- /* Set max and minimum boost and hence minimum allocation */
- if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
- Boost = ((cpi->baseline_gf_interval + 1) * 200);
- else if (Boost < 125)
- Boost = 125;
-
- allocation_chunks = (i * 100) + Boost;
-
- /* Normalize Altboost and allocations chunck down to prevent overflow */
- while (Boost > 1000)
- {
- Boost /= 2;
- allocation_chunks /= 2;
- }
-
- /* Calculate the number of bits to be spent on the arf based on the
- * boost number
- */
- arf_frame_bits = (int)((double)Boost * (group_bits /
- (double)allocation_chunks));
-
- /* Estimate if there are enough bits available to make worthwhile use
- * of an arf.
- */
- tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits);
-
- /* Only use an arf if it is likely we will be able to code
- * it at a lower Q than the surrounding frames.
- */
- if (tmp_q < cpi->worst_quality)
- {
- int half_gf_int;
- int frames_after_arf;
- int frames_bwd = cpi->oxcf.arnr_max_frames - 1;
- int frames_fwd = cpi->oxcf.arnr_max_frames - 1;
-
- cpi->source_alt_ref_pending = 1;
-
- /*
- * For alt ref frames the error score for the end frame of the
- * group (the alt ref frame) should not contribute to the group
- * total and hence the number of bit allocated to the group.
- * Rather it forms part of the next group (it is the GF at the
- * start of the next group)
- * gf_group_err -= mod_frame_err;
- *
- * For alt ref frames alt ref frame is technically part of the
- * GF frame for the next group but we always base the error
- * calculation and bit allocation on the current group of frames.
- *
- * Set the interval till the next gf or arf.
- * For ARFs this is the number of frames to be coded before the
- * future frame that is coded as an ARF.
- * The future frame itself is part of the next group
- */
- cpi->baseline_gf_interval = i;
-
- /*
- * Define the arnr filter width for this group of frames:
- * We only filter frames that lie within a distance of half
- * the GF interval from the ARF frame. We also have to trap
- * cases where the filter extends beyond the end of clip.
- * Note: this_frame->frame has been updated in the loop
- * so it now points at the ARF frame.
- */
- half_gf_int = cpi->baseline_gf_interval >> 1;
- frames_after_arf = (int)(cpi->twopass.total_stats.count -
- this_frame->frame - 1);
-
- switch (cpi->oxcf.arnr_type)
- {
- case 1: /* Backward filter */
- frames_fwd = 0;
- if (frames_bwd > half_gf_int)
- frames_bwd = half_gf_int;
- break;
-
- case 2: /* Forward filter */
- if (frames_fwd > half_gf_int)
- frames_fwd = half_gf_int;
- if (frames_fwd > frames_after_arf)
- frames_fwd = frames_after_arf;
- frames_bwd = 0;
- break;
-
- case 3: /* Centered filter */
- default:
- frames_fwd >>= 1;
- if (frames_fwd > frames_after_arf)
- frames_fwd = frames_after_arf;
- if (frames_fwd > half_gf_int)
- frames_fwd = half_gf_int;
-
- frames_bwd = frames_fwd;
-
- /* For even length filter there is one more frame backward
- * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
- */
- if (frames_bwd < half_gf_int)
- frames_bwd += (cpi->oxcf.arnr_max_frames+1) & 0x1;
- break;
- }
-
- cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
- }
- else
- {
- cpi->source_alt_ref_pending = 0;
- cpi->baseline_gf_interval = i;
- }
- }
- else
- {
- cpi->source_alt_ref_pending = 0;
- cpi->baseline_gf_interval = i;
- }
-
- /*
- * Now decide how many bits should be allocated to the GF group as a
- * proportion of those remaining in the kf group.
- * The final key frame group in the clip is treated as a special case
- * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
- * This is also important for short clips where there may only be one
- * key frame.
- */
- if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count -
- cpi->common.current_video_frame))
- {
- cpi->twopass.kf_group_bits =
- (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
- }
-
- /* Calculate the bits to be allocated to the group as a whole */
- if ((cpi->twopass.kf_group_bits > 0) &&
- (cpi->twopass.kf_group_error_left > 0))
- {
- cpi->twopass.gf_group_bits =
- (int64_t)(cpi->twopass.kf_group_bits *
- (gf_group_err / cpi->twopass.kf_group_error_left));
- }
- else
- cpi->twopass.gf_group_bits = 0;
-
- cpi->twopass.gf_group_bits =
- (cpi->twopass.gf_group_bits < 0)
- ? 0
- : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits)
- ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits;
-
- /* Clip cpi->twopass.gf_group_bits based on user supplied data rate
- * variability limit (cpi->oxcf.two_pass_vbrmax_section)
- */
- if (cpi->twopass.gf_group_bits >
- (int64_t)max_bits * cpi->baseline_gf_interval)
- cpi->twopass.gf_group_bits =
- (int64_t)max_bits * cpi->baseline_gf_interval;
-
- /* Reset the file position */
- reset_fpf_position(cpi, start_pos);
-
- /* Update the record of error used so far (only done once per gf group) */
- cpi->twopass.modified_error_used += gf_group_err;
-
- /* Assign bits to the arf or gf. */
- for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) {
- int Boost;
- int allocation_chunks;
- int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
- int gf_bits;
-
- /* For ARF frames */
- if (cpi->source_alt_ref_pending && i == 0)
- {
-#if NEW_BOOST
- Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
-#else
- Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
-#endif
- Boost += (cpi->baseline_gf_interval * 50);
-
- /* Set max and minimum boost and hence minimum allocation */
- if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
- Boost = ((cpi->baseline_gf_interval + 1) * 200);
- else if (Boost < 125)
- Boost = 125;
-
- allocation_chunks =
- ((cpi->baseline_gf_interval + 1) * 100) + Boost;
- }
- /* Else for standard golden frames */
- else
- {
- /* boost based on inter / intra ratio of subsequent frames */
- Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100;
-
- /* Set max and minimum boost and hence minimum allocation */
- if (Boost > (cpi->baseline_gf_interval * 150))
- Boost = (cpi->baseline_gf_interval * 150);
- else if (Boost < 125)
- Boost = 125;
-
- allocation_chunks =
- (cpi->baseline_gf_interval * 100) + (Boost - 100);
- }
-
- /* Normalize Altboost and allocations chunck down to prevent overflow */
- while (Boost > 1000)
- {
- Boost /= 2;
- allocation_chunks /= 2;
- }
-
- /* Calculate the number of bits to be spent on the gf or arf based on
- * the boost number
- */
- gf_bits = (int)((double)Boost *
- (cpi->twopass.gf_group_bits /
- (double)allocation_chunks));
-
- /* If the frame that is to be boosted is simpler than the average for
- * the gf/arf group then use an alternative calculation
- * based on the error score of the frame itself
- */
- if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval)
- {
- double alt_gf_grp_bits;
- int alt_gf_bits;
-
- alt_gf_grp_bits =
- (double)cpi->twopass.kf_group_bits *
- (mod_frame_err * (double)cpi->baseline_gf_interval) /
- DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left);
-
- alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits /
- (double)allocation_chunks));
-
- if (gf_bits > alt_gf_bits)
- {
- gf_bits = alt_gf_bits;
- }
- }
- /* Else if it is harder than other frames in the group make sure it at
- * least receives an allocation in keeping with its relative error
- * score, otherwise it may be worse off than an "un-boosted" frame
- */
- else
- {
- int alt_gf_bits =
- (int)((double)cpi->twopass.kf_group_bits *
- mod_frame_err /
- DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left));
-
- if (alt_gf_bits > gf_bits)
- {
- gf_bits = alt_gf_bits;
- }
- }
-
- /* Apply an additional limit for CBR */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1))
- cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1);
- }
-
- /* Dont allow a negative value for gf_bits */
- if (gf_bits < 0)
- gf_bits = 0;
-
- /* Add in minimum for a frame */
- gf_bits += cpi->min_frame_bandwidth;
-
- if (i == 0)
- {
- cpi->twopass.gf_bits = gf_bits;
- }
- if (i == 1 || (!cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)))
- {
- /* Per frame bit target for this frame */
- cpi->per_frame_bandwidth = gf_bits;
- }
- }
-
- {
- /* Adjust KF group bits and error remainin */
- cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err;
- cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits;
-
- if (cpi->twopass.kf_group_bits < 0)
- cpi->twopass.kf_group_bits = 0;
-
- /* Note the error score left in the remaining frames of the group.
- * For normal GFs we want to remove the error score for the first
- * frame of the group (except in Key frame case where this has
- * already happened)
- */
- if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
- cpi->twopass.gf_group_error_left = (int)(gf_group_err -
- gf_first_frame_err);
- else
- cpi->twopass.gf_group_error_left = (int) gf_group_err;
-
- cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits - cpi->min_frame_bandwidth;
-
- if (cpi->twopass.gf_group_bits < 0)
- cpi->twopass.gf_group_bits = 0;
-
- /* This condition could fail if there are two kfs very close together
- * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the
- * calculation of cpi->twopass.alt_extra_bits.
- */
- if ( cpi->baseline_gf_interval >= 3 )
- {
-#if NEW_BOOST
- int boost = (cpi->source_alt_ref_pending)
- ? b_boost : cpi->gfu_boost;
-#else
- int boost = cpi->gfu_boost;
-#endif
- if ( boost >= 150 )
- {
- int pct_extra;
-
- pct_extra = (boost - 100) / 50;
- pct_extra = (pct_extra > 20) ? 20 : pct_extra;
-
- cpi->twopass.alt_extra_bits =
- (int)(cpi->twopass.gf_group_bits * pct_extra) / 100;
- cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits;
- cpi->twopass.alt_extra_bits /=
- ((cpi->baseline_gf_interval-1)>>1);
- }
- else
- cpi->twopass.alt_extra_bits = 0;
- }
- else
- cpi->twopass.alt_extra_bits = 0;
- }
-
- /* Adjustments based on a measure of complexity of the section */
- if (cpi->common.frame_type != KEY_FRAME)
- {
- FIRSTPASS_STATS sectionstats;
- double Ratio;
-
- zero_stats(&sectionstats);
- reset_fpf_position(cpi, start_pos);
-
- for (i = 0 ; i < cpi->baseline_gf_interval ; i++)
- {
- input_stats(cpi, &next_frame);
- accumulate_stats(&sectionstats, &next_frame);
- }
-
- avg_stats(&sectionstats);
-
- cpi->twopass.section_intra_rating = (unsigned int)
- (sectionstats.intra_error /
- DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
-
- Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
- cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
-
- if (cpi->twopass.section_max_qfactor < 0.80)
- cpi->twopass.section_max_qfactor = 0.80;
-
- reset_fpf_position(cpi, start_pos);
- }
-}
-
-/* Allocate bits to a normal frame that is neither a gf an arf or a key frame. */
-static void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
-{
- int target_frame_size;
-
- double modified_err;
- double err_fraction;
-
- int max_bits = frame_max_bits(cpi); /* Max for a single frame */
-
- /* Calculate modified prediction error used in bit allocation */
- modified_err = calculate_modified_err(cpi, this_frame);
-
- /* What portion of the remaining GF group error is used by this frame */
- if (cpi->twopass.gf_group_error_left > 0)
- err_fraction = modified_err / cpi->twopass.gf_group_error_left;
- else
- err_fraction = 0.0;
-
- /* How many of those bits available for allocation should we give it? */
- target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction);
-
- /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits)
- * at the top end.
- */
- if (target_frame_size < 0)
- target_frame_size = 0;
- else
- {
- if (target_frame_size > max_bits)
- target_frame_size = max_bits;
-
- if (target_frame_size > cpi->twopass.gf_group_bits)
- target_frame_size = (int)cpi->twopass.gf_group_bits;
- }
-
- /* Adjust error and bits remaining */
- cpi->twopass.gf_group_error_left -= (int)modified_err;
- cpi->twopass.gf_group_bits -= target_frame_size;
-
- if (cpi->twopass.gf_group_bits < 0)
- cpi->twopass.gf_group_bits = 0;
-
- /* Add in the minimum number of bits that is set aside for every frame. */
- target_frame_size += cpi->min_frame_bandwidth;
-
- /* Every other frame gets a few extra bits */
- if ( (cpi->frames_since_golden & 0x01) &&
- (cpi->frames_till_gf_update_due > 0) )
- {
- target_frame_size += cpi->twopass.alt_extra_bits;
- }
-
- /* Per frame bit target for this frame */
- cpi->per_frame_bandwidth = target_frame_size;
-}
-
-void vp8_second_pass(VP8_COMP *cpi)
-{
- int tmp_q;
- int frames_left = (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame);
-
- FIRSTPASS_STATS this_frame = {0};
- FIRSTPASS_STATS this_frame_copy;
-
- double this_frame_intra_error;
- double this_frame_coded_error;
-
- int overhead_bits;
-
- if (!cpi->twopass.stats_in)
- {
- return ;
- }
-
- vp8_clear_system_state();
-
- if (EOF == input_stats(cpi, &this_frame))
- return;
-
- this_frame_intra_error = this_frame.intra_error;
- this_frame_coded_error = this_frame.coded_error;
-
- /* keyframe and section processing ! */
- if (cpi->twopass.frames_to_key == 0)
- {
- /* Define next KF group and assign bits to it */
- memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
- find_next_key_frame(cpi, &this_frame_copy);
-
- /* Special case: Error error_resilient_mode mode does not make much
- * sense for two pass but with its current meaning this code is
- * designed to stop outlandish behaviour if someone does set it when
- * using two pass. It effectively disables GF groups. This is
- * temporary code until we decide what should really happen in this
- * case.
- */
- if (cpi->oxcf.error_resilient_mode)
- {
- cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits;
- cpi->twopass.gf_group_error_left =
- (int)cpi->twopass.kf_group_error_left;
- cpi->baseline_gf_interval = cpi->twopass.frames_to_key;
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
- cpi->source_alt_ref_pending = 0;
- }
-
- }
-
- /* Is this a GF / ARF (Note that a KF is always also a GF) */
- if (cpi->frames_till_gf_update_due == 0)
- {
- /* Define next gf group and assign bits to it */
- memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
- define_gf_group(cpi, &this_frame_copy);
-
- /* If we are going to code an altref frame at the end of the group
- * and the current frame is not a key frame.... If the previous
- * group used an arf this frame has already benefited from that arf
- * boost and it should not be given extra bits If the previous
- * group was NOT coded using arf we may want to apply some boost to
- * this GF as well
- */
- if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME))
- {
- /* Assign a standard frames worth of bits from those allocated
- * to the GF group
- */
- int bak = cpi->per_frame_bandwidth;
- memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
- assign_std_frame_bits(cpi, &this_frame_copy);
- cpi->per_frame_bandwidth = bak;
- }
- }
-
- /* Otherwise this is an ordinary frame */
- else
- {
- /* Special case: Error error_resilient_mode mode does not make much
- * sense for two pass but with its current meaning but this code is
- * designed to stop outlandish behaviour if someone does set it
- * when using two pass. It effectively disables GF groups. This is
- * temporary code till we decide what should really happen in this
- * case.
- */
- if (cpi->oxcf.error_resilient_mode)
- {
- cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key;
-
- if (cpi->common.frame_type != KEY_FRAME)
- {
- /* Assign bits from those allocated to the GF group */
- memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
- assign_std_frame_bits(cpi, &this_frame_copy);
- }
- }
- else
- {
- /* Assign bits from those allocated to the GF group */
- memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
- assign_std_frame_bits(cpi, &this_frame_copy);
- }
- }
-
- /* Keep a globally available copy of this and the next frame's iiratio. */
- cpi->twopass.this_iiratio = (unsigned int)(this_frame_intra_error /
- DOUBLE_DIVIDE_CHECK(this_frame_coded_error));
- {
- FIRSTPASS_STATS next_frame;
- if ( lookup_next_frame_stats(cpi, &next_frame) != EOF )
- {
- cpi->twopass.next_iiratio = (unsigned int)(next_frame.intra_error /
- DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
- }
- }
-
- /* Set nominal per second bandwidth for this frame */
- cpi->target_bandwidth = (int)
- (cpi->per_frame_bandwidth * cpi->output_framerate);
- if (cpi->target_bandwidth < 0)
- cpi->target_bandwidth = 0;
-
-
- /* Account for mv, mode and other overheads. */
- overhead_bits = (int)estimate_modemvcost(
- cpi, &cpi->twopass.total_left_stats );
-
- /* Special case code for first frame. */
- if (cpi->common.current_video_frame == 0)
- {
- cpi->twopass.est_max_qcorrection_factor = 1.0;
-
- /* Set a cq_level in constrained quality mode. */
- if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
- {
- int est_cq;
-
- est_cq =
- estimate_cq( cpi,
- &cpi->twopass.total_left_stats,
- (int)(cpi->twopass.bits_left / frames_left),
- overhead_bits );
-
- cpi->cq_target_quality = cpi->oxcf.cq_level;
- if ( est_cq > cpi->cq_target_quality )
- cpi->cq_target_quality = est_cq;
- }
-
- /* guess at maxq needed in 2nd pass */
- cpi->twopass.maxq_max_limit = cpi->worst_quality;
- cpi->twopass.maxq_min_limit = cpi->best_quality;
-
- tmp_q = estimate_max_q(
- cpi,
- &cpi->twopass.total_left_stats,
- (int)(cpi->twopass.bits_left / frames_left),
- overhead_bits );
-
- /* Limit the maxq value returned subsequently.
- * This increases the risk of overspend or underspend if the initial
- * estimate for the clip is bad, but helps prevent excessive
- * variation in Q, especially near the end of a clip
- * where for example a small overspend may cause Q to crash
- */
- cpi->twopass.maxq_max_limit = ((tmp_q + 32) < cpi->worst_quality)
- ? (tmp_q + 32) : cpi->worst_quality;
- cpi->twopass.maxq_min_limit = ((tmp_q - 32) > cpi->best_quality)
- ? (tmp_q - 32) : cpi->best_quality;
-
- cpi->active_worst_quality = tmp_q;
- cpi->ni_av_qi = tmp_q;
- }
-
- /* The last few frames of a clip almost always have to few or too many
- * bits and for the sake of over exact rate control we dont want to make
- * radical adjustments to the allowed quantizer range just to use up a
- * few surplus bits or get beneath the target rate.
- */
- else if ( (cpi->common.current_video_frame <
- (((unsigned int)cpi->twopass.total_stats.count * 255)>>8)) &&
- ((cpi->common.current_video_frame + cpi->baseline_gf_interval) <
- (unsigned int)cpi->twopass.total_stats.count) )
- {
- if (frames_left < 1)
- frames_left = 1;
-
- tmp_q = estimate_max_q(
- cpi,
- &cpi->twopass.total_left_stats,
- (int)(cpi->twopass.bits_left / frames_left),
- overhead_bits );
-
- /* Move active_worst_quality but in a damped way */
- if (tmp_q > cpi->active_worst_quality)
- cpi->active_worst_quality ++;
- else if (tmp_q < cpi->active_worst_quality)
- cpi->active_worst_quality --;
-
- cpi->active_worst_quality =
- ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4;
- }
-
- cpi->twopass.frames_to_key --;
-
- /* Update the total stats remaining sturcture */
- subtract_stats(&cpi->twopass.total_left_stats, &this_frame );
-}
-
-
-static int test_candidate_kf(VP8_COMP *cpi, FIRSTPASS_STATS *last_frame, FIRSTPASS_STATS *this_frame, FIRSTPASS_STATS *next_frame)
-{
- int is_viable_kf = 0;
-
- /* Does the frame satisfy the primary criteria of a key frame
- * If so, then examine how well it predicts subsequent frames
- */
- if ((this_frame->pcnt_second_ref < 0.10) &&
- (next_frame->pcnt_second_ref < 0.10) &&
- ((this_frame->pcnt_inter < 0.05) ||
- (
- ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) &&
- ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) &&
- ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > .40) ||
- (fabs(last_frame->intra_error - this_frame->intra_error) / DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > .40) ||
- ((next_frame->intra_error / DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5)
- )
- )
- )
- )
- {
- int i;
- FIRSTPASS_STATS *start_pos;
-
- FIRSTPASS_STATS local_next_frame;
-
- double boost_score = 0.0;
- double old_boost_score = 0.0;
- double decay_accumulator = 1.0;
- double next_iiratio;
-
- memcpy(&local_next_frame, next_frame, sizeof(*next_frame));
-
- /* Note the starting file position so we can reset to it */
- start_pos = cpi->twopass.stats_in;
-
- /* Examine how well the key frame predicts subsequent frames */
- for (i = 0 ; i < 16; i++)
- {
- next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)) ;
-
- if (next_iiratio > RMAX)
- next_iiratio = RMAX;
-
- /* Cumulative effect of decay in prediction quality */
- if (local_next_frame.pcnt_inter > 0.85)
- decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
- else
- decay_accumulator = decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0);
-
- /* Keep a running total */
- boost_score += (decay_accumulator * next_iiratio);
-
- /* Test various breakout clauses */
- if ((local_next_frame.pcnt_inter < 0.05) ||
- (next_iiratio < 1.5) ||
- (((local_next_frame.pcnt_inter -
- local_next_frame.pcnt_neutral) < 0.20) &&
- (next_iiratio < 3.0)) ||
- ((boost_score - old_boost_score) < 0.5) ||
- (local_next_frame.intra_error < 200)
- )
- {
- break;
- }
-
- old_boost_score = boost_score;
-
- /* Get the next frame details */
- if (EOF == input_stats(cpi, &local_next_frame))
- break;
- }
-
- /* If there is tolerable prediction for at least the next 3 frames
- * then break out else discard this pottential key frame and move on
- */
- if (boost_score > 5.0 && (i > 3))
- is_viable_kf = 1;
- else
- {
- /* Reset the file position */
- reset_fpf_position(cpi, start_pos);
-
- is_viable_kf = 0;
- }
- }
-
- return is_viable_kf;
-}
-static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
-{
- int i,j;
- FIRSTPASS_STATS last_frame;
- FIRSTPASS_STATS first_frame;
- FIRSTPASS_STATS next_frame;
- FIRSTPASS_STATS *start_position;
-
- double decay_accumulator = 1.0;
- double boost_score = 0;
- double old_boost_score = 0.0;
- double loop_decay_rate;
-
- double kf_mod_err = 0.0;
- double kf_group_err = 0.0;
- double kf_group_intra_err = 0.0;
- double kf_group_coded_err = 0.0;
- double recent_loop_decay[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0};
-
- memset(&next_frame, 0, sizeof(next_frame));
-
- vp8_clear_system_state();
- start_position = cpi->twopass.stats_in;
-
- cpi->common.frame_type = KEY_FRAME;
-
- /* is this a forced key frame by interval */
- cpi->this_key_frame_forced = cpi->next_key_frame_forced;
-
- /* Clear the alt ref active flag as this can never be active on a key
- * frame
- */
- cpi->source_alt_ref_active = 0;
-
- /* Kf is always a gf so clear frames till next gf counter */
- cpi->frames_till_gf_update_due = 0;
-
- cpi->twopass.frames_to_key = 1;
-
- /* Take a copy of the initial frame details */
- memcpy(&first_frame, this_frame, sizeof(*this_frame));
-
- cpi->twopass.kf_group_bits = 0;
- cpi->twopass.kf_group_error_left = 0;
-
- kf_mod_err = calculate_modified_err(cpi, this_frame);
-
- /* find the next keyframe */
- i = 0;
- while (cpi->twopass.stats_in < cpi->twopass.stats_in_end)
- {
- /* Accumulate kf group error */
- kf_group_err += calculate_modified_err(cpi, this_frame);
-
- /* These figures keep intra and coded error counts for all frames
- * including key frames in the group. The effect of the key frame
- * itself can be subtracted out using the first_frame data
- * collected above
- */
- kf_group_intra_err += this_frame->intra_error;
- kf_group_coded_err += this_frame->coded_error;
-
- /* Load the next frame's stats. */
- memcpy(&last_frame, this_frame, sizeof(*this_frame));
- input_stats(cpi, this_frame);
-
- /* Provided that we are not at the end of the file... */
- if (cpi->oxcf.auto_key
- && lookup_next_frame_stats(cpi, &next_frame) != EOF)
- {
- /* Normal scene cut check */
- if ( ( i >= MIN_GF_INTERVAL ) &&
- test_candidate_kf(cpi, &last_frame, this_frame, &next_frame) )
- {
- break;
- }
-
- /* How fast is prediction quality decaying */
- loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
-
- /* We want to know something about the recent past... rather than
- * as used elsewhere where we are concened with decay in prediction
- * quality since the last GF or KF.
- */
- recent_loop_decay[i%8] = loop_decay_rate;
- decay_accumulator = 1.0;
- for (j = 0; j < 8; j++)
- {
- decay_accumulator = decay_accumulator * recent_loop_decay[j];
- }
-
- /* Special check for transition or high motion followed by a
- * static scene.
- */
- if ( detect_transition_to_still( cpi, i,
- (cpi->key_frame_frequency-i),
- loop_decay_rate,
- decay_accumulator ) )
- {
- break;
- }
-
-
- /* Step on to the next frame */
- cpi->twopass.frames_to_key ++;
-
- /* If we don't have a real key frame within the next two
- * forcekeyframeevery intervals then break out of the loop.
- */
- if (cpi->twopass.frames_to_key >= 2 *(int)cpi->key_frame_frequency)
- break;
- } else
- cpi->twopass.frames_to_key ++;
-
- i++;
- }
-
- /* If there is a max kf interval set by the user we must obey it.
- * We already breakout of the loop above at 2x max.
- * This code centers the extra kf if the actual natural
- * interval is between 1x and 2x
- */
- if (cpi->oxcf.auto_key
- && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency )
- {
- FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
- FIRSTPASS_STATS tmp_frame;
-
- cpi->twopass.frames_to_key /= 2;
-
- /* Copy first frame details */
- memcpy(&tmp_frame, &first_frame, sizeof(first_frame));
-
- /* Reset to the start of the group */
- reset_fpf_position(cpi, start_position);
-
- kf_group_err = 0;
- kf_group_intra_err = 0;
- kf_group_coded_err = 0;
-
- /* Rescan to get the correct error data for the forced kf group */
- for( i = 0; i < cpi->twopass.frames_to_key; i++ )
- {
- /* Accumulate kf group errors */
- kf_group_err += calculate_modified_err(cpi, &tmp_frame);
- kf_group_intra_err += tmp_frame.intra_error;
- kf_group_coded_err += tmp_frame.coded_error;
-
- /* Load a the next frame's stats */
- input_stats(cpi, &tmp_frame);
- }
-
- /* Reset to the start of the group */
- reset_fpf_position(cpi, current_pos);
-
- cpi->next_key_frame_forced = 1;
- }
- else
- cpi->next_key_frame_forced = 0;
-
- /* Special case for the last frame of the file */
- if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
- {
- /* Accumulate kf group error */
- kf_group_err += calculate_modified_err(cpi, this_frame);
-
- /* These figures keep intra and coded error counts for all frames
- * including key frames in the group. The effect of the key frame
- * itself can be subtracted out using the first_frame data
- * collected above
- */
- kf_group_intra_err += this_frame->intra_error;
- kf_group_coded_err += this_frame->coded_error;
- }
-
- /* Calculate the number of bits that should be assigned to the kf group. */
- if ((cpi->twopass.bits_left > 0) && (cpi->twopass.modified_error_left > 0.0))
- {
- /* Max for a single normal frame (not key frame) */
- int max_bits = frame_max_bits(cpi);
-
- /* Maximum bits for the kf group */
- int64_t max_grp_bits;
-
- /* Default allocation based on bits left and relative
- * complexity of the section
- */
- cpi->twopass.kf_group_bits = (int64_t)( cpi->twopass.bits_left *
- ( kf_group_err /
- cpi->twopass.modified_error_left ));
-
- /* Clip based on maximum per frame rate defined by the user. */
- max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
- if (cpi->twopass.kf_group_bits > max_grp_bits)
- cpi->twopass.kf_group_bits = max_grp_bits;
-
- /* Additional special case for CBR if buffer is getting full. */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level;
- int64_t buffer_lvl = cpi->buffer_level;
-
- /* If the buffer is near or above the optimal and this kf group is
- * not being allocated much then increase the allocation a bit.
- */
- if (buffer_lvl >= opt_buffer_lvl)
- {
- int64_t high_water_mark = (opt_buffer_lvl +
- cpi->oxcf.maximum_buffer_size) >> 1;
-
- int64_t av_group_bits;
-
- /* Av bits per frame * number of frames */
- av_group_bits = (int64_t)cpi->av_per_frame_bandwidth *
- (int64_t)cpi->twopass.frames_to_key;
-
- /* We are at or above the maximum. */
- if (cpi->buffer_level >= high_water_mark)
- {
- int64_t min_group_bits;
-
- min_group_bits = av_group_bits +
- (int64_t)(buffer_lvl -
- high_water_mark);
-
- if (cpi->twopass.kf_group_bits < min_group_bits)
- cpi->twopass.kf_group_bits = min_group_bits;
- }
- /* We are above optimal but below the maximum */
- else if (cpi->twopass.kf_group_bits < av_group_bits)
- {
- int64_t bits_below_av = av_group_bits -
- cpi->twopass.kf_group_bits;
-
- cpi->twopass.kf_group_bits +=
- (int64_t)((double)bits_below_av *
- (double)(buffer_lvl - opt_buffer_lvl) /
- (double)(high_water_mark - opt_buffer_lvl));
- }
- }
- }
- }
- else
- cpi->twopass.kf_group_bits = 0;
-
- /* Reset the first pass file position */
- reset_fpf_position(cpi, start_position);
-
- /* determine how big to make this keyframe based on how well the
- * subsequent frames use inter blocks
- */
- decay_accumulator = 1.0;
- boost_score = 0.0;
-
- for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
- {
- double r;
-
- if (EOF == input_stats(cpi, &next_frame))
- break;
-
- if (next_frame.intra_error > cpi->twopass.kf_intra_err_min)
- r = (IIKFACTOR2 * next_frame.intra_error /
- DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
- else
- r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min /
- DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
-
- if (r > RMAX)
- r = RMAX;
-
- /* How fast is prediction quality decaying */
- loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
-
- decay_accumulator = decay_accumulator * loop_decay_rate;
- decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
-
- boost_score += (decay_accumulator * r);
-
- if ((i > MIN_GF_INTERVAL) &&
- ((boost_score - old_boost_score) < 1.0))
- {
- break;
- }
-
- old_boost_score = boost_score;
- }
-
- if (1)
- {
- FIRSTPASS_STATS sectionstats;
- double Ratio;
-
- zero_stats(&sectionstats);
- reset_fpf_position(cpi, start_position);
-
- for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
- {
- input_stats(cpi, &next_frame);
- accumulate_stats(&sectionstats, &next_frame);
- }
-
- avg_stats(&sectionstats);
-
- cpi->twopass.section_intra_rating = (unsigned int)
- (sectionstats.intra_error
- / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
-
- Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
- cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
-
- if (cpi->twopass.section_max_qfactor < 0.80)
- cpi->twopass.section_max_qfactor = 0.80;
- }
-
- /* When using CBR apply additional buffer fullness related upper limits */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- double max_boost;
-
- if (cpi->drop_frames_allowed)
- {
- int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark
- * (cpi->oxcf.optimal_buffer_level / 100));
-
- if (cpi->buffer_level > df_buffer_level)
- max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
- else
- max_boost = 0.0;
- }
- else if (cpi->buffer_level > 0)
- {
- max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
- }
- else
- {
- max_boost = 0.0;
- }
-
- if (boost_score > max_boost)
- boost_score = max_boost;
- }
-
- /* Reset the first pass file position */
- reset_fpf_position(cpi, start_position);
-
- /* Work out how many bits to allocate for the key frame itself */
- if (1)
- {
- int kf_boost = (int)boost_score;
- int allocation_chunks;
- int Counter = cpi->twopass.frames_to_key;
- int alt_kf_bits;
- YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
- /* Min boost based on kf interval */
-#if 0
-
- while ((kf_boost < 48) && (Counter > 0))
- {
- Counter -= 2;
- kf_boost ++;
- }
-
-#endif
-
- if (kf_boost < 48)
- {
- kf_boost += ((Counter + 1) >> 1);
-
- if (kf_boost > 48) kf_boost = 48;
- }
-
- /* bigger frame sizes need larger kf boosts, smaller frames smaller
- * boosts...
- */
- if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240))
- kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
- else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240))
- kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
-
- /* Min KF boost */
- kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */
- if (kf_boost < 250)
- kf_boost = 250;
-
- /*
- * We do three calculations for kf size.
- * The first is based on the error score for the whole kf group.
- * The second (optionaly) on the key frames own error if this is
- * smaller than the average for the group.
- * The final one insures that the frame receives at least the
- * allocation it would have received based on its own error score vs
- * the error score remaining
- * Special case if the sequence appears almost totaly static
- * as measured by the decay accumulator. In this case we want to
- * spend almost all of the bits on the key frame.
- * cpi->twopass.frames_to_key-1 because key frame itself is taken
- * care of by kf_boost.
- */
- if ( decay_accumulator >= 0.99 )
- {
- allocation_chunks =
- ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
- }
- else
- {
- allocation_chunks =
- ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
- }
-
- /* Normalize Altboost and allocations chunck down to prevent overflow */
- while (kf_boost > 1000)
- {
- kf_boost /= 2;
- allocation_chunks /= 2;
- }
-
- cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;
-
- /* Calculate the number of bits to be spent on the key frame */
- cpi->twopass.kf_bits = (int)((double)kf_boost * ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks));
-
- /* Apply an additional limit for CBR */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2))
- cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2);
- }
-
- /* If the key frame is actually easier than the average for the
- * kf group (which does sometimes happen... eg a blank intro frame)
- * Then use an alternate calculation based on the kf error score
- * which should give a smaller key frame.
- */
- if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key)
- {
- double alt_kf_grp_bits =
- ((double)cpi->twopass.bits_left *
- (kf_mod_err * (double)cpi->twopass.frames_to_key) /
- DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
-
- alt_kf_bits = (int)((double)kf_boost *
- (alt_kf_grp_bits / (double)allocation_chunks));
-
- if (cpi->twopass.kf_bits > alt_kf_bits)
- {
- cpi->twopass.kf_bits = alt_kf_bits;
- }
- }
- /* Else if it is much harder than other frames in the group make sure
- * it at least receives an allocation in keeping with its relative
- * error score
- */
- else
- {
- alt_kf_bits =
- (int)((double)cpi->twopass.bits_left *
- (kf_mod_err /
- DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)));
-
- if (alt_kf_bits > cpi->twopass.kf_bits)
- {
- cpi->twopass.kf_bits = alt_kf_bits;
- }
- }
-
- cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits;
- /* Add in the minimum frame allowance */
- cpi->twopass.kf_bits += cpi->min_frame_bandwidth;
-
- /* Peer frame bit target for this frame */
- cpi->per_frame_bandwidth = cpi->twopass.kf_bits;
-
- /* Convert to a per second bitrate */
- cpi->target_bandwidth = (int)(cpi->twopass.kf_bits *
- cpi->output_framerate);
- }
-
- /* Note the total error score of the kf group minus the key frame itself */
- cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
-
- /* Adjust the count of total modified error left. The count of bits left
- * is adjusted elsewhere based on real coded frame sizes
- */
- cpi->twopass.modified_error_left -= kf_group_err;
-
- if (cpi->oxcf.allow_spatial_resampling)
- {
- int resample_trigger = 0;
- int last_kf_resampled = 0;
- int kf_q;
- int scale_val = 0;
- int hr, hs, vr, vs;
- int new_width = cpi->oxcf.Width;
- int new_height = cpi->oxcf.Height;
-
- int projected_buffer_level;
- int tmp_q;
-
- double projected_bits_perframe;
- double group_iiratio = (kf_group_intra_err - first_frame.intra_error) / (kf_group_coded_err - first_frame.coded_error);
- double err_per_frame = kf_group_err / cpi->twopass.frames_to_key;
- double bits_per_frame;
- double av_bits_per_frame;
- double effective_size_ratio;
-
- if ((cpi->common.Width != cpi->oxcf.Width) || (cpi->common.Height != cpi->oxcf.Height))
- last_kf_resampled = 1;
-
- /* Set back to unscaled by defaults */
- cpi->common.horiz_scale = NORMAL;
- cpi->common.vert_scale = NORMAL;
-
- /* Calculate Average bits per frame. */
- av_bits_per_frame = cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate);
-
- /* CBR... Use the clip average as the target for deciding resample */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- bits_per_frame = av_bits_per_frame;
- }
-
- /* In VBR we want to avoid downsampling in easy section unless we
- * are under extreme pressure So use the larger of target bitrate
- * for this section or average bitrate for sequence
- */
- else
- {
- /* This accounts for how hard the section is... */
- bits_per_frame = (double)
- (cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key);
-
- /* Dont turn to resampling in easy sections just because they
- * have been assigned a small number of bits
- */
- if (bits_per_frame < av_bits_per_frame)
- bits_per_frame = av_bits_per_frame;
- }
-
- /* bits_per_frame should comply with our minimum */
- if (bits_per_frame < (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100))
- bits_per_frame = (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
-
- /* Work out if spatial resampling is necessary */
- kf_q = estimate_kf_group_q(cpi, err_per_frame,
- (int)bits_per_frame, group_iiratio);
-
- /* If we project a required Q higher than the maximum allowed Q then
- * make a guess at the actual size of frames in this section
- */
- projected_bits_perframe = bits_per_frame;
- tmp_q = kf_q;
-
- while (tmp_q > cpi->worst_quality)
- {
- projected_bits_perframe *= 1.04;
- tmp_q--;
- }
-
- /* Guess at buffer level at the end of the section */
- projected_buffer_level = (int)
- (cpi->buffer_level - (int)
- ((projected_bits_perframe - av_bits_per_frame) *
- cpi->twopass.frames_to_key));
-
- if (0)
- {
- FILE *f = fopen("Subsamle.stt", "a");
- fprintf(f, " %8d %8d %8d %8d %12.0f %8d %8d %8d\n", cpi->common.current_video_frame, kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width);
- fclose(f);
- }
-
- /* The trigger for spatial resampling depends on the various
- * parameters such as whether we are streaming (CBR) or VBR.
- */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- /* Trigger resample if we are projected to fall below down
- * sample level or resampled last time and are projected to
- * remain below the up sample level
- */
- if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100)) ||
- (last_kf_resampled && (projected_buffer_level < (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))))
- resample_trigger = 1;
- else
- resample_trigger = 0;
- }
- else
- {
- int64_t clip_bits = (int64_t)(cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate));
- int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level;
-
- /* If triggered last time the threshold for triggering again is
- * reduced:
- *
- * Projected Q higher than allowed and Overspend > 5% of total
- * bits
- */
- if ((last_kf_resampled && (kf_q > cpi->worst_quality)) ||
- ((kf_q > cpi->worst_quality) &&
- (over_spend > clip_bits / 20)))
- resample_trigger = 1;
- else
- resample_trigger = 0;
-
- }
-
- if (resample_trigger)
- {
- while ((kf_q >= cpi->worst_quality) && (scale_val < 6))
- {
- scale_val ++;
-
- cpi->common.vert_scale = vscale_lookup[scale_val];
- cpi->common.horiz_scale = hscale_lookup[scale_val];
-
- Scale2Ratio(cpi->common.horiz_scale, &hr, &hs);
- Scale2Ratio(cpi->common.vert_scale, &vr, &vs);
-
- new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
- new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
-
- /* Reducing the area to 1/4 does not reduce the complexity
- * (err_per_frame) to 1/4... effective_sizeratio attempts
- * to provide a crude correction for this
- */
- effective_size_ratio = (double)(new_width * new_height) / (double)(cpi->oxcf.Width * cpi->oxcf.Height);
- effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0;
-
- /* Now try again and see what Q we get with the smaller
- * image size
- */
- kf_q = estimate_kf_group_q(cpi,
- err_per_frame * effective_size_ratio,
- (int)bits_per_frame, group_iiratio);
-
- if (0)
- {
- FILE *f = fopen("Subsamle.stt", "a");
- fprintf(f, "******** %8d %8d %8d %12.0f %8d %8d %8d\n", kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width);
- fclose(f);
- }
- }
- }
-
- if ((cpi->common.Width != new_width) || (cpi->common.Height != new_height))
- {
- cpi->common.Width = new_width;
- cpi->common.Height = new_height;
- vp8_alloc_compressor_data(cpi);
- }
- }
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.h
deleted file mode 100644
index c409ebca8f1..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/firstpass.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_FIRSTPASS_H_
-#define VP8_ENCODER_FIRSTPASS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void vp8_init_first_pass(VP8_COMP *cpi);
-extern void vp8_first_pass(VP8_COMP *cpi);
-extern void vp8_end_first_pass(VP8_COMP *cpi);
-
-extern void vp8_init_second_pass(VP8_COMP *cpi);
-extern void vp8_second_pass(VP8_COMP *cpi);
-extern void vp8_end_second_pass(VP8_COMP *cpi);
-
-extern size_t vp8_firstpass_stats_sz(unsigned int mb_count);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_FIRSTPASS_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.c
deleted file mode 100644
index ce2ce08c170..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2011 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-#include <assert.h>
-#include <stdlib.h>
-#include "vpx_config.h"
-#include "lookahead.h"
-#include "vp8/common/extend.h"
-
-#define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25)
-
-struct lookahead_ctx
-{
- unsigned int max_sz; /* Absolute size of the queue */
- unsigned int sz; /* Number of buffers currently in the queue */
- unsigned int read_idx; /* Read index */
- unsigned int write_idx; /* Write index */
- struct lookahead_entry *buf; /* Buffer list */
-};
-
-
-/* Return the buffer at the given absolute index and increment the index */
-static struct lookahead_entry *
-pop(struct lookahead_ctx *ctx,
- unsigned int *idx)
-{
- unsigned int index = *idx;
- struct lookahead_entry *buf = ctx->buf + index;
-
- assert(index < ctx->max_sz);
- if(++index >= ctx->max_sz)
- index -= ctx->max_sz;
- *idx = index;
- return buf;
-}
-
-
-void
-vp8_lookahead_destroy(struct lookahead_ctx *ctx)
-{
- if(ctx)
- {
- if(ctx->buf)
- {
- unsigned int i;
-
- for(i = 0; i < ctx->max_sz; i++)
- vp8_yv12_de_alloc_frame_buffer(&ctx->buf[i].img);
- free(ctx->buf);
- }
- free(ctx);
- }
-}
-
-
-struct lookahead_ctx*
-vp8_lookahead_init(unsigned int width,
- unsigned int height,
- unsigned int depth)
-{
- struct lookahead_ctx *ctx = NULL;
- unsigned int i;
-
- /* Clamp the lookahead queue depth */
- if(depth < 1)
- depth = 1;
- else if(depth > MAX_LAG_BUFFERS)
- depth = MAX_LAG_BUFFERS;
-
- /* Keep last frame in lookahead buffer by increasing depth by 1.*/
- depth += 1;
-
- /* Align the buffer dimensions */
- width = (width + 15) & ~15;
- height = (height + 15) & ~15;
-
- /* Allocate the lookahead structures */
- ctx = calloc(1, sizeof(*ctx));
- if(ctx)
- {
- ctx->max_sz = depth;
- ctx->buf = calloc(depth, sizeof(*ctx->buf));
- if(!ctx->buf)
- goto bail;
- for(i=0; i<depth; i++)
- if (vp8_yv12_alloc_frame_buffer(&ctx->buf[i].img,
- width, height, VP8BORDERINPIXELS))
- goto bail;
- }
- return ctx;
-bail:
- vp8_lookahead_destroy(ctx);
- return NULL;
-}
-
-
-int
-vp8_lookahead_push(struct lookahead_ctx *ctx,
- YV12_BUFFER_CONFIG *src,
- int64_t ts_start,
- int64_t ts_end,
- unsigned int flags,
- unsigned char *active_map)
-{
- struct lookahead_entry* buf;
- int row, col, active_end;
- int mb_rows = (src->y_height + 15) >> 4;
- int mb_cols = (src->y_width + 15) >> 4;
-
- if(ctx->sz + 2 > ctx->max_sz)
- return 1;
- ctx->sz++;
- buf = pop(ctx, &ctx->write_idx);
-
- /* Only do this partial copy if the following conditions are all met:
- * 1. Lookahead queue has has size of 1.
- * 2. Active map is provided.
- * 3. This is not a key frame, golden nor altref frame.
- */
- if (ctx->max_sz == 1 && active_map && !flags)
- {
- for (row = 0; row < mb_rows; ++row)
- {
- col = 0;
-
- while (1)
- {
- /* Find the first active macroblock in this row. */
- for (; col < mb_cols; ++col)
- {
- if (active_map[col])
- break;
- }
-
- /* No more active macroblock in this row. */
- if (col == mb_cols)
- break;
-
- /* Find the end of active region in this row. */
- active_end = col;
-
- for (; active_end < mb_cols; ++active_end)
- {
- if (!active_map[active_end])
- break;
- }
-
- /* Only copy this active region. */
- vp8_copy_and_extend_frame_with_rect(src, &buf->img,
- row << 4,
- col << 4, 16,
- (active_end - col) << 4);
-
- /* Start again from the end of this active region. */
- col = active_end;
- }
-
- active_map += mb_cols;
- }
- }
- else
- {
- vp8_copy_and_extend_frame(src, &buf->img);
- }
- buf->ts_start = ts_start;
- buf->ts_end = ts_end;
- buf->flags = flags;
- return 0;
-}
-
-
-struct lookahead_entry*
-vp8_lookahead_pop(struct lookahead_ctx *ctx,
- int drain)
-{
- struct lookahead_entry* buf = NULL;
-
- if(ctx->sz && (drain || ctx->sz == ctx->max_sz - 1))
- {
- buf = pop(ctx, &ctx->read_idx);
- ctx->sz--;
- }
- return buf;
-}
-
-
-struct lookahead_entry*
-vp8_lookahead_peek(struct lookahead_ctx *ctx,
- unsigned int index,
- int direction)
-{
- struct lookahead_entry* buf = NULL;
-
- if (direction == PEEK_FORWARD)
- {
- assert(index < ctx->max_sz - 1);
- if(index < ctx->sz)
- {
- index += ctx->read_idx;
- if(index >= ctx->max_sz)
- index -= ctx->max_sz;
- buf = ctx->buf + index;
- }
- }
- else if (direction == PEEK_BACKWARD)
- {
- assert(index == 1);
-
- if(ctx->read_idx == 0)
- index = ctx->max_sz - 1;
- else
- index = ctx->read_idx - index;
- buf = ctx->buf + index;
- }
-
- return buf;
-}
-
-
-unsigned int
-vp8_lookahead_depth(struct lookahead_ctx *ctx)
-{
- return ctx->sz;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.h
deleted file mode 100644
index cad68e639fb..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/lookahead.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2011 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-#ifndef VP8_ENCODER_LOOKAHEAD_H_
-#define VP8_ENCODER_LOOKAHEAD_H_
-#include "vpx_scale/yv12config.h"
-#include "vpx/vpx_integer.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct lookahead_entry
-{
- YV12_BUFFER_CONFIG img;
- int64_t ts_start;
- int64_t ts_end;
- unsigned int flags;
-};
-
-
-struct lookahead_ctx;
-
-/**\brief Initializes the lookahead stage
- *
- * The lookahead stage is a queue of frame buffers on which some analysis
- * may be done when buffers are enqueued.
- *
- *
- */
-struct lookahead_ctx* vp8_lookahead_init(unsigned int width,
- unsigned int height,
- unsigned int depth
- );
-
-
-/**\brief Destroys the lookahead stage
- *
- */
-void vp8_lookahead_destroy(struct lookahead_ctx *ctx);
-
-
-/**\brief Enqueue a source buffer
- *
- * This function will copy the source image into a new framebuffer with
- * the expected stride/border.
- *
- * If active_map is non-NULL and there is only one frame in the queue, then copy
- * only active macroblocks.
- *
- * \param[in] ctx Pointer to the lookahead context
- * \param[in] src Pointer to the image to enqueue
- * \param[in] ts_start Timestamp for the start of this frame
- * \param[in] ts_end Timestamp for the end of this frame
- * \param[in] flags Flags set on this frame
- * \param[in] active_map Map that specifies which macroblock is active
- */
-int
-vp8_lookahead_push(struct lookahead_ctx *ctx,
- YV12_BUFFER_CONFIG *src,
- int64_t ts_start,
- int64_t ts_end,
- unsigned int flags,
- unsigned char *active_map);
-
-
-/**\brief Get the next source buffer to encode
- *
- *
- * \param[in] ctx Pointer to the lookahead context
- * \param[in] drain Flag indicating the buffer should be drained
- * (return a buffer regardless of the current queue depth)
- *
- * \retval NULL, if drain set and queue is empty
- * \retval NULL, if drain not set and queue not of the configured depth
- *
- */
-struct lookahead_entry*
-vp8_lookahead_pop(struct lookahead_ctx *ctx,
- int drain);
-
-
-#define PEEK_FORWARD 1
-#define PEEK_BACKWARD -1
-/**\brief Get a future source buffer to encode
- *
- * \param[in] ctx Pointer to the lookahead context
- * \param[in] index Index of the frame to be returned, 0 == next frame
- *
- * \retval NULL, if no buffer exists at the specified index
- *
- */
-struct lookahead_entry*
-vp8_lookahead_peek(struct lookahead_ctx *ctx,
- unsigned int index,
- int direction);
-
-
-/**\brief Get the number of frames currently in the lookahead queue
- *
- * \param[in] ctx Pointer to the lookahead context
- */
-unsigned int
-vp8_lookahead_depth(struct lookahead_ctx *ctx);
-
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_LOOKAHEAD_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c
deleted file mode 100644
index f848e8fb571..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c
+++ /dev/null
@@ -1,2032 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "./vp8_rtcd.h"
-#include "./vpx_dsp_rtcd.h"
-#include "onyx_int.h"
-#include "mcomp.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vpx_config.h"
-#include <stdio.h>
-#include <limits.h>
-#include <math.h>
-#include "vp8/common/findnearmv.h"
-#include "vp8/common/common.h"
-
-#ifdef VP8_ENTROPY_STATS
-static int mv_ref_ct [31] [4] [2];
-static int mv_mode_cts [4] [2];
-#endif
-
-int vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight)
-{
- /* MV costing is based on the distribution of vectors in the previous
- * frame and as such will tend to over state the cost of vectors. In
- * addition coding a new vector can have a knock on effect on the cost
- * of subsequent vectors and the quality of prediction from NEAR and
- * NEAREST for subsequent blocks. The "Weight" parameter allows, to a
- * limited extent, for some account to be taken of these factors.
- */
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] + mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) * Weight) >> 7;
-}
-
-static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int error_per_bit)
-{
- /* Ignore mv costing if mvcost is NULL */
- if (mvcost)
- return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
- mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1])
- * error_per_bit + 128) >> 8;
- return 0;
-}
-
-static int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvsadcost[2], int error_per_bit)
-{
- /* Calculate sad error cost on full pixel basis. */
- /* Ignore mv costing if mvsadcost is NULL */
- if (mvsadcost)
- return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] +
- mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)])
- * error_per_bit + 128) >> 8;
- return 0;
-}
-
-void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride)
-{
- int Len;
- int search_site_count = 0;
-
-
- /* Generate offsets for 4 search sites per step. */
- Len = MAX_FIRST_STEP;
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = 0;
- search_site_count++;
-
- while (Len > 0)
- {
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = -Len;
- x->ss[search_site_count].offset = -Len * stride;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = Len;
- x->ss[search_site_count].offset = Len * stride;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = -Len;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = -Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = Len;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = Len;
- search_site_count++;
-
- /* Contract. */
- Len /= 2;
- }
-
- x->ss_count = search_site_count;
- x->searches_per_step = 4;
-}
-
-void vp8_init3smotion_compensation(MACROBLOCK *x, int stride)
-{
- int Len;
- int search_site_count = 0;
-
- /* Generate offsets for 8 search sites per step. */
- Len = MAX_FIRST_STEP;
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = 0;
- search_site_count++;
-
- while (Len > 0)
- {
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = -Len;
- x->ss[search_site_count].offset = -Len * stride;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = 0;
- x->ss[search_site_count].mv.row = Len;
- x->ss[search_site_count].offset = Len * stride;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = -Len;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = -Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = Len;
- x->ss[search_site_count].mv.row = 0;
- x->ss[search_site_count].offset = Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = -Len;
- x->ss[search_site_count].mv.row = -Len;
- x->ss[search_site_count].offset = -Len * stride - Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = Len;
- x->ss[search_site_count].mv.row = -Len;
- x->ss[search_site_count].offset = -Len * stride + Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = -Len;
- x->ss[search_site_count].mv.row = Len;
- x->ss[search_site_count].offset = Len * stride - Len;
- search_site_count++;
-
- /* Compute offsets for search sites. */
- x->ss[search_site_count].mv.col = Len;
- x->ss[search_site_count].mv.row = Len;
- x->ss[search_site_count].offset = Len * stride + Len;
- search_site_count++;
-
-
- /* Contract. */
- Len /= 2;
- }
-
- x->ss_count = search_site_count;
- x->searches_per_step = 8;
-}
-
-/*
- * To avoid the penalty for crossing cache-line read, preload the reference
- * area in a small buffer, which is aligned to make sure there won't be crossing
- * cache-line read while reading from this buffer. This reduced the cpu
- * cycles spent on reading ref data in sub-pixel filter functions.
- * TODO: Currently, since sub-pixel search range here is -3 ~ 3, copy 22 rows x
- * 32 cols area that is enough for 16x16 macroblock. Later, for SPLITMV, we
- * could reduce the area.
- */
-
-/* estimated cost of a motion vector (r,c) */
-#define MVC(r,c) (mvcost ? ((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 : 0)
-/* pointer to predictor base of a motionvector */
-#define PRE(r,c) (y + (((r)>>2) * y_stride + ((c)>>2) -(offset)))
-/* convert motion vector component to offset for svf calc */
-#define SP(x) (((x)&3)<<1)
-/* returns subpixel variance error function. */
-#define DIST(r,c) vfp->svf( PRE(r,c), y_stride, SP(c),SP(r), z,b->src_stride,&sse)
-#define IFMVCV(r,c,s,e) if ( c >= minc && c <= maxc && r >= minr && r <= maxr) s else e;
-/* returns distortion + motion vector cost */
-#define ERR(r,c) (MVC(r,c)+DIST(r,c))
-/* checks if (r,c) has better score than previous best */
-#define CHECK_BETTER(v,r,c) IFMVCV(r,c,{thismse = DIST(r,c); if((v = (MVC(r,c)+thismse)) < besterr) { besterr = v; br=r; bc=c; *distortion = thismse; *sse1 = sse; }}, v=UINT_MAX;)
-
-int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
- int_mv *bestmv, int_mv *ref_mv,
- int error_per_bit,
- const vp8_variance_fn_ptr_t *vfp,
- int *mvcost[2], int *distortion,
- unsigned int *sse1)
-{
- unsigned char *z = (*(b->base_src) + b->src);
-
- int rr = ref_mv->as_mv.row >> 1, rc = ref_mv->as_mv.col >> 1;
- int br = bestmv->as_mv.row * 4, bc = bestmv->as_mv.col * 4;
- int tr = br, tc = bc;
- unsigned int besterr;
- unsigned int left, right, up, down, diag;
- unsigned int sse;
- unsigned int whichdir;
- unsigned int halfiters = 4;
- unsigned int quarteriters = 4;
- int thismse;
-
- int minc = MAX(x->mv_col_min * 4,
- (ref_mv->as_mv.col >> 1) - ((1 << mvlong_width) - 1));
- int maxc = MIN(x->mv_col_max * 4,
- (ref_mv->as_mv.col >> 1) + ((1 << mvlong_width) - 1));
- int minr = MAX(x->mv_row_min * 4,
- (ref_mv->as_mv.row >> 1) - ((1 << mvlong_width) - 1));
- int maxr = MIN(x->mv_row_max * 4,
- (ref_mv->as_mv.row >> 1) + ((1 << mvlong_width) - 1));
-
- int y_stride;
- int offset;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
-
-
-#if ARCH_X86 || ARCH_X86_64
- MACROBLOCKD *xd = &x->e_mbd;
- unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- unsigned char *y;
- int buf_r1, buf_r2, buf_c1;
-
- /* Clamping to avoid out-of-range data access */
- buf_r1 = ((bestmv->as_mv.row - 3) < x->mv_row_min)?(bestmv->as_mv.row - x->mv_row_min):3;
- buf_r2 = ((bestmv->as_mv.row + 3) > x->mv_row_max)?(x->mv_row_max - bestmv->as_mv.row):3;
- buf_c1 = ((bestmv->as_mv.col - 3) < x->mv_col_min)?(bestmv->as_mv.col - x->mv_col_min):3;
- y_stride = 32;
-
- /* Copy to intermediate buffer before searching. */
- vfp->copymem(y_0 - buf_c1 - pre_stride*buf_r1, pre_stride, xd->y_buf, y_stride, 16+buf_r1+buf_r2);
- y = xd->y_buf + y_stride*buf_r1 +buf_c1;
-#else
- unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- y_stride = pre_stride;
-#endif
-
- offset = (bestmv->as_mv.row) * y_stride + bestmv->as_mv.col;
-
- /* central mv */
- bestmv->as_mv.row *= 8;
- bestmv->as_mv.col *= 8;
-
- /* calculate central point error */
- besterr = vfp->vf(y, y_stride, z, b->src_stride, sse1);
- *distortion = besterr;
- besterr += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
-
- /* TODO: Each subsequent iteration checks at least one point in common
- * with the last iteration could be 2 ( if diag selected)
- */
- while (--halfiters)
- {
- /* 1/2 pel */
- CHECK_BETTER(left, tr, tc - 2);
- CHECK_BETTER(right, tr, tc + 2);
- CHECK_BETTER(up, tr - 2, tc);
- CHECK_BETTER(down, tr + 2, tc);
-
- whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
-
- switch (whichdir)
- {
- case 0:
- CHECK_BETTER(diag, tr - 2, tc - 2);
- break;
- case 1:
- CHECK_BETTER(diag, tr - 2, tc + 2);
- break;
- case 2:
- CHECK_BETTER(diag, tr + 2, tc - 2);
- break;
- case 3:
- CHECK_BETTER(diag, tr + 2, tc + 2);
- break;
- }
-
- /* no reason to check the same one again. */
- if (tr == br && tc == bc)
- break;
-
- tr = br;
- tc = bc;
- }
-
- /* TODO: Each subsequent iteration checks at least one point in common
- * with the last iteration could be 2 ( if diag selected)
- */
-
- /* 1/4 pel */
- while (--quarteriters)
- {
- CHECK_BETTER(left, tr, tc - 1);
- CHECK_BETTER(right, tr, tc + 1);
- CHECK_BETTER(up, tr - 1, tc);
- CHECK_BETTER(down, tr + 1, tc);
-
- whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
-
- switch (whichdir)
- {
- case 0:
- CHECK_BETTER(diag, tr - 1, tc - 1);
- break;
- case 1:
- CHECK_BETTER(diag, tr - 1, tc + 1);
- break;
- case 2:
- CHECK_BETTER(diag, tr + 1, tc - 1);
- break;
- case 3:
- CHECK_BETTER(diag, tr + 1, tc + 1);
- break;
- }
-
- /* no reason to check the same one again. */
- if (tr == br && tc == bc)
- break;
-
- tr = br;
- tc = bc;
- }
-
- bestmv->as_mv.row = br * 2;
- bestmv->as_mv.col = bc * 2;
-
- if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > (MAX_FULL_PEL_VAL<<3)) ||
- (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > (MAX_FULL_PEL_VAL<<3)))
- return INT_MAX;
-
- return besterr;
-}
-#undef MVC
-#undef PRE
-#undef SP
-#undef DIST
-#undef IFMVCV
-#undef ERR
-#undef CHECK_BETTER
-
-int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
- int_mv *bestmv, int_mv *ref_mv,
- int error_per_bit,
- const vp8_variance_fn_ptr_t *vfp,
- int *mvcost[2], int *distortion,
- unsigned int *sse1)
-{
- int bestmse = INT_MAX;
- int_mv startmv;
- int_mv this_mv;
- unsigned char *z = (*(b->base_src) + b->src);
- int left, right, up, down, diag;
- unsigned int sse;
- int whichdir ;
- int thismse;
- int y_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
-
-#if ARCH_X86 || ARCH_X86_64
- MACROBLOCKD *xd = &x->e_mbd;
- unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- unsigned char *y;
-
- y_stride = 32;
- /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */
- vfp->copymem(y_0 - 1 - pre_stride, pre_stride, xd->y_buf, y_stride, 18);
- y = xd->y_buf + y_stride + 1;
-#else
- unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- y_stride = pre_stride;
-#endif
-
- /* central mv */
- bestmv->as_mv.row *= 8;
- bestmv->as_mv.col *= 8;
- startmv = *bestmv;
-
- /* calculate central point error */
- bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1);
- *distortion = bestmse;
- bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
-
- /* go left then right and check error */
- this_mv.as_mv.row = startmv.as_mv.row;
- this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
- thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse);
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (left < bestmse)
- {
- *bestmv = this_mv;
- bestmse = left;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.col += 8;
- thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse);
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (right < bestmse)
- {
- *bestmv = this_mv;
- bestmse = right;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- /* go up then down and check error */
- this_mv.as_mv.col = startmv.as_mv.col;
- this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
- thismse = vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse);
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (up < bestmse)
- {
- *bestmv = this_mv;
- bestmse = up;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.row += 8;
- thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse);
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (down < bestmse)
- {
- *bestmv = this_mv;
- bestmse = down;
- *distortion = thismse;
- *sse1 = sse;
- }
-
-
- /* now check 1 more diagonal */
- whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
- this_mv = startmv;
-
- switch (whichdir)
- {
- case 0:
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
- thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse);
- break;
- case 1:
- this_mv.as_mv.col += 4;
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
- thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse);
- break;
- case 2:
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
- this_mv.as_mv.row += 4;
- thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse);
- break;
- case 3:
- default:
- this_mv.as_mv.col += 4;
- this_mv.as_mv.row += 4;
- thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse);
- break;
- }
-
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (diag < bestmse)
- {
- *bestmv = this_mv;
- bestmse = diag;
- *distortion = thismse;
- *sse1 = sse;
- }
-
-
- /* time to check quarter pels. */
- if (bestmv->as_mv.row < startmv.as_mv.row)
- y -= y_stride;
-
- if (bestmv->as_mv.col < startmv.as_mv.col)
- y--;
-
- startmv = *bestmv;
-
-
-
- /* go left then right and check error */
- this_mv.as_mv.row = startmv.as_mv.row;
-
- if (startmv.as_mv.col & 7)
- {
- this_mv.as_mv.col = startmv.as_mv.col - 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
-
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (left < bestmse)
- {
- *bestmv = this_mv;
- bestmse = left;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.col += 4;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (right < bestmse)
- {
- *bestmv = this_mv;
- bestmse = right;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- /* go up then down and check error */
- this_mv.as_mv.col = startmv.as_mv.col;
-
- if (startmv.as_mv.row & 7)
- {
- this_mv.as_mv.row = startmv.as_mv.row - 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
- }
-
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (up < bestmse)
- {
- *bestmv = this_mv;
- bestmse = up;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.row += 4;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (down < bestmse)
- {
- *bestmv = this_mv;
- bestmse = down;
- *distortion = thismse;
- *sse1 = sse;
- }
-
-
- /* now check 1 more diagonal */
- whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
-
- this_mv = startmv;
-
- switch (whichdir)
- {
- case 0:
-
- if (startmv.as_mv.row & 7)
- {
- this_mv.as_mv.row -= 2;
-
- if (startmv.as_mv.col & 7)
- {
- this_mv.as_mv.col -= 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);;
- }
- }
- else
- {
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
-
- if (startmv.as_mv.col & 7)
- {
- this_mv.as_mv.col -= 2;
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
- thismse = vfp->svf(y - y_stride - 1, y_stride, 6, 6, z, b->src_stride, &sse);
- }
- }
-
- break;
- case 1:
- this_mv.as_mv.col += 2;
-
- if (startmv.as_mv.row & 7)
- {
- this_mv.as_mv.row -= 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
- thismse = vfp->svf(y - y_stride, y_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
- }
-
- break;
- case 2:
- this_mv.as_mv.row += 2;
-
- if (startmv.as_mv.col & 7)
- {
- this_mv.as_mv.col -= 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
- else
- {
- this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
- thismse = vfp->svf(y - 1, y_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- }
-
- break;
- case 3:
- this_mv.as_mv.col += 2;
- this_mv.as_mv.row += 2;
- thismse = vfp->svf(y, y_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
- break;
- }
-
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (diag < bestmse)
- {
- *bestmv = this_mv;
- bestmse = diag;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- return bestmse;
-}
-
-int vp8_find_best_half_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
- int_mv *bestmv, int_mv *ref_mv,
- int error_per_bit,
- const vp8_variance_fn_ptr_t *vfp,
- int *mvcost[2], int *distortion,
- unsigned int *sse1)
-{
- int bestmse = INT_MAX;
- int_mv startmv;
- int_mv this_mv;
- unsigned char *z = (*(b->base_src) + b->src);
- int left, right, up, down, diag;
- unsigned int sse;
- int whichdir ;
- int thismse;
- int y_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
-
-#if ARCH_X86 || ARCH_X86_64
- MACROBLOCKD *xd = &x->e_mbd;
- unsigned char *y_0 = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- unsigned char *y;
-
- y_stride = 32;
- /* Copy 18 rows x 32 cols area to intermediate buffer before searching. */
- vfp->copymem(y_0 - 1 - pre_stride, pre_stride, xd->y_buf, y_stride, 18);
- y = xd->y_buf + y_stride + 1;
-#else
- unsigned char *y = base_pre + d->offset + (bestmv->as_mv.row) * pre_stride + bestmv->as_mv.col;
- y_stride = pre_stride;
-#endif
-
- /* central mv */
- bestmv->as_mv.row *= 8;
- bestmv->as_mv.col *= 8;
- startmv = *bestmv;
-
- /* calculate central point error */
- bestmse = vfp->vf(y, y_stride, z, b->src_stride, sse1);
- *distortion = bestmse;
- bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
-
- /* go left then right and check error */
- this_mv.as_mv.row = startmv.as_mv.row;
- this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
- thismse = vfp->svf_halfpix_h(y - 1, y_stride, z, b->src_stride, &sse);
- left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (left < bestmse)
- {
- *bestmv = this_mv;
- bestmse = left;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.col += 8;
- thismse = vfp->svf_halfpix_h(y, y_stride, z, b->src_stride, &sse);
- right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (right < bestmse)
- {
- *bestmv = this_mv;
- bestmse = right;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- /* go up then down and check error */
- this_mv.as_mv.col = startmv.as_mv.col;
- this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
- thismse = vfp->svf_halfpix_v(y - y_stride, y_stride, z, b->src_stride, &sse);
- up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (up < bestmse)
- {
- *bestmv = this_mv;
- bestmse = up;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- this_mv.as_mv.row += 8;
- thismse = vfp->svf_halfpix_v(y, y_stride, z, b->src_stride, &sse);
- down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (down < bestmse)
- {
- *bestmv = this_mv;
- bestmse = down;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- /* now check 1 more diagonal - */
- whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
- this_mv = startmv;
-
- switch (whichdir)
- {
- case 0:
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
- thismse = vfp->svf_halfpix_hv(y - 1 - y_stride, y_stride, z, b->src_stride, &sse);
- break;
- case 1:
- this_mv.as_mv.col += 4;
- this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
- thismse = vfp->svf_halfpix_hv(y - y_stride, y_stride, z, b->src_stride, &sse);
- break;
- case 2:
- this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
- this_mv.as_mv.row += 4;
- thismse = vfp->svf_halfpix_hv(y - 1, y_stride, z, b->src_stride, &sse);
- break;
- case 3:
- default:
- this_mv.as_mv.col += 4;
- this_mv.as_mv.row += 4;
- thismse = vfp->svf_halfpix_hv(y, y_stride, z, b->src_stride, &sse);
- break;
- }
-
- diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
-
- if (diag < bestmse)
- {
- *bestmv = this_mv;
- bestmse = diag;
- *distortion = thismse;
- *sse1 = sse;
- }
-
- return bestmse;
-}
-
-#define CHECK_BOUNDS(range) \
-{\
- all_in = 1;\
- all_in &= ((br-range) >= x->mv_row_min);\
- all_in &= ((br+range) <= x->mv_row_max);\
- all_in &= ((bc-range) >= x->mv_col_min);\
- all_in &= ((bc+range) <= x->mv_col_max);\
-}
-
-#define CHECK_POINT \
-{\
- if (this_mv.as_mv.col < x->mv_col_min) continue;\
- if (this_mv.as_mv.col > x->mv_col_max) continue;\
- if (this_mv.as_mv.row < x->mv_row_min) continue;\
- if (this_mv.as_mv.row > x->mv_row_max) continue;\
-}
-
-#define CHECK_BETTER \
-{\
- if (thissad < bestsad)\
- {\
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);\
- if (thissad < bestsad)\
- {\
- bestsad = thissad;\
- best_site = i;\
- }\
- }\
-}
-
-static const MV next_chkpts[6][3] =
-{
- {{ -2, 0}, { -1, -2}, {1, -2}},
- {{ -1, -2}, {1, -2}, {2, 0}},
- {{1, -2}, {2, 0}, {1, 2}},
- {{2, 0}, {1, 2}, { -1, 2}},
- {{1, 2}, { -1, 2}, { -2, 0}},
- {{ -1, 2}, { -2, 0}, { -1, -2}}
-};
-
-int vp8_hex_search
-(
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int_mv *best_mv,
- int search_param,
- int sad_per_bit,
- const vp8_variance_fn_ptr_t *vfp,
- int *mvsadcost[2],
- int *mvcost[2],
- int_mv *center_mv
-)
-{
- MV hex[6] = { { -1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0} } ;
- MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}} ;
- int i, j;
-
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
-
- int in_what_stride = pre_stride;
- int br, bc;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
- unsigned char *base_offset;
- unsigned char *this_offset;
- int k = -1;
- int all_in;
- int best_site = -1;
- int hex_range = 127;
- int dia_range = 8;
-
- int_mv fcenter_mv;
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- (void)mvcost;
-
- /* adjust ref_mv to make sure it is within MV range */
- vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
- br = ref_mv->as_mv.row;
- bc = ref_mv->as_mv.col;
-
- /* Work out the start point for the search */
- base_offset = (unsigned char *)(base_pre + d->offset);
- this_offset = base_offset + (br * (pre_stride)) + bc;
- this_mv.as_mv.row = br;
- this_mv.as_mv.col = bc;
- bestsad = vfp->sdf(what, what_stride, this_offset, in_what_stride)
- + mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
-#if CONFIG_MULTI_RES_ENCODING
- /* Lower search range based on prediction info */
- if (search_param >= 6) goto cal_neighbors;
- else if (search_param >= 5) hex_range = 4;
- else if (search_param >= 4) hex_range = 6;
- else if (search_param >= 3) hex_range = 15;
- else if (search_param >= 2) hex_range = 31;
- else if (search_param >= 1) hex_range = 63;
-
- dia_range = 8;
-#else
- (void)search_param;
-#endif
-
- /* hex search */
- CHECK_BOUNDS(2)
-
- if(all_in)
- {
- for (i = 0; i < 6; i++)
- {
- this_mv.as_mv.row = br + hex[i].row;
- this_mv.as_mv.col = bc + hex[i].col;
- this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }else
- {
- for (i = 0; i < 6; i++)
- {
- this_mv.as_mv.row = br + hex[i].row;
- this_mv.as_mv.col = bc + hex[i].col;
- CHECK_POINT
- this_offset = base_offset + (this_mv.as_mv.row * in_what_stride) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }
-
- if (best_site == -1)
- goto cal_neighbors;
- else
- {
- br += hex[best_site].row;
- bc += hex[best_site].col;
- k = best_site;
- }
-
- for (j = 1; j < hex_range; j++)
- {
- best_site = -1;
- CHECK_BOUNDS(2)
-
- if(all_in)
- {
- for (i = 0; i < 3; i++)
- {
- this_mv.as_mv.row = br + next_chkpts[k][i].row;
- this_mv.as_mv.col = bc + next_chkpts[k][i].col;
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }else
- {
- for (i = 0; i < 3; i++)
- {
- this_mv.as_mv.row = br + next_chkpts[k][i].row;
- this_mv.as_mv.col = bc + next_chkpts[k][i].col;
- CHECK_POINT
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }
-
- if (best_site == -1)
- break;
- else
- {
- br += next_chkpts[k][best_site].row;
- bc += next_chkpts[k][best_site].col;
- k += 5 + best_site;
- if (k >= 12) k -= 12;
- else if (k >= 6) k -= 6;
- }
- }
-
- /* check 4 1-away neighbors */
-cal_neighbors:
- for (j = 0; j < dia_range; j++)
- {
- best_site = -1;
- CHECK_BOUNDS(1)
-
- if(all_in)
- {
- for (i = 0; i < 4; i++)
- {
- this_mv.as_mv.row = br + neighbors[i].row;
- this_mv.as_mv.col = bc + neighbors[i].col;
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }else
- {
- for (i = 0; i < 4; i++)
- {
- this_mv.as_mv.row = br + neighbors[i].row;
- this_mv.as_mv.col = bc + neighbors[i].col;
- CHECK_POINT
- this_offset = base_offset + (this_mv.as_mv.row * (in_what_stride)) + this_mv.as_mv.col;
- thissad = vfp->sdf(what, what_stride, this_offset, in_what_stride);
- CHECK_BETTER
- }
- }
-
- if (best_site == -1)
- break;
- else
- {
- br += neighbors[best_site].row;
- bc += neighbors[best_site].col;
- }
- }
-
- best_mv->as_mv.row = br;
- best_mv->as_mv.col = bc;
-
- return bestsad;
-}
-#undef CHECK_BOUNDS
-#undef CHECK_POINT
-#undef CHECK_BETTER
-
-int vp8_diamond_search_sad_c
-(
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int_mv *best_mv,
- int search_param,
- int sad_per_bit,
- int *num00,
- vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2],
- int_mv *center_mv
-)
-{
- int i, j, step;
-
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- unsigned char *in_what;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- unsigned char *best_address;
-
- int tot_steps;
- int_mv this_mv;
-
- unsigned int bestsad;
- unsigned int thissad;
- int best_site = 0;
- int last_site = 0;
-
- int ref_row;
- int ref_col;
- int this_row_offset;
- int this_col_offset;
- search_site *ss;
-
- unsigned char *check_here;
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
- ref_row = ref_mv->as_mv.row;
- ref_col = ref_mv->as_mv.col;
- *num00 = 0;
- best_mv->as_mv.row = ref_row;
- best_mv->as_mv.col = ref_col;
-
- /* Work out the start point for the search */
- in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
- best_address = in_what;
-
- /* Check the starting position */
- bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
- /* search_param determines the length of the initial step and hence
- * the number of iterations 0 = initial step (MAX_FIRST_STEP) pel :
- * 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
- */
- ss = &x->ss[search_param * x->searches_per_step];
- tot_steps = (x->ss_count / x->searches_per_step) - search_param;
-
- i = 1;
-
- for (step = 0; step < tot_steps ; step++)
- {
- for (j = 0 ; j < x->searches_per_step ; j++)
- {
- /* Trap illegal vectors */
- this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
- this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
-
- if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
- (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
-
- {
- check_here = ss[i].offset + best_address;
- thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.row = this_row_offset;
- this_mv.as_mv.col = this_col_offset;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_site = i;
- }
- }
- }
-
- i++;
- }
-
- if (best_site != last_site)
- {
- best_mv->as_mv.row += ss[best_site].mv.row;
- best_mv->as_mv.col += ss[best_site].mv.col;
- best_address += ss[best_site].offset;
- last_site = best_site;
- }
- else if (best_address == in_what)
- (*num00)++;
- }
-
- this_mv.as_mv.row = best_mv->as_mv.row << 3;
- this_mv.as_mv.col = best_mv->as_mv.col << 3;
-
- return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_diamond_search_sadx4
-(
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int_mv *best_mv,
- int search_param,
- int sad_per_bit,
- int *num00,
- vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2],
- int_mv *center_mv
-)
-{
- int i, j, step;
-
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- unsigned char *in_what;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- unsigned char *best_address;
-
- int tot_steps;
- int_mv this_mv;
-
- unsigned int bestsad;
- unsigned int thissad;
- int best_site = 0;
- int last_site = 0;
-
- int ref_row;
- int ref_col;
- int this_row_offset;
- int this_col_offset;
- search_site *ss;
-
- unsigned char *check_here;
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- vp8_clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
- ref_row = ref_mv->as_mv.row;
- ref_col = ref_mv->as_mv.col;
- *num00 = 0;
- best_mv->as_mv.row = ref_row;
- best_mv->as_mv.col = ref_col;
-
- /* Work out the start point for the search */
- in_what = (unsigned char *)(base_pre + d->offset + (ref_row * pre_stride) + ref_col);
- best_address = in_what;
-
- /* Check the starting position */
- bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride)
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
- /* search_param determines the length of the initial step and hence the
- * number of iterations 0 = initial step (MAX_FIRST_STEP) pel : 1 =
- * (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
- */
- ss = &x->ss[search_param * x->searches_per_step];
- tot_steps = (x->ss_count / x->searches_per_step) - search_param;
-
- i = 1;
-
- for (step = 0; step < tot_steps ; step++)
- {
- int all_in = 1, t;
-
- /* To know if all neighbor points are within the bounds, 4 bounds
- * checking are enough instead of checking 4 bounds for each
- * points.
- */
- all_in &= ((best_mv->as_mv.row + ss[i].mv.row)> x->mv_row_min);
- all_in &= ((best_mv->as_mv.row + ss[i+1].mv.row) < x->mv_row_max);
- all_in &= ((best_mv->as_mv.col + ss[i+2].mv.col) > x->mv_col_min);
- all_in &= ((best_mv->as_mv.col + ss[i+3].mv.col) < x->mv_col_max);
-
- if (all_in)
- {
- unsigned int sad_array[4];
-
- for (j = 0 ; j < x->searches_per_step ; j += 4)
- {
- const unsigned char *block_offset[4];
-
- for (t = 0; t < 4; t++)
- block_offset[t] = ss[i+t].offset + best_address;
-
- fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
-
- for (t = 0; t < 4; t++, i++)
- {
- if (sad_array[t] < bestsad)
- {
- this_mv.as_mv.row = best_mv->as_mv.row + ss[i].mv.row;
- this_mv.as_mv.col = best_mv->as_mv.col + ss[i].mv.col;
- sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (sad_array[t] < bestsad)
- {
- bestsad = sad_array[t];
- best_site = i;
- }
- }
- }
- }
- }
- else
- {
- for (j = 0 ; j < x->searches_per_step ; j++)
- {
- /* Trap illegal vectors */
- this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
- this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
-
- if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
- (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
- {
- check_here = ss[i].offset + best_address;
- thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.row = this_row_offset;
- this_mv.as_mv.col = this_col_offset;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_site = i;
- }
- }
- }
- i++;
- }
- }
-
- if (best_site != last_site)
- {
- best_mv->as_mv.row += ss[best_site].mv.row;
- best_mv->as_mv.col += ss[best_site].mv.col;
- best_address += ss[best_site].offset;
- last_site = best_site;
- }
- else if (best_address == in_what)
- (*num00)++;
- }
-
- this_mv.as_mv.row = best_mv->as_mv.row * 8;
- this_mv.as_mv.col = best_mv->as_mv.col * 8;
-
- return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_full_search_sad_c(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
- int sad_per_bit, int distance,
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
- int_mv *center_mv)
-{
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- unsigned char *in_what;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- int mv_stride = pre_stride;
- unsigned char *bestaddress;
- int_mv *best_mv = &d->bmi.mv;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
- int r, c;
-
- unsigned char *check_here;
-
- int ref_row = ref_mv->as_mv.row;
- int ref_col = ref_mv->as_mv.col;
-
- int row_min = ref_row - distance;
- int row_max = ref_row + distance;
- int col_min = ref_col - distance;
- int col_max = ref_col + distance;
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- /* Work out the mid point for the search */
- in_what = base_pre + d->offset;
- bestaddress = in_what + (ref_row * pre_stride) + ref_col;
-
- best_mv->as_mv.row = ref_row;
- best_mv->as_mv.col = ref_col;
-
- /* Baseline value at the centre */
- bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
- /* Apply further limits to prevent us looking using vectors that
- * stretch beyiond the UMV border
- */
- if (col_min < x->mv_col_min)
- col_min = x->mv_col_min;
-
- if (col_max > x->mv_col_max)
- col_max = x->mv_col_max;
-
- if (row_min < x->mv_row_min)
- row_min = x->mv_row_min;
-
- if (row_max > x->mv_row_max)
- row_max = x->mv_row_max;
-
- for (r = row_min; r < row_max ; r++)
- {
- this_mv.as_mv.row = r;
- check_here = r * mv_stride + in_what + col_min;
-
- for (c = col_min; c < col_max; c++)
- {
- thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
-
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
-
- check_here++;
- }
- }
-
- this_mv.as_mv.row = best_mv->as_mv.row << 3;
- this_mv.as_mv.col = best_mv->as_mv.col << 3;
-
- return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
- int sad_per_bit, int distance,
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
- int_mv *center_mv)
-{
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- unsigned char *in_what;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- int mv_stride = pre_stride;
- unsigned char *bestaddress;
- int_mv *best_mv = &d->bmi.mv;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
- int r, c;
-
- unsigned char *check_here;
-
- int ref_row = ref_mv->as_mv.row;
- int ref_col = ref_mv->as_mv.col;
-
- int row_min = ref_row - distance;
- int row_max = ref_row + distance;
- int col_min = ref_col - distance;
- int col_max = ref_col + distance;
-
- unsigned int sad_array[3];
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- /* Work out the mid point for the search */
- in_what = base_pre + d->offset;
- bestaddress = in_what + (ref_row * pre_stride) + ref_col;
-
- best_mv->as_mv.row = ref_row;
- best_mv->as_mv.col = ref_col;
-
- /* Baseline value at the centre */
- bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
- /* Apply further limits to prevent us looking using vectors that stretch
- * beyond the UMV border
- */
- if (col_min < x->mv_col_min)
- col_min = x->mv_col_min;
-
- if (col_max > x->mv_col_max)
- col_max = x->mv_col_max;
-
- if (row_min < x->mv_row_min)
- row_min = x->mv_row_min;
-
- if (row_max > x->mv_row_max)
- row_max = x->mv_row_max;
-
- for (r = row_min; r < row_max ; r++)
- {
- this_mv.as_mv.row = r;
- check_here = r * mv_stride + in_what + col_min;
- c = col_min;
-
- while ((c + 2) < col_max)
- {
- int i;
-
- fn_ptr->sdx3f(what, what_stride, check_here, in_what_stride, sad_array);
-
- for (i = 0; i < 3; i++)
- {
- thissad = sad_array[i];
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
- }
-
- check_here++;
- c++;
- }
- }
-
- while (c < col_max)
- {
- thissad = fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
- }
-
- check_here ++;
- c ++;
- }
-
- }
-
- this_mv.as_mv.row = best_mv->as_mv.row << 3;
- this_mv.as_mv.col = best_mv->as_mv.col << 3;
-
- return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
- int sad_per_bit, int distance,
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
- int_mv *center_mv)
-{
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- unsigned char *in_what;
- int in_what_stride = pre_stride;
- int mv_stride = pre_stride;
- unsigned char *bestaddress;
- int_mv *best_mv = &d->bmi.mv;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
- int r, c;
-
- unsigned char *check_here;
-
- int ref_row = ref_mv->as_mv.row;
- int ref_col = ref_mv->as_mv.col;
-
- int row_min = ref_row - distance;
- int row_max = ref_row + distance;
- int col_min = ref_col - distance;
- int col_max = ref_col + distance;
-
- // TODO(johannkoenig): check if this alignment is necessary.
- DECLARE_ALIGNED(16, unsigned int, sad_array8[8]);
- unsigned int sad_array[3];
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- /* Work out the mid point for the search */
- in_what = base_pre + d->offset;
- bestaddress = in_what + (ref_row * pre_stride) + ref_col;
-
- best_mv->as_mv.row = ref_row;
- best_mv->as_mv.col = ref_col;
-
- /* Baseline value at the centre */
- bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride)
- + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, sad_per_bit);
-
- /* Apply further limits to prevent us looking using vectors that stretch
- * beyond the UMV border
- */
- if (col_min < x->mv_col_min)
- col_min = x->mv_col_min;
-
- if (col_max > x->mv_col_max)
- col_max = x->mv_col_max;
-
- if (row_min < x->mv_row_min)
- row_min = x->mv_row_min;
-
- if (row_max > x->mv_row_max)
- row_max = x->mv_row_max;
-
- for (r = row_min; r < row_max ; r++)
- {
- this_mv.as_mv.row = r;
- check_here = r * mv_stride + in_what + col_min;
- c = col_min;
-
- while ((c + 7) < col_max)
- {
- int i;
-
- fn_ptr->sdx8f(what, what_stride, check_here, in_what_stride, sad_array8);
-
- for (i = 0; i < 8; i++)
- {
- thissad = sad_array8[i];
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
- }
-
- check_here++;
- c++;
- }
- }
-
- while ((c + 2) < col_max)
- {
- int i;
-
- fn_ptr->sdx3f(what, what_stride, check_here , in_what_stride, sad_array);
-
- for (i = 0; i < 3; i++)
- {
- thissad = sad_array[i];
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
- }
-
- check_here++;
- c++;
- }
- }
-
- while (c < col_max)
- {
- thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.col = c;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv,
- mvsadcost, sad_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_mv->as_mv.row = r;
- best_mv->as_mv.col = c;
- bestaddress = check_here;
- }
- }
-
- check_here ++;
- c ++;
- }
- }
-
- this_mv.as_mv.row = best_mv->as_mv.row * 8;
- this_mv.as_mv.col = best_mv->as_mv.col * 8;
-
- return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_refining_search_sad_c(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
- int error_per_bit, int search_range,
- vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
- int_mv *center_mv)
-{
- MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
- int i, j;
- short this_row_offset, this_col_offset;
-
- int what_stride = b->src_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- unsigned char *what = (*(b->base_src) + b->src);
- unsigned char *best_address = (unsigned char *)(base_pre + d->offset +
- (ref_mv->as_mv.row * pre_stride) + ref_mv->as_mv.col);
- unsigned char *check_here;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
- + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
-
- for (i=0; i<search_range; i++)
- {
- int best_site = -1;
-
- for (j = 0 ; j < 4 ; j++)
- {
- this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
- this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
-
- if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
- (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
- {
- check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
- thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.row = this_row_offset;
- this_mv.as_mv.col = this_col_offset;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_site = j;
- }
- }
- }
- }
-
- if (best_site == -1)
- break;
- else
- {
- ref_mv->as_mv.row += neighbors[best_site].row;
- ref_mv->as_mv.col += neighbors[best_site].col;
- best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
- }
- }
-
- this_mv.as_mv.row = ref_mv->as_mv.row << 3;
- this_mv.as_mv.col = ref_mv->as_mv.col << 3;
-
- return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
- int_mv *ref_mv, int error_per_bit,
- int search_range, vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2], int_mv *center_mv)
-{
- MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
- int i, j;
- short this_row_offset, this_col_offset;
-
- int what_stride = b->src_stride;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int in_what_stride = pre_stride;
- unsigned char *what = (*(b->base_src) + b->src);
- unsigned char *best_address = (unsigned char *)(base_pre + d->offset +
- (ref_mv->as_mv.row * pre_stride) + ref_mv->as_mv.col);
- unsigned char *check_here;
- int_mv this_mv;
- unsigned int bestsad;
- unsigned int thissad;
-
- int *mvsadcost[2];
- int_mv fcenter_mv;
-
- mvsadcost[0] = x->mvsadcost[0];
- mvsadcost[1] = x->mvsadcost[1];
- fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
- fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
-
- bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride)
- + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
-
- for (i=0; i<search_range; i++)
- {
- int best_site = -1;
- int all_in = 1;
-
- all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min);
- all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max);
- all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min);
- all_in &= ((ref_mv->as_mv.col + 1) < x->mv_col_max);
-
- if(all_in)
- {
- unsigned int sad_array[4];
- const unsigned char *block_offset[4];
- block_offset[0] = best_address - in_what_stride;
- block_offset[1] = best_address - 1;
- block_offset[2] = best_address + 1;
- block_offset[3] = best_address + in_what_stride;
-
- fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
-
- for (j = 0; j < 4; j++)
- {
- if (sad_array[j] < bestsad)
- {
- this_mv.as_mv.row = ref_mv->as_mv.row + neighbors[j].row;
- this_mv.as_mv.col = ref_mv->as_mv.col + neighbors[j].col;
- sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
-
- if (sad_array[j] < bestsad)
- {
- bestsad = sad_array[j];
- best_site = j;
- }
- }
- }
- }
- else
- {
- for (j = 0 ; j < 4 ; j++)
- {
- this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
- this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
-
- if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
- (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
- {
- check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
- thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride);
-
- if (thissad < bestsad)
- {
- this_mv.as_mv.row = this_row_offset;
- this_mv.as_mv.col = this_col_offset;
- thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
-
- if (thissad < bestsad)
- {
- bestsad = thissad;
- best_site = j;
- }
- }
- }
- }
- }
-
- if (best_site == -1)
- break;
- else
- {
- ref_mv->as_mv.row += neighbors[best_site].row;
- ref_mv->as_mv.col += neighbors[best_site].col;
- best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
- }
- }
-
- this_mv.as_mv.row = ref_mv->as_mv.row * 8;
- this_mv.as_mv.col = ref_mv->as_mv.col * 8;
-
- return fn_ptr->vf(what, what_stride, best_address, in_what_stride, &thissad)
- + mv_err_cost(&this_mv, center_mv, mvcost, x->errorperbit);
-}
-
-#ifdef VP8_ENTROPY_STATS
-void print_mode_context(void)
-{
- FILE *f = fopen("modecont.c", "w");
- int i, j;
-
- fprintf(f, "#include \"entropy.h\"\n");
- fprintf(f, "const int vp8_mode_contexts[6][4] =\n");
- fprintf(f, "{\n");
-
- for (j = 0; j < 6; j++)
- {
- fprintf(f, " { /* %d */\n", j);
- fprintf(f, " ");
-
- for (i = 0; i < 4; i++)
- {
- int overal_prob;
- int this_prob;
- int count;
-
- /* Overall probs */
- count = mv_mode_cts[i][0] + mv_mode_cts[i][1];
-
- if (count)
- overal_prob = 256 * mv_mode_cts[i][0] / count;
- else
- overal_prob = 128;
-
- if (overal_prob == 0)
- overal_prob = 1;
-
- /* context probs */
- count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
-
- if (count)
- this_prob = 256 * mv_ref_ct[j][i][0] / count;
- else
- this_prob = 128;
-
- if (this_prob == 0)
- this_prob = 1;
-
- fprintf(f, "%5d, ", this_prob);
- }
-
- fprintf(f, " },\n");
- }
-
- fprintf(f, "};\n");
- fclose(f);
-}
-
-/* MV ref count VP8_ENTROPY_STATS stats code */
-#ifdef VP8_ENTROPY_STATS
-void init_mv_ref_counts()
-{
- memset(mv_ref_ct, 0, sizeof(mv_ref_ct));
- memset(mv_mode_cts, 0, sizeof(mv_mode_cts));
-}
-
-void accum_mv_refs(MB_PREDICTION_MODE m, const int ct[4])
-{
- if (m == ZEROMV)
- {
- ++mv_ref_ct [ct[0]] [0] [0];
- ++mv_mode_cts[0][0];
- }
- else
- {
- ++mv_ref_ct [ct[0]] [0] [1];
- ++mv_mode_cts[0][1];
-
- if (m == NEARESTMV)
- {
- ++mv_ref_ct [ct[1]] [1] [0];
- ++mv_mode_cts[1][0];
- }
- else
- {
- ++mv_ref_ct [ct[1]] [1] [1];
- ++mv_mode_cts[1][1];
-
- if (m == NEARMV)
- {
- ++mv_ref_ct [ct[2]] [2] [0];
- ++mv_mode_cts[2][0];
- }
- else
- {
- ++mv_ref_ct [ct[2]] [2] [1];
- ++mv_mode_cts[2][1];
-
- if (m == NEWMV)
- {
- ++mv_ref_ct [ct[3]] [3] [0];
- ++mv_mode_cts[3][0];
- }
- else
- {
- ++mv_ref_ct [ct[3]] [3] [1];
- ++mv_mode_cts[3][1];
- }
- }
- }
- }
-}
-
-#endif/* END MV ref count VP8_ENTROPY_STATS stats code */
-
-#endif
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.h
deleted file mode 100644
index f284f7c3807..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_MCOMP_H_
-#define VP8_ENCODER_MCOMP_H_
-
-#include "block.h"
-#include "vp8/common/variance.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef VP8_ENTROPY_STATS
-extern void init_mv_ref_counts();
-extern void accum_mv_refs(MB_PREDICTION_MODE, const int near_mv_ref_cts[4]);
-#endif
-
-
-/* The maximum number of steps in a step search given the largest allowed
- * initial step
- */
-#define MAX_MVSEARCH_STEPS 8
-
-/* Max full pel mv specified in 1 pel units */
-#define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS)) - 1)
-
-/* Maximum size of the first step in full pel units */
-#define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS-1))
-
-extern void print_mode_context(void);
-extern int vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight);
-extern void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride);
-extern void vp8_init3smotion_compensation(MACROBLOCK *x, int stride);
-
-
-extern int vp8_hex_search
-(
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int_mv *best_mv,
- int search_param,
- int error_per_bit,
- const vp8_variance_fn_ptr_t *vf,
- int *mvsadcost[2],
- int *mvcost[2],
- int_mv *center_mv
-);
-
-typedef int (fractional_mv_step_fp)
- (MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *bestmv, int_mv *ref_mv,
- int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2],
- int *distortion, unsigned int *sse);
-
-extern fractional_mv_step_fp vp8_find_best_sub_pixel_step_iteratively;
-extern fractional_mv_step_fp vp8_find_best_sub_pixel_step;
-extern fractional_mv_step_fp vp8_find_best_half_pixel_step;
-extern fractional_mv_step_fp vp8_skip_fractional_mv_step;
-
-typedef int (*vp8_full_search_fn_t)
- (
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int sad_per_bit,
- int distance,
- vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2],
- int_mv *center_mv
- );
-
-typedef int (*vp8_refining_search_fn_t)
- (
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int sad_per_bit,
- int distance,
- vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2],
- int_mv *center_mv
- );
-
-typedef int (*vp8_diamond_search_fn_t)
- (
- MACROBLOCK *x,
- BLOCK *b,
- BLOCKD *d,
- int_mv *ref_mv,
- int_mv *best_mv,
- int search_param,
- int sad_per_bit,
- int *num00,
- vp8_variance_fn_ptr_t *fn_ptr,
- int *mvcost[2],
- int_mv *center_mv
- );
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_MCOMP_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.c
deleted file mode 100644
index ad0e9308dc1..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vp8/common/blockd.h"
-#include "modecosts.h"
-#include "onyx_int.h"
-#include "treewriter.h"
-#include "vp8/common/entropymode.h"
-
-
-void vp8_init_mode_costs(VP8_COMP *c)
-{
- VP8_COMMON *x = &c->common;
- struct rd_costs_struct *rd_costs = &c->rd_costs;
-
- {
- const vp8_tree_p T = vp8_bmode_tree;
-
- int i = 0;
-
- do
- {
- int j = 0;
-
- do
- {
- vp8_cost_tokens(rd_costs->bmode_costs[i][j],
- vp8_kf_bmode_prob[i][j], T);
- }
- while (++j < VP8_BINTRAMODES);
- }
- while (++i < VP8_BINTRAMODES);
-
- vp8_cost_tokens(rd_costs->inter_bmode_costs, x->fc.bmode_prob, T);
- }
- vp8_cost_tokens(rd_costs->inter_bmode_costs, x->fc.sub_mv_ref_prob,
- vp8_sub_mv_ref_tree);
-
- vp8_cost_tokens(rd_costs->mbmode_cost[1], x->fc.ymode_prob, vp8_ymode_tree);
- vp8_cost_tokens(rd_costs->mbmode_cost[0], vp8_kf_ymode_prob,
- vp8_kf_ymode_tree);
-
- vp8_cost_tokens(rd_costs->intra_uv_mode_cost[1], x->fc.uv_mode_prob,
- vp8_uv_mode_tree);
- vp8_cost_tokens(rd_costs->intra_uv_mode_cost[0], vp8_kf_uv_mode_prob,
- vp8_uv_mode_tree);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.h
deleted file mode 100644
index 9871bfffdf9..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/modecosts.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_MODECOSTS_H_
-#define VP8_ENCODER_MODECOSTS_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct VP8_COMP;
-
-void vp8_init_mode_costs(struct VP8_COMP *x);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_MODECOSTS_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.c
deleted file mode 100644
index 8d96445f53c..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <limits.h>
-#include "vpx_config.h"
-#include "onyx_int.h"
-#include "mr_dissim.h"
-#include "vpx_mem/vpx_mem.h"
-#include "rdopt.h"
-#include "vp8/common/common.h"
-
-void vp8_cal_low_res_mb_cols(VP8_COMP *cpi)
-{
- int low_res_w;
-
- /* Support arbitrary down-sampling factor */
- unsigned int iw = cpi->oxcf.Width*cpi->oxcf.mr_down_sampling_factor.den
- + cpi->oxcf.mr_down_sampling_factor.num - 1;
-
- low_res_w = iw/cpi->oxcf.mr_down_sampling_factor.num;
- cpi->mr_low_res_mb_cols = ((low_res_w + 15) >> 4);
-}
-
-#define GET_MV(x) \
-if(x->mbmi.ref_frame !=INTRA_FRAME) \
-{ \
- mvx[cnt] = x->mbmi.mv.as_mv.row; \
- mvy[cnt] = x->mbmi.mv.as_mv.col; \
- cnt++; \
-}
-
-#define GET_MV_SIGN(x) \
-if(x->mbmi.ref_frame !=INTRA_FRAME) \
-{ \
- mvx[cnt] = x->mbmi.mv.as_mv.row; \
- mvy[cnt] = x->mbmi.mv.as_mv.col; \
- if (cm->ref_frame_sign_bias[x->mbmi.ref_frame] \
- != cm->ref_frame_sign_bias[tmp->mbmi.ref_frame]) \
- { \
- mvx[cnt] *= -1; \
- mvy[cnt] *= -1; \
- } \
- cnt++; \
-}
-
-void vp8_cal_dissimilarity(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
- int i;
-
- /* Note: The first row & first column in mip are outside the frame, which
- * were initialized to all 0.(ref_frame, mode, mv...)
- * Their ref_frame = 0 means they won't be counted in the following
- * calculation.
- */
- if (cpi->oxcf.mr_total_resolutions >1
- && cpi->oxcf.mr_encoder_id < (cpi->oxcf.mr_total_resolutions - 1))
- {
- /* Store info for show/no-show frames for supporting alt_ref.
- * If parent frame is alt_ref, child has one too.
- */
- LOWER_RES_FRAME_INFO* store_info
- = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
-
- store_info->frame_type = cm->frame_type;
-
- if(cm->frame_type != KEY_FRAME)
- {
- store_info->is_frame_dropped = 0;
- for (i = 1; i < MAX_REF_FRAMES; i++)
- store_info->low_res_ref_frames[i] = cpi->current_ref_frames[i];
- }
-
- if(cm->frame_type != KEY_FRAME)
- {
- int mb_row;
- int mb_col;
- /* Point to beginning of allocated MODE_INFO arrays. */
- MODE_INFO *tmp = cm->mip + cm->mode_info_stride;
- LOWER_RES_MB_INFO* store_mode_info = store_info->mb_info;
-
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
- {
- tmp++;
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
- {
- int dissim = INT_MAX;
-
- if(tmp->mbmi.ref_frame !=INTRA_FRAME)
- {
- int mvx[8];
- int mvy[8];
- int mmvx;
- int mmvy;
- int cnt=0;
- const MODE_INFO *here = tmp;
- const MODE_INFO *above = here - cm->mode_info_stride;
- const MODE_INFO *left = here - 1;
- const MODE_INFO *aboveleft = above - 1;
- const MODE_INFO *aboveright = NULL;
- const MODE_INFO *right = NULL;
- const MODE_INFO *belowleft = NULL;
- const MODE_INFO *below = NULL;
- const MODE_INFO *belowright = NULL;
-
- /* If alternate reference frame is used, we have to
- * check sign of MV. */
- if(cpi->oxcf.play_alternate)
- {
- /* Gather mv of neighboring MBs */
- GET_MV_SIGN(above)
- GET_MV_SIGN(left)
- GET_MV_SIGN(aboveleft)
-
- if(mb_col < (cm->mb_cols-1))
- {
- right = here + 1;
- aboveright = above + 1;
- GET_MV_SIGN(right)
- GET_MV_SIGN(aboveright)
- }
-
- if(mb_row < (cm->mb_rows-1))
- {
- below = here + cm->mode_info_stride;
- belowleft = below - 1;
- GET_MV_SIGN(below)
- GET_MV_SIGN(belowleft)
- }
-
- if(mb_col < (cm->mb_cols-1)
- && mb_row < (cm->mb_rows-1))
- {
- belowright = below + 1;
- GET_MV_SIGN(belowright)
- }
- }else
- {
- /* No alt_ref and gather mv of neighboring MBs */
- GET_MV(above)
- GET_MV(left)
- GET_MV(aboveleft)
-
- if(mb_col < (cm->mb_cols-1))
- {
- right = here + 1;
- aboveright = above + 1;
- GET_MV(right)
- GET_MV(aboveright)
- }
-
- if(mb_row < (cm->mb_rows-1))
- {
- below = here + cm->mode_info_stride;
- belowleft = below - 1;
- GET_MV(below)
- GET_MV(belowleft)
- }
-
- if(mb_col < (cm->mb_cols-1)
- && mb_row < (cm->mb_rows-1))
- {
- belowright = below + 1;
- GET_MV(belowright)
- }
- }
-
- if (cnt > 0)
- {
- int max_mvx = mvx[0];
- int min_mvx = mvx[0];
- int max_mvy = mvy[0];
- int min_mvy = mvy[0];
- int i;
-
- if (cnt > 1)
- {
- for (i=1; i< cnt; i++)
- {
- if (mvx[i] > max_mvx) max_mvx = mvx[i];
- else if (mvx[i] < min_mvx) min_mvx = mvx[i];
- if (mvy[i] > max_mvy) max_mvy = mvy[i];
- else if (mvy[i] < min_mvy) min_mvy = mvy[i];
- }
- }
-
- mmvx = MAX(abs(min_mvx - here->mbmi.mv.as_mv.row),
- abs(max_mvx - here->mbmi.mv.as_mv.row));
- mmvy = MAX(abs(min_mvy - here->mbmi.mv.as_mv.col),
- abs(max_mvy - here->mbmi.mv.as_mv.col));
- dissim = MAX(mmvx, mmvy);
- }
- }
-
- /* Store mode info for next resolution encoding */
- store_mode_info->mode = tmp->mbmi.mode;
- store_mode_info->ref_frame = tmp->mbmi.ref_frame;
- store_mode_info->mv.as_int = tmp->mbmi.mv.as_int;
- store_mode_info->dissim = dissim;
- tmp++;
- store_mode_info++;
- }
- }
- }
- }
-}
-
-/* This function is called only when this frame is dropped at current
- resolution level. */
-void vp8_store_drop_frame_info(VP8_COMP *cpi)
-{
- /* If the frame is dropped in lower-resolution encoding, this information
- is passed to higher resolution level so that the encoder knows there
- is no mode & motion info available.
- */
- if (cpi->oxcf.mr_total_resolutions >1
- && cpi->oxcf.mr_encoder_id < (cpi->oxcf.mr_total_resolutions - 1))
- {
- /* Store info for show/no-show frames for supporting alt_ref.
- * If parent frame is alt_ref, child has one too.
- */
- LOWER_RES_FRAME_INFO* store_info
- = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
-
- /* Set frame_type to be INTER_FRAME since we won't drop key frame. */
- store_info->frame_type = INTER_FRAME;
- store_info->is_frame_dropped = 1;
- }
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.h
deleted file mode 100644
index 5a59ce62a61..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mr_dissim.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_MR_DISSIM_H_
-#define VP8_ENCODER_MR_DISSIM_H_
-#include "vpx_config.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void vp8_cal_low_res_mb_cols(VP8_COMP *cpi);
-extern void vp8_cal_dissimilarity(VP8_COMP *cpi);
-extern void vp8_store_drop_frame_info(VP8_COMP *cpi);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_MR_DISSIM_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_if.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_if.c
deleted file mode 100644
index 40e29e191af..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_if.c
+++ /dev/null
@@ -1,6011 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "./vpx_scale_rtcd.h"
-#include "./vpx_dsp_rtcd.h"
-#include "./vp8_rtcd.h"
-#include "vp8/common/onyxc_int.h"
-#include "vp8/common/blockd.h"
-#include "onyx_int.h"
-#include "vp8/common/systemdependent.h"
-#include "quantize.h"
-#include "vp8/common/alloccommon.h"
-#include "mcomp.h"
-#include "firstpass.h"
-#include "vpx/internal/vpx_psnr.h"
-#include "vpx_scale/vpx_scale.h"
-#include "vp8/common/extend.h"
-#include "ratectrl.h"
-#include "vp8/common/quant_common.h"
-#include "segmentation.h"
-#if CONFIG_POSTPROC
-#include "vp8/common/postproc.h"
-#endif
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/swapyv12buffer.h"
-#include "vp8/common/threading.h"
-#include "vpx_ports/vpx_timer.h"
-#if ARCH_ARM
-#include "vpx_ports/arm.h"
-#endif
-#if CONFIG_MULTI_RES_ENCODING
-#include "mr_dissim.h"
-#endif
-#include "encodeframe.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <limits.h>
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
-extern int vp8_update_coef_context(VP8_COMP *cpi);
-extern void vp8_update_coef_probs(VP8_COMP *cpi);
-#endif
-
-extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
-extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
-extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
-
-extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
-extern void print_parms(VP8_CONFIG *ocf, char *filenam);
-extern unsigned int vp8_get_processor_freq();
-extern void print_tree_update_probs();
-extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
-extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
-
-int vp8_estimate_entropy_savings(VP8_COMP *cpi);
-
-int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
-
-extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
-
-static void set_default_lf_deltas(VP8_COMP *cpi);
-
-extern const int vp8_gf_interval_table[101];
-
-#if CONFIG_INTERNAL_STATS
-#include "math.h"
-
-extern double vp8_calc_ssim
-(
- YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest,
- int lumamask,
- double *weight
-);
-
-
-extern double vp8_calc_ssimg
-(
- YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest,
- double *ssim_y,
- double *ssim_u,
- double *ssim_v
-);
-
-
-#endif
-
-
-#ifdef OUTPUT_YUV_SRC
-FILE *yuv_file;
-#endif
-#ifdef OUTPUT_YUV_DENOISED
-FILE *yuv_denoised_file;
-#endif
-
-#if 0
-FILE *framepsnr;
-FILE *kf_list;
-FILE *keyfile;
-#endif
-
-#if 0
-extern int skip_true_count;
-extern int skip_false_count;
-#endif
-
-
-#ifdef VP8_ENTROPY_STATS
-extern int intra_mode_stats[10][10][10];
-#endif
-
-#ifdef SPEEDSTATS
-unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-unsigned int tot_pm = 0;
-unsigned int cnt_pm = 0;
-unsigned int tot_ef = 0;
-unsigned int cnt_ef = 0;
-#endif
-
-#ifdef MODE_STATS
-extern unsigned __int64 Sectionbits[50];
-extern int y_modes[5] ;
-extern int uv_modes[4] ;
-extern int b_modes[10] ;
-
-extern int inter_y_modes[10] ;
-extern int inter_uv_modes[4] ;
-extern unsigned int inter_b_modes[15];
-#endif
-
-extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
-
-extern const int qrounding_factors[129];
-extern const int qzbin_factors[129];
-extern void vp8cx_init_quantizer(VP8_COMP *cpi);
-extern const int vp8cx_base_skip_false_prob[128];
-
-/* Tables relating active max Q to active min Q */
-static const unsigned char kf_low_motion_minq[QINDEX_RANGE] =
-{
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
- 3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,
- 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
- 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
- 16,16,17,17,18,18,18,18,19,20,20,21,21,22,23,23
-};
-static const unsigned char kf_high_motion_minq[QINDEX_RANGE] =
-{
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,
- 3,3,3,3,4,4,4,4,5,5,5,5,5,5,6,6,
- 6,6,7,7,8,8,8,8,9,9,10,10,10,10,11,11,
- 11,11,12,12,13,13,13,13,14,14,15,15,15,15,16,16,
- 16,16,17,17,18,18,18,18,19,19,20,20,20,20,21,21,
- 21,21,22,22,23,23,24,25,25,26,26,27,28,28,29,30
-};
-static const unsigned char gf_low_motion_minq[QINDEX_RANGE] =
-{
- 0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,
- 3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,
- 7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,
- 11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,
- 19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,
- 27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,
- 35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,
- 43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58
-};
-static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] =
-{
- 0,0,0,0,1,1,1,1,1,1,2,2,3,3,3,4,
- 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
- 9,10,10,10,10,11,11,11,12,12,12,12,13,13,13,14,
- 14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,
- 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,
- 30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,
- 38,39,39,40,40,41,41,42,42,43,43,44,45,46,47,48,
- 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
-};
-static const unsigned char gf_high_motion_minq[QINDEX_RANGE] =
-{
- 0,0,0,0,1,1,1,1,1,2,2,2,3,3,3,4,
- 4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,
- 9,10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
- 17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,
- 25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,
- 33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,
- 41,41,42,42,43,44,45,46,47,48,49,50,51,52,53,54,
- 55,56,57,58,59,60,62,64,66,68,70,72,74,76,78,80
-};
-static const unsigned char inter_minq[QINDEX_RANGE] =
-{
- 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
- 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
- 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
- 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
- 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
- 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
- 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
- 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
-};
-
-#ifdef PACKET_TESTING
-extern FILE *vpxlogc;
-#endif
-
-static void save_layer_context(VP8_COMP *cpi)
-{
- LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
-
- /* Save layer dependent coding state */
- lc->target_bandwidth = cpi->target_bandwidth;
- lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
- lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
- lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
- lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
- lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
- lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
- lc->buffer_level = cpi->buffer_level;
- lc->bits_off_target = cpi->bits_off_target;
- lc->total_actual_bits = cpi->total_actual_bits;
- lc->worst_quality = cpi->worst_quality;
- lc->active_worst_quality = cpi->active_worst_quality;
- lc->best_quality = cpi->best_quality;
- lc->active_best_quality = cpi->active_best_quality;
- lc->ni_av_qi = cpi->ni_av_qi;
- lc->ni_tot_qi = cpi->ni_tot_qi;
- lc->ni_frames = cpi->ni_frames;
- lc->avg_frame_qindex = cpi->avg_frame_qindex;
- lc->rate_correction_factor = cpi->rate_correction_factor;
- lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
- lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
- lc->zbin_over_quant = cpi->mb.zbin_over_quant;
- lc->inter_frame_target = cpi->inter_frame_target;
- lc->total_byte_count = cpi->total_byte_count;
- lc->filter_level = cpi->common.filter_level;
-
- lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
-
- memcpy (lc->count_mb_ref_frame_usage,
- cpi->mb.count_mb_ref_frame_usage,
- sizeof(cpi->mb.count_mb_ref_frame_usage));
-}
-
-static void restore_layer_context(VP8_COMP *cpi, const int layer)
-{
- LAYER_CONTEXT *lc = &cpi->layer_context[layer];
-
- /* Restore layer dependent coding state */
- cpi->current_layer = layer;
- cpi->target_bandwidth = lc->target_bandwidth;
- cpi->oxcf.target_bandwidth = lc->target_bandwidth;
- cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
- cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
- cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
- cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
- cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
- cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
- cpi->buffer_level = lc->buffer_level;
- cpi->bits_off_target = lc->bits_off_target;
- cpi->total_actual_bits = lc->total_actual_bits;
- cpi->active_worst_quality = lc->active_worst_quality;
- cpi->active_best_quality = lc->active_best_quality;
- cpi->ni_av_qi = lc->ni_av_qi;
- cpi->ni_tot_qi = lc->ni_tot_qi;
- cpi->ni_frames = lc->ni_frames;
- cpi->avg_frame_qindex = lc->avg_frame_qindex;
- cpi->rate_correction_factor = lc->rate_correction_factor;
- cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
- cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
- cpi->mb.zbin_over_quant = lc->zbin_over_quant;
- cpi->inter_frame_target = lc->inter_frame_target;
- cpi->total_byte_count = lc->total_byte_count;
- cpi->common.filter_level = lc->filter_level;
-
- cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
-
- memcpy (cpi->mb.count_mb_ref_frame_usage,
- lc->count_mb_ref_frame_usage,
- sizeof(cpi->mb.count_mb_ref_frame_usage));
-}
-
-static int rescale(int val, int num, int denom)
-{
- int64_t llnum = num;
- int64_t llden = denom;
- int64_t llval = val;
-
- return (int)(llval * llnum / llden);
-}
-
-static void init_temporal_layer_context(VP8_COMP *cpi,
- VP8_CONFIG *oxcf,
- const int layer,
- double prev_layer_framerate)
-{
- LAYER_CONTEXT *lc = &cpi->layer_context[layer];
-
- lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
- lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
-
- lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
- lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
- lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
-
- lc->starting_buffer_level =
- rescale((int)(oxcf->starting_buffer_level),
- lc->target_bandwidth, 1000);
-
- if (oxcf->optimal_buffer_level == 0)
- lc->optimal_buffer_level = lc->target_bandwidth / 8;
- else
- lc->optimal_buffer_level =
- rescale((int)(oxcf->optimal_buffer_level),
- lc->target_bandwidth, 1000);
-
- if (oxcf->maximum_buffer_size == 0)
- lc->maximum_buffer_size = lc->target_bandwidth / 8;
- else
- lc->maximum_buffer_size =
- rescale((int)(oxcf->maximum_buffer_size),
- lc->target_bandwidth, 1000);
-
- /* Work out the average size of a frame within this layer */
- if (layer > 0)
- lc->avg_frame_size_for_layer =
- (int)((cpi->oxcf.target_bitrate[layer] -
- cpi->oxcf.target_bitrate[layer-1]) * 1000 /
- (lc->framerate - prev_layer_framerate));
-
- lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
- lc->active_best_quality = cpi->oxcf.best_allowed_q;
- lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
-
- lc->buffer_level = lc->starting_buffer_level;
- lc->bits_off_target = lc->starting_buffer_level;
-
- lc->total_actual_bits = 0;
- lc->ni_av_qi = 0;
- lc->ni_tot_qi = 0;
- lc->ni_frames = 0;
- lc->rate_correction_factor = 1.0;
- lc->key_frame_rate_correction_factor = 1.0;
- lc->gf_rate_correction_factor = 1.0;
- lc->inter_frame_target = 0;
-}
-
-// Upon a run-time change in temporal layers, reset the layer context parameters
-// for any "new" layers. For "existing" layers, let them inherit the parameters
-// from the previous layer state (at the same layer #). In future we may want
-// to better map the previous layer state(s) to the "new" ones.
-static void reset_temporal_layer_change(VP8_COMP *cpi,
- VP8_CONFIG *oxcf,
- const int prev_num_layers)
-{
- int i;
- double prev_layer_framerate = 0;
- const int curr_num_layers = cpi->oxcf.number_of_layers;
- // If the previous state was 1 layer, get current layer context from cpi.
- // We need this to set the layer context for the new layers below.
- if (prev_num_layers == 1)
- {
- cpi->current_layer = 0;
- save_layer_context(cpi);
- }
- for (i = 0; i < curr_num_layers; i++)
- {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- if (i >= prev_num_layers)
- {
- init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
- }
- // The initial buffer levels are set based on their starting levels.
- // We could set the buffer levels based on the previous state (normalized
- // properly by the layer bandwidths) but we would need to keep track of
- // the previous set of layer bandwidths (i.e., target_bitrate[i])
- // before the layer change. For now, reset to the starting levels.
- lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
- cpi->oxcf.target_bitrate[i];
- lc->bits_off_target = lc->buffer_level;
- // TDOD(marpan): Should we set the rate_correction_factor and
- // active_worst/best_quality to values derived from the previous layer
- // state (to smooth-out quality dips/rate fluctuation at transition)?
-
- // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
- // is not set for 1 layer, and the restore_layer_context/save_context()
- // are not called in the encoding loop, so we need to call it here to
- // pass the layer context state to |cpi|.
- if (curr_num_layers == 1)
- {
- lc->target_bandwidth = cpi->oxcf.target_bandwidth;
- lc->buffer_level = cpi->oxcf.starting_buffer_level_in_ms *
- lc->target_bandwidth / 1000;
- lc->bits_off_target = lc->buffer_level;
- restore_layer_context(cpi, 0);
- }
- prev_layer_framerate = cpi->output_framerate /
- cpi->oxcf.rate_decimator[i];
- }
-}
-
-static void setup_features(VP8_COMP *cpi)
-{
- // If segmentation enabled set the update flags
- if ( cpi->mb.e_mbd.segmentation_enabled )
- {
- cpi->mb.e_mbd.update_mb_segmentation_map = 1;
- cpi->mb.e_mbd.update_mb_segmentation_data = 1;
- }
- else
- {
- cpi->mb.e_mbd.update_mb_segmentation_map = 0;
- cpi->mb.e_mbd.update_mb_segmentation_data = 0;
- }
-
- cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
- cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
- memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
- memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
- memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
- memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
-
- set_default_lf_deltas(cpi);
-
-}
-
-
-static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
-
-
-static void dealloc_compressor_data(VP8_COMP *cpi)
-{
- vpx_free(cpi->tplist);
- cpi->tplist = NULL;
-
- /* Delete last frame MV storage buffers */
- vpx_free(cpi->lfmv);
- cpi->lfmv = 0;
-
- vpx_free(cpi->lf_ref_frame_sign_bias);
- cpi->lf_ref_frame_sign_bias = 0;
-
- vpx_free(cpi->lf_ref_frame);
- cpi->lf_ref_frame = 0;
-
- /* Delete sementation map */
- vpx_free(cpi->segmentation_map);
- cpi->segmentation_map = 0;
-
- vpx_free(cpi->active_map);
- cpi->active_map = 0;
-
- vp8_de_alloc_frame_buffers(&cpi->common);
-
- vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
- vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
- dealloc_raw_frame_buffers(cpi);
-
- vpx_free(cpi->tok);
- cpi->tok = 0;
-
- /* Structure used to monitor GF usage */
- vpx_free(cpi->gf_active_flags);
- cpi->gf_active_flags = 0;
-
- /* Activity mask based per mb zbin adjustments */
- vpx_free(cpi->mb_activity_map);
- cpi->mb_activity_map = 0;
-
- vpx_free(cpi->mb.pip);
- cpi->mb.pip = 0;
-
-#if CONFIG_MULTITHREAD
- vpx_free(cpi->mt_current_mb_col);
- cpi->mt_current_mb_col = NULL;
-#endif
-}
-
-static void enable_segmentation(VP8_COMP *cpi)
-{
- /* Set the appropriate feature bit */
- cpi->mb.e_mbd.segmentation_enabled = 1;
- cpi->mb.e_mbd.update_mb_segmentation_map = 1;
- cpi->mb.e_mbd.update_mb_segmentation_data = 1;
-}
-static void disable_segmentation(VP8_COMP *cpi)
-{
- /* Clear the appropriate feature bit */
- cpi->mb.e_mbd.segmentation_enabled = 0;
-}
-
-/* Valid values for a segment are 0 to 3
- * Segmentation map is arrange as [Rows][Columns]
- */
-static void set_segmentation_map(VP8_COMP *cpi, unsigned char *segmentation_map)
-{
- /* Copy in the new segmentation map */
- memcpy(cpi->segmentation_map, segmentation_map, (cpi->common.mb_rows * cpi->common.mb_cols));
-
- /* Signal that the map should be updated. */
- cpi->mb.e_mbd.update_mb_segmentation_map = 1;
- cpi->mb.e_mbd.update_mb_segmentation_data = 1;
-}
-
-/* The values given for each segment can be either deltas (from the default
- * value chosen for the frame) or absolute values.
- *
- * Valid range for abs values is:
- * (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
- * Valid range for delta values are:
- * (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
- *
- * abs_delta = SEGMENT_DELTADATA (deltas)
- * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
- *
- */
-static void set_segment_data(VP8_COMP *cpi, signed char *feature_data, unsigned char abs_delta)
-{
- cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
- memcpy(cpi->segment_feature_data, feature_data, sizeof(cpi->segment_feature_data));
-}
-
-
-static void segmentation_test_function(VP8_COMP *cpi)
-{
- unsigned char *seg_map;
- signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
-
- // Create a temporary map for segmentation data.
- CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
-
- // Set the segmentation Map
- set_segmentation_map(cpi, seg_map);
-
- // Activate segmentation.
- enable_segmentation(cpi);
-
- // Set up the quant segment data
- feature_data[MB_LVL_ALT_Q][0] = 0;
- feature_data[MB_LVL_ALT_Q][1] = 4;
- feature_data[MB_LVL_ALT_Q][2] = 0;
- feature_data[MB_LVL_ALT_Q][3] = 0;
- // Set up the loop segment data
- feature_data[MB_LVL_ALT_LF][0] = 0;
- feature_data[MB_LVL_ALT_LF][1] = 0;
- feature_data[MB_LVL_ALT_LF][2] = 0;
- feature_data[MB_LVL_ALT_LF][3] = 0;
-
- // Initialise the feature data structure
- // SEGMENT_DELTADATA 0, SEGMENT_ABSDATA 1
- set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
-
- // Delete sementation map
- vpx_free(seg_map);
-
- seg_map = 0;
-}
-
-/* A simple function to cyclically refresh the background at a lower Q */
-static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
-{
- unsigned char *seg_map = cpi->segmentation_map;
- signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
- int i;
- int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
- int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
-
- cpi->cyclic_refresh_q = Q / 2;
-
- if (cpi->oxcf.screen_content_mode) {
- // Modify quality ramp-up based on Q. Above some Q level, increase the
- // number of blocks to be refreshed, and reduce it below the thredhold.
- // Turn-off under certain conditions (i.e., away from key frame, and if
- // we are at good quality (low Q) and most of the blocks were skipped-encoded
- // in previous frame.
- int qp_thresh = (cpi->oxcf.screen_content_mode == 2) ? 80 : 100;
- if (Q >= qp_thresh) {
- cpi->cyclic_refresh_mode_max_mbs_perframe =
- (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
- } else if (cpi->frames_since_key > 250 &&
- Q < 20 &&
- cpi->mb.skip_true_count > (int)(0.95 * mbs_in_frame)) {
- cpi->cyclic_refresh_mode_max_mbs_perframe = 0;
- } else {
- cpi->cyclic_refresh_mode_max_mbs_perframe =
- (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
- }
- block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
- }
-
- // Set every macroblock to be eligible for update.
- // For key frame this will reset seg map to 0.
- memset(cpi->segmentation_map, 0, mbs_in_frame);
-
- if (cpi->common.frame_type != KEY_FRAME && block_count > 0)
- {
- /* Cycle through the macro_block rows */
- /* MB loop to set local segmentation map */
- i = cpi->cyclic_refresh_mode_index;
- assert(i < mbs_in_frame);
- do
- {
- /* If the MB is as a candidate for clean up then mark it for
- * possible boost/refresh (segment 1) The segment id may get
- * reset to 0 later if the MB gets coded anything other than
- * last frame 0,0 as only (last frame 0,0) MBs are eligable for
- * refresh : that is to say Mbs likely to be background blocks.
- */
- if (cpi->cyclic_refresh_map[i] == 0)
- {
- seg_map[i] = 1;
- block_count --;
- }
- else if (cpi->cyclic_refresh_map[i] < 0)
- cpi->cyclic_refresh_map[i]++;
-
- i++;
- if (i == mbs_in_frame)
- i = 0;
-
- }
- while(block_count && i != cpi->cyclic_refresh_mode_index);
-
- cpi->cyclic_refresh_mode_index = i;
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity > 0) {
- if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive &&
- Q < (int)cpi->denoiser.denoise_pars.qp_thresh &&
- (cpi->frames_since_key >
- 2 * cpi->denoiser.denoise_pars.consec_zerolast)) {
- // Under aggressive denoising, use segmentation to turn off loop
- // filter below some qp thresh. The filter is reduced for all
- // blocks that have been encoded as ZEROMV LAST x frames in a row,
- // where x is set by cpi->denoiser.denoise_pars.consec_zerolast.
- // This is to avoid "dot" artifacts that can occur from repeated
- // loop filtering on noisy input source.
- cpi->cyclic_refresh_q = Q;
- // lf_adjustment = -MAX_LOOP_FILTER;
- lf_adjustment = -40;
- for (i = 0; i < mbs_in_frame; ++i) {
- seg_map[i] = (cpi->consec_zero_last[i] >
- cpi->denoiser.denoise_pars.consec_zerolast) ? 1 : 0;
- }
- }
- }
-#endif
- }
-
- /* Activate segmentation. */
- cpi->mb.e_mbd.update_mb_segmentation_map = 1;
- cpi->mb.e_mbd.update_mb_segmentation_data = 1;
- enable_segmentation(cpi);
-
- /* Set up the quant segment data */
- feature_data[MB_LVL_ALT_Q][0] = 0;
- feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
- feature_data[MB_LVL_ALT_Q][2] = 0;
- feature_data[MB_LVL_ALT_Q][3] = 0;
-
- /* Set up the loop segment data */
- feature_data[MB_LVL_ALT_LF][0] = 0;
- feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
- feature_data[MB_LVL_ALT_LF][2] = 0;
- feature_data[MB_LVL_ALT_LF][3] = 0;
-
- /* Initialise the feature data structure */
- set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
-
-}
-
-static void set_default_lf_deltas(VP8_COMP *cpi)
-{
- cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
- cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
-
- memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
- memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
-
- /* Test of ref frame deltas */
- cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
- cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
- cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
- cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
-
- cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
-
- if(cpi->oxcf.Mode == MODE_REALTIME)
- cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
- else
- cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
-
- cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
- cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
-}
-
-/* Convenience macros for mapping speed and mode into a continuous
- * range
- */
-#define GOOD(x) (x+1)
-#define RT(x) (x+7)
-
-static int speed_map(int speed, const int *map)
-{
- int res;
-
- do
- {
- res = *map++;
- } while(speed >= *map++);
- return res;
-}
-
-static const int thresh_mult_map_znn[] = {
- /* map common to zero, nearest, and near */
- 0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
-};
-
-static const int thresh_mult_map_vhpred[] = {
- 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(1), 2000,
- RT(7), INT_MAX, INT_MAX
-};
-
-static const int thresh_mult_map_bpred[] = {
- 2000, GOOD(0), 2500, GOOD(2), 5000, GOOD(3), 7500, RT(0), 2500, RT(1), 5000,
- RT(6), INT_MAX, INT_MAX
-};
-
-static const int thresh_mult_map_tm[] = {
- 1000, GOOD(2), 1500, GOOD(3), 2000, RT(0), 0, RT(1), 1000, RT(2), 2000,
- RT(7), INT_MAX, INT_MAX
-};
-
-static const int thresh_mult_map_new1[] = {
- 1000, GOOD(2), 2000, RT(0), 2000, INT_MAX
-};
-
-static const int thresh_mult_map_new2[] = {
- 1000, GOOD(2), 2000, GOOD(3), 2500, GOOD(5), 4000, RT(0), 2000, RT(2), 2500,
- RT(5), 4000, INT_MAX
-};
-
-static const int thresh_mult_map_split1[] = {
- 2500, GOOD(0), 1700, GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
- RT(0), 5000, RT(1), 10000, RT(2), 25000, RT(3), INT_MAX, INT_MAX
-};
-
-static const int thresh_mult_map_split2[] = {
- 5000, GOOD(0), 4500, GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
- RT(0), 10000, RT(1), 20000, RT(2), 50000, RT(3), INT_MAX, INT_MAX
-};
-
-static const int mode_check_freq_map_zn2[] = {
- /* {zero,nearest}{2,3} */
- 0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
-};
-
-static const int mode_check_freq_map_vhbpred[] = {
- 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
-};
-
-static const int mode_check_freq_map_near2[] = {
- 0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(10), 1<<2, RT(11), 1<<3, RT(12), 1<<4,
- INT_MAX
-};
-
-static const int mode_check_freq_map_new1[] = {
- 0, RT(10), 1<<1, RT(11), 1<<2, RT(12), 1<<3, INT_MAX
-};
-
-static const int mode_check_freq_map_new2[] = {
- 0, GOOD(5), 4, RT(0), 0, RT(3), 4, RT(10), 1<<3, RT(11), 1<<4, RT(12), 1<<5,
- INT_MAX
-};
-
-static const int mode_check_freq_map_split1[] = {
- 0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
-};
-
-static const int mode_check_freq_map_split2[] = {
- 0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
-};
-
-void vp8_set_speed_features(VP8_COMP *cpi)
-{
- SPEED_FEATURES *sf = &cpi->sf;
- int Mode = cpi->compressor_speed;
- int Speed = cpi->Speed;
- int i;
- VP8_COMMON *cm = &cpi->common;
- int last_improved_quant = sf->improved_quant;
- int ref_frames;
-
- /* Initialise default mode frequency sampling variables */
- for (i = 0; i < MAX_MODES; i ++)
- {
- cpi->mode_check_freq[i] = 0;
- }
-
- cpi->mb.mbs_tested_so_far = 0;
- cpi->mb.mbs_zero_last_dot_suppress = 0;
-
- /* best quality defaults */
- sf->RD = 1;
- sf->search_method = NSTEP;
- sf->improved_quant = 1;
- sf->improved_dct = 1;
- sf->auto_filter = 1;
- sf->recode_loop = 1;
- sf->quarter_pixel_search = 1;
- sf->half_pixel_search = 1;
- sf->iterative_sub_pixel = 1;
- sf->optimize_coefficients = 1;
- sf->use_fastquant_for_pick = 0;
- sf->no_skip_block4x4_search = 1;
-
- sf->first_step = 0;
- sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
- sf->improved_mv_pred = 1;
-
- /* default thresholds to 0 */
- for (i = 0; i < MAX_MODES; i++)
- sf->thresh_mult[i] = 0;
-
- /* Count enabled references */
- ref_frames = 1;
- if (cpi->ref_frame_flags & VP8_LAST_FRAME)
- ref_frames++;
- if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
- ref_frames++;
- if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
- ref_frames++;
-
- /* Convert speed to continuous range, with clamping */
- if (Mode == 0)
- Speed = 0;
- else if (Mode == 2)
- Speed = RT(Speed);
- else
- {
- if (Speed > 5)
- Speed = 5;
- Speed = GOOD(Speed);
- }
-
- sf->thresh_mult[THR_ZERO1] =
- sf->thresh_mult[THR_NEAREST1] =
- sf->thresh_mult[THR_NEAR1] =
- sf->thresh_mult[THR_DC] = 0; /* always */
-
- sf->thresh_mult[THR_ZERO2] =
- sf->thresh_mult[THR_ZERO3] =
- sf->thresh_mult[THR_NEAREST2] =
- sf->thresh_mult[THR_NEAREST3] =
- sf->thresh_mult[THR_NEAR2] =
- sf->thresh_mult[THR_NEAR3] = speed_map(Speed, thresh_mult_map_znn);
-
- sf->thresh_mult[THR_V_PRED] =
- sf->thresh_mult[THR_H_PRED] = speed_map(Speed, thresh_mult_map_vhpred);
- sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
- sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
- sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
- sf->thresh_mult[THR_NEW2] =
- sf->thresh_mult[THR_NEW3] = speed_map(Speed, thresh_mult_map_new2);
- sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
- sf->thresh_mult[THR_SPLIT2] =
- sf->thresh_mult[THR_SPLIT3] = speed_map(Speed, thresh_mult_map_split2);
-
- // Special case for temporal layers.
- // Reduce the thresholds for zero/nearest/near for GOLDEN, if GOLDEN is
- // used as second reference. We don't modify thresholds for ALTREF case
- // since ALTREF is usually used as long-term reference in temporal layers.
- if ((cpi->Speed <= 6) &&
- (cpi->oxcf.number_of_layers > 1) &&
- (cpi->ref_frame_flags & VP8_LAST_FRAME) &&
- (cpi->ref_frame_flags & VP8_GOLD_FRAME)) {
- if (cpi->closest_reference_frame == GOLDEN_FRAME) {
- sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 3;
- sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 3;
- sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 3;
- } else {
- sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 1;
- sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 1;
- sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 1;
- }
- }
-
- cpi->mode_check_freq[THR_ZERO1] =
- cpi->mode_check_freq[THR_NEAREST1] =
- cpi->mode_check_freq[THR_NEAR1] =
- cpi->mode_check_freq[THR_TM] =
- cpi->mode_check_freq[THR_DC] = 0; /* always */
-
- cpi->mode_check_freq[THR_ZERO2] =
- cpi->mode_check_freq[THR_ZERO3] =
- cpi->mode_check_freq[THR_NEAREST2] =
- cpi->mode_check_freq[THR_NEAREST3] = speed_map(Speed,
- mode_check_freq_map_zn2);
-
- cpi->mode_check_freq[THR_NEAR2] =
- cpi->mode_check_freq[THR_NEAR3] = speed_map(Speed,
- mode_check_freq_map_near2);
-
- cpi->mode_check_freq[THR_V_PRED] =
- cpi->mode_check_freq[THR_H_PRED] =
- cpi->mode_check_freq[THR_B_PRED] = speed_map(Speed,
- mode_check_freq_map_vhbpred);
- cpi->mode_check_freq[THR_NEW1] = speed_map(Speed,
- mode_check_freq_map_new1);
- cpi->mode_check_freq[THR_NEW2] =
- cpi->mode_check_freq[THR_NEW3] = speed_map(Speed,
- mode_check_freq_map_new2);
- cpi->mode_check_freq[THR_SPLIT1] = speed_map(Speed,
- mode_check_freq_map_split1);
- cpi->mode_check_freq[THR_SPLIT2] =
- cpi->mode_check_freq[THR_SPLIT3] = speed_map(Speed,
- mode_check_freq_map_split2);
- Speed = cpi->Speed;
- switch (Mode)
- {
-#if !(CONFIG_REALTIME_ONLY)
- case 0: /* best quality mode */
- sf->first_step = 0;
- sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
- break;
- case 1:
- case 3:
- if (Speed > 0)
- {
- /* Disable coefficient optimization above speed 0 */
- sf->optimize_coefficients = 0;
- sf->use_fastquant_for_pick = 1;
- sf->no_skip_block4x4_search = 0;
-
- sf->first_step = 1;
- }
-
- if (Speed > 2)
- {
- sf->improved_quant = 0;
- sf->improved_dct = 0;
-
- /* Only do recode loop on key frames, golden frames and
- * alt ref frames
- */
- sf->recode_loop = 2;
-
- }
-
- if (Speed > 3)
- {
- sf->auto_filter = 1;
- sf->recode_loop = 0; /* recode loop off */
- sf->RD = 0; /* Turn rd off */
-
- }
-
- if (Speed > 4)
- {
- sf->auto_filter = 0; /* Faster selection of loop filter */
- }
-
- break;
-#endif
- case 2:
- sf->optimize_coefficients = 0;
- sf->recode_loop = 0;
- sf->auto_filter = 1;
- sf->iterative_sub_pixel = 1;
- sf->search_method = NSTEP;
-
- if (Speed > 0)
- {
- sf->improved_quant = 0;
- sf->improved_dct = 0;
-
- sf->use_fastquant_for_pick = 1;
- sf->no_skip_block4x4_search = 0;
- sf->first_step = 1;
- }
-
- if (Speed > 2)
- sf->auto_filter = 0; /* Faster selection of loop filter */
-
- if (Speed > 3)
- {
- sf->RD = 0;
- sf->auto_filter = 1;
- }
-
- if (Speed > 4)
- {
- sf->auto_filter = 0; /* Faster selection of loop filter */
- sf->search_method = HEX;
- sf->iterative_sub_pixel = 0;
- }
-
- if (Speed > 6)
- {
- unsigned int sum = 0;
- unsigned int total_mbs = cm->MBs;
- int thresh;
- unsigned int total_skip;
-
- int min = 2000;
-
- if (cpi->oxcf.encode_breakout > 2000)
- min = cpi->oxcf.encode_breakout;
-
- min >>= 7;
-
- for (i = 0; i < min; i++)
- {
- sum += cpi->mb.error_bins[i];
- }
-
- total_skip = sum;
- sum = 0;
-
- /* i starts from 2 to make sure thresh started from 2048 */
- for (; i < 1024; i++)
- {
- sum += cpi->mb.error_bins[i];
-
- if (10 * sum >= (unsigned int)(cpi->Speed - 6)*(total_mbs - total_skip))
- break;
- }
-
- i--;
- thresh = (i << 7);
-
- if (thresh < 2000)
- thresh = 2000;
-
- if (ref_frames > 1)
- {
- sf->thresh_mult[THR_NEW1 ] = thresh;
- sf->thresh_mult[THR_NEAREST1 ] = thresh >> 1;
- sf->thresh_mult[THR_NEAR1 ] = thresh >> 1;
- }
-
- if (ref_frames > 2)
- {
- sf->thresh_mult[THR_NEW2] = thresh << 1;
- sf->thresh_mult[THR_NEAREST2 ] = thresh;
- sf->thresh_mult[THR_NEAR2 ] = thresh;
- }
-
- if (ref_frames > 3)
- {
- sf->thresh_mult[THR_NEW3] = thresh << 1;
- sf->thresh_mult[THR_NEAREST3 ] = thresh;
- sf->thresh_mult[THR_NEAR3 ] = thresh;
- }
-
- sf->improved_mv_pred = 0;
- }
-
- if (Speed > 8)
- sf->quarter_pixel_search = 0;
-
- if(cm->version == 0)
- {
- cm->filter_type = NORMAL_LOOPFILTER;
-
- if (Speed >= 14)
- cm->filter_type = SIMPLE_LOOPFILTER;
- }
- else
- {
- cm->filter_type = SIMPLE_LOOPFILTER;
- }
-
- /* This has a big hit on quality. Last resort */
- if (Speed >= 15)
- sf->half_pixel_search = 0;
-
- memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
-
- }; /* switch */
-
- /* Slow quant, dct and trellis not worthwhile for first pass
- * so make sure they are always turned off.
- */
- if ( cpi->pass == 1 )
- {
- sf->improved_quant = 0;
- sf->optimize_coefficients = 0;
- sf->improved_dct = 0;
- }
-
- if (cpi->sf.search_method == NSTEP)
- {
- vp8_init3smotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
- }
- else if (cpi->sf.search_method == DIAMOND)
- {
- vp8_init_dsmotion_compensation(&cpi->mb, cm->yv12_fb[cm->lst_fb_idx].y_stride);
- }
-
- if (cpi->sf.improved_dct)
- {
- cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
- cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
- }
- else
- {
- /* No fast FDCT defined for any platform at this time. */
- cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
- cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
- }
-
- cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
-
- if (cpi->sf.improved_quant)
- {
- cpi->mb.quantize_b = vp8_regular_quantize_b;
- }
- else
- {
- cpi->mb.quantize_b = vp8_fast_quantize_b;
- }
- if (cpi->sf.improved_quant != last_improved_quant)
- vp8cx_init_quantizer(cpi);
-
- if (cpi->sf.iterative_sub_pixel == 1)
- {
- cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
- }
- else if (cpi->sf.quarter_pixel_search)
- {
- cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
- }
- else if (cpi->sf.half_pixel_search)
- {
- cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
- }
- else
- {
- cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
- }
-
- if (cpi->sf.optimize_coefficients == 1 && cpi->pass!=1)
- cpi->mb.optimize = 1;
- else
- cpi->mb.optimize = 0;
-
- if (cpi->common.full_pixel)
- cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
-
-#ifdef SPEEDSTATS
- frames_at_speed[cpi->Speed]++;
-#endif
-}
-#undef GOOD
-#undef RT
-
-static void alloc_raw_frame_buffers(VP8_COMP *cpi)
-{
-#if VP8_TEMPORAL_ALT_REF
- int width = (cpi->oxcf.Width + 15) & ~15;
- int height = (cpi->oxcf.Height + 15) & ~15;
-#endif
-
- cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
- cpi->oxcf.lag_in_frames);
- if(!cpi->lookahead)
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate lag buffers");
-
-#if VP8_TEMPORAL_ALT_REF
-
- if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
- width, height, VP8BORDERINPIXELS))
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate altref buffer");
-
-#endif
-}
-
-
-static void dealloc_raw_frame_buffers(VP8_COMP *cpi)
-{
-#if VP8_TEMPORAL_ALT_REF
- vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
-#endif
- vp8_lookahead_destroy(cpi->lookahead);
-}
-
-
-static int vp8_alloc_partition_data(VP8_COMP *cpi)
-{
- vpx_free(cpi->mb.pip);
-
- cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
- (cpi->common.mb_rows + 1),
- sizeof(PARTITION_INFO));
- if(!cpi->mb.pip)
- return 1;
-
- cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
-
- return 0;
-}
-
-void vp8_alloc_compressor_data(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = & cpi->common;
-
- int width = cm->Width;
- int height = cm->Height;
-
- if (vp8_alloc_frame_buffers(cm, width, height))
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate frame buffers");
-
- if (vp8_alloc_partition_data(cpi))
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate partition data");
-
-
- if ((width & 0xf) != 0)
- width += 16 - (width & 0xf);
-
- if ((height & 0xf) != 0)
- height += 16 - (height & 0xf);
-
-
- if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame,
- width, height, VP8BORDERINPIXELS))
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate last frame buffer");
-
- if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
- width, height, VP8BORDERINPIXELS))
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
- "Failed to allocate scaled source buffer");
-
- vpx_free(cpi->tok);
-
- {
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
-#else
- unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
-#endif
- CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
- }
-
- /* Data used for real time vc mode to see if gf needs refreshing */
- cpi->zeromv_count = 0;
-
-
- /* Structures used to monitor GF usage */
- vpx_free(cpi->gf_active_flags);
- CHECK_MEM_ERROR(cpi->gf_active_flags,
- vpx_calloc(sizeof(*cpi->gf_active_flags),
- cm->mb_rows * cm->mb_cols));
- cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
-
- vpx_free(cpi->mb_activity_map);
- CHECK_MEM_ERROR(cpi->mb_activity_map,
- vpx_calloc(sizeof(*cpi->mb_activity_map),
- cm->mb_rows * cm->mb_cols));
-
- /* allocate memory for storing last frame's MVs for MV prediction. */
- vpx_free(cpi->lfmv);
- CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
- sizeof(*cpi->lfmv)));
- vpx_free(cpi->lf_ref_frame_sign_bias);
- CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
- vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
- sizeof(*cpi->lf_ref_frame_sign_bias)));
- vpx_free(cpi->lf_ref_frame);
- CHECK_MEM_ERROR(cpi->lf_ref_frame,
- vpx_calloc((cm->mb_rows+2) * (cm->mb_cols+2),
- sizeof(*cpi->lf_ref_frame)));
-
- /* Create the encoder segmentation map and set all entries to 0 */
- vpx_free(cpi->segmentation_map);
- CHECK_MEM_ERROR(cpi->segmentation_map,
- vpx_calloc(cm->mb_rows * cm->mb_cols,
- sizeof(*cpi->segmentation_map)));
- cpi->cyclic_refresh_mode_index = 0;
- vpx_free(cpi->active_map);
- CHECK_MEM_ERROR(cpi->active_map,
- vpx_calloc(cm->mb_rows * cm->mb_cols,
- sizeof(*cpi->active_map)));
- memset(cpi->active_map , 1, (cm->mb_rows * cm->mb_cols));
-
-#if CONFIG_MULTITHREAD
- if (width < 640)
- cpi->mt_sync_range = 1;
- else if (width <= 1280)
- cpi->mt_sync_range = 4;
- else if (width <= 2560)
- cpi->mt_sync_range = 8;
- else
- cpi->mt_sync_range = 16;
-
- if (cpi->oxcf.multi_threaded > 1)
- {
- vpx_free(cpi->mt_current_mb_col);
- CHECK_MEM_ERROR(cpi->mt_current_mb_col,
- vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
- }
-
-#endif
-
- vpx_free(cpi->tplist);
- CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity > 0) {
- vp8_denoiser_free(&cpi->denoiser);
- vp8_denoiser_allocate(&cpi->denoiser, width, height,
- cm->mb_rows, cm->mb_cols,
- cpi->oxcf.noise_sensitivity);
- }
-#endif
-}
-
-
-/* Quant MOD */
-static const int q_trans[] =
-{
- 0, 1, 2, 3, 4, 5, 7, 8,
- 9, 10, 12, 13, 15, 17, 18, 19,
- 20, 21, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, 33, 35, 37, 39, 41,
- 43, 45, 47, 49, 51, 53, 55, 57,
- 59, 61, 64, 67, 70, 73, 76, 79,
- 82, 85, 88, 91, 94, 97, 100, 103,
- 106, 109, 112, 115, 118, 121, 124, 127,
-};
-
-int vp8_reverse_trans(int x)
-{
- int i;
-
- for (i = 0; i < 64; i++)
- if (q_trans[i] >= x)
- return i;
-
- return 63;
-}
-void vp8_new_framerate(VP8_COMP *cpi, double framerate)
-{
- if(framerate < .1)
- framerate = 30;
-
- cpi->framerate = framerate;
- cpi->output_framerate = framerate;
- cpi->per_frame_bandwidth = (int)(cpi->oxcf.target_bandwidth /
- cpi->output_framerate);
- cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
- cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
- cpi->oxcf.two_pass_vbrmin_section / 100);
-
- /* Set Maximum gf/arf interval */
- cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
-
- if(cpi->max_gf_interval < 12)
- cpi->max_gf_interval = 12;
-
- /* Extended interval for genuinely static scenes */
- cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
-
- /* Special conditions when altr ref frame enabled in lagged compress mode */
- if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames)
- {
- if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1)
- cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
-
- if (cpi->twopass.static_scene_max_gf_interval > cpi->oxcf.lag_in_frames - 1)
- cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
- }
-
- if ( cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval )
- cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
-}
-
-
-static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
-{
- VP8_COMMON *cm = &cpi->common;
-
- cpi->oxcf = *oxcf;
-
- cpi->auto_gold = 1;
- cpi->auto_adjust_gold_quantizer = 1;
-
- cm->version = oxcf->Version;
- vp8_setup_version(cm);
-
- /* Frame rate is not available on the first frame, as it's derived from
- * the observed timestamps. The actual value used here doesn't matter
- * too much, as it will adapt quickly.
- */
- if (oxcf->timebase.num > 0) {
- cpi->framerate = (double)(oxcf->timebase.den) /
- (double)(oxcf->timebase.num);
- } else {
- cpi->framerate = 30;
- }
-
- /* If the reciprocal of the timebase seems like a reasonable framerate,
- * then use that as a guess, otherwise use 30.
- */
- if (cpi->framerate > 180)
- cpi->framerate = 30;
-
- cpi->ref_framerate = cpi->framerate;
-
- cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
-
- cm->refresh_golden_frame = 0;
- cm->refresh_last_frame = 1;
- cm->refresh_entropy_probs = 1;
-
- /* change includes all joint functionality */
- vp8_change_config(cpi, oxcf);
-
- /* Initialize active best and worst q and average q values. */
- cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
- cpi->active_best_quality = cpi->oxcf.best_allowed_q;
- cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
-
- /* Initialise the starting buffer levels */
- cpi->buffer_level = cpi->oxcf.starting_buffer_level;
- cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
-
- cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
- cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
- cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
- cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
-
- cpi->total_actual_bits = 0;
- cpi->total_target_vs_actual = 0;
-
- /* Temporal scalabilty */
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
- double prev_layer_framerate=0;
-
- for (i=0; i<cpi->oxcf.number_of_layers; i++)
- {
- init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
- prev_layer_framerate = cpi->output_framerate /
- cpi->oxcf.rate_decimator[i];
- }
- }
-
-#if VP8_TEMPORAL_ALT_REF
- {
- int i;
-
- cpi->fixed_divide[0] = 0;
-
- for (i = 1; i < 512; i++)
- cpi->fixed_divide[i] = 0x80000 / i;
- }
-#endif
-}
-
-static void update_layer_contexts (VP8_COMP *cpi)
-{
- VP8_CONFIG *oxcf = &cpi->oxcf;
-
- /* Update snapshots of the layer contexts to reflect new parameters */
- if (oxcf->number_of_layers > 1)
- {
- unsigned int i;
- double prev_layer_framerate=0;
-
- assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
- for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i)
- {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
-
- lc->framerate =
- cpi->ref_framerate / oxcf->rate_decimator[i];
- lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
-
- lc->starting_buffer_level = rescale(
- (int)oxcf->starting_buffer_level_in_ms,
- lc->target_bandwidth, 1000);
-
- if (oxcf->optimal_buffer_level == 0)
- lc->optimal_buffer_level = lc->target_bandwidth / 8;
- else
- lc->optimal_buffer_level = rescale(
- (int)oxcf->optimal_buffer_level_in_ms,
- lc->target_bandwidth, 1000);
-
- if (oxcf->maximum_buffer_size == 0)
- lc->maximum_buffer_size = lc->target_bandwidth / 8;
- else
- lc->maximum_buffer_size = rescale(
- (int)oxcf->maximum_buffer_size_in_ms,
- lc->target_bandwidth, 1000);
-
- /* Work out the average size of a frame within this layer */
- if (i > 0)
- lc->avg_frame_size_for_layer =
- (int)((oxcf->target_bitrate[i] -
- oxcf->target_bitrate[i-1]) * 1000 /
- (lc->framerate - prev_layer_framerate));
-
- prev_layer_framerate = lc->framerate;
- }
- }
-}
-
-void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
-{
- VP8_COMMON *cm = &cpi->common;
- int last_w, last_h, prev_number_of_layers;
-
- if (!cpi)
- return;
-
- if (!oxcf)
- return;
-
-#if CONFIG_MULTITHREAD
- /* wait for the last picture loopfilter thread done */
- if (cpi->b_lpf_running)
- {
- sem_wait(&cpi->h_event_end_lpf);
- cpi->b_lpf_running = 0;
- }
-#endif
-
- if (cm->version != oxcf->Version)
- {
- cm->version = oxcf->Version;
- vp8_setup_version(cm);
- }
-
- last_w = cpi->oxcf.Width;
- last_h = cpi->oxcf.Height;
- prev_number_of_layers = cpi->oxcf.number_of_layers;
-
- cpi->oxcf = *oxcf;
-
- switch (cpi->oxcf.Mode)
- {
-
- case MODE_REALTIME:
- cpi->pass = 0;
- cpi->compressor_speed = 2;
-
- if (cpi->oxcf.cpu_used < -16)
- {
- cpi->oxcf.cpu_used = -16;
- }
-
- if (cpi->oxcf.cpu_used > 16)
- cpi->oxcf.cpu_used = 16;
-
- break;
-
- case MODE_GOODQUALITY:
- cpi->pass = 0;
- cpi->compressor_speed = 1;
-
- if (cpi->oxcf.cpu_used < -5)
- {
- cpi->oxcf.cpu_used = -5;
- }
-
- if (cpi->oxcf.cpu_used > 5)
- cpi->oxcf.cpu_used = 5;
-
- break;
-
- case MODE_BESTQUALITY:
- cpi->pass = 0;
- cpi->compressor_speed = 0;
- break;
-
- case MODE_FIRSTPASS:
- cpi->pass = 1;
- cpi->compressor_speed = 1;
- break;
- case MODE_SECONDPASS:
- cpi->pass = 2;
- cpi->compressor_speed = 1;
-
- if (cpi->oxcf.cpu_used < -5)
- {
- cpi->oxcf.cpu_used = -5;
- }
-
- if (cpi->oxcf.cpu_used > 5)
- cpi->oxcf.cpu_used = 5;
-
- break;
- case MODE_SECONDPASS_BEST:
- cpi->pass = 2;
- cpi->compressor_speed = 0;
- break;
- }
-
- if (cpi->pass == 0)
- cpi->auto_worst_q = 1;
-
- cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
- cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
- cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
-
- if (oxcf->fixed_q >= 0)
- {
- if (oxcf->worst_allowed_q < 0)
- cpi->oxcf.fixed_q = q_trans[0];
- else
- cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
-
- if (oxcf->alt_q < 0)
- cpi->oxcf.alt_q = q_trans[0];
- else
- cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
-
- if (oxcf->key_q < 0)
- cpi->oxcf.key_q = q_trans[0];
- else
- cpi->oxcf.key_q = q_trans[oxcf->key_q];
-
- if (oxcf->gold_q < 0)
- cpi->oxcf.gold_q = q_trans[0];
- else
- cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
-
- }
-
- cpi->baseline_gf_interval =
- cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
-
-#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- cpi->oxcf.token_partitions = 3;
-#endif
-
- if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3)
- cm->multi_token_partition =
- (TOKEN_PARTITION) cpi->oxcf.token_partitions;
-
- setup_features(cpi);
-
- {
- int i;
-
- for (i = 0; i < MAX_MB_SEGMENTS; i++)
- cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
- }
-
- /* At the moment the first order values may not be > MAXQ */
- if (cpi->oxcf.fixed_q > MAXQ)
- cpi->oxcf.fixed_q = MAXQ;
-
- /* local file playback mode == really big buffer */
- if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK)
- {
- cpi->oxcf.starting_buffer_level = 60000;
- cpi->oxcf.optimal_buffer_level = 60000;
- cpi->oxcf.maximum_buffer_size = 240000;
- cpi->oxcf.starting_buffer_level_in_ms = 60000;
- cpi->oxcf.optimal_buffer_level_in_ms = 60000;
- cpi->oxcf.maximum_buffer_size_in_ms = 240000;
- }
-
- /* Convert target bandwidth from Kbit/s to Bit/s */
- cpi->oxcf.target_bandwidth *= 1000;
-
- cpi->oxcf.starting_buffer_level =
- rescale((int)cpi->oxcf.starting_buffer_level,
- cpi->oxcf.target_bandwidth, 1000);
-
- /* Set or reset optimal and maximum buffer levels. */
- if (cpi->oxcf.optimal_buffer_level == 0)
- cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
- else
- cpi->oxcf.optimal_buffer_level =
- rescale((int)cpi->oxcf.optimal_buffer_level,
- cpi->oxcf.target_bandwidth, 1000);
-
- if (cpi->oxcf.maximum_buffer_size == 0)
- cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
- else
- cpi->oxcf.maximum_buffer_size =
- rescale((int)cpi->oxcf.maximum_buffer_size,
- cpi->oxcf.target_bandwidth, 1000);
- // Under a configuration change, where maximum_buffer_size may change,
- // keep buffer level clipped to the maximum allowed buffer size.
- if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
- cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
- cpi->buffer_level = cpi->bits_off_target;
- }
-
- /* Set up frame rate and related parameters rate control values. */
- vp8_new_framerate(cpi, cpi->framerate);
-
- /* Set absolute upper and lower quality limits */
- cpi->worst_quality = cpi->oxcf.worst_allowed_q;
- cpi->best_quality = cpi->oxcf.best_allowed_q;
-
- /* active values should only be modified if out of new range */
- if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q)
- {
- cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
- }
- /* less likely */
- else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q)
- {
- cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
- }
- if (cpi->active_best_quality < cpi->oxcf.best_allowed_q)
- {
- cpi->active_best_quality = cpi->oxcf.best_allowed_q;
- }
- /* less likely */
- else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q)
- {
- cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
- }
-
- cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
-
- cpi->cq_target_quality = cpi->oxcf.cq_level;
-
- /* Only allow dropped frames in buffered mode */
- cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
-
- cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
-
- // Check if the number of temporal layers has changed, and if so reset the
- // pattern counter and set/initialize the temporal layer context for the
- // new layer configuration.
- if (cpi->oxcf.number_of_layers != prev_number_of_layers)
- {
- // If the number of temporal layers are changed we must start at the
- // base of the pattern cycle, so set the layer id to 0 and reset
- // the temporal pattern counter.
- if (cpi->temporal_layer_id > 0) {
- cpi->temporal_layer_id = 0;
- }
- cpi->temporal_pattern_counter = 0;
- reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
- }
-
- if (!cpi->initial_width)
- {
- cpi->initial_width = cpi->oxcf.Width;
- cpi->initial_height = cpi->oxcf.Height;
- }
-
- cm->Width = cpi->oxcf.Width;
- cm->Height = cpi->oxcf.Height;
- assert(cm->Width <= cpi->initial_width);
- assert(cm->Height <= cpi->initial_height);
-
- /* TODO(jkoleszar): if an internal spatial resampling is active,
- * and we downsize the input image, maybe we should clear the
- * internal scale immediately rather than waiting for it to
- * correct.
- */
-
- /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
- if (cpi->oxcf.Sharpness > 7)
- cpi->oxcf.Sharpness = 7;
-
- cm->sharpness_level = cpi->oxcf.Sharpness;
-
- if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL)
- {
- int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
- int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
-
- Scale2Ratio(cm->horiz_scale, &hr, &hs);
- Scale2Ratio(cm->vert_scale, &vr, &vs);
-
- /* always go to the next whole number */
- cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
- cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
- }
-
- if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height)
- cpi->force_next_frame_intra = 1;
-
- if (((cm->Width + 15) & 0xfffffff0) !=
- cm->yv12_fb[cm->lst_fb_idx].y_width ||
- ((cm->Height + 15) & 0xfffffff0) !=
- cm->yv12_fb[cm->lst_fb_idx].y_height ||
- cm->yv12_fb[cm->lst_fb_idx].y_width == 0)
- {
- dealloc_raw_frame_buffers(cpi);
- alloc_raw_frame_buffers(cpi);
- vp8_alloc_compressor_data(cpi);
- }
-
- if (cpi->oxcf.fixed_q >= 0)
- {
- cpi->last_q[0] = cpi->oxcf.fixed_q;
- cpi->last_q[1] = cpi->oxcf.fixed_q;
- }
-
- cpi->Speed = cpi->oxcf.cpu_used;
-
- /* force to allowlag to 0 if lag_in_frames is 0; */
- if (cpi->oxcf.lag_in_frames == 0)
- {
- cpi->oxcf.allow_lag = 0;
- }
- /* Limit on lag buffers as these are not currently dynamically allocated */
- else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
- cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
-
- /* YX Temp */
- cpi->alt_ref_source = NULL;
- cpi->is_src_frame_alt_ref = 0;
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc)
- {
- int width = (cpi->oxcf.Width + 15) & ~15;
- int height = (cpi->oxcf.Height + 15) & ~15;
- vp8_denoiser_allocate(&cpi->denoiser, width, height,
- cm->mb_rows, cm->mb_cols,
- cpi->oxcf.noise_sensitivity);
- }
- }
-#endif
-
-#if 0
- /* Experimental RD Code */
- cpi->frame_distortion = 0;
- cpi->last_frame_distortion = 0;
-#endif
-
-}
-
-#ifndef M_LOG2_E
-#define M_LOG2_E 0.693147180559945309417
-#endif
-#define log2f(x) (log (x) / (float) M_LOG2_E)
-
-static void cal_mvsadcosts(int *mvsadcost[2])
-{
- int i = 1;
-
- mvsadcost [0] [0] = 300;
- mvsadcost [1] [0] = 300;
-
- do
- {
- double z = 256 * (2 * (log2f(8 * i) + .6));
- mvsadcost [0][i] = (int) z;
- mvsadcost [1][i] = (int) z;
- mvsadcost [0][-i] = (int) z;
- mvsadcost [1][-i] = (int) z;
- }
- while (++i <= mvfp_max);
-}
-
-struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
-{
- int i;
-
- VP8_COMP *cpi;
- VP8_COMMON *cm;
-
- cpi = vpx_memalign(32, sizeof(VP8_COMP));
- /* Check that the CPI instance is valid */
- if (!cpi)
- return 0;
-
- cm = &cpi->common;
-
- memset(cpi, 0, sizeof(VP8_COMP));
-
- if (setjmp(cm->error.jmp))
- {
- cpi->common.error.setjmp = 0;
- vp8_remove_compressor(&cpi);
- return 0;
- }
-
- cpi->common.error.setjmp = 1;
-
- CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site), (MAX_MVSEARCH_STEPS * 8) + 1));
-
- vp8_create_common(&cpi->common);
-
- init_config(cpi, oxcf);
-
- memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob, sizeof(vp8cx_base_skip_false_prob));
- cpi->common.current_video_frame = 0;
- cpi->temporal_pattern_counter = 0;
- cpi->temporal_layer_id = -1;
- cpi->kf_overspend_bits = 0;
- cpi->kf_bitrate_adjustment = 0;
- cpi->frames_till_gf_update_due = 0;
- cpi->gf_overspend_bits = 0;
- cpi->non_gf_bitrate_adjustment = 0;
- cpi->prob_last_coded = 128;
- cpi->prob_gf_coded = 128;
- cpi->prob_intra_coded = 63;
-
- /* Prime the recent reference frame usage counters.
- * Hereafter they will be maintained as a sort of moving average
- */
- cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
- cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
- cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
- cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
-
- /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
- cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
-
- cpi->twopass.gf_decay_rate = 0;
- cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
-
- cpi->gold_is_last = 0 ;
- cpi->alt_is_last = 0 ;
- cpi->gold_is_alt = 0 ;
-
- cpi->active_map_enabled = 0;
-
-#if 0
- /* Experimental code for lagged and one pass */
- /* Initialise one_pass GF frames stats */
- /* Update stats used for GF selection */
- if (cpi->pass == 0)
- {
- cpi->one_pass_frame_index = 0;
-
- for (i = 0; i < MAX_LAG_BUFFERS; i++)
- {
- cpi->one_pass_frame_stats[i].frames_so_far = 0;
- cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
- cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
- cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
- cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
- cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
- cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
- cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
- cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
- }
- }
-#endif
-
- cpi->mse_source_denoised = 0;
-
- /* Should we use the cyclic refresh method.
- * Currently this is tied to error resilliant mode
- */
- cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
- cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
- if (cpi->oxcf.number_of_layers == 1) {
- cpi->cyclic_refresh_mode_max_mbs_perframe =
- (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
- } else if (cpi->oxcf.number_of_layers == 2) {
- cpi->cyclic_refresh_mode_max_mbs_perframe =
- (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
- }
- cpi->cyclic_refresh_mode_index = 0;
- cpi->cyclic_refresh_q = 32;
-
- if (cpi->cyclic_refresh_mode_enabled)
- {
- CHECK_MEM_ERROR(cpi->cyclic_refresh_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
- }
- else
- cpi->cyclic_refresh_map = (signed char *) NULL;
-
- CHECK_MEM_ERROR(cpi->consec_zero_last,
- vpx_calloc(cm->mb_rows * cm->mb_cols, 1));
- CHECK_MEM_ERROR(cpi->consec_zero_last_mvbias,
- vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
-
-#ifdef VP8_ENTROPY_STATS
- init_context_counters();
-#endif
-
- /*Initialize the feed-forward activity masking.*/
- cpi->activity_avg = 90<<12;
-
- /* Give a sensible default for the first frame. */
- cpi->frames_since_key = 8;
- cpi->key_frame_frequency = cpi->oxcf.key_freq;
- cpi->this_key_frame_forced = 0;
- cpi->next_key_frame_forced = 0;
-
- cpi->source_alt_ref_pending = 0;
- cpi->source_alt_ref_active = 0;
- cpi->common.refresh_alt_ref_frame = 0;
-
- cpi->force_maxqp = 0;
-
- cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
-#if CONFIG_INTERNAL_STATS
- cpi->b_calculate_ssimg = 0;
-
- cpi->count = 0;
- cpi->bytes = 0;
-
- if (cpi->b_calculate_psnr)
- {
- cpi->total_sq_error = 0.0;
- cpi->total_sq_error2 = 0.0;
- cpi->total_y = 0.0;
- cpi->total_u = 0.0;
- cpi->total_v = 0.0;
- cpi->total = 0.0;
- cpi->totalp_y = 0.0;
- cpi->totalp_u = 0.0;
- cpi->totalp_v = 0.0;
- cpi->totalp = 0.0;
- cpi->tot_recode_hits = 0;
- cpi->summed_quality = 0;
- cpi->summed_weights = 0;
- }
-
- if (cpi->b_calculate_ssimg)
- {
- cpi->total_ssimg_y = 0;
- cpi->total_ssimg_u = 0;
- cpi->total_ssimg_v = 0;
- cpi->total_ssimg_all = 0;
- }
-
-#endif
-
- cpi->first_time_stamp_ever = 0x7FFFFFFF;
-
- cpi->frames_till_gf_update_due = 0;
- cpi->key_frame_count = 1;
-
- cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
- cpi->ni_tot_qi = 0;
- cpi->ni_frames = 0;
- cpi->total_byte_count = 0;
-
- cpi->drop_frame = 0;
-
- cpi->rate_correction_factor = 1.0;
- cpi->key_frame_rate_correction_factor = 1.0;
- cpi->gf_rate_correction_factor = 1.0;
- cpi->twopass.est_max_qcorrection_factor = 1.0;
-
- for (i = 0; i < KEY_FRAME_CONTEXT; i++)
- {
- cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
- }
-
-#ifdef OUTPUT_YUV_SRC
- yuv_file = fopen("bd.yuv", "ab");
-#endif
-#ifdef OUTPUT_YUV_DENOISED
- yuv_denoised_file = fopen("denoised.yuv", "ab");
-#endif
-
-#if 0
- framepsnr = fopen("framepsnr.stt", "a");
- kf_list = fopen("kf_list.stt", "w");
-#endif
-
- cpi->output_pkt_list = oxcf->output_pkt_list;
-
-#if !(CONFIG_REALTIME_ONLY)
-
- if (cpi->pass == 1)
- {
- vp8_init_first_pass(cpi);
- }
- else if (cpi->pass == 2)
- {
- size_t packet_sz = sizeof(FIRSTPASS_STATS);
- int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
-
- cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
- cpi->twopass.stats_in = cpi->twopass.stats_in_start;
- cpi->twopass.stats_in_end = (void*)((char *)cpi->twopass.stats_in
- + (packets - 1) * packet_sz);
- vp8_init_second_pass(cpi);
- }
-
-#endif
-
- if (cpi->compressor_speed == 2)
- {
- cpi->avg_encode_time = 0;
- cpi->avg_pick_mode_time = 0;
- }
-
- vp8_set_speed_features(cpi);
-
- /* Set starting values of RD threshold multipliers (128 = *1) */
- for (i = 0; i < MAX_MODES; i++)
- {
- cpi->mb.rd_thresh_mult[i] = 128;
- }
-
-#ifdef VP8_ENTROPY_STATS
- init_mv_ref_counts();
-#endif
-
-#if CONFIG_MULTITHREAD
- if(vp8cx_create_encoder_threads(cpi))
- {
- vp8_remove_compressor(&cpi);
- return 0;
- }
-#endif
-
- cpi->fn_ptr[BLOCK_16X16].sdf = vpx_sad16x16;
- cpi->fn_ptr[BLOCK_16X16].vf = vpx_variance16x16;
- cpi->fn_ptr[BLOCK_16X16].svf = vp8_sub_pixel_variance16x16;
- cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h = vp8_variance_halfpixvar16x16_h;
- cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v = vp8_variance_halfpixvar16x16_v;
- cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = vp8_variance_halfpixvar16x16_hv;
- cpi->fn_ptr[BLOCK_16X16].sdx3f = vpx_sad16x16x3;
- cpi->fn_ptr[BLOCK_16X16].sdx8f = vpx_sad16x16x8;
- cpi->fn_ptr[BLOCK_16X16].sdx4df = vpx_sad16x16x4d;
-
- cpi->fn_ptr[BLOCK_16X8].sdf = vpx_sad16x8;
- cpi->fn_ptr[BLOCK_16X8].vf = vpx_variance16x8;
- cpi->fn_ptr[BLOCK_16X8].svf = vp8_sub_pixel_variance16x8;
- cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h = NULL;
- cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v = NULL;
- cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
- cpi->fn_ptr[BLOCK_16X8].sdx3f = vpx_sad16x8x3;
- cpi->fn_ptr[BLOCK_16X8].sdx8f = vpx_sad16x8x8;
- cpi->fn_ptr[BLOCK_16X8].sdx4df = vpx_sad16x8x4d;
-
- cpi->fn_ptr[BLOCK_8X16].sdf = vpx_sad8x16;
- cpi->fn_ptr[BLOCK_8X16].vf = vpx_variance8x16;
- cpi->fn_ptr[BLOCK_8X16].svf = vp8_sub_pixel_variance8x16;
- cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h = NULL;
- cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v = NULL;
- cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
- cpi->fn_ptr[BLOCK_8X16].sdx3f = vpx_sad8x16x3;
- cpi->fn_ptr[BLOCK_8X16].sdx8f = vpx_sad8x16x8;
- cpi->fn_ptr[BLOCK_8X16].sdx4df = vpx_sad8x16x4d;
-
- cpi->fn_ptr[BLOCK_8X8].sdf = vpx_sad8x8;
- cpi->fn_ptr[BLOCK_8X8].vf = vpx_variance8x8;
- cpi->fn_ptr[BLOCK_8X8].svf = vp8_sub_pixel_variance8x8;
- cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h = NULL;
- cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v = NULL;
- cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
- cpi->fn_ptr[BLOCK_8X8].sdx3f = vpx_sad8x8x3;
- cpi->fn_ptr[BLOCK_8X8].sdx8f = vpx_sad8x8x8;
- cpi->fn_ptr[BLOCK_8X8].sdx4df = vpx_sad8x8x4d;
-
- cpi->fn_ptr[BLOCK_4X4].sdf = vpx_sad4x4;
- cpi->fn_ptr[BLOCK_4X4].vf = vpx_variance4x4;
- cpi->fn_ptr[BLOCK_4X4].svf = vp8_sub_pixel_variance4x4;
- cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h = NULL;
- cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v = NULL;
- cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
- cpi->fn_ptr[BLOCK_4X4].sdx3f = vpx_sad4x4x3;
- cpi->fn_ptr[BLOCK_4X4].sdx8f = vpx_sad4x4x8;
- cpi->fn_ptr[BLOCK_4X4].sdx4df = vpx_sad4x4x4d;
-
-#if ARCH_X86 || ARCH_X86_64
- cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
- cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
- cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
- cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
- cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
-#endif
-
- cpi->full_search_sad = vp8_full_search_sad;
- cpi->diamond_search_sad = vp8_diamond_search_sad;
- cpi->refining_search_sad = vp8_refining_search_sad;
-
- /* make sure frame 1 is okay */
- cpi->mb.error_bins[0] = cpi->common.MBs;
-
- /* vp8cx_init_quantizer() is first called here. Add check in
- * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
- * called later when needed. This will avoid unnecessary calls of
- * vp8cx_init_quantizer() for every frame.
- */
- vp8cx_init_quantizer(cpi);
-
- vp8_loop_filter_init(cm);
-
- cpi->common.error.setjmp = 0;
-
-#if CONFIG_MULTI_RES_ENCODING
-
- /* Calculate # of MBs in a row in lower-resolution level image. */
- if (cpi->oxcf.mr_encoder_id > 0)
- vp8_cal_low_res_mb_cols(cpi);
-
-#endif
-
- /* setup RD costs to MACROBLOCK struct */
-
- cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max+1];
- cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max+1];
- cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max+1];
- cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max+1];
-
- cal_mvsadcosts(cpi->mb.mvsadcost);
-
- cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
- cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
- cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
- cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
- cpi->mb.token_costs = cpi->rd_costs.token_costs;
-
- /* setup block ptrs & offsets */
- vp8_setup_block_ptrs(&cpi->mb);
- vp8_setup_block_dptrs(&cpi->mb.e_mbd);
-
- return cpi;
-}
-
-
-void vp8_remove_compressor(VP8_COMP **ptr)
-{
- VP8_COMP *cpi = *ptr;
-
- if (!cpi)
- return;
-
- if (cpi && (cpi->common.current_video_frame > 0))
- {
-#if !(CONFIG_REALTIME_ONLY)
-
- if (cpi->pass == 2)
- {
- vp8_end_second_pass(cpi);
- }
-
-#endif
-
-#ifdef VP8_ENTROPY_STATS
- print_context_counters();
- print_tree_update_probs();
- print_mode_context();
-#endif
-
-#if CONFIG_INTERNAL_STATS
-
- if (cpi->pass != 1)
- {
- FILE *f = fopen("opsnr.stt", "a");
- double time_encoded = (cpi->last_end_time_stamp_seen
- - cpi->first_time_stamp_ever) / 10000000.000;
- double total_encode_time = (cpi->time_receive_data +
- cpi->time_compress_data) / 1000.000;
- double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
-
- if (cpi->b_calculate_psnr)
- {
- if (cpi->oxcf.number_of_layers > 1)
- {
- int i;
-
- fprintf(f, "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
- "GLPsnrP\tVPXSSIM\t\n");
- for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
- {
- double dr = (double)cpi->bytes_in_layer[i] *
- 8.0 / 1000.0 / time_encoded;
- double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
- cpi->common.Width * cpi->common.Height;
- double total_psnr =
- vpx_sse_to_psnr(samples, 255.0,
- cpi->total_error2[i]);
- double total_psnr2 =
- vpx_sse_to_psnr(samples, 255.0,
- cpi->total_error2_p[i]);
- double total_ssim = 100 * pow(cpi->sum_ssim[i] /
- cpi->sum_weights[i], 8.0);
-
- fprintf(f, "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
- "%7.3f\t%7.3f\n",
- i, dr,
- cpi->sum_psnr[i] / cpi->frames_in_layer[i],
- total_psnr,
- cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
- total_psnr2, total_ssim);
- }
- }
- else
- {
- double samples = 3.0 / 2 * cpi->count *
- cpi->common.Width * cpi->common.Height;
- double total_psnr = vpx_sse_to_psnr(samples, 255.0,
- cpi->total_sq_error);
- double total_psnr2 = vpx_sse_to_psnr(samples, 255.0,
- cpi->total_sq_error2);
- double total_ssim = 100 * pow(cpi->summed_quality /
- cpi->summed_weights, 8.0);
-
- fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
- "GLPsnrP\tVPXSSIM\t Time(us)\n");
- fprintf(f, "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
- "%7.3f\t%8.0f\n",
- dr, cpi->total / cpi->count, total_psnr,
- cpi->totalp / cpi->count, total_psnr2,
- total_ssim, total_encode_time);
- }
- }
-
- if (cpi->b_calculate_ssimg)
- {
- if (cpi->oxcf.number_of_layers > 1)
- {
- int i;
-
- fprintf(f, "Layer\tBitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
- "Time(us)\n");
- for (i=0; i<(int)cpi->oxcf.number_of_layers; i++)
- {
- double dr = (double)cpi->bytes_in_layer[i] *
- 8.0 / 1000.0 / time_encoded;
- fprintf(f, "%5d\t%7.3f\t%6.4f\t"
- "%6.4f\t%6.4f\t%6.4f\t%8.0f\n",
- i, dr,
- cpi->total_ssimg_y_in_layer[i] /
- cpi->frames_in_layer[i],
- cpi->total_ssimg_u_in_layer[i] /
- cpi->frames_in_layer[i],
- cpi->total_ssimg_v_in_layer[i] /
- cpi->frames_in_layer[i],
- cpi->total_ssimg_all_in_layer[i] /
- cpi->frames_in_layer[i],
- total_encode_time);
- }
- }
- else
- {
- fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t"
- "Time(us)\n");
- fprintf(f, "%7.3f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
- cpi->total_ssimg_y / cpi->count,
- cpi->total_ssimg_u / cpi->count,
- cpi->total_ssimg_v / cpi->count,
- cpi->total_ssimg_all / cpi->count, total_encode_time);
- }
- }
-
- fclose(f);
-#if 0
- f = fopen("qskip.stt", "a");
- fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
- fclose(f);
-#endif
-
- }
-
-#endif
-
-
-#ifdef SPEEDSTATS
-
- if (cpi->compressor_speed == 2)
- {
- int i;
- FILE *f = fopen("cxspeed.stt", "a");
- cnt_pm /= cpi->common.MBs;
-
- for (i = 0; i < 16; i++)
- fprintf(f, "%5d", frames_at_speed[i]);
-
- fprintf(f, "\n");
- fclose(f);
- }
-
-#endif
-
-
-#ifdef MODE_STATS
- {
- extern int count_mb_seg[4];
- FILE *f = fopen("modes.stt", "a");
- double dr = (double)cpi->framerate * (double)bytes * (double)8 / (double)count / (double)1000 ;
- fprintf(f, "intra_mode in Intra Frames:\n");
- fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1], y_modes[2], y_modes[3], y_modes[4]);
- fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1], uv_modes[2], uv_modes[3]);
- fprintf(f, "B: ");
- {
- int i;
-
- for (i = 0; i < 10; i++)
- fprintf(f, "%8d, ", b_modes[i]);
-
- fprintf(f, "\n");
-
- }
-
- fprintf(f, "Modes in Inter Frames:\n");
- fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
- inter_y_modes[0], inter_y_modes[1], inter_y_modes[2], inter_y_modes[3], inter_y_modes[4],
- inter_y_modes[5], inter_y_modes[6], inter_y_modes[7], inter_y_modes[8], inter_y_modes[9]);
- fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0], inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
- fprintf(f, "B: ");
- {
- int i;
-
- for (i = 0; i < 15; i++)
- fprintf(f, "%8d, ", inter_b_modes[i]);
-
- fprintf(f, "\n");
-
- }
- fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1], count_mb_seg[2], count_mb_seg[3]);
- fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4], inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4], inter_b_modes[NEW4X4]);
-
-
-
- fclose(f);
- }
-#endif
-
-#ifdef VP8_ENTROPY_STATS
- {
- int i, j, k;
- FILE *fmode = fopen("modecontext.c", "w");
-
- fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
- fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
- fprintf(fmode, "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
-
- for (i = 0; i < 10; i++)
- {
-
- fprintf(fmode, " { /* Above Mode : %d */\n", i);
-
- for (j = 0; j < 10; j++)
- {
-
- fprintf(fmode, " {");
-
- for (k = 0; k < 10; k++)
- {
- if (!intra_mode_stats[i][j][k])
- fprintf(fmode, " %5d, ", 1);
- else
- fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
- }
-
- fprintf(fmode, "}, /* left_mode %d */\n", j);
-
- }
-
- fprintf(fmode, " },\n");
-
- }
-
- fprintf(fmode, "};\n");
- fclose(fmode);
- }
-#endif
-
-
-#if defined(SECTIONBITS_OUTPUT)
-
- if (0)
- {
- int i;
- FILE *f = fopen("tokenbits.stt", "a");
-
- for (i = 0; i < 28; i++)
- fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
-
- fprintf(f, "\n");
- fclose(f);
- }
-
-#endif
-
-#if 0
- {
- printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
- printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
- printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, cpi->time_receive_data / 1000, cpi->time_encode_mb_row / 1000, cpi->time_compress_data / 1000, (cpi->time_receive_data + cpi->time_compress_data) / 1000);
- }
-#endif
-
- }
-
-#if CONFIG_MULTITHREAD
- vp8cx_remove_encoder_threads(cpi);
-#endif
-
-#if CONFIG_TEMPORAL_DENOISING
- vp8_denoiser_free(&cpi->denoiser);
-#endif
- dealloc_compressor_data(cpi);
- vpx_free(cpi->mb.ss);
- vpx_free(cpi->tok);
- vpx_free(cpi->cyclic_refresh_map);
- vpx_free(cpi->consec_zero_last);
- vpx_free(cpi->consec_zero_last_mvbias);
-
- vp8_remove_common(&cpi->common);
- vpx_free(cpi);
- *ptr = 0;
-
-#ifdef OUTPUT_YUV_SRC
- fclose(yuv_file);
-#endif
-#ifdef OUTPUT_YUV_DENOISED
- fclose(yuv_denoised_file);
-#endif
-
-#if 0
-
- if (keyfile)
- fclose(keyfile);
-
- if (framepsnr)
- fclose(framepsnr);
-
- if (kf_list)
- fclose(kf_list);
-
-#endif
-
-}
-
-
-static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
- unsigned char *recon, int recon_stride,
- unsigned int cols, unsigned int rows)
-{
- unsigned int row, col;
- uint64_t total_sse = 0;
- int diff;
-
- for (row = 0; row + 16 <= rows; row += 16)
- {
- for (col = 0; col + 16 <= cols; col += 16)
- {
- unsigned int sse;
-
- vpx_mse16x16(orig + col, orig_stride,
- recon + col, recon_stride,
- &sse);
- total_sse += sse;
- }
-
- /* Handle odd-sized width */
- if (col < cols)
- {
- unsigned int border_row, border_col;
- unsigned char *border_orig = orig;
- unsigned char *border_recon = recon;
-
- for (border_row = 0; border_row < 16; border_row++)
- {
- for (border_col = col; border_col < cols; border_col++)
- {
- diff = border_orig[border_col] - border_recon[border_col];
- total_sse += diff * diff;
- }
-
- border_orig += orig_stride;
- border_recon += recon_stride;
- }
- }
-
- orig += orig_stride * 16;
- recon += recon_stride * 16;
- }
-
- /* Handle odd-sized height */
- for (; row < rows; row++)
- {
- for (col = 0; col < cols; col++)
- {
- diff = orig[col] - recon[col];
- total_sse += diff * diff;
- }
-
- orig += orig_stride;
- recon += recon_stride;
- }
-
- vp8_clear_system_state();
- return total_sse;
-}
-
-
-static void generate_psnr_packet(VP8_COMP *cpi)
-{
- YV12_BUFFER_CONFIG *orig = cpi->Source;
- YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
- struct vpx_codec_cx_pkt pkt;
- uint64_t sse;
- int i;
- unsigned int width = cpi->common.Width;
- unsigned int height = cpi->common.Height;
-
- pkt.kind = VPX_CODEC_PSNR_PKT;
- sse = calc_plane_error(orig->y_buffer, orig->y_stride,
- recon->y_buffer, recon->y_stride,
- width, height);
- pkt.data.psnr.sse[0] = sse;
- pkt.data.psnr.sse[1] = sse;
- pkt.data.psnr.samples[0] = width * height;
- pkt.data.psnr.samples[1] = width * height;
-
- width = (width + 1) / 2;
- height = (height + 1) / 2;
-
- sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
- recon->u_buffer, recon->uv_stride,
- width, height);
- pkt.data.psnr.sse[0] += sse;
- pkt.data.psnr.sse[2] = sse;
- pkt.data.psnr.samples[0] += width * height;
- pkt.data.psnr.samples[2] = width * height;
-
- sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
- recon->v_buffer, recon->uv_stride,
- width, height);
- pkt.data.psnr.sse[0] += sse;
- pkt.data.psnr.sse[3] = sse;
- pkt.data.psnr.samples[0] += width * height;
- pkt.data.psnr.samples[3] = width * height;
-
- for (i = 0; i < 4; i++)
- pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
- (double)(pkt.data.psnr.sse[i]));
-
- vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
-}
-
-
-int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags)
-{
- if (ref_frame_flags > 7)
- return -1 ;
-
- cpi->ref_frame_flags = ref_frame_flags;
- return 0;
-}
-int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags)
-{
- if (ref_frame_flags > 7)
- return -1 ;
-
- cpi->common.refresh_golden_frame = 0;
- cpi->common.refresh_alt_ref_frame = 0;
- cpi->common.refresh_last_frame = 0;
-
- if (ref_frame_flags & VP8_LAST_FRAME)
- cpi->common.refresh_last_frame = 1;
-
- if (ref_frame_flags & VP8_GOLD_FRAME)
- cpi->common.refresh_golden_frame = 1;
-
- if (ref_frame_flags & VP8_ALTR_FRAME)
- cpi->common.refresh_alt_ref_frame = 1;
-
- return 0;
-}
-
-int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
-{
- VP8_COMMON *cm = &cpi->common;
- int ref_fb_idx;
-
- if (ref_frame_flag == VP8_LAST_FRAME)
- ref_fb_idx = cm->lst_fb_idx;
- else if (ref_frame_flag == VP8_GOLD_FRAME)
- ref_fb_idx = cm->gld_fb_idx;
- else if (ref_frame_flag == VP8_ALTR_FRAME)
- ref_fb_idx = cm->alt_fb_idx;
- else
- return -1;
-
- vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
-
- return 0;
-}
-int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag, YV12_BUFFER_CONFIG *sd)
-{
- VP8_COMMON *cm = &cpi->common;
-
- int ref_fb_idx;
-
- if (ref_frame_flag == VP8_LAST_FRAME)
- ref_fb_idx = cm->lst_fb_idx;
- else if (ref_frame_flag == VP8_GOLD_FRAME)
- ref_fb_idx = cm->gld_fb_idx;
- else if (ref_frame_flag == VP8_ALTR_FRAME)
- ref_fb_idx = cm->alt_fb_idx;
- else
- return -1;
-
- vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
-
- return 0;
-}
-int vp8_update_entropy(VP8_COMP *cpi, int update)
-{
- VP8_COMMON *cm = &cpi->common;
- cm->refresh_entropy_probs = update;
-
- return 0;
-}
-
-
-#if defined(OUTPUT_YUV_SRC) || defined(OUTPUT_YUV_DENOISED)
-void vp8_write_yuv_frame(FILE *yuv_file, YV12_BUFFER_CONFIG *s)
-{
- unsigned char *src = s->y_buffer;
- int h = s->y_height;
-
- do
- {
- fwrite(src, s->y_width, 1, yuv_file);
- src += s->y_stride;
- }
- while (--h);
-
- src = s->u_buffer;
- h = s->uv_height;
-
- do
- {
- fwrite(src, s->uv_width, 1, yuv_file);
- src += s->uv_stride;
- }
- while (--h);
-
- src = s->v_buffer;
- h = s->uv_height;
-
- do
- {
- fwrite(src, s->uv_width, 1, yuv_file);
- src += s->uv_stride;
- }
- while (--h);
-}
-#endif
-
-static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- /* are we resizing the image */
- if (cm->horiz_scale != 0 || cm->vert_scale != 0)
- {
-#if CONFIG_SPATIAL_RESAMPLING
- int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
- int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
- int tmp_height;
-
- if (cm->vert_scale == 3)
- tmp_height = 9;
- else
- tmp_height = 11;
-
- Scale2Ratio(cm->horiz_scale, &hr, &hs);
- Scale2Ratio(cm->vert_scale, &vr, &vs);
-
- vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
- tmp_height, hs, hr, vs, vr, 0);
-
- vp8_yv12_extend_frame_borders(&cpi->scaled_source);
- cpi->Source = &cpi->scaled_source;
-#endif
- }
- else
- cpi->Source = sd;
-}
-
-
-static int resize_key_frame(VP8_COMP *cpi)
-{
-#if CONFIG_SPATIAL_RESAMPLING
- VP8_COMMON *cm = &cpi->common;
-
- /* Do we need to apply resampling for one pass cbr.
- * In one pass this is more limited than in two pass cbr.
- * The test and any change is only made once per key frame sequence.
- */
- if (cpi->oxcf.allow_spatial_resampling && (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
- {
- int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
- int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
- int new_width, new_height;
-
- /* If we are below the resample DOWN watermark then scale down a
- * notch.
- */
- if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100))
- {
- cm->horiz_scale = (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
- cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
- }
- /* Should we now start scaling back up */
- else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))
- {
- cm->horiz_scale = (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
- cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
- }
-
- /* Get the new height and width */
- Scale2Ratio(cm->horiz_scale, &hr, &hs);
- Scale2Ratio(cm->vert_scale, &vr, &vs);
- new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
- new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
-
- /* If the image size has changed we need to reallocate the buffers
- * and resample the source image
- */
- if ((cm->Width != new_width) || (cm->Height != new_height))
- {
- cm->Width = new_width;
- cm->Height = new_height;
- vp8_alloc_compressor_data(cpi);
- scale_and_extend_source(cpi->un_scaled_source, cpi);
- return 1;
- }
- }
-
-#endif
- return 0;
-}
-
-
-static void update_alt_ref_frame_stats(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- /* Select an interval before next GF or altref */
- if (!cpi->auto_gold)
- cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
-
- if ((cpi->pass != 2) && cpi->frames_till_gf_update_due)
- {
- cpi->current_gf_interval = cpi->frames_till_gf_update_due;
-
- /* Set the bits per frame that we should try and recover in
- * subsequent inter frames to account for the extra GF spend...
- * note that his does not apply for GF updates that occur
- * coincident with a key frame as the extra cost of key frames is
- * dealt with elsewhere.
- */
- cpi->gf_overspend_bits += cpi->projected_frame_size;
- cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
- }
-
- /* Update data structure that monitors level of reference to last GF */
- memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
- cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
-
- /* this frame refreshes means next frames don't unless specified by user */
- cpi->frames_since_golden = 0;
-
- /* Clear the alternate reference update pending flag. */
- cpi->source_alt_ref_pending = 0;
-
- /* Set the alternate reference frame active flag */
- cpi->source_alt_ref_active = 1;
-
-
-}
-static void update_golden_frame_stats(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- /* Update the Golden frame usage counts. */
- if (cm->refresh_golden_frame)
- {
- /* Select an interval before next GF */
- if (!cpi->auto_gold)
- cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
-
- if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0))
- {
- cpi->current_gf_interval = cpi->frames_till_gf_update_due;
-
- /* Set the bits per frame that we should try and recover in
- * subsequent inter frames to account for the extra GF spend...
- * note that his does not apply for GF updates that occur
- * coincident with a key frame as the extra cost of key frames
- * is dealt with elsewhere.
- */
- if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active)
- {
- /* Calcluate GF bits to be recovered
- * Projected size - av frame bits available for inter
- * frames for clip as a whole
- */
- cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->inter_frame_target);
- }
-
- cpi->non_gf_bitrate_adjustment = cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
-
- }
-
- /* Update data structure that monitors level of reference to last GF */
- memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
- cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
-
- /* this frame refreshes means next frames don't unless specified by
- * user
- */
- cm->refresh_golden_frame = 0;
- cpi->frames_since_golden = 0;
-
- cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
- cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
- cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
- cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
-
- /* ******** Fixed Q test code only ************ */
- /* If we are going to use the ALT reference for the next group of
- * frames set a flag to say so.
- */
- if (cpi->oxcf.fixed_q >= 0 &&
- cpi->oxcf.play_alternate && !cpi->common.refresh_alt_ref_frame)
- {
- cpi->source_alt_ref_pending = 1;
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
- }
-
- if (!cpi->source_alt_ref_pending)
- cpi->source_alt_ref_active = 0;
-
- /* Decrement count down till next gf */
- if (cpi->frames_till_gf_update_due > 0)
- cpi->frames_till_gf_update_due--;
-
- }
- else if (!cpi->common.refresh_alt_ref_frame)
- {
- /* Decrement count down till next gf */
- if (cpi->frames_till_gf_update_due > 0)
- cpi->frames_till_gf_update_due--;
-
- if (cpi->frames_till_alt_ref_frame)
- cpi->frames_till_alt_ref_frame --;
-
- cpi->frames_since_golden ++;
-
- if (cpi->frames_since_golden > 1)
- {
- cpi->recent_ref_frame_usage[INTRA_FRAME] +=
- cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
- cpi->recent_ref_frame_usage[LAST_FRAME] +=
- cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
- cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
- cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
- cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
- cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
- }
- }
-}
-
-/* This function updates the reference frame probability estimates that
- * will be used during mode selection
- */
-static void update_rd_ref_frame_probs(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
- const int rf_intra = rfct[INTRA_FRAME];
- const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
-
- if (cm->frame_type == KEY_FRAME)
- {
- cpi->prob_intra_coded = 255;
- cpi->prob_last_coded = 128;
- cpi->prob_gf_coded = 128;
- }
- else if (!(rf_intra + rf_inter))
- {
- cpi->prob_intra_coded = 63;
- cpi->prob_last_coded = 128;
- cpi->prob_gf_coded = 128;
- }
-
- /* update reference frame costs since we can do better than what we got
- * last frame.
- */
- if (cpi->oxcf.number_of_layers == 1)
- {
- if (cpi->common.refresh_alt_ref_frame)
- {
- cpi->prob_intra_coded += 40;
- if (cpi->prob_intra_coded > 255)
- cpi->prob_intra_coded = 255;
- cpi->prob_last_coded = 200;
- cpi->prob_gf_coded = 1;
- }
- else if (cpi->frames_since_golden == 0)
- {
- cpi->prob_last_coded = 214;
- }
- else if (cpi->frames_since_golden == 1)
- {
- cpi->prob_last_coded = 192;
- cpi->prob_gf_coded = 220;
- }
- else if (cpi->source_alt_ref_active)
- {
- cpi->prob_gf_coded -= 20;
-
- if (cpi->prob_gf_coded < 10)
- cpi->prob_gf_coded = 10;
- }
- if (!cpi->source_alt_ref_active)
- cpi->prob_gf_coded = 255;
- }
-}
-
-
-/* 1 = key, 0 = inter */
-static int decide_key_frame(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- int code_key_frame = 0;
-
- cpi->kf_boost = 0;
-
- if (cpi->Speed > 11)
- return 0;
-
- /* Clear down mmx registers */
- vp8_clear_system_state();
-
- if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0))
- {
- double change = 1.0 * abs((int)(cpi->mb.intra_error -
- cpi->last_intra_error)) / (1 + cpi->last_intra_error);
- double change2 = 1.0 * abs((int)(cpi->mb.prediction_error -
- cpi->last_prediction_error)) / (1 + cpi->last_prediction_error);
- double minerror = cm->MBs * 256;
-
- cpi->last_intra_error = cpi->mb.intra_error;
- cpi->last_prediction_error = cpi->mb.prediction_error;
-
- if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15
- && cpi->mb.prediction_error > minerror
- && (change > .25 || change2 > .25))
- {
- /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra > cpi->last_frame_percent_intra + 3*/
- return 1;
- }
-
- return 0;
-
- }
-
- /* If the following are true we might as well code a key frame */
- if (((cpi->this_frame_percent_intra == 100) &&
- (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
- ((cpi->this_frame_percent_intra > 95) &&
- (cpi->this_frame_percent_intra >= (cpi->last_frame_percent_intra + 5))))
- {
- code_key_frame = 1;
- }
- /* in addition if the following are true and this is not a golden frame
- * then code a key frame Note that on golden frames there often seems
- * to be a pop in intra useage anyway hence this restriction is
- * designed to prevent spurious key frames. The Intra pop needs to be
- * investigated.
- */
- else if (((cpi->this_frame_percent_intra > 60) &&
- (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 2))) ||
- ((cpi->this_frame_percent_intra > 75) &&
- (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra * 3 / 2))) ||
- ((cpi->this_frame_percent_intra > 90) &&
- (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 10))))
- {
- if (!cm->refresh_golden_frame)
- code_key_frame = 1;
- }
-
- return code_key_frame;
-
-}
-
-#if !(CONFIG_REALTIME_ONLY)
-static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
-{
- (void) size;
- (void) dest;
- (void) frame_flags;
- vp8_set_quantizer(cpi, 26);
-
- vp8_first_pass(cpi);
-}
-#endif
-
-#if 0
-void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
-{
-
- /* write the frame */
- FILE *yframe;
- int i;
- char filename[255];
-
- sprintf(filename, "cx\\y%04d.raw", this_frame);
- yframe = fopen(filename, "wb");
-
- for (i = 0; i < frame->y_height; i++)
- fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
-
- fclose(yframe);
- sprintf(filename, "cx\\u%04d.raw", this_frame);
- yframe = fopen(filename, "wb");
-
- for (i = 0; i < frame->uv_height; i++)
- fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
-
- fclose(yframe);
- sprintf(filename, "cx\\v%04d.raw", this_frame);
- yframe = fopen(filename, "wb");
-
- for (i = 0; i < frame->uv_height; i++)
- fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
-
- fclose(yframe);
-}
-#endif
-/* return of 0 means drop frame */
-
-/* Function to test for conditions that indeicate we should loop
- * back and recode a frame.
- */
-static int recode_loop_test( VP8_COMP *cpi,
- int high_limit, int low_limit,
- int q, int maxq, int minq )
-{
- int force_recode = 0;
- VP8_COMMON *cm = &cpi->common;
-
- /* Is frame recode allowed at all
- * Yes if either recode mode 1 is selected or mode two is selcted
- * and the frame is a key frame. golden frame or alt_ref_frame
- */
- if ( (cpi->sf.recode_loop == 1) ||
- ( (cpi->sf.recode_loop == 2) &&
- ( (cm->frame_type == KEY_FRAME) ||
- cm->refresh_golden_frame ||
- cm->refresh_alt_ref_frame ) ) )
- {
- /* General over and under shoot tests */
- if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
- ((cpi->projected_frame_size < low_limit) && (q > minq)) )
- {
- force_recode = 1;
- }
- /* Special Constrained quality tests */
- else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
- {
- /* Undershoot and below auto cq level */
- if ( (q > cpi->cq_target_quality) &&
- (cpi->projected_frame_size <
- ((cpi->this_frame_target * 7) >> 3)))
- {
- force_recode = 1;
- }
- /* Severe undershoot and between auto and user cq level */
- else if ( (q > cpi->oxcf.cq_level) &&
- (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
- (cpi->active_best_quality > cpi->oxcf.cq_level))
- {
- force_recode = 1;
- cpi->active_best_quality = cpi->oxcf.cq_level;
- }
- }
- }
-
- return force_recode;
-}
-
-static void update_reference_frames(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
- YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
-
- /* At this point the new frame has been encoded.
- * If any buffer copy / swapping is signaled it should be done here.
- */
-
- if (cm->frame_type == KEY_FRAME)
- {
- yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME ;
-
- yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
- yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
-
- cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
-
- cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
- cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
- }
- else /* For non key frames */
- {
- if (cm->refresh_alt_ref_frame)
- {
- assert(!cm->copy_buffer_to_arf);
-
- cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
- cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
- cm->alt_fb_idx = cm->new_fb_idx;
-
- cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
- }
- else if (cm->copy_buffer_to_arf)
- {
- assert(!(cm->copy_buffer_to_arf & ~0x3));
-
- if (cm->copy_buffer_to_arf == 1)
- {
- if(cm->alt_fb_idx != cm->lst_fb_idx)
- {
- yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
- yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
- cm->alt_fb_idx = cm->lst_fb_idx;
-
- cpi->current_ref_frames[ALTREF_FRAME] =
- cpi->current_ref_frames[LAST_FRAME];
- }
- }
- else /* if (cm->copy_buffer_to_arf == 2) */
- {
- if(cm->alt_fb_idx != cm->gld_fb_idx)
- {
- yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
- yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
- cm->alt_fb_idx = cm->gld_fb_idx;
-
- cpi->current_ref_frames[ALTREF_FRAME] =
- cpi->current_ref_frames[GOLDEN_FRAME];
- }
- }
- }
-
- if (cm->refresh_golden_frame)
- {
- assert(!cm->copy_buffer_to_gf);
-
- cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
- cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
- cm->gld_fb_idx = cm->new_fb_idx;
-
- cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
- }
- else if (cm->copy_buffer_to_gf)
- {
- assert(!(cm->copy_buffer_to_arf & ~0x3));
-
- if (cm->copy_buffer_to_gf == 1)
- {
- if(cm->gld_fb_idx != cm->lst_fb_idx)
- {
- yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
- yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
- cm->gld_fb_idx = cm->lst_fb_idx;
-
- cpi->current_ref_frames[GOLDEN_FRAME] =
- cpi->current_ref_frames[LAST_FRAME];
- }
- }
- else /* if (cm->copy_buffer_to_gf == 2) */
- {
- if(cm->alt_fb_idx != cm->gld_fb_idx)
- {
- yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
- yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
- cm->gld_fb_idx = cm->alt_fb_idx;
-
- cpi->current_ref_frames[GOLDEN_FRAME] =
- cpi->current_ref_frames[ALTREF_FRAME];
- }
- }
- }
- }
-
- if (cm->refresh_last_frame)
- {
- cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
- cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
- cm->lst_fb_idx = cm->new_fb_idx;
-
- cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
- }
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- /* we shouldn't have to keep multiple copies as we know in advance which
- * buffer we should start - for now to get something up and running
- * I've chosen to copy the buffers
- */
- if (cm->frame_type == KEY_FRAME)
- {
- int i;
- for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
- vp8_yv12_copy_frame(cpi->Source,
- &cpi->denoiser.yv12_running_avg[i]);
- }
- else /* For non key frames */
- {
- vp8_yv12_extend_frame_borders(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
-
- if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf)
- {
- vp8_yv12_copy_frame(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
- &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
- }
- if (cm->refresh_golden_frame || cm->copy_buffer_to_gf)
- {
- vp8_yv12_copy_frame(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
- &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
- }
- if(cm->refresh_last_frame)
- {
- vp8_yv12_copy_frame(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME],
- &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
- }
- }
- if (cpi->oxcf.noise_sensitivity == 4)
- vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
-
- }
-#endif
-
-}
-
-static int measure_square_diff_partial(YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest,
- VP8_COMP *cpi)
- {
- int i, j;
- int Total = 0;
- int num_blocks = 0;
- int skip = 2;
- int min_consec_zero_last = 10;
- int tot_num_blocks = (source->y_height * source->y_width) >> 8;
- unsigned char *src = source->y_buffer;
- unsigned char *dst = dest->y_buffer;
-
- /* Loop through the Y plane, every |skip| blocks along rows and colmumns,
- * summing the square differences, and only for blocks that have been
- * zero_last mode at least |x| frames in a row.
- */
- for (i = 0; i < source->y_height; i += 16 * skip)
- {
- int block_index_row = (i >> 4) * cpi->common.mb_cols;
- for (j = 0; j < source->y_width; j += 16 * skip)
- {
- int index = block_index_row + (j >> 4);
- if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
- unsigned int sse;
- Total += vpx_mse16x16(src + j,
- source->y_stride,
- dst + j, dest->y_stride,
- &sse);
- num_blocks++;
- }
- }
- src += 16 * skip * source->y_stride;
- dst += 16 * skip * dest->y_stride;
- }
- // Only return non-zero if we have at least ~1/16 samples for estimate.
- if (num_blocks > (tot_num_blocks >> 4)) {
- return (Total / num_blocks);
- } else {
- return 0;
- }
- }
-
-#if CONFIG_TEMPORAL_DENOISING
-static void process_denoiser_mode_change(VP8_COMP *cpi) {
- const VP8_COMMON *const cm = &cpi->common;
- int i, j;
- int total = 0;
- int num_blocks = 0;
- // Number of blocks skipped along row/column in computing the
- // nmse (normalized mean square error) of source.
- int skip = 2;
- // Only select blocks for computing nmse that have been encoded
- // as ZERO LAST min_consec_zero_last frames in a row.
- // Scale with number of temporal layers.
- int min_consec_zero_last = 12 / cpi->oxcf.number_of_layers;
- // Decision is tested for changing the denoising mode every
- // num_mode_change times this function is called. Note that this
- // function called every 8 frames, so (8 * num_mode_change) is number
- // of frames where denoising mode change is tested for switch.
- int num_mode_change = 20;
- // Framerate factor, to compensate for larger mse at lower framerates.
- // Use ref_framerate, which is full source framerate for temporal layers.
- // TODO(marpan): Adjust this factor.
- int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
- int tot_num_blocks = cm->mb_rows * cm->mb_cols;
- int ystride = cpi->Source->y_stride;
- unsigned char *src = cpi->Source->y_buffer;
- unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
- static const unsigned char const_source[16] = {
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128};
- int bandwidth = (int)(cpi->target_bandwidth);
- // For temporal layers, use full bandwidth (top layer).
- if (cpi->oxcf.number_of_layers > 1) {
- LAYER_CONTEXT *lc = &cpi->layer_context[cpi->oxcf.number_of_layers - 1];
- bandwidth = (int)(lc->target_bandwidth);
- }
- // Loop through the Y plane, every skip blocks along rows and columns,
- // summing the normalized mean square error, only for blocks that have
- // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
- // a row and have small sum difference between current and previous frame.
- // Normalization here is by the contrast of the current frame block.
- for (i = 0; i < cm->Height; i += 16 * skip) {
- int block_index_row = (i >> 4) * cm->mb_cols;
- for (j = 0; j < cm->Width; j += 16 * skip) {
- int index = block_index_row + (j >> 4);
- if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
- unsigned int sse;
- const unsigned int var = vpx_variance16x16(src + j,
- ystride,
- dst + j,
- ystride,
- &sse);
- // Only consider this block as valid for noise measurement
- // if the sum_diff average of the current and previous frame
- // is small (to avoid effects from lighting change).
- if ((sse - var) < 128) {
- unsigned int sse2;
- const unsigned int act = vpx_variance16x16(src + j,
- ystride,
- const_source,
- 0,
- &sse2);
- if (act > 0)
- total += sse / act;
- num_blocks++;
- }
- }
- }
- src += 16 * skip * ystride;
- dst += 16 * skip * ystride;
- }
- total = total * fac_framerate / 100;
-
- // Only consider this frame as valid sample if we have computed nmse over
- // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
- // application inputs duplicate frames, or contrast is all zero).
- if (total > 0 &&
- (num_blocks > (tot_num_blocks >> 4))) {
- // Update the recursive mean square source_diff.
- total = (total << 8) / num_blocks;
- if (cpi->denoiser.nmse_source_diff_count == 0) {
- // First sample in new interval.
- cpi->denoiser.nmse_source_diff = total;
- cpi->denoiser.qp_avg = cm->base_qindex;
- } else {
- // For subsequent samples, use average with weight ~1/4 for new sample.
- cpi->denoiser.nmse_source_diff = (int)((total +
- 3 * cpi->denoiser.nmse_source_diff) >> 2);
- cpi->denoiser.qp_avg = (int)((cm->base_qindex +
- 3 * cpi->denoiser.qp_avg) >> 2);
- }
- cpi->denoiser.nmse_source_diff_count++;
- }
- // Check for changing the denoiser mode, when we have obtained #samples =
- // num_mode_change. Condition the change also on the bitrate and QP.
- if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
- // Check for going up: from normal to aggressive mode.
- if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
- (cpi->denoiser.nmse_source_diff >
- cpi->denoiser.threshold_aggressive_mode) &&
- (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
- bandwidth > cpi->denoiser.bitrate_threshold)) {
- vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
- } else {
- // Check for going down: from aggressive to normal mode.
- if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
- (cpi->denoiser.nmse_source_diff <
- cpi->denoiser.threshold_aggressive_mode)) ||
- ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
- (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
- bandwidth < cpi->denoiser.bitrate_threshold))) {
- vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
- }
- }
- // Reset metric and counter for next interval.
- cpi->denoiser.nmse_source_diff = 0;
- cpi->denoiser.qp_avg = 0;
- cpi->denoiser.nmse_source_diff_count = 0;
- }
-}
-#endif
-
-void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
-{
- const FRAME_TYPE frame_type = cm->frame_type;
-
- int update_any_ref_buffers = 1;
- if (cpi->common.refresh_last_frame == 0 &&
- cpi->common.refresh_golden_frame == 0 &&
- cpi->common.refresh_alt_ref_frame == 0) {
- update_any_ref_buffers = 0;
- }
-
- if (cm->no_lpf)
- {
- cm->filter_level = 0;
- }
- else
- {
- struct vpx_usec_timer timer;
-
- vp8_clear_system_state();
-
- vpx_usec_timer_start(&timer);
- if (cpi->sf.auto_filter == 0) {
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
- // Use the denoised buffer for selecting base loop filter level.
- // Denoised signal for current frame is stored in INTRA_FRAME.
- // No denoising on key frames.
- vp8cx_pick_filter_level_fast(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
- } else {
- vp8cx_pick_filter_level_fast(cpi->Source, cpi);
- }
-#else
- vp8cx_pick_filter_level_fast(cpi->Source, cpi);
-#endif
- } else {
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
- // Use the denoised buffer for selecting base loop filter level.
- // Denoised signal for current frame is stored in INTRA_FRAME.
- // No denoising on key frames.
- vp8cx_pick_filter_level(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
- } else {
- vp8cx_pick_filter_level(cpi->Source, cpi);
- }
-#else
- vp8cx_pick_filter_level(cpi->Source, cpi);
-#endif
- }
-
-
- if (cm->filter_level > 0)
- {
- vp8cx_set_alt_lf_level(cpi, cm->filter_level);
- }
-
- vpx_usec_timer_mark(&timer);
- cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
- }
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded)
- sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
-#endif
-
- // No need to apply loop-filter if the encoded frame does not update
- // any reference buffers.
- if (cm->filter_level > 0 && update_any_ref_buffers)
- {
- vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
- }
-
- vp8_yv12_extend_frame_borders(cm->frame_to_show);
-
-}
-
-static void encode_frame_to_data_rate
-(
- VP8_COMP *cpi,
- unsigned long *size,
- unsigned char *dest,
- unsigned char* dest_end,
- unsigned int *frame_flags
-)
-{
- int Q;
- int frame_over_shoot_limit;
- int frame_under_shoot_limit;
-
- int Loop = 0;
- int loop_count;
-
- VP8_COMMON *cm = &cpi->common;
- int active_worst_qchanged = 0;
-
-#if !(CONFIG_REALTIME_ONLY)
- int q_low;
- int q_high;
- int zbin_oq_high;
- int zbin_oq_low = 0;
- int top_index;
- int bottom_index;
- int overshoot_seen = 0;
- int undershoot_seen = 0;
-#endif
-
- int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
- cpi->oxcf.optimal_buffer_level / 100);
- int drop_mark75 = drop_mark * 2 / 3;
- int drop_mark50 = drop_mark / 4;
- int drop_mark25 = drop_mark / 8;
-
-
- /* Clear down mmx registers to allow floating point in what follows */
- vp8_clear_system_state();
-
-#if CONFIG_MULTITHREAD
- /* wait for the last picture loopfilter thread done */
- if (cpi->b_lpf_running)
- {
- sem_wait(&cpi->h_event_end_lpf);
- cpi->b_lpf_running = 0;
- }
-#endif
-
- if(cpi->force_next_frame_intra)
- {
- cm->frame_type = KEY_FRAME; /* delayed intra frame */
- cpi->force_next_frame_intra = 0;
- }
-
- /* For an alt ref frame in 2 pass we skip the call to the second pass
- * function that sets the target bandwidth
- */
-#if !(CONFIG_REALTIME_ONLY)
-
- if (cpi->pass == 2)
- {
- if (cpi->common.refresh_alt_ref_frame)
- {
- /* Per frame bit target for the alt ref frame */
- cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
- /* per second target bitrate */
- cpi->target_bandwidth = (int)(cpi->twopass.gf_bits *
- cpi->output_framerate);
- }
- }
- else
-#endif
- cpi->per_frame_bandwidth = (int)(cpi->target_bandwidth / cpi->output_framerate);
-
- /* Default turn off buffer to buffer copying */
- cm->copy_buffer_to_gf = 0;
- cm->copy_buffer_to_arf = 0;
-
- /* Clear zbin over-quant value and mode boost values. */
- cpi->mb.zbin_over_quant = 0;
- cpi->mb.zbin_mode_boost = 0;
-
- /* Enable or disable mode based tweaking of the zbin
- * For 2 Pass Only used where GF/ARF prediction quality
- * is above a threshold
- */
- cpi->mb.zbin_mode_boost_enabled = 1;
- if (cpi->pass == 2)
- {
- if ( cpi->gfu_boost <= 400 )
- {
- cpi->mb.zbin_mode_boost_enabled = 0;
- }
- }
-
- /* Current default encoder behaviour for the altref sign bias */
- if (cpi->source_alt_ref_active)
- cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
- else
- cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
-
- /* Check to see if a key frame is signaled
- * For two pass with auto key frame enabled cm->frame_type may already
- * be set, but not for one pass.
- */
- if ((cm->current_video_frame == 0) ||
- (cm->frame_flags & FRAMEFLAGS_KEY) ||
- (cpi->oxcf.auto_key && (cpi->frames_since_key % cpi->key_frame_frequency == 0)))
- {
- /* Key frame from VFW/auto-keyframe/first frame */
- cm->frame_type = KEY_FRAME;
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity == 4) {
- // For adaptive mode, reset denoiser to normal mode on key frame.
- vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
- }
-#endif
- }
-
-#if CONFIG_MULTI_RES_ENCODING
- if (cpi->oxcf.mr_total_resolutions > 1) {
- LOWER_RES_FRAME_INFO* low_res_frame_info
- = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info;
-
- if (cpi->oxcf.mr_encoder_id) {
-
- // TODO(marpan): This constraint shouldn't be needed, as we would like
- // to allow for key frame setting (forced or periodic) defined per
- // spatial layer. For now, keep this in.
- cm->frame_type = low_res_frame_info->frame_type;
-
- // Check if lower resolution is available for motion vector reuse.
- if(cm->frame_type != KEY_FRAME)
- {
- cpi->mr_low_res_mv_avail = 1;
- cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
-
- if (cpi->ref_frame_flags & VP8_LAST_FRAME)
- cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[LAST_FRAME]
- == low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
-
- if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
- cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[GOLDEN_FRAME]
- == low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
-
- // Don't use altref to determine whether low res is available.
- // TODO (marpan): Should we make this type of condition on a
- // per-reference frame basis?
- /*
- if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
- cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
- == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
- */
- }
- }
-
- // On a key frame: For the lowest resolution, keep track of the key frame
- // counter value. For the higher resolutions, reset the current video
- // frame counter to that of the lowest resolution.
- // This is done to the handle the case where we may stop/start encoding
- // higher layer(s). The restart-encoding of higher layer is only signaled
- // by a key frame for now.
- // TODO (marpan): Add flag to indicate restart-encoding of higher layer.
- if (cm->frame_type == KEY_FRAME) {
- if (cpi->oxcf.mr_encoder_id) {
- // If the initial starting value of the buffer level is zero (this can
- // happen because we may have not started encoding this higher stream),
- // then reset it to non-zero value based on |starting_buffer_level|.
- if (cpi->common.current_video_frame == 0 && cpi->buffer_level == 0) {
- unsigned int i;
- cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
- cpi->buffer_level = cpi->oxcf.starting_buffer_level;
- for (i = 0; i < cpi->oxcf.number_of_layers; i++) {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- lc->bits_off_target = lc->starting_buffer_level;
- lc->buffer_level = lc->starting_buffer_level;
- }
- }
- cpi->common.current_video_frame =
- low_res_frame_info->key_frame_counter_value;
- } else {
- low_res_frame_info->key_frame_counter_value =
- cpi->common.current_video_frame;
- }
- }
-
- }
-#endif
-
- // Find the reference frame closest to the current frame.
- cpi->closest_reference_frame = LAST_FRAME;
- if(cm->frame_type != KEY_FRAME) {
- int i;
- MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
- if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
- closest_ref = LAST_FRAME;
- } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
- closest_ref = GOLDEN_FRAME;
- } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
- closest_ref = ALTREF_FRAME;
- }
- for(i = 1; i <= 3; i++) {
- vpx_ref_frame_type_t ref_frame_type = (vpx_ref_frame_type_t)
- ((i == 3) ? 4 : i);
- if (cpi->ref_frame_flags & ref_frame_type) {
- if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
- (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
- closest_ref = i;
- }
- }
- }
- cpi->closest_reference_frame = closest_ref;
- }
-
- /* Set various flags etc to special state if it is a key frame */
- if (cm->frame_type == KEY_FRAME)
- {
- int i;
-
- // Set the loop filter deltas and segmentation map update
- setup_features(cpi);
-
- /* The alternate reference frame cannot be active for a key frame */
- cpi->source_alt_ref_active = 0;
-
- /* Reset the RD threshold multipliers to default of * 1 (128) */
- for (i = 0; i < MAX_MODES; i++)
- {
- cpi->mb.rd_thresh_mult[i] = 128;
- }
-
- // Reset the zero_last counter to 0 on key frame.
- memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
- memset(cpi->consec_zero_last_mvbias, 0,
- (cpi->common.mb_rows * cpi->common.mb_cols));
- }
-
-#if 0
- /* Experimental code for lagged compress and one pass
- * Initialise one_pass GF frames stats
- * Update stats used for GF selection
- */
- {
- cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
-
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
- }
-#endif
-
- update_rd_ref_frame_probs(cpi);
-
- if (cpi->drop_frames_allowed)
- {
- /* The reset to decimation 0 is only done here for one pass.
- * Once it is set two pass leaves decimation on till the next kf.
- */
- if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0))
- cpi->decimation_factor --;
-
- if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0)
- cpi->decimation_factor = 1;
-
- else if (cpi->buffer_level < drop_mark25 && (cpi->decimation_factor == 2 || cpi->decimation_factor == 3))
- {
- cpi->decimation_factor = 3;
- }
- else if (cpi->buffer_level < drop_mark50 && (cpi->decimation_factor == 1 || cpi->decimation_factor == 2))
- {
- cpi->decimation_factor = 2;
- }
- else if (cpi->buffer_level < drop_mark75 && (cpi->decimation_factor == 0 || cpi->decimation_factor == 1))
- {
- cpi->decimation_factor = 1;
- }
- }
-
- /* The following decimates the frame rate according to a regular
- * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
- * prevent buffer under-run in CBR mode. Alternatively it might be
- * desirable in some situations to drop frame rate but throw more bits
- * at each frame.
- *
- * Note that dropping a key frame can be problematic if spatial
- * resampling is also active
- */
- if (cpi->decimation_factor > 0)
- {
- switch (cpi->decimation_factor)
- {
- case 1:
- cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
- break;
- case 2:
- cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
- break;
- case 3:
- cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
- break;
- }
-
- /* Note that we should not throw out a key frame (especially when
- * spatial resampling is enabled).
- */
- if (cm->frame_type == KEY_FRAME)
- {
- cpi->decimation_count = cpi->decimation_factor;
- }
- else if (cpi->decimation_count > 0)
- {
- cpi->decimation_count --;
-
- cpi->bits_off_target += cpi->av_per_frame_bandwidth;
- if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
- cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
-
-#if CONFIG_MULTI_RES_ENCODING
- vp8_store_drop_frame_info(cpi);
-#endif
-
- cm->current_video_frame++;
- cpi->frames_since_key++;
- // We advance the temporal pattern for dropped frames.
- cpi->temporal_pattern_counter++;
-
-#if CONFIG_INTERNAL_STATS
- cpi->count ++;
-#endif
-
- cpi->buffer_level = cpi->bits_off_target;
-
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
-
- /* Propagate bits saved by dropping the frame to higher
- * layers
- */
- for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
- {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- lc->bits_off_target += (int)(lc->target_bandwidth /
- lc->framerate);
- if (lc->bits_off_target > lc->maximum_buffer_size)
- lc->bits_off_target = lc->maximum_buffer_size;
- lc->buffer_level = lc->bits_off_target;
- }
- }
-
- return;
- }
- else
- cpi->decimation_count = cpi->decimation_factor;
- }
- else
- cpi->decimation_count = 0;
-
- /* Decide how big to make the frame */
- if (!vp8_pick_frame_size(cpi))
- {
- /*TODO: 2 drop_frame and return code could be put together. */
-#if CONFIG_MULTI_RES_ENCODING
- vp8_store_drop_frame_info(cpi);
-#endif
- cm->current_video_frame++;
- cpi->frames_since_key++;
- // We advance the temporal pattern for dropped frames.
- cpi->temporal_pattern_counter++;
- return;
- }
-
- /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
- * This has a knock on effect on active best quality as well.
- * For CBR if the buffer reaches its maximum level then we can no longer
- * save up bits for later frames so we might as well use them up
- * on the current frame.
- */
- if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
- (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) && cpi->buffered_mode)
- {
- /* Max adjustment is 1/4 */
- int Adjustment = cpi->active_worst_quality / 4;
-
- if (Adjustment)
- {
- int buff_lvl_step;
-
- if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size)
- {
- buff_lvl_step = (int)
- ((cpi->oxcf.maximum_buffer_size -
- cpi->oxcf.optimal_buffer_level) /
- Adjustment);
-
- if (buff_lvl_step)
- Adjustment = (int)
- ((cpi->buffer_level -
- cpi->oxcf.optimal_buffer_level) /
- buff_lvl_step);
- else
- Adjustment = 0;
- }
-
- cpi->active_worst_quality -= Adjustment;
-
- if(cpi->active_worst_quality < cpi->active_best_quality)
- cpi->active_worst_quality = cpi->active_best_quality;
- }
- }
-
- /* Set an active best quality and if necessary active worst quality
- * There is some odd behavior for one pass here that needs attention.
- */
- if ( (cpi->pass == 2) || (cpi->ni_frames > 150))
- {
- vp8_clear_system_state();
-
- Q = cpi->active_worst_quality;
-
- if ( cm->frame_type == KEY_FRAME )
- {
- if ( cpi->pass == 2 )
- {
- if (cpi->gfu_boost > 600)
- cpi->active_best_quality = kf_low_motion_minq[Q];
- else
- cpi->active_best_quality = kf_high_motion_minq[Q];
-
- /* Special case for key frames forced because we have reached
- * the maximum key frame interval. Here force the Q to a range
- * based on the ambient Q to reduce the risk of popping
- */
- if ( cpi->this_key_frame_forced )
- {
- if ( cpi->active_best_quality > cpi->avg_frame_qindex * 7/8)
- cpi->active_best_quality = cpi->avg_frame_qindex * 7/8;
- else if ( cpi->active_best_quality < cpi->avg_frame_qindex >> 2 )
- cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
- }
- }
- /* One pass more conservative */
- else
- cpi->active_best_quality = kf_high_motion_minq[Q];
- }
-
- else if (cpi->oxcf.number_of_layers==1 &&
- (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame))
- {
- /* Use the lower of cpi->active_worst_quality and recent
- * average Q as basis for GF/ARF Q limit unless last frame was
- * a key frame.
- */
- if ( (cpi->frames_since_key > 1) &&
- (cpi->avg_frame_qindex < cpi->active_worst_quality) )
- {
- Q = cpi->avg_frame_qindex;
- }
-
- /* For constrained quality dont allow Q less than the cq level */
- if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
- (Q < cpi->cq_target_quality) )
- {
- Q = cpi->cq_target_quality;
- }
-
- if ( cpi->pass == 2 )
- {
- if ( cpi->gfu_boost > 1000 )
- cpi->active_best_quality = gf_low_motion_minq[Q];
- else if ( cpi->gfu_boost < 400 )
- cpi->active_best_quality = gf_high_motion_minq[Q];
- else
- cpi->active_best_quality = gf_mid_motion_minq[Q];
-
- /* Constrained quality use slightly lower active best. */
- if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
- {
- cpi->active_best_quality =
- cpi->active_best_quality * 15/16;
- }
- }
- /* One pass more conservative */
- else
- cpi->active_best_quality = gf_high_motion_minq[Q];
- }
- else
- {
- cpi->active_best_quality = inter_minq[Q];
-
- /* For the constant/constrained quality mode we dont want
- * q to fall below the cq level.
- */
- if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
- (cpi->active_best_quality < cpi->cq_target_quality) )
- {
- /* If we are strongly undershooting the target rate in the last
- * frames then use the user passed in cq value not the auto
- * cq value.
- */
- if ( cpi->rolling_actual_bits < cpi->min_frame_bandwidth )
- cpi->active_best_quality = cpi->oxcf.cq_level;
- else
- cpi->active_best_quality = cpi->cq_target_quality;
- }
- }
-
- /* If CBR and the buffer is as full then it is reasonable to allow
- * higher quality on the frames to prevent bits just going to waste.
- */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- /* Note that the use of >= here elliminates the risk of a devide
- * by 0 error in the else if clause
- */
- if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size)
- cpi->active_best_quality = cpi->best_quality;
-
- else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)
- {
- int Fraction = (int)
- (((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128)
- / (cpi->oxcf.maximum_buffer_size -
- cpi->oxcf.optimal_buffer_level));
- int min_qadjustment = ((cpi->active_best_quality -
- cpi->best_quality) * Fraction) / 128;
-
- cpi->active_best_quality -= min_qadjustment;
- }
- }
- }
- /* Make sure constrained quality mode limits are adhered to for the first
- * few frames of one pass encodes
- */
- else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
- {
- if ( (cm->frame_type == KEY_FRAME) ||
- cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame )
- {
- cpi->active_best_quality = cpi->best_quality;
- }
- else if (cpi->active_best_quality < cpi->cq_target_quality)
- {
- cpi->active_best_quality = cpi->cq_target_quality;
- }
- }
-
- /* Clip the active best and worst quality values to limits */
- if (cpi->active_worst_quality > cpi->worst_quality)
- cpi->active_worst_quality = cpi->worst_quality;
-
- if (cpi->active_best_quality < cpi->best_quality)
- cpi->active_best_quality = cpi->best_quality;
-
- if ( cpi->active_worst_quality < cpi->active_best_quality )
- cpi->active_worst_quality = cpi->active_best_quality;
-
- /* Determine initial Q to try */
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
-
-#if !(CONFIG_REALTIME_ONLY)
-
- /* Set highest allowed value for Zbin over quant */
- if (cm->frame_type == KEY_FRAME)
- zbin_oq_high = 0;
- else if ((cpi->oxcf.number_of_layers == 1) && ((cm->refresh_alt_ref_frame ||
- (cm->refresh_golden_frame && !cpi->source_alt_ref_active))))
- {
- zbin_oq_high = 16;
- }
- else
- zbin_oq_high = ZBIN_OQ_MAX;
-#endif
-
- /* Setup background Q adjustment for error resilient mode.
- * For multi-layer encodes only enable this for the base layer.
- */
- if (cpi->cyclic_refresh_mode_enabled)
- {
- // Special case for screen_content_mode with golden frame updates.
- int disable_cr_gf = (cpi->oxcf.screen_content_mode == 2 &&
- cm->refresh_golden_frame);
- if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf)
- cyclic_background_refresh(cpi, Q, 0);
- else
- disable_segmentation(cpi);
- }
-
- vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
-
-#if !(CONFIG_REALTIME_ONLY)
- /* Limit Q range for the adaptive loop. */
- bottom_index = cpi->active_best_quality;
- top_index = cpi->active_worst_quality;
- q_low = cpi->active_best_quality;
- q_high = cpi->active_worst_quality;
-#endif
-
- vp8_save_coding_context(cpi);
-
- loop_count = 0;
-
- scale_and_extend_source(cpi->un_scaled_source, cpi);
-
-#if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
- // Option to apply spatial blur under the aggressive or adaptive
- // (temporal denoising) mode.
- if (cpi->oxcf.noise_sensitivity >= 3) {
- if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
- vp8_de_noise(cm, cpi->Source, cpi->Source,
- cpi->denoiser.denoise_pars.spatial_blur, 1, 0, 0);
- }
- }
-#endif
-
-#if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
-
- if (cpi->oxcf.noise_sensitivity > 0)
- {
- unsigned char *src;
- int l = 0;
-
- switch (cpi->oxcf.noise_sensitivity)
- {
- case 1:
- l = 20;
- break;
- case 2:
- l = 40;
- break;
- case 3:
- l = 60;
- break;
- case 4:
- l = 80;
- break;
- case 5:
- l = 100;
- break;
- case 6:
- l = 150;
- break;
- }
-
-
- if (cm->frame_type == KEY_FRAME)
- {
- vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1, 0, 1);
- }
- else
- {
- vp8_de_noise(cm, cpi->Source, cpi->Source, l , 1, 0, 1);
-
- src = cpi->Source->y_buffer;
-
- if (cpi->Source->y_stride < 0)
- {
- src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
- }
- }
- }
-
-#endif
-
-
-#ifdef OUTPUT_YUV_SRC
- vp8_write_yuv_frame(yuv_file, cpi->Source);
-#endif
-
- do
- {
- vp8_clear_system_state();
-
- vp8_set_quantizer(cpi, Q);
-
- /* setup skip prob for costing in mode/mv decision */
- if (cpi->common.mb_no_coeff_skip)
- {
- cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
-
- if (cm->frame_type != KEY_FRAME)
- {
- if (cpi->common.refresh_alt_ref_frame)
- {
- if (cpi->last_skip_false_probs[2] != 0)
- cpi->prob_skip_false = cpi->last_skip_false_probs[2];
-
- /*
- if(cpi->last_skip_false_probs[2]!=0 && abs(Q- cpi->last_skip_probs_q[2])<=16 )
- cpi->prob_skip_false = cpi->last_skip_false_probs[2];
- else if (cpi->last_skip_false_probs[2]!=0)
- cpi->prob_skip_false = (cpi->last_skip_false_probs[2] + cpi->prob_skip_false ) / 2;
- */
- }
- else if (cpi->common.refresh_golden_frame)
- {
- if (cpi->last_skip_false_probs[1] != 0)
- cpi->prob_skip_false = cpi->last_skip_false_probs[1];
-
- /*
- if(cpi->last_skip_false_probs[1]!=0 && abs(Q- cpi->last_skip_probs_q[1])<=16 )
- cpi->prob_skip_false = cpi->last_skip_false_probs[1];
- else if (cpi->last_skip_false_probs[1]!=0)
- cpi->prob_skip_false = (cpi->last_skip_false_probs[1] + cpi->prob_skip_false ) / 2;
- */
- }
- else
- {
- if (cpi->last_skip_false_probs[0] != 0)
- cpi->prob_skip_false = cpi->last_skip_false_probs[0];
-
- /*
- if(cpi->last_skip_false_probs[0]!=0 && abs(Q- cpi->last_skip_probs_q[0])<=16 )
- cpi->prob_skip_false = cpi->last_skip_false_probs[0];
- else if(cpi->last_skip_false_probs[0]!=0)
- cpi->prob_skip_false = (cpi->last_skip_false_probs[0] + cpi->prob_skip_false ) / 2;
- */
- }
-
- /* as this is for cost estimate, let's make sure it does not
- * go extreme eitehr way
- */
- if (cpi->prob_skip_false < 5)
- cpi->prob_skip_false = 5;
-
- if (cpi->prob_skip_false > 250)
- cpi->prob_skip_false = 250;
-
- if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref)
- cpi->prob_skip_false = 1;
- }
-
-#if 0
-
- if (cpi->pass != 1)
- {
- FILE *f = fopen("skip.stt", "a");
- fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
- fclose(f);
- }
-
-#endif
-
- }
-
- if (cm->frame_type == KEY_FRAME)
- {
- if(resize_key_frame(cpi))
- {
- /* If the frame size has changed, need to reset Q, quantizer,
- * and background refresh.
- */
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
- if (cpi->cyclic_refresh_mode_enabled)
- {
- if (cpi->current_layer==0)
- cyclic_background_refresh(cpi, Q, 0);
- else
- disable_segmentation(cpi);
- }
- // Reset the zero_last counter to 0 on key frame.
- memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
- memset(cpi->consec_zero_last_mvbias, 0,
- (cpi->common.mb_rows * cpi->common.mb_cols));
- vp8_set_quantizer(cpi, Q);
- }
-
- vp8_setup_key_frame(cpi);
- }
-
-
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- {
- if(cpi->oxcf.error_resilient_mode)
- cm->refresh_entropy_probs = 0;
-
- if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS)
- {
- if (cm->frame_type == KEY_FRAME)
- cm->refresh_entropy_probs = 1;
- }
-
- if (cm->refresh_entropy_probs == 0)
- {
- /* save a copy for later refresh */
- memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
- }
-
- vp8_update_coef_context(cpi);
-
- vp8_update_coef_probs(cpi);
-
- /* transform / motion compensation build reconstruction frame
- * +pack coef partitions
- */
- vp8_encode_frame(cpi);
-
- /* cpi->projected_frame_size is not needed for RT mode */
- }
-#else
- /* transform / motion compensation build reconstruction frame */
- vp8_encode_frame(cpi);
-
- if (cpi->oxcf.screen_content_mode == 2) {
- if (vp8_drop_encodedframe_overshoot(cpi, Q))
- return;
- }
-
- cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
- cpi->projected_frame_size = (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
-#endif
- vp8_clear_system_state();
-
- /* Test to see if the stats generated for this frame indicate that
- * we should have coded a key frame (assuming that we didn't)!
- */
-
- if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
- && cpi->compressor_speed != 2)
- {
-#if !(CONFIG_REALTIME_ONLY)
- if (decide_key_frame(cpi))
- {
- /* Reset all our sizing numbers and recode */
- cm->frame_type = KEY_FRAME;
-
- vp8_pick_frame_size(cpi);
-
- /* Clear the Alt reference frame active flag when we have
- * a key frame
- */
- cpi->source_alt_ref_active = 0;
-
- // Set the loop filter deltas and segmentation map update
- setup_features(cpi);
-
- vp8_restore_coding_context(cpi);
-
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
-
- vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit, &frame_over_shoot_limit);
-
- /* Limit Q range for the adaptive loop. */
- bottom_index = cpi->active_best_quality;
- top_index = cpi->active_worst_quality;
- q_low = cpi->active_best_quality;
- q_high = cpi->active_worst_quality;
-
- loop_count++;
- Loop = 1;
-
- continue;
- }
-#endif
- }
-
- vp8_clear_system_state();
-
- if (frame_over_shoot_limit == 0)
- frame_over_shoot_limit = 1;
-
- /* Are we are overshooting and up against the limit of active max Q. */
- if (((cpi->pass != 2) || (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
- (Q == cpi->active_worst_quality) &&
- (cpi->active_worst_quality < cpi->worst_quality) &&
- (cpi->projected_frame_size > frame_over_shoot_limit))
- {
- int over_size_percent = ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) / frame_over_shoot_limit;
-
- /* If so is there any scope for relaxing it */
- while ((cpi->active_worst_quality < cpi->worst_quality) && (over_size_percent > 0))
- {
- cpi->active_worst_quality++;
- /* Assume 1 qstep = about 4% on frame size. */
- over_size_percent = (int)(over_size_percent * 0.96);
- }
-#if !(CONFIG_REALTIME_ONLY)
- top_index = cpi->active_worst_quality;
-#endif
- /* If we have updated the active max Q do not call
- * vp8_update_rate_correction_factors() this loop.
- */
- active_worst_qchanged = 1;
- }
- else
- active_worst_qchanged = 0;
-
-#if !(CONFIG_REALTIME_ONLY)
- /* Special case handling for forced key frames */
- if ( (cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced )
- {
- int last_q = Q;
- int kf_err = vp8_calc_ss_err(cpi->Source,
- &cm->yv12_fb[cm->new_fb_idx]);
-
- /* The key frame is not good enough */
- if ( kf_err > ((cpi->ambient_err * 7) >> 3) )
- {
- /* Lower q_high */
- q_high = (Q > q_low) ? (Q - 1) : q_low;
-
- /* Adjust Q */
- Q = (q_high + q_low) >> 1;
- }
- /* The key frame is much better than the previous frame */
- else if ( kf_err < (cpi->ambient_err >> 1) )
- {
- /* Raise q_low */
- q_low = (Q < q_high) ? (Q + 1) : q_high;
-
- /* Adjust Q */
- Q = (q_high + q_low + 1) >> 1;
- }
-
- /* Clamp Q to upper and lower limits: */
- if (Q > q_high)
- Q = q_high;
- else if (Q < q_low)
- Q = q_low;
-
- Loop = Q != last_q;
- }
-
- /* Is the projected frame size out of range and are we allowed
- * to attempt to recode.
- */
- else if ( recode_loop_test( cpi,
- frame_over_shoot_limit, frame_under_shoot_limit,
- Q, top_index, bottom_index ) )
- {
- int last_q = Q;
- int Retries = 0;
-
- /* Frame size out of permitted range. Update correction factor
- * & compute new Q to try...
- */
-
- /* Frame is too large */
- if (cpi->projected_frame_size > cpi->this_frame_target)
- {
- /* Raise Qlow as to at least the current value */
- q_low = (Q < q_high) ? (Q + 1) : q_high;
-
- /* If we are using over quant do the same for zbin_oq_low */
- if (cpi->mb.zbin_over_quant > 0)
- zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
- (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
-
- if (undershoot_seen)
- {
- /* Update rate_correction_factor unless
- * cpi->active_worst_quality has changed.
- */
- if (!active_worst_qchanged)
- vp8_update_rate_correction_factors(cpi, 1);
-
- Q = (q_high + q_low + 1) / 2;
-
- /* Adjust cpi->zbin_over_quant (only allowed when Q
- * is max)
- */
- if (Q < MAXQ)
- cpi->mb.zbin_over_quant = 0;
- else
- {
- zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high) ?
- (cpi->mb.zbin_over_quant + 1) : zbin_oq_high;
- cpi->mb.zbin_over_quant =
- (zbin_oq_high + zbin_oq_low) / 2;
- }
- }
- else
- {
- /* Update rate_correction_factor unless
- * cpi->active_worst_quality has changed.
- */
- if (!active_worst_qchanged)
- vp8_update_rate_correction_factors(cpi, 0);
-
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
-
- while (((Q < q_low) ||
- (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
- (Retries < 10))
- {
- vp8_update_rate_correction_factors(cpi, 0);
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
- Retries ++;
- }
- }
-
- overshoot_seen = 1;
- }
- /* Frame is too small */
- else
- {
- if (cpi->mb.zbin_over_quant == 0)
- /* Lower q_high if not using over quant */
- q_high = (Q > q_low) ? (Q - 1) : q_low;
- else
- /* else lower zbin_oq_high */
- zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low) ?
- (cpi->mb.zbin_over_quant - 1) : zbin_oq_low;
-
- if (overshoot_seen)
- {
- /* Update rate_correction_factor unless
- * cpi->active_worst_quality has changed.
- */
- if (!active_worst_qchanged)
- vp8_update_rate_correction_factors(cpi, 1);
-
- Q = (q_high + q_low) / 2;
-
- /* Adjust cpi->zbin_over_quant (only allowed when Q
- * is max)
- */
- if (Q < MAXQ)
- cpi->mb.zbin_over_quant = 0;
- else
- cpi->mb.zbin_over_quant =
- (zbin_oq_high + zbin_oq_low) / 2;
- }
- else
- {
- /* Update rate_correction_factor unless
- * cpi->active_worst_quality has changed.
- */
- if (!active_worst_qchanged)
- vp8_update_rate_correction_factors(cpi, 0);
-
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
-
- /* Special case reset for qlow for constrained quality.
- * This should only trigger where there is very substantial
- * undershoot on a frame and the auto cq level is above
- * the user passsed in value.
- */
- if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
- (Q < q_low) )
- {
- q_low = Q;
- }
-
- while (((Q > q_high) ||
- (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
- (Retries < 10))
- {
- vp8_update_rate_correction_factors(cpi, 0);
- Q = vp8_regulate_q(cpi, cpi->this_frame_target);
- Retries ++;
- }
- }
-
- undershoot_seen = 1;
- }
-
- /* Clamp Q to upper and lower limits: */
- if (Q > q_high)
- Q = q_high;
- else if (Q < q_low)
- Q = q_low;
-
- /* Clamp cpi->zbin_over_quant */
- cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low) ?
- zbin_oq_low : (cpi->mb.zbin_over_quant > zbin_oq_high) ?
- zbin_oq_high : cpi->mb.zbin_over_quant;
-
- Loop = Q != last_q;
- }
- else
-#endif
- Loop = 0;
-
- if (cpi->is_src_frame_alt_ref)
- Loop = 0;
-
- if (Loop == 1)
- {
- vp8_restore_coding_context(cpi);
- loop_count++;
-#if CONFIG_INTERNAL_STATS
- cpi->tot_recode_hits++;
-#endif
- }
- }
- while (Loop == 1);
-
-#if 0
- /* Experimental code for lagged and one pass
- * Update stats used for one pass GF selection
- */
- {
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
- cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
- }
-#endif
-
- /* Special case code to reduce pulsing when key frames are forced at a
- * fixed interval. Note the reconstruction error if it is the frame before
- * the force key frame
- */
- if ( cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0) )
- {
- cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
- &cm->yv12_fb[cm->new_fb_idx]);
- }
-
- /* This frame's MVs are saved and will be used in next frame's MV predictor.
- * Last frame has one more line(add to bottom) and one more column(add to
- * right) than cm->mip. The edge elements are initialized to 0.
- */
-#if CONFIG_MULTI_RES_ENCODING
- if(!cpi->oxcf.mr_encoder_id && cm->show_frame)
-#else
- if(cm->show_frame) /* do not save for altref frame */
-#endif
- {
- int mb_row;
- int mb_col;
- /* Point to beginning of allocated MODE_INFO arrays. */
- MODE_INFO *tmp = cm->mip;
-
- if(cm->frame_type != KEY_FRAME)
- {
- for (mb_row = 0; mb_row < cm->mb_rows+1; mb_row ++)
- {
- for (mb_col = 0; mb_col < cm->mb_cols+1; mb_col ++)
- {
- if(tmp->mbmi.ref_frame != INTRA_FRAME)
- cpi->lfmv[mb_col + mb_row*(cm->mode_info_stride+1)].as_int = tmp->mbmi.mv.as_int;
-
- cpi->lf_ref_frame_sign_bias[mb_col + mb_row*(cm->mode_info_stride+1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
- cpi->lf_ref_frame[mb_col + mb_row*(cm->mode_info_stride+1)] = tmp->mbmi.ref_frame;
- tmp++;
- }
- }
- }
- }
-
- /* Count last ref frame 0,0 usage on current encoded frame. */
- {
- int mb_row;
- int mb_col;
- /* Point to beginning of MODE_INFO arrays. */
- MODE_INFO *tmp = cm->mi;
-
- cpi->zeromv_count = 0;
-
- if(cm->frame_type != KEY_FRAME)
- {
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
- {
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++)
- {
- if (tmp->mbmi.mode == ZEROMV &&
- tmp->mbmi.ref_frame == LAST_FRAME)
- cpi->zeromv_count++;
- tmp++;
- }
- tmp++;
- }
- }
- }
-
-#if CONFIG_MULTI_RES_ENCODING
- vp8_cal_dissimilarity(cpi);
-#endif
-
- /* Update the GF useage maps.
- * This is done after completing the compression of a frame when all
- * modes etc. are finalized but before loop filter
- */
- if (cpi->oxcf.number_of_layers == 1)
- vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
-
- if (cm->frame_type == KEY_FRAME)
- cm->refresh_last_frame = 1;
-
-#if 0
- {
- FILE *f = fopen("gfactive.stt", "a");
- fprintf(f, "%8d %8d %8d %8d %8d\n", cm->current_video_frame, (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols), cpi->this_iiratio, cpi->next_iiratio, cm->refresh_golden_frame);
- fclose(f);
- }
-#endif
-
- /* For inter frames the current default behavior is that when
- * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
- * This is purely an encoder decision at present.
- */
- if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame)
- cm->copy_buffer_to_arf = 2;
- else
- cm->copy_buffer_to_arf = 0;
-
- cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
-
-#if CONFIG_TEMPORAL_DENOISING
- // Get some measure of the amount of noise, by measuring the (partial) mse
- // between source and denoised buffer, for y channel. Partial refers to
- // computing the sse for a sub-sample of the frame (i.e., skip x blocks along row/column),
- // and only for blocks in that set that are consecutive ZEROMV_LAST mode.
- // Do this every ~8 frames, to further reduce complexity.
- // TODO(marpan): Keep this for now for the case cpi->oxcf.noise_sensitivity < 4,
- // should be removed in favor of the process_denoiser_mode_change() function below.
- if (cpi->oxcf.noise_sensitivity > 0 &&
- cpi->oxcf.noise_sensitivity < 4 &&
- !cpi->oxcf.screen_content_mode &&
- cpi->frames_since_key%8 == 0 &&
- cm->frame_type != KEY_FRAME) {
- cpi->mse_source_denoised = measure_square_diff_partial(
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi->Source, cpi);
- }
-
- // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
- // of source diff (between current and previous frame), and determine if we
- // should switch the denoiser mode. Sampling refers to computing the mse for
- // a sub-sample of the frame (i.e., skip x blocks along row/column), and
- // only for blocks in that set that have used ZEROMV LAST, along with some
- // constraint on the sum diff between blocks. This process is called every
- // ~8 frames, to further reduce complexity.
- if (cpi->oxcf.noise_sensitivity == 4 &&
- !cpi->oxcf.screen_content_mode &&
- cpi->frames_since_key % 8 == 0 &&
- cm->frame_type != KEY_FRAME) {
- process_denoiser_mode_change(cpi);
- }
-#endif
-
-#if CONFIG_MULTITHREAD
- if (cpi->b_multi_threaded)
- {
- /* start loopfilter in separate thread */
- sem_post(&cpi->h_event_start_lpf);
- cpi->b_lpf_running = 1;
- }
- else
-#endif
- {
- vp8_loopfilter_frame(cpi, cm);
- }
-
- update_reference_frames(cpi);
-
-#ifdef OUTPUT_YUV_DENOISED
- vp8_write_yuv_frame(yuv_denoised_file,
- &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
-#endif
-
-#if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
- if (cpi->oxcf.error_resilient_mode)
- {
- cm->refresh_entropy_probs = 0;
- }
-#endif
-
-#if CONFIG_MULTITHREAD
- /* wait that filter_level is picked so that we can continue with stream packing */
- if (cpi->b_multi_threaded)
- sem_wait(&cpi->h_event_end_lpf);
-#endif
-
- /* build the bitstream */
- vp8_pack_bitstream(cpi, dest, dest_end, size);
-
-#if CONFIG_MULTITHREAD
- /* if PSNR packets are generated we have to wait for the lpf */
- if (cpi->b_lpf_running && cpi->b_calculate_psnr)
- {
- sem_wait(&cpi->h_event_end_lpf);
- cpi->b_lpf_running = 0;
- }
-#endif
-
- /* Move storing frame_type out of the above loop since it is also
- * needed in motion search besides loopfilter */
- cm->last_frame_type = cm->frame_type;
-
- /* Update rate control heuristics */
- cpi->total_byte_count += (*size);
- cpi->projected_frame_size = (*size) << 3;
-
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
- for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
- cpi->layer_context[i].total_byte_count += (*size);
- }
-
- if (!active_worst_qchanged)
- vp8_update_rate_correction_factors(cpi, 2);
-
- cpi->last_q[cm->frame_type] = cm->base_qindex;
-
- if (cm->frame_type == KEY_FRAME)
- {
- vp8_adjust_key_frame_context(cpi);
- }
-
- /* Keep a record of ambient average Q. */
- if (cm->frame_type != KEY_FRAME)
- cpi->avg_frame_qindex = (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
-
- /* Keep a record from which we can calculate the average Q excluding
- * GF updates and key frames
- */
- if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
- (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame)))
- {
- cpi->ni_frames++;
-
- /* Calculate the average Q for normal inter frames (not key or GFU
- * frames).
- */
- if ( cpi->pass == 2 )
- {
- cpi->ni_tot_qi += Q;
- cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
- }
- else
- {
- /* Damp value for first few frames */
- if (cpi->ni_frames > 150 )
- {
- cpi->ni_tot_qi += Q;
- cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
- }
- /* For one pass, early in the clip ... average the current frame Q
- * value with the worstq entered by the user as a dampening measure
- */
- else
- {
- cpi->ni_tot_qi += Q;
- cpi->ni_av_qi = ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
- }
-
- /* If the average Q is higher than what was used in the last
- * frame (after going through the recode loop to keep the frame
- * size within range) then use the last frame value - 1. The -1
- * is designed to stop Q and hence the data rate, from
- * progressively falling away during difficult sections, but at
- * the same time reduce the number of itterations around the
- * recode loop.
- */
- if (Q > cpi->ni_av_qi)
- cpi->ni_av_qi = Q - 1;
- }
- }
-
- /* Update the buffer level variable. */
- /* Non-viewable frames are a special case and are treated as pure overhead. */
- if ( !cm->show_frame )
- cpi->bits_off_target -= cpi->projected_frame_size;
- else
- cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
-
- /* Clip the buffer level to the maximum specified buffer size */
- if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
- cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
-
- // If the frame dropper is not enabled, don't let the buffer level go below
- // some threshold, given here by -|maximum_buffer_size|. For now we only do
- // this for screen content input.
- if (cpi->drop_frames_allowed == 0 && cpi->oxcf.screen_content_mode &&
- cpi->bits_off_target < -cpi->oxcf.maximum_buffer_size)
- cpi->bits_off_target = -cpi->oxcf.maximum_buffer_size;
-
- /* Rolling monitors of whether we are over or underspending used to
- * help regulate min and Max Q in two pass.
- */
- cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
- cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
- cpi->long_rolling_target_bits = ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
- cpi->long_rolling_actual_bits = ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) / 32;
-
- /* Actual bits spent */
- cpi->total_actual_bits += cpi->projected_frame_size;
-
- /* Debug stats */
- cpi->total_target_vs_actual += (cpi->this_frame_target - cpi->projected_frame_size);
-
- cpi->buffer_level = cpi->bits_off_target;
-
- /* Propagate values to higher temporal layers */
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
-
- for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
- {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- int bits_off_for_this_layer =
- (int)(lc->target_bandwidth / lc->framerate -
- cpi->projected_frame_size);
-
- lc->bits_off_target += bits_off_for_this_layer;
-
- /* Clip buffer level to maximum buffer size for the layer */
- if (lc->bits_off_target > lc->maximum_buffer_size)
- lc->bits_off_target = lc->maximum_buffer_size;
-
- lc->total_actual_bits += cpi->projected_frame_size;
- lc->total_target_vs_actual += bits_off_for_this_layer;
- lc->buffer_level = lc->bits_off_target;
- }
- }
-
- /* Update bits left to the kf and gf groups to account for overshoot
- * or undershoot on these frames
- */
- if (cm->frame_type == KEY_FRAME)
- {
- cpi->twopass.kf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
-
- if (cpi->twopass.kf_group_bits < 0)
- cpi->twopass.kf_group_bits = 0 ;
- }
- else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame)
- {
- cpi->twopass.gf_group_bits += cpi->this_frame_target - cpi->projected_frame_size;
-
- if (cpi->twopass.gf_group_bits < 0)
- cpi->twopass.gf_group_bits = 0 ;
- }
-
- if (cm->frame_type != KEY_FRAME)
- {
- if (cpi->common.refresh_alt_ref_frame)
- {
- cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
- cpi->last_skip_probs_q[2] = cm->base_qindex;
- }
- else if (cpi->common.refresh_golden_frame)
- {
- cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
- cpi->last_skip_probs_q[1] = cm->base_qindex;
- }
- else
- {
- cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
- cpi->last_skip_probs_q[0] = cm->base_qindex;
-
- /* update the baseline */
- cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
-
- }
- }
-
-#if 0 && CONFIG_INTERNAL_STATS
- {
- FILE *f = fopen("tmp.stt", "a");
-
- vp8_clear_system_state();
-
- if (cpi->twopass.total_left_stats.coded_error != 0.0)
- fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
- "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
- "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
- cpi->common.current_video_frame, cpi->this_frame_target,
- cpi->projected_frame_size,
- (cpi->projected_frame_size - cpi->this_frame_target),
- cpi->total_target_vs_actual,
- cpi->buffer_level,
- (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
- cpi->total_actual_bits, cm->base_qindex,
- cpi->active_best_quality, cpi->active_worst_quality,
- cpi->ni_av_qi, cpi->cq_target_quality,
- cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
- cm->frame_type, cpi->gfu_boost,
- cpi->twopass.est_max_qcorrection_factor,
- cpi->twopass.bits_left,
- cpi->twopass.total_left_stats.coded_error,
- (double)cpi->twopass.bits_left /
- cpi->twopass.total_left_stats.coded_error,
- cpi->tot_recode_hits);
- else
- fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
- "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
- "%8.2lf %"PRId64" %10.3lf %8d\n",
- cpi->common.current_video_frame, cpi->this_frame_target,
- cpi->projected_frame_size,
- (cpi->projected_frame_size - cpi->this_frame_target),
- cpi->total_target_vs_actual,
- cpi->buffer_level,
- (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
- cpi->total_actual_bits, cm->base_qindex,
- cpi->active_best_quality, cpi->active_worst_quality,
- cpi->ni_av_qi, cpi->cq_target_quality,
- cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
- cm->frame_type, cpi->gfu_boost,
- cpi->twopass.est_max_qcorrection_factor,
- cpi->twopass.bits_left,
- cpi->twopass.total_left_stats.coded_error,
- cpi->tot_recode_hits);
-
- fclose(f);
-
- {
- FILE *fmodes = fopen("Modes.stt", "a");
-
- fprintf(fmodes, "%6d:%1d:%1d:%1d ",
- cpi->common.current_video_frame,
- cm->frame_type, cm->refresh_golden_frame,
- cm->refresh_alt_ref_frame);
-
- fprintf(fmodes, "\n");
-
- fclose(fmodes);
- }
- }
-
-#endif
-
- if (cm->refresh_golden_frame == 1)
- cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
- else
- cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_GOLDEN;
-
- if (cm->refresh_alt_ref_frame == 1)
- cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
- else
- cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
-
-
- if (cm->refresh_last_frame & cm->refresh_golden_frame)
- /* both refreshed */
- cpi->gold_is_last = 1;
- else if (cm->refresh_last_frame ^ cm->refresh_golden_frame)
- /* 1 refreshed but not the other */
- cpi->gold_is_last = 0;
-
- if (cm->refresh_last_frame & cm->refresh_alt_ref_frame)
- /* both refreshed */
- cpi->alt_is_last = 1;
- else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame)
- /* 1 refreshed but not the other */
- cpi->alt_is_last = 0;
-
- if (cm->refresh_alt_ref_frame & cm->refresh_golden_frame)
- /* both refreshed */
- cpi->gold_is_alt = 1;
- else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame)
- /* 1 refreshed but not the other */
- cpi->gold_is_alt = 0;
-
- cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
-
- if (cpi->gold_is_last)
- cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
-
- if (cpi->alt_is_last)
- cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
-
- if (cpi->gold_is_alt)
- cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
-
-
- if (!cpi->oxcf.error_resilient_mode)
- {
- if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame && (cm->frame_type != KEY_FRAME))
- /* Update the alternate reference frame stats as appropriate. */
- update_alt_ref_frame_stats(cpi);
- else
- /* Update the Golden frame stats as appropriate. */
- update_golden_frame_stats(cpi);
- }
-
- if (cm->frame_type == KEY_FRAME)
- {
- /* Tell the caller that the frame was coded as a key frame */
- *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
-
- /* As this frame is a key frame the next defaults to an inter frame. */
- cm->frame_type = INTER_FRAME;
-
- cpi->last_frame_percent_intra = 100;
- }
- else
- {
- *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
-
- cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
- }
-
- /* Clear the one shot update flags for segmentation map and mode/ref
- * loop filter deltas.
- */
- cpi->mb.e_mbd.update_mb_segmentation_map = 0;
- cpi->mb.e_mbd.update_mb_segmentation_data = 0;
- cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
-
-
- /* Dont increment frame counters if this was an altref buffer update
- * not a real frame
- */
- if (cm->show_frame)
- {
- cm->current_video_frame++;
- cpi->frames_since_key++;
- cpi->temporal_pattern_counter++;
- }
-
- /* reset to normal state now that we are done. */
-
-
-
-#if 0
- {
- char filename[512];
- FILE *recon_file;
- sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
- recon_file = fopen(filename, "wb");
- fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
- cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
- fclose(recon_file);
- }
-#endif
-
- /* DEBUG */
- /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
-
-
-}
-#if !(CONFIG_REALTIME_ONLY)
-static void Pass2Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned char * dest_end, unsigned int *frame_flags)
-{
-
- if (!cpi->common.refresh_alt_ref_frame)
- vp8_second_pass(cpi);
-
- encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
- cpi->twopass.bits_left -= 8 * *size;
-
- if (!cpi->common.refresh_alt_ref_frame)
- {
- double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth
- *cpi->oxcf.two_pass_vbrmin_section / 100);
- cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
- }
-}
-#endif
-
-int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time)
-{
- struct vpx_usec_timer timer;
- int res = 0;
-
- vpx_usec_timer_start(&timer);
-
- /* Reinit the lookahead buffer if the frame size changes */
- if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height)
- {
- assert(cpi->oxcf.lag_in_frames < 2);
- dealloc_raw_frame_buffers(cpi);
- alloc_raw_frame_buffers(cpi);
- }
-
- if(vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
- frame_flags, cpi->active_map_enabled ? cpi->active_map : NULL))
- res = -1;
- vpx_usec_timer_mark(&timer);
- cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
-
- return res;
-}
-
-
-static int frame_is_reference(const VP8_COMP *cpi)
-{
- const VP8_COMMON *cm = &cpi->common;
- const MACROBLOCKD *xd = &cpi->mb.e_mbd;
-
- return cm->frame_type == KEY_FRAME || cm->refresh_last_frame
- || cm->refresh_golden_frame || cm->refresh_alt_ref_frame
- || cm->copy_buffer_to_gf || cm->copy_buffer_to_arf
- || cm->refresh_entropy_probs
- || xd->mode_ref_lf_delta_update
- || xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
-}
-
-
-int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush)
-{
- VP8_COMMON *cm;
- struct vpx_usec_timer tsctimer;
- struct vpx_usec_timer ticktimer;
- struct vpx_usec_timer cmptimer;
- YV12_BUFFER_CONFIG *force_src_buffer = NULL;
-
- if (!cpi)
- return -1;
-
- cm = &cpi->common;
-
- if (setjmp(cpi->common.error.jmp))
- {
- cpi->common.error.setjmp = 0;
- vp8_clear_system_state();
- return VPX_CODEC_CORRUPT_FRAME;
- }
-
- cpi->common.error.setjmp = 1;
-
- vpx_usec_timer_start(&cmptimer);
-
- cpi->source = NULL;
-
-#if !(CONFIG_REALTIME_ONLY)
- /* Should we code an alternate reference frame */
- if (cpi->oxcf.error_resilient_mode == 0 &&
- cpi->oxcf.play_alternate &&
- cpi->source_alt_ref_pending)
- {
- if ((cpi->source = vp8_lookahead_peek(cpi->lookahead,
- cpi->frames_till_gf_update_due,
- PEEK_FORWARD)))
- {
- cpi->alt_ref_source = cpi->source;
- if (cpi->oxcf.arnr_max_frames > 0)
- {
- vp8_temporal_filter_prepare_c(cpi,
- cpi->frames_till_gf_update_due);
- force_src_buffer = &cpi->alt_ref_buffer;
- }
- cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
- cm->refresh_alt_ref_frame = 1;
- cm->refresh_golden_frame = 0;
- cm->refresh_last_frame = 0;
- cm->show_frame = 0;
- /* Clear Pending alt Ref flag. */
- cpi->source_alt_ref_pending = 0;
- cpi->is_src_frame_alt_ref = 0;
- }
- }
-#endif
-
- if (!cpi->source)
- {
- /* Read last frame source if we are encoding first pass. */
- if (cpi->pass == 1 && cm->current_video_frame > 0)
- {
- if((cpi->last_source = vp8_lookahead_peek(cpi->lookahead, 1,
- PEEK_BACKWARD)) == NULL)
- return -1;
- }
-
-
- if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush)))
- {
- cm->show_frame = 1;
-
- cpi->is_src_frame_alt_ref = cpi->alt_ref_source
- && (cpi->source == cpi->alt_ref_source);
-
- if(cpi->is_src_frame_alt_ref)
- cpi->alt_ref_source = NULL;
- }
- }
-
- if (cpi->source)
- {
- cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
- cpi->un_scaled_source = cpi->Source;
- *time_stamp = cpi->source->ts_start;
- *time_end = cpi->source->ts_end;
- *frame_flags = cpi->source->flags;
-
- if (cpi->pass == 1 && cm->current_video_frame > 0)
- {
- cpi->last_frame_unscaled_source = &cpi->last_source->img;
- }
- }
- else
- {
- *size = 0;
-#if !(CONFIG_REALTIME_ONLY)
-
- if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done)
- {
- vp8_end_first_pass(cpi); /* get last stats packet */
- cpi->twopass.first_pass_done = 1;
- }
-
-#endif
-
- return -1;
- }
-
- if (cpi->source->ts_start < cpi->first_time_stamp_ever)
- {
- cpi->first_time_stamp_ever = cpi->source->ts_start;
- cpi->last_end_time_stamp_seen = cpi->source->ts_start;
- }
-
- /* adjust frame rates based on timestamps given */
- if (cm->show_frame)
- {
- int64_t this_duration;
- int step = 0;
-
- if (cpi->source->ts_start == cpi->first_time_stamp_ever)
- {
- this_duration = cpi->source->ts_end - cpi->source->ts_start;
- step = 1;
- }
- else
- {
- int64_t last_duration;
-
- this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
- last_duration = cpi->last_end_time_stamp_seen
- - cpi->last_time_stamp_seen;
- /* do a step update if the duration changes by 10% */
- if (last_duration)
- step = (int)(((this_duration - last_duration) *
- 10 / last_duration));
- }
-
- if (this_duration)
- {
- if (step)
- cpi->ref_framerate = 10000000.0 / this_duration;
- else
- {
- double avg_duration, interval;
-
- /* Average this frame's rate into the last second's average
- * frame rate. If we haven't seen 1 second yet, then average
- * over the whole interval seen.
- */
- interval = (double)(cpi->source->ts_end -
- cpi->first_time_stamp_ever);
- if(interval > 10000000.0)
- interval = 10000000;
-
- avg_duration = 10000000.0 / cpi->ref_framerate;
- avg_duration *= (interval - avg_duration + this_duration);
- avg_duration /= interval;
-
- cpi->ref_framerate = 10000000.0 / avg_duration;
- }
-#if CONFIG_MULTI_RES_ENCODING
- if (cpi->oxcf.mr_total_resolutions > 1) {
- LOWER_RES_FRAME_INFO* low_res_frame_info = (LOWER_RES_FRAME_INFO*)
- cpi->oxcf.mr_low_res_mode_info;
- // Frame rate should be the same for all spatial layers in
- // multi-res-encoding (simulcast), so we constrain the frame for
- // higher layers to be that of lowest resolution. This is needed
- // as he application may decide to skip encoding a high layer and
- // then start again, in which case a big jump in time-stamps will
- // be received for that high layer, which will yield an incorrect
- // frame rate (from time-stamp adjustment in above calculation).
- if (cpi->oxcf.mr_encoder_id) {
- cpi->ref_framerate = low_res_frame_info->low_res_framerate;
- }
- else {
- // Keep track of frame rate for lowest resolution.
- low_res_frame_info->low_res_framerate = cpi->ref_framerate;
- }
- }
-#endif
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
-
- /* Update frame rates for each layer */
- assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
- for (i = 0; i < cpi->oxcf.number_of_layers &&
- i < VPX_TS_MAX_LAYERS; ++i)
- {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- lc->framerate = cpi->ref_framerate /
- cpi->oxcf.rate_decimator[i];
- }
- }
- else
- vp8_new_framerate(cpi, cpi->ref_framerate);
- }
-
- cpi->last_time_stamp_seen = cpi->source->ts_start;
- cpi->last_end_time_stamp_seen = cpi->source->ts_end;
- }
-
- if (cpi->oxcf.number_of_layers > 1)
- {
- int layer;
-
- update_layer_contexts (cpi);
-
- /* Restore layer specific context & set frame rate */
- if (cpi->temporal_layer_id >= 0) {
- layer = cpi->temporal_layer_id;
- } else {
- layer = cpi->oxcf.layer_id[
- cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
- }
- restore_layer_context (cpi, layer);
- vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
- }
-
- if (cpi->compressor_speed == 2)
- {
- vpx_usec_timer_start(&tsctimer);
- vpx_usec_timer_start(&ticktimer);
- }
-
- cpi->lf_zeromv_pct = (cpi->zeromv_count * 100)/cm->MBs;
-
-#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
- {
- int i;
- const int num_part = (1 << cm->multi_token_partition);
- /* the available bytes in dest */
- const unsigned long dest_size = dest_end - dest;
- const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
-
- unsigned char *dp = dest;
-
- cpi->partition_d[0] = dp;
- dp += dest_size/10; /* reserve 1/10 for control partition */
- cpi->partition_d_end[0] = dp;
-
- for(i = 0; i < num_part; i++)
- {
- cpi->partition_d[i + 1] = dp;
- dp += tok_part_buff_size;
- cpi->partition_d_end[i + 1] = dp;
- }
- }
-#endif
-
- /* start with a 0 size frame */
- *size = 0;
-
- /* Clear down mmx registers */
- vp8_clear_system_state();
-
- cm->frame_type = INTER_FRAME;
- cm->frame_flags = *frame_flags;
-
-#if 0
-
- if (cm->refresh_alt_ref_frame)
- {
- cm->refresh_golden_frame = 0;
- cm->refresh_last_frame = 0;
- }
- else
- {
- cm->refresh_golden_frame = 0;
- cm->refresh_last_frame = 1;
- }
-
-#endif
- /* find a free buffer for the new frame */
- {
- int i = 0;
- for(; i < NUM_YV12_BUFFERS; i++)
- {
- if(!cm->yv12_fb[i].flags)
- {
- cm->new_fb_idx = i;
- break;
- }
- }
-
- assert(i < NUM_YV12_BUFFERS );
- }
-#if !(CONFIG_REALTIME_ONLY)
-
- if (cpi->pass == 1)
- {
- Pass1Encode(cpi, size, dest, frame_flags);
- }
- else if (cpi->pass == 2)
- {
- Pass2Encode(cpi, size, dest, dest_end, frame_flags);
- }
- else
-#endif
- encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
-
- if (cpi->compressor_speed == 2)
- {
- unsigned int duration, duration2;
- vpx_usec_timer_mark(&tsctimer);
- vpx_usec_timer_mark(&ticktimer);
-
- duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
- duration2 = (unsigned int)((double)duration / 2);
-
- if (cm->frame_type != KEY_FRAME)
- {
- if (cpi->avg_encode_time == 0)
- cpi->avg_encode_time = duration;
- else
- cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
- }
-
- if (duration2)
- {
- {
-
- if (cpi->avg_pick_mode_time == 0)
- cpi->avg_pick_mode_time = duration2;
- else
- cpi->avg_pick_mode_time = (7 * cpi->avg_pick_mode_time + duration2) >> 3;
- }
- }
-
- }
-
- if (cm->refresh_entropy_probs == 0)
- {
- memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
- }
-
- /* Save the contexts separately for alt ref, gold and last. */
- /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
- if(cm->refresh_alt_ref_frame)
- memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
-
- if(cm->refresh_golden_frame)
- memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
-
- if(cm->refresh_last_frame)
- memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
-
- /* if its a dropped frame honor the requests on subsequent frames */
- if (*size > 0)
- {
- cpi->droppable = !frame_is_reference(cpi);
-
- /* return to normal state */
- cm->refresh_entropy_probs = 1;
- cm->refresh_alt_ref_frame = 0;
- cm->refresh_golden_frame = 0;
- cm->refresh_last_frame = 1;
- cm->frame_type = INTER_FRAME;
-
- }
-
- /* Save layer specific state */
- if (cpi->oxcf.number_of_layers > 1)
- save_layer_context (cpi);
-
- vpx_usec_timer_mark(&cmptimer);
- cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
-
- if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
- {
- generate_psnr_packet(cpi);
- }
-
-#if CONFIG_INTERNAL_STATS
-
- if (cpi->pass != 1)
- {
- cpi->bytes += *size;
-
- if (cm->show_frame)
- {
- cpi->common.show_frame_mi = cpi->common.mi;
- cpi->count ++;
-
- if (cpi->b_calculate_psnr)
- {
- uint64_t ye,ue,ve;
- double frame_psnr;
- YV12_BUFFER_CONFIG *orig = cpi->Source;
- YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
- unsigned int y_width = cpi->common.Width;
- unsigned int y_height = cpi->common.Height;
- unsigned int uv_width = (y_width + 1) / 2;
- unsigned int uv_height = (y_height + 1) / 2;
- int y_samples = y_height * y_width;
- int uv_samples = uv_height * uv_width;
- int t_samples = y_samples + 2 * uv_samples;
- double sq_error;
-
- ye = calc_plane_error(orig->y_buffer, orig->y_stride,
- recon->y_buffer, recon->y_stride, y_width, y_height);
-
- ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
- recon->u_buffer, recon->uv_stride, uv_width, uv_height);
-
- ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
- recon->v_buffer, recon->uv_stride, uv_width, uv_height);
-
- sq_error = (double)(ye + ue + ve);
-
- frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
-
- cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
- cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
- cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
- cpi->total_sq_error += sq_error;
- cpi->total += frame_psnr;
-#if CONFIG_POSTPROC
- {
- YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
- double sq_error2;
- double frame_psnr2, frame_ssim2 = 0;
- double weight = 0;
-
- vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer, cm->filter_level * 10 / 6, 1, 0);
- vp8_clear_system_state();
-
- ye = calc_plane_error(orig->y_buffer, orig->y_stride,
- pp->y_buffer, pp->y_stride, y_width, y_height);
-
- ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
- pp->u_buffer, pp->uv_stride, uv_width, uv_height);
-
- ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
- pp->v_buffer, pp->uv_stride, uv_width, uv_height);
-
- sq_error2 = (double)(ye + ue + ve);
-
- frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
-
- cpi->totalp_y += vpx_sse_to_psnr(y_samples,
- 255.0, (double)ye);
- cpi->totalp_u += vpx_sse_to_psnr(uv_samples,
- 255.0, (double)ue);
- cpi->totalp_v += vpx_sse_to_psnr(uv_samples,
- 255.0, (double)ve);
- cpi->total_sq_error2 += sq_error2;
- cpi->totalp += frame_psnr2;
-
- frame_ssim2 = vp8_calc_ssim(cpi->Source,
- &cm->post_proc_buffer, 1, &weight);
-
- cpi->summed_quality += frame_ssim2 * weight;
- cpi->summed_weights += weight;
-
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
-
- for (i=cpi->current_layer;
- i<cpi->oxcf.number_of_layers; i++)
- {
- cpi->frames_in_layer[i]++;
-
- cpi->bytes_in_layer[i] += *size;
- cpi->sum_psnr[i] += frame_psnr;
- cpi->sum_psnr_p[i] += frame_psnr2;
- cpi->total_error2[i] += sq_error;
- cpi->total_error2_p[i] += sq_error2;
- cpi->sum_ssim[i] += frame_ssim2 * weight;
- cpi->sum_weights[i] += weight;
- }
- }
- }
-#endif
- }
-
- if (cpi->b_calculate_ssimg)
- {
- double y, u, v, frame_all;
- frame_all = vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
- &y, &u, &v);
-
- if (cpi->oxcf.number_of_layers > 1)
- {
- unsigned int i;
-
- for (i=cpi->current_layer;
- i<cpi->oxcf.number_of_layers; i++)
- {
- if (!cpi->b_calculate_psnr)
- cpi->frames_in_layer[i]++;
-
- cpi->total_ssimg_y_in_layer[i] += y;
- cpi->total_ssimg_u_in_layer[i] += u;
- cpi->total_ssimg_v_in_layer[i] += v;
- cpi->total_ssimg_all_in_layer[i] += frame_all;
- }
- }
- else
- {
- cpi->total_ssimg_y += y;
- cpi->total_ssimg_u += u;
- cpi->total_ssimg_v += v;
- cpi->total_ssimg_all += frame_all;
- }
- }
-
- }
- }
-
-#if 0
-
- if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
- {
- skiptruecount += cpi->skip_true_count;
- skipfalsecount += cpi->skip_false_count;
- }
-
-#endif
-#if 0
-
- if (cpi->pass != 1)
- {
- FILE *f = fopen("skip.stt", "a");
- fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
-
- if (cpi->is_src_frame_alt_ref == 1)
- fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
-
- fclose(f);
- }
-
-#endif
-#endif
-
- cpi->common.error.setjmp = 0;
-
- return 0;
-}
-
-int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags)
-{
- if (cpi->common.refresh_alt_ref_frame)
- return -1;
- else
- {
- int ret;
-
-#if CONFIG_MULTITHREAD
- if(cpi->b_lpf_running)
- {
- sem_wait(&cpi->h_event_end_lpf);
- cpi->b_lpf_running = 0;
- }
-#endif
-
-#if CONFIG_POSTPROC
- cpi->common.show_frame_mi = cpi->common.mi;
- ret = vp8_post_proc_frame(&cpi->common, dest, flags);
-#else
- (void)flags;
-
- if (cpi->common.frame_to_show)
- {
- *dest = *cpi->common.frame_to_show;
- dest->y_width = cpi->common.Width;
- dest->y_height = cpi->common.Height;
- dest->uv_height = cpi->common.Height / 2;
- ret = 0;
- }
- else
- {
- ret = -1;
- }
-
-#endif
- vp8_clear_system_state();
- return ret;
- }
-}
-
-int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4])
-{
- signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
- int internal_delta_q[MAX_MB_SEGMENTS];
- const int range = 63;
- int i;
-
- // This method is currently incompatible with the cyclic refresh method
- if ( cpi->cyclic_refresh_mode_enabled )
- return -1;
-
- // Check number of rows and columns match
- if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
- return -1;
-
- // Range check the delta Q values and convert the external Q range values
- // to internal ones.
- if ( (abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
- (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range) )
- return -1;
-
- // Range check the delta lf values
- if ( (abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
- (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range) )
- return -1;
-
- if (!map)
- {
- disable_segmentation(cpi);
- return 0;
- }
-
- // Translate the external delta q values to internal values.
- for ( i = 0; i < MAX_MB_SEGMENTS; i++ )
- internal_delta_q[i] =
- ( delta_q[i] >= 0 ) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
-
- /* Set the segmentation Map */
- set_segmentation_map(cpi, map);
-
- /* Activate segmentation. */
- enable_segmentation(cpi);
-
- /* Set up the quant segment data */
- feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
- feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
- feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
- feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
-
- /* Set up the loop segment data s */
- feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
- feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
- feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
- feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
-
- cpi->segment_encode_breakout[0] = threshold[0];
- cpi->segment_encode_breakout[1] = threshold[1];
- cpi->segment_encode_breakout[2] = threshold[2];
- cpi->segment_encode_breakout[3] = threshold[3];
-
- /* Initialise the feature data structure */
- set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
-
- return 0;
-}
-
-int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows, unsigned int cols)
-{
- if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols)
- {
- if (map)
- {
- memcpy(cpi->active_map, map, rows * cols);
- cpi->active_map_enabled = 1;
- }
- else
- cpi->active_map_enabled = 0;
-
- return 0;
- }
- else
- {
- return -1 ;
- }
-}
-
-int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode, VPX_SCALING vert_mode)
-{
- if (horiz_mode <= ONETWO)
- cpi->common.horiz_scale = horiz_mode;
- else
- return -1;
-
- if (vert_mode <= ONETWO)
- cpi->common.vert_scale = vert_mode;
- else
- return -1;
-
- return 0;
-}
-
-
-
-int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest)
-{
- int i, j;
- int Total = 0;
-
- unsigned char *src = source->y_buffer;
- unsigned char *dst = dest->y_buffer;
-
- /* Loop through the Y plane raw and reconstruction data summing
- * (square differences)
- */
- for (i = 0; i < source->y_height; i += 16)
- {
- for (j = 0; j < source->y_width; j += 16)
- {
- unsigned int sse;
- Total += vpx_mse16x16(src + j, source->y_stride,
- dst + j, dest->y_stride, &sse);
- }
-
- src += 16 * source->y_stride;
- dst += 16 * dest->y_stride;
- }
-
- return Total;
-}
-
-
-int vp8_get_quantizer(VP8_COMP *cpi)
-{
- return cpi->common.base_qindex;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_int.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_int.h
deleted file mode 100644
index c48e2f4478b..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/onyx_int.h
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_ONYX_INT_H_
-#define VP8_ENCODER_ONYX_INT_H_
-
-#include <stdio.h>
-#include "vpx_config.h"
-#include "vp8/common/onyx.h"
-#include "treewriter.h"
-#include "tokenize.h"
-#include "vp8/common/onyxc_int.h"
-#include "vp8/common/variance.h"
-#include "encodemb.h"
-#include "quantize.h"
-#include "vp8/common/entropy.h"
-#include "vp8/common/threading.h"
-#include "vpx_ports/mem.h"
-#include "vpx/internal/vpx_codec_internal.h"
-#include "vpx/vp8.h"
-#include "mcomp.h"
-#include "vp8/common/findnearmv.h"
-#include "lookahead.h"
-#if CONFIG_TEMPORAL_DENOISING
-#include "vp8/encoder/denoising.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define MIN_GF_INTERVAL 4
-#define DEFAULT_GF_INTERVAL 7
-
-#define KEY_FRAME_CONTEXT 5
-
-#define MAX_LAG_BUFFERS (CONFIG_REALTIME_ONLY? 1 : 25)
-
-#define AF_THRESH 25
-#define AF_THRESH2 100
-#define ARF_DECAY_THRESH 12
-
-
-#define MIN_THRESHMULT 32
-#define MAX_THRESHMULT 512
-
-#define GF_ZEROMV_ZBIN_BOOST 12
-#define LF_ZEROMV_ZBIN_BOOST 6
-#define MV_ZBIN_BOOST 4
-#define ZBIN_OQ_MAX 192
-
-#if !(CONFIG_REALTIME_ONLY)
-#define VP8_TEMPORAL_ALT_REF 1
-#endif
-
-typedef struct
-{
- int kf_indicated;
- unsigned int frames_since_key;
- unsigned int frames_since_golden;
- int filter_level;
- int frames_till_gf_update_due;
- int recent_ref_frame_usage[MAX_REF_FRAMES];
-
- MV_CONTEXT mvc[2];
- int mvcosts[2][MVvals+1];
-
-#ifdef MODE_STATS
- int y_modes[5];
- int uv_modes[4];
- int b_modes[10];
- int inter_y_modes[10];
- int inter_uv_modes[4];
- int inter_b_modes[10];
-#endif
-
- vp8_prob ymode_prob[4], uv_mode_prob[3]; /* interframe intra mode probs */
- vp8_prob kf_ymode_prob[4], kf_uv_mode_prob[3]; /* keyframe "" */
-
- int ymode_count[5], uv_mode_count[4]; /* intra MB type cts this frame */
-
- int count_mb_ref_frame_usage[MAX_REF_FRAMES];
-
- int this_frame_percent_intra;
- int last_frame_percent_intra;
-
-
-} CODING_CONTEXT;
-
-typedef struct
-{
- double frame;
- double intra_error;
- double coded_error;
- double ssim_weighted_pred_err;
- double pcnt_inter;
- double pcnt_motion;
- double pcnt_second_ref;
- double pcnt_neutral;
- double MVr;
- double mvr_abs;
- double MVc;
- double mvc_abs;
- double MVrv;
- double MVcv;
- double mv_in_out_count;
- double new_mv_count;
- double duration;
- double count;
-}
-FIRSTPASS_STATS;
-
-typedef struct
-{
- int frames_so_far;
- double frame_intra_error;
- double frame_coded_error;
- double frame_pcnt_inter;
- double frame_pcnt_motion;
- double frame_mvr;
- double frame_mvr_abs;
- double frame_mvc;
- double frame_mvc_abs;
-
-} ONEPASS_FRAMESTATS;
-
-
-typedef enum
-{
- THR_ZERO1 = 0,
- THR_DC = 1,
-
- THR_NEAREST1 = 2,
- THR_NEAR1 = 3,
-
- THR_ZERO2 = 4,
- THR_NEAREST2 = 5,
-
- THR_ZERO3 = 6,
- THR_NEAREST3 = 7,
-
- THR_NEAR2 = 8,
- THR_NEAR3 = 9,
-
- THR_V_PRED = 10,
- THR_H_PRED = 11,
- THR_TM = 12,
-
- THR_NEW1 = 13,
- THR_NEW2 = 14,
- THR_NEW3 = 15,
-
- THR_SPLIT1 = 16,
- THR_SPLIT2 = 17,
- THR_SPLIT3 = 18,
-
- THR_B_PRED = 19
-}
-THR_MODES;
-
-typedef enum
-{
- DIAMOND = 0,
- NSTEP = 1,
- HEX = 2
-} SEARCH_METHODS;
-
-typedef struct
-{
- int RD;
- SEARCH_METHODS search_method;
- int improved_quant;
- int improved_dct;
- int auto_filter;
- int recode_loop;
- int iterative_sub_pixel;
- int half_pixel_search;
- int quarter_pixel_search;
- int thresh_mult[MAX_MODES];
- int max_step_search_steps;
- int first_step;
- int optimize_coefficients;
-
- int use_fastquant_for_pick;
- int no_skip_block4x4_search;
- int improved_mv_pred;
-
-} SPEED_FEATURES;
-
-typedef struct
-{
- MACROBLOCK mb;
- int segment_counts[MAX_MB_SEGMENTS];
- int totalrate;
-} MB_ROW_COMP;
-
-typedef struct
-{
- TOKENEXTRA *start;
- TOKENEXTRA *stop;
-} TOKENLIST;
-
-typedef struct
-{
- int ithread;
- void *ptr1;
- void *ptr2;
-} ENCODETHREAD_DATA;
-typedef struct
-{
- int ithread;
- void *ptr1;
-} LPFTHREAD_DATA;
-
-enum
-{
- BLOCK_16X8,
- BLOCK_8X16,
- BLOCK_8X8,
- BLOCK_4X4,
- BLOCK_16X16,
- BLOCK_MAX_SEGMENTS
-};
-
-typedef struct
-{
- /* Layer configuration */
- double framerate;
- int target_bandwidth;
-
- /* Layer specific coding parameters */
- int64_t starting_buffer_level;
- int64_t optimal_buffer_level;
- int64_t maximum_buffer_size;
- int64_t starting_buffer_level_in_ms;
- int64_t optimal_buffer_level_in_ms;
- int64_t maximum_buffer_size_in_ms;
-
- int avg_frame_size_for_layer;
-
- int64_t buffer_level;
- int64_t bits_off_target;
-
- int64_t total_actual_bits;
- int total_target_vs_actual;
-
- int worst_quality;
- int active_worst_quality;
- int best_quality;
- int active_best_quality;
-
- int ni_av_qi;
- int ni_tot_qi;
- int ni_frames;
- int avg_frame_qindex;
-
- double rate_correction_factor;
- double key_frame_rate_correction_factor;
- double gf_rate_correction_factor;
-
- int zbin_over_quant;
-
- int inter_frame_target;
- int64_t total_byte_count;
-
- int filter_level;
-
- int last_frame_percent_intra;
-
- int count_mb_ref_frame_usage[MAX_REF_FRAMES];
-
-} LAYER_CONTEXT;
-
-typedef struct VP8_COMP
-{
-
- DECLARE_ALIGNED(16, short, Y1quant[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y1quant_shift[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y1zbin[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y1round[QINDEX_RANGE][16]);
-
- DECLARE_ALIGNED(16, short, Y2quant[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y2quant_shift[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y2zbin[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y2round[QINDEX_RANGE][16]);
-
- DECLARE_ALIGNED(16, short, UVquant[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, UVquant_shift[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, UVzbin[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, UVround[QINDEX_RANGE][16]);
-
- DECLARE_ALIGNED(16, short, zrun_zbin_boost_y1[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, zrun_zbin_boost_y2[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, zrun_zbin_boost_uv[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y1quant_fast[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, Y2quant_fast[QINDEX_RANGE][16]);
- DECLARE_ALIGNED(16, short, UVquant_fast[QINDEX_RANGE][16]);
-
-
- MACROBLOCK mb;
- VP8_COMMON common;
- vp8_writer bc[9]; /* one boolcoder for each partition */
-
- VP8_CONFIG oxcf;
-
- struct lookahead_ctx *lookahead;
- struct lookahead_entry *source;
- struct lookahead_entry *alt_ref_source;
- struct lookahead_entry *last_source;
-
- YV12_BUFFER_CONFIG *Source;
- YV12_BUFFER_CONFIG *un_scaled_source;
- YV12_BUFFER_CONFIG scaled_source;
- YV12_BUFFER_CONFIG *last_frame_unscaled_source;
-
- unsigned int frames_till_alt_ref_frame;
- /* frame in src_buffers has been identified to be encoded as an alt ref */
- int source_alt_ref_pending;
- /* an alt ref frame has been encoded and is usable */
- int source_alt_ref_active;
- /* source of frame to encode is an exact copy of an alt ref frame */
- int is_src_frame_alt_ref;
-
- /* golden frame same as last frame ( short circuit gold searches) */
- int gold_is_last;
- /* Alt reference frame same as last ( short circuit altref search) */
- int alt_is_last;
- /* don't do both alt and gold search ( just do gold). */
- int gold_is_alt;
-
- YV12_BUFFER_CONFIG pick_lf_lvl_frame;
-
- TOKENEXTRA *tok;
- unsigned int tok_count;
-
-
- unsigned int frames_since_key;
- unsigned int key_frame_frequency;
- unsigned int this_key_frame_forced;
- unsigned int next_key_frame_forced;
-
- /* Ambient reconstruction err target for force key frames */
- int ambient_err;
-
- unsigned int mode_check_freq[MAX_MODES];
-
- int rd_baseline_thresh[MAX_MODES];
-
- int RDMULT;
- int RDDIV ;
-
- CODING_CONTEXT coding_context;
-
- /* Rate targetting variables */
- int64_t last_prediction_error;
- int64_t last_intra_error;
-
- int this_frame_target;
- int projected_frame_size;
- int last_q[2]; /* Separate values for Intra/Inter */
-
- double rate_correction_factor;
- double key_frame_rate_correction_factor;
- double gf_rate_correction_factor;
-
- unsigned int frames_since_golden;
- /* Count down till next GF */
- int frames_till_gf_update_due;
-
- /* GF interval chosen when we coded the last GF */
- int current_gf_interval;
-
- /* Total bits overspent becasue of GF boost (cumulative) */
- int gf_overspend_bits;
-
- /* Used in the few frames following a GF to recover the extra bits
- * spent in that GF
- */
- int non_gf_bitrate_adjustment;
-
- /* Extra bits spent on key frames that need to be recovered */
- int kf_overspend_bits;
-
- /* Current number of bit s to try and recover on each inter frame. */
- int kf_bitrate_adjustment;
- int max_gf_interval;
- int baseline_gf_interval;
- int active_arnr_frames;
-
- int64_t key_frame_count;
- int prior_key_frame_distance[KEY_FRAME_CONTEXT];
- /* Current section per frame bandwidth target */
- int per_frame_bandwidth;
- /* Average frame size target for clip */
- int av_per_frame_bandwidth;
- /* Minimum allocation that should be used for any frame */
- int min_frame_bandwidth;
- int inter_frame_target;
- double output_framerate;
- int64_t last_time_stamp_seen;
- int64_t last_end_time_stamp_seen;
- int64_t first_time_stamp_ever;
-
- int ni_av_qi;
- int ni_tot_qi;
- int ni_frames;
- int avg_frame_qindex;
-
- int64_t total_byte_count;
-
- int buffered_mode;
-
- double framerate;
- double ref_framerate;
- int64_t buffer_level;
- int64_t bits_off_target;
-
- int rolling_target_bits;
- int rolling_actual_bits;
-
- int long_rolling_target_bits;
- int long_rolling_actual_bits;
-
- int64_t total_actual_bits;
- int total_target_vs_actual; /* debug stats */
-
- int worst_quality;
- int active_worst_quality;
- int best_quality;
- int active_best_quality;
-
- int cq_target_quality;
-
- int drop_frames_allowed; /* Are we permitted to drop frames? */
- int drop_frame; /* Drop this frame? */
-
- vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
- char update_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-
- unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-
- int gfu_boost;
- int kf_boost;
- int last_boost;
-
- int target_bandwidth;
- struct vpx_codec_pkt_list *output_pkt_list;
-
-#if 0
- /* Experimental code for lagged and one pass */
- ONEPASS_FRAMESTATS one_pass_frame_stats[MAX_LAG_BUFFERS];
- int one_pass_frame_index;
-#endif
-
- int decimation_factor;
- int decimation_count;
-
- /* for real time encoding */
- int avg_encode_time; /* microsecond */
- int avg_pick_mode_time; /* microsecond */
- int Speed;
- int compressor_speed;
-
- int auto_gold;
- int auto_adjust_gold_quantizer;
- int auto_worst_q;
- int cpu_used;
- int pass;
-
-
- int prob_intra_coded;
- int prob_last_coded;
- int prob_gf_coded;
- int prob_skip_false;
- int last_skip_false_probs[3];
- int last_skip_probs_q[3];
- int recent_ref_frame_usage[MAX_REF_FRAMES];
-
- int this_frame_percent_intra;
- int last_frame_percent_intra;
-
- int ref_frame_flags;
-
- SPEED_FEATURES sf;
-
- /* Count ZEROMV on all reference frames. */
- int zeromv_count;
- int lf_zeromv_pct;
-
- unsigned char *segmentation_map;
- signed char segment_feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
- int segment_encode_breakout[MAX_MB_SEGMENTS];
-
- unsigned char *active_map;
- unsigned int active_map_enabled;
-
- /* Video conferencing cyclic refresh mode flags. This is a mode
- * designed to clean up the background over time in live encoding
- * scenarious. It uses segmentation.
- */
- int cyclic_refresh_mode_enabled;
- int cyclic_refresh_mode_max_mbs_perframe;
- int cyclic_refresh_mode_index;
- int cyclic_refresh_q;
- signed char *cyclic_refresh_map;
- // Count on how many (consecutive) times a macroblock uses ZER0MV_LAST.
- unsigned char *consec_zero_last;
- // Counter that is reset when a block is checked for a mode-bias against
- // ZEROMV_LASTREF.
- unsigned char *consec_zero_last_mvbias;
-
- // Frame counter for the temporal pattern. Counter is rest when the temporal
- // layers are changed dynamically (run-time change).
- unsigned int temporal_pattern_counter;
- // Temporal layer id.
- int temporal_layer_id;
-
- // Measure of average squared difference between source and denoised signal.
- int mse_source_denoised;
-
- int force_maxqp;
-
-#if CONFIG_MULTITHREAD
- /* multithread data */
- int * mt_current_mb_col;
- int mt_sync_range;
- int b_multi_threaded;
- int encoding_thread_count;
- int b_lpf_running;
-
- pthread_t *h_encoding_thread;
- pthread_t h_filter_thread;
-
- MB_ROW_COMP *mb_row_ei;
- ENCODETHREAD_DATA *en_thread_data;
- LPFTHREAD_DATA lpf_thread_data;
-
- /* events */
- sem_t *h_event_start_encoding;
- sem_t h_event_end_encoding;
- sem_t h_event_start_lpf;
- sem_t h_event_end_lpf;
-#endif
-
- TOKENLIST *tplist;
- unsigned int partition_sz[MAX_PARTITIONS];
- unsigned char *partition_d[MAX_PARTITIONS];
- unsigned char *partition_d_end[MAX_PARTITIONS];
-
-
- fractional_mv_step_fp *find_fractional_mv_step;
- vp8_full_search_fn_t full_search_sad;
- vp8_refining_search_fn_t refining_search_sad;
- vp8_diamond_search_fn_t diamond_search_sad;
- vp8_variance_fn_ptr_t fn_ptr[BLOCK_MAX_SEGMENTS];
- uint64_t time_receive_data;
- uint64_t time_compress_data;
- uint64_t time_pick_lpf;
- uint64_t time_encode_mb_row;
-
- int base_skip_false_prob[128];
-
- FRAME_CONTEXT lfc_n; /* last frame entropy */
- FRAME_CONTEXT lfc_a; /* last alt ref entropy */
- FRAME_CONTEXT lfc_g; /* last gold ref entropy */
-
-
- struct twopass_rc
- {
- unsigned int section_intra_rating;
- double section_max_qfactor;
- unsigned int next_iiratio;
- unsigned int this_iiratio;
- FIRSTPASS_STATS total_stats;
- FIRSTPASS_STATS this_frame_stats;
- FIRSTPASS_STATS *stats_in, *stats_in_end, *stats_in_start;
- FIRSTPASS_STATS total_left_stats;
- int first_pass_done;
- int64_t bits_left;
- int64_t clip_bits_total;
- double avg_iiratio;
- double modified_error_total;
- double modified_error_used;
- double modified_error_left;
- double kf_intra_err_min;
- double gf_intra_err_min;
- int frames_to_key;
- int maxq_max_limit;
- int maxq_min_limit;
- int gf_decay_rate;
- int static_scene_max_gf_interval;
- int kf_bits;
- /* Remaining error from uncoded frames in a gf group. */
- int gf_group_error_left;
- /* Projected total bits available for a key frame group of frames */
- int64_t kf_group_bits;
- /* Error score of frames still to be coded in kf group */
- int64_t kf_group_error_left;
- /* Projected Bits available for a group including 1 GF or ARF */
- int64_t gf_group_bits;
- /* Bits for the golden frame or ARF */
- int gf_bits;
- int alt_extra_bits;
- double est_max_qcorrection_factor;
- } twopass;
-
-#if VP8_TEMPORAL_ALT_REF
- YV12_BUFFER_CONFIG alt_ref_buffer;
- YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS];
- int fixed_divide[512];
-#endif
-
-#if CONFIG_INTERNAL_STATS
- int count;
- double total_y;
- double total_u;
- double total_v;
- double total ;
- double total_sq_error;
- double totalp_y;
- double totalp_u;
- double totalp_v;
- double totalp;
- double total_sq_error2;
- int bytes;
- double summed_quality;
- double summed_weights;
- unsigned int tot_recode_hits;
-
-
- double total_ssimg_y;
- double total_ssimg_u;
- double total_ssimg_v;
- double total_ssimg_all;
-
- int b_calculate_ssimg;
-#endif
- int b_calculate_psnr;
-
- /* Per MB activity measurement */
- unsigned int activity_avg;
- unsigned int * mb_activity_map;
-
- /* Record of which MBs still refer to last golden frame either
- * directly or through 0,0
- */
- unsigned char *gf_active_flags;
- int gf_active_count;
-
- int output_partition;
-
- /* Store last frame's MV info for next frame MV prediction */
- int_mv *lfmv;
- int *lf_ref_frame_sign_bias;
- int *lf_ref_frame;
-
- /* force next frame to intra when kf_auto says so */
- int force_next_frame_intra;
-
- int droppable;
-
- int initial_width;
- int initial_height;
-
-#if CONFIG_TEMPORAL_DENOISING
- VP8_DENOISER denoiser;
-#endif
-
- /* Coding layer state variables */
- unsigned int current_layer;
- LAYER_CONTEXT layer_context[VPX_TS_MAX_LAYERS];
-
- int64_t frames_in_layer[VPX_TS_MAX_LAYERS];
- int64_t bytes_in_layer[VPX_TS_MAX_LAYERS];
- double sum_psnr[VPX_TS_MAX_LAYERS];
- double sum_psnr_p[VPX_TS_MAX_LAYERS];
- double total_error2[VPX_TS_MAX_LAYERS];
- double total_error2_p[VPX_TS_MAX_LAYERS];
- double sum_ssim[VPX_TS_MAX_LAYERS];
- double sum_weights[VPX_TS_MAX_LAYERS];
-
- double total_ssimg_y_in_layer[VPX_TS_MAX_LAYERS];
- double total_ssimg_u_in_layer[VPX_TS_MAX_LAYERS];
- double total_ssimg_v_in_layer[VPX_TS_MAX_LAYERS];
- double total_ssimg_all_in_layer[VPX_TS_MAX_LAYERS];
-
-#if CONFIG_MULTI_RES_ENCODING
- /* Number of MBs per row at lower-resolution level */
- int mr_low_res_mb_cols;
- /* Indicate if lower-res mv info is available */
- unsigned char mr_low_res_mv_avail;
-#endif
- /* The frame number of each reference frames */
- unsigned int current_ref_frames[MAX_REF_FRAMES];
- // Closest reference frame to current frame.
- MV_REFERENCE_FRAME closest_reference_frame;
-
- struct rd_costs_struct
- {
- int mvcosts[2][MVvals+1];
- int mvsadcosts[2][MVfpvals+1];
- int mbmode_cost[2][MB_MODE_COUNT];
- int intra_uv_mode_cost[2][MB_MODE_COUNT];
- int bmode_costs[10][10][10];
- int inter_bmode_costs[B_MODE_COUNT];
- int token_costs[BLOCK_TYPES][COEF_BANDS]
- [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
- } rd_costs;
-} VP8_COMP;
-
-void vp8_alloc_compressor_data(VP8_COMP *cpi);
-int vp8_reverse_trans(int x);
-void vp8_new_framerate(VP8_COMP *cpi, double framerate);
-void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm);
-
-void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest,
- unsigned char *dest_end, unsigned long *size);
-
-void vp8_tokenize_mb(VP8_COMP *, MACROBLOCK *, TOKENEXTRA **);
-
-void vp8_set_speed_features(VP8_COMP *cpi);
-
-#if CONFIG_DEBUG
-#define CHECK_MEM_ERROR(lval,expr) do {\
- lval = (expr); \
- if(!lval) \
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
- "Failed to allocate "#lval" at %s:%d", \
- __FILE__,__LINE__);\
- } while(0)
-#else
-#define CHECK_MEM_ERROR(lval,expr) do {\
- lval = (expr); \
- if(!lval) \
- vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,\
- "Failed to allocate "#lval);\
- } while(0)
-#endif
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_ONYX_INT_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c
deleted file mode 100644
index 053bf119aa9..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c
+++ /dev/null
@@ -1,1548 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <limits.h>
-#include "vpx_config.h"
-#include "./vpx_dsp_rtcd.h"
-#include "onyx_int.h"
-#include "modecosts.h"
-#include "encodeintra.h"
-#include "vp8/common/common.h"
-#include "vp8/common/entropymode.h"
-#include "pickinter.h"
-#include "vp8/common/findnearmv.h"
-#include "encodemb.h"
-#include "vp8/common/reconinter.h"
-#include "vp8/common/reconintra4x4.h"
-#include "vp8/common/variance.h"
-#include "mcomp.h"
-#include "rdopt.h"
-#include "vpx_mem/vpx_mem.h"
-#if CONFIG_TEMPORAL_DENOISING
-#include "denoising.h"
-#endif
-
-#ifdef SPEEDSTATS
-extern unsigned int cnt_pm;
-#endif
-
-extern const int vp8_ref_frame_order[MAX_MODES];
-extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
-
-// Fixed point implementation of a skin color classifier. Skin color
-// is model by a Gaussian distribution in the CbCr color space.
-// See ../../test/skin_color_detector_test.cc where the reference
-// skin color classifier is defined.
-
-// Fixed-point skin color model parameters.
-static const int skin_mean[2] = {7463, 9614}; // q6
-static const int skin_inv_cov[4] = {4107, 1663, 1663, 2157}; // q16
-static const int skin_threshold = 1570636; // q18
-
-// Evaluates the Mahalanobis distance measure for the input CbCr values.
-static int evaluate_skin_color_difference(int cb, int cr)
-{
- const int cb_q6 = cb << 6;
- const int cr_q6 = cr << 6;
- const int cb_diff_q12 = (cb_q6 - skin_mean[0]) * (cb_q6 - skin_mean[0]);
- const int cbcr_diff_q12 = (cb_q6 - skin_mean[0]) * (cr_q6 - skin_mean[1]);
- const int cr_diff_q12 = (cr_q6 - skin_mean[1]) * (cr_q6 - skin_mean[1]);
- const int cb_diff_q2 = (cb_diff_q12 + (1 << 9)) >> 10;
- const int cbcr_diff_q2 = (cbcr_diff_q12 + (1 << 9)) >> 10;
- const int cr_diff_q2 = (cr_diff_q12 + (1 << 9)) >> 10;
- const int skin_diff = skin_inv_cov[0] * cb_diff_q2 +
- skin_inv_cov[1] * cbcr_diff_q2 +
- skin_inv_cov[2] * cbcr_diff_q2 +
- skin_inv_cov[3] * cr_diff_q2;
- return skin_diff;
-}
-
-static int macroblock_corner_grad(unsigned char* signal, int stride,
- int offsetx, int offsety, int sgnx, int sgny)
-{
- int y1 = signal[offsetx * stride + offsety];
- int y2 = signal[offsetx * stride + offsety + sgny];
- int y3 = signal[(offsetx + sgnx) * stride + offsety];
- int y4 = signal[(offsetx + sgnx) * stride + offsety + sgny];
- return MAX(MAX(abs(y1 - y2), abs(y1 - y3)), abs(y1 - y4));
-}
-
-static int check_dot_artifact_candidate(VP8_COMP *cpi,
- MACROBLOCK *x,
- unsigned char *target_last,
- int stride,
- unsigned char* last_ref,
- int mb_row,
- int mb_col,
- int channel)
-{
- int threshold1 = 6;
- int threshold2 = 3;
- unsigned int max_num = (cpi->common.MBs) / 10;
- int grad_last = 0;
- int grad_source = 0;
- int index = mb_row * cpi->common.mb_cols + mb_col;
- // Threshold for #consecutive (base layer) frames using zero_last mode.
- int num_frames = 30;
- int shift = 15;
- if (channel > 0) {
- shift = 7;
- }
- if (cpi->oxcf.number_of_layers > 1)
- {
- num_frames = 20;
- }
- x->zero_last_dot_suppress = 0;
- // Blocks on base layer frames that have been using ZEROMV_LAST repeatedly
- // (i.e, at least |x| consecutive frames are candidates for increasing the
- // rd adjustment for zero_last mode.
- // Only allow this for at most |max_num| blocks per frame.
- // Don't allow this for screen content input.
- if (cpi->current_layer == 0 &&
- cpi->consec_zero_last_mvbias[index] > num_frames &&
- x->mbs_zero_last_dot_suppress < max_num &&
- !cpi->oxcf.screen_content_mode)
- {
- // If this block is checked here, label it so we don't check it again until
- // ~|x| framaes later.
- x->zero_last_dot_suppress = 1;
- // Dot artifact is noticeable as strong gradient at corners of macroblock,
- // for flat areas. As a simple detector for now, we look for a high
- // corner gradient on last ref, and a smaller gradient on source.
- // Check 4 corners, return if any satisfy condition.
- // Top-left:
- grad_last = macroblock_corner_grad(last_ref, stride, 0, 0, 1, 1);
- grad_source = macroblock_corner_grad(target_last, stride, 0, 0, 1, 1);
- if (grad_last >= threshold1 && grad_source <= threshold2)
- {
- x->mbs_zero_last_dot_suppress++;
- return 1;
- }
- // Top-right:
- grad_last = macroblock_corner_grad(last_ref, stride, 0, shift, 1, -1);
- grad_source = macroblock_corner_grad(target_last, stride, 0, shift, 1, -1);
- if (grad_last >= threshold1 && grad_source <= threshold2)
- {
- x->mbs_zero_last_dot_suppress++;
- return 1;
- }
- // Bottom-left:
- grad_last = macroblock_corner_grad(last_ref, stride, shift, 0, -1, 1);
- grad_source = macroblock_corner_grad(target_last, stride, shift, 0, -1, 1);
- if (grad_last >= threshold1 && grad_source <= threshold2)
- {
- x->mbs_zero_last_dot_suppress++;
- return 1;
- }
- // Bottom-right:
- grad_last = macroblock_corner_grad(last_ref, stride, shift, shift, -1, -1);
- grad_source = macroblock_corner_grad(target_last, stride, shift, shift, -1, -1);
- if (grad_last >= threshold1 && grad_source <= threshold2)
- {
- x->mbs_zero_last_dot_suppress++;
- return 1;
- }
- return 0;
- }
- return 0;
-}
-
-// Checks if the input yCbCr values corresponds to skin color.
-static int is_skin_color(int y, int cb, int cr)
-{
- if (y < 40 || y > 220)
- {
- return 0;
- }
- return (evaluate_skin_color_difference(cb, cr) < skin_threshold);
-}
-
-int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d,
- int_mv *bestmv, int_mv *ref_mv,
- int error_per_bit,
- const vp8_variance_fn_ptr_t *vfp,
- int *mvcost[2], int *distortion,
- unsigned int *sse)
-{
- (void) b;
- (void) d;
- (void) ref_mv;
- (void) error_per_bit;
- (void) vfp;
- (void) mb;
- (void) mvcost;
- (void) distortion;
- (void) sse;
- bestmv->as_mv.row <<= 3;
- bestmv->as_mv.col <<= 3;
- return 0;
-}
-
-
-int vp8_get_inter_mbpred_error(MACROBLOCK *mb,
- const vp8_variance_fn_ptr_t *vfp,
- unsigned int *sse,
- int_mv this_mv)
-{
-
- BLOCK *b = &mb->block[0];
- BLOCKD *d = &mb->e_mbd.block[0];
- unsigned char *what = (*(b->base_src) + b->src);
- int what_stride = b->src_stride;
- int pre_stride = mb->e_mbd.pre.y_stride;
- unsigned char *in_what = mb->e_mbd.pre.y_buffer + d->offset ;
- int in_what_stride = pre_stride;
- int xoffset = this_mv.as_mv.col & 7;
- int yoffset = this_mv.as_mv.row & 7;
-
- in_what += (this_mv.as_mv.row >> 3) * pre_stride + (this_mv.as_mv.col >> 3);
-
- if (xoffset | yoffset)
- {
- return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what, what_stride, sse);
- }
- else
- {
- return vfp->vf(what, what_stride, in_what, in_what_stride, sse);
- }
-
-}
-
-static int get_prediction_error(BLOCK *be, BLOCKD *b)
-{
- unsigned char *sptr;
- unsigned char *dptr;
- sptr = (*(be->base_src) + be->src);
- dptr = b->predictor;
-
- return vpx_get4x4sse_cs(sptr, be->src_stride, dptr, 16);
-
-}
-
-static int pick_intra4x4block(
- MACROBLOCK *x,
- int ib,
- B_PREDICTION_MODE *best_mode,
- const int *mode_costs,
-
- int *bestrate,
- int *bestdistortion)
-{
-
- BLOCKD *b = &x->e_mbd.block[ib];
- BLOCK *be = &x->block[ib];
- int dst_stride = x->e_mbd.dst.y_stride;
- unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
- B_PREDICTION_MODE mode;
- int best_rd = INT_MAX;
- int rate;
- int distortion;
-
- unsigned char *Above = dst - dst_stride;
- unsigned char *yleft = dst - 1;
- unsigned char top_left = Above[-1];
-
- for (mode = B_DC_PRED; mode <= B_HE_PRED; mode++)
- {
- int this_rd;
-
- rate = mode_costs[mode];
-
- vp8_intra4x4_predict(Above, yleft, dst_stride, mode,
- b->predictor, 16, top_left);
- distortion = get_prediction_error(be, b);
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
- if (this_rd < best_rd)
- {
- *bestrate = rate;
- *bestdistortion = distortion;
- best_rd = this_rd;
- *best_mode = mode;
- }
- }
-
- b->bmi.as_mode = *best_mode;
- vp8_encode_intra4x4block(x, ib);
- return best_rd;
-}
-
-
-static int pick_intra4x4mby_modes
-(
- MACROBLOCK *mb,
- int *Rate,
- int *best_dist
-)
-{
- MACROBLOCKD *const xd = &mb->e_mbd;
- int i;
- int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
- int error;
- int distortion = 0;
- const int *bmode_costs;
-
- intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
-
- bmode_costs = mb->inter_bmode_costs;
-
- for (i = 0; i < 16; i++)
- {
- MODE_INFO *const mic = xd->mode_info_context;
- const int mis = xd->mode_info_stride;
-
- B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
- int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d);
-
- if (mb->e_mbd.frame_type == KEY_FRAME)
- {
- const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
- const B_PREDICTION_MODE L = left_block_mode(mic, i);
-
- bmode_costs = mb->bmode_costs[A][L];
- }
-
-
- pick_intra4x4block(mb, i, &best_mode, bmode_costs, &r, &d);
-
- cost += r;
- distortion += d;
- mic->bmi[i].as_mode = best_mode;
-
- /* Break out case where we have already exceeded best so far value
- * that was passed in
- */
- if (distortion > *best_dist)
- break;
- }
-
- *Rate = cost;
-
- if (i == 16)
- {
- *best_dist = distortion;
- error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
- }
- else
- {
- *best_dist = INT_MAX;
- error = INT_MAX;
- }
-
- return error;
-}
-
-static void pick_intra_mbuv_mode(MACROBLOCK *mb)
-{
-
- MACROBLOCKD *x = &mb->e_mbd;
- unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride;
- unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride;
- unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src);
- unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src);
- int uvsrc_stride = mb->block[16].src_stride;
- unsigned char uleft_col[8];
- unsigned char vleft_col[8];
- unsigned char utop_left = uabove_row[-1];
- unsigned char vtop_left = vabove_row[-1];
- int i, j;
- int expected_udc;
- int expected_vdc;
- int shift;
- int Uaverage = 0;
- int Vaverage = 0;
- int diff;
- int pred_error[4] = {0, 0, 0, 0}, best_error = INT_MAX;
- MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
-
-
- for (i = 0; i < 8; i++)
- {
- uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
- vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
- }
-
- if (!x->up_available && !x->left_available)
- {
- expected_udc = 128;
- expected_vdc = 128;
- }
- else
- {
- shift = 2;
-
- if (x->up_available)
- {
-
- for (i = 0; i < 8; i++)
- {
- Uaverage += uabove_row[i];
- Vaverage += vabove_row[i];
- }
-
- shift ++;
-
- }
-
- if (x->left_available)
- {
- for (i = 0; i < 8; i++)
- {
- Uaverage += uleft_col[i];
- Vaverage += vleft_col[i];
- }
-
- shift ++;
-
- }
-
- expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
- expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
- }
-
-
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 8; j++)
- {
-
- int predu = uleft_col[i] + uabove_row[j] - utop_left;
- int predv = vleft_col[i] + vabove_row[j] - vtop_left;
- int u_p, v_p;
-
- u_p = usrc_ptr[j];
- v_p = vsrc_ptr[j];
-
- if (predu < 0)
- predu = 0;
-
- if (predu > 255)
- predu = 255;
-
- if (predv < 0)
- predv = 0;
-
- if (predv > 255)
- predv = 255;
-
-
- diff = u_p - expected_udc;
- pred_error[DC_PRED] += diff * diff;
- diff = v_p - expected_vdc;
- pred_error[DC_PRED] += diff * diff;
-
-
- diff = u_p - uabove_row[j];
- pred_error[V_PRED] += diff * diff;
- diff = v_p - vabove_row[j];
- pred_error[V_PRED] += diff * diff;
-
-
- diff = u_p - uleft_col[i];
- pred_error[H_PRED] += diff * diff;
- diff = v_p - vleft_col[i];
- pred_error[H_PRED] += diff * diff;
-
-
- diff = u_p - predu;
- pred_error[TM_PRED] += diff * diff;
- diff = v_p - predv;
- pred_error[TM_PRED] += diff * diff;
-
-
- }
-
- usrc_ptr += uvsrc_stride;
- vsrc_ptr += uvsrc_stride;
-
- if (i == 3)
- {
- usrc_ptr = (mb->block[18].src + *mb->block[18].base_src);
- vsrc_ptr = (mb->block[22].src + *mb->block[22].base_src);
- }
-
-
-
- }
-
-
- for (i = DC_PRED; i <= TM_PRED; i++)
- {
- if (best_error > pred_error[i])
- {
- best_error = pred_error[i];
- best_mode = (MB_PREDICTION_MODE)i;
- }
- }
-
-
- mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode;
-
-}
-
-static void update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- /* Split MV modes currently not supported when RD is nopt enabled,
- * therefore, only need to modify MVcount in NEWMV mode. */
- if (xd->mode_info_context->mbmi.mode == NEWMV)
- {
- x->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row -
- best_ref_mv->as_mv.row) >> 1)]++;
- x->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col -
- best_ref_mv->as_mv.col) >> 1)]++;
- }
-}
-
-
-#if CONFIG_MULTI_RES_ENCODING
-static
-void get_lower_res_motion_info(VP8_COMP *cpi, MACROBLOCKD *xd, int *dissim,
- int *parent_ref_frame,
- MB_PREDICTION_MODE *parent_mode,
- int_mv *parent_ref_mv, int mb_row, int mb_col)
-{
- LOWER_RES_MB_INFO* store_mode_info
- = ((LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info)->mb_info;
- unsigned int parent_mb_index;
-
- /* Consider different down_sampling_factor. */
- {
- /* TODO: Removed the loop that supports special down_sampling_factor
- * such as 2, 4, 8. Will revisit it if needed.
- * Should also try using a look-up table to see if it helps
- * performance. */
- int parent_mb_row, parent_mb_col;
-
- parent_mb_row = mb_row*cpi->oxcf.mr_down_sampling_factor.den
- /cpi->oxcf.mr_down_sampling_factor.num;
- parent_mb_col = mb_col*cpi->oxcf.mr_down_sampling_factor.den
- /cpi->oxcf.mr_down_sampling_factor.num;
- parent_mb_index = parent_mb_row*cpi->mr_low_res_mb_cols + parent_mb_col;
- }
-
- /* Read lower-resolution mode & motion result from memory.*/
- *parent_ref_frame = store_mode_info[parent_mb_index].ref_frame;
- *parent_mode = store_mode_info[parent_mb_index].mode;
- *dissim = store_mode_info[parent_mb_index].dissim;
-
- /* For highest-resolution encoder, adjust dissim value. Lower its quality
- * for good performance. */
- if (cpi->oxcf.mr_encoder_id == (cpi->oxcf.mr_total_resolutions - 1))
- *dissim>>=1;
-
- if(*parent_ref_frame != INTRA_FRAME)
- {
- /* Consider different down_sampling_factor.
- * The result can be rounded to be more precise, but it takes more time.
- */
- (*parent_ref_mv).as_mv.row = store_mode_info[parent_mb_index].mv.as_mv.row
- *cpi->oxcf.mr_down_sampling_factor.num
- /cpi->oxcf.mr_down_sampling_factor.den;
- (*parent_ref_mv).as_mv.col = store_mode_info[parent_mb_index].mv.as_mv.col
- *cpi->oxcf.mr_down_sampling_factor.num
- /cpi->oxcf.mr_down_sampling_factor.den;
-
- vp8_clamp_mv2(parent_ref_mv, xd);
- }
-}
-#endif
-
-static void check_for_encode_breakout(unsigned int sse, MACROBLOCK* x)
-{
- MACROBLOCKD *xd = &x->e_mbd;
-
- unsigned int threshold = (xd->block[0].dequant[1]
- * xd->block[0].dequant[1] >>4);
-
- if(threshold < x->encode_breakout)
- threshold = x->encode_breakout;
-
- if (sse < threshold )
- {
- /* Check u and v to make sure skip is ok */
- unsigned int sse2 = 0;
-
- sse2 = VP8_UVSSE(x);
-
- if (sse2 * 2 < x->encode_breakout)
- x->skip = 1;
- else
- x->skip = 0;
- }
-}
-
-static int evaluate_inter_mode(unsigned int* sse, int rate2, int* distortion2,
- VP8_COMP *cpi, MACROBLOCK *x, int rd_adj)
-{
- MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
- int_mv mv = x->e_mbd.mode_info_context->mbmi.mv;
- int this_rd;
- int denoise_aggressive = 0;
- /* Exit early and don't compute the distortion if this macroblock
- * is marked inactive. */
- if (cpi->active_map_enabled && x->active_ptr[0] == 0)
- {
- *sse = 0;
- *distortion2 = 0;
- x->skip = 1;
- return INT_MAX;
- }
-
- if((this_mode != NEWMV) ||
- !(cpi->sf.half_pixel_search) || cpi->common.full_pixel==1)
- *distortion2 = vp8_get_inter_mbpred_error(x,
- &cpi->fn_ptr[BLOCK_16X16],
- sse, mv);
-
- this_rd = RDCOST(x->rdmult, x->rddiv, rate2, *distortion2);
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity > 0) {
- denoise_aggressive =
- (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) ? 1 : 0;
- }
-#endif
-
- // Adjust rd for ZEROMV and LAST, if LAST is the closest reference frame.
- // TODO: We should also add condition on distance of closest to current.
- if(!cpi->oxcf.screen_content_mode &&
- this_mode == ZEROMV &&
- x->e_mbd.mode_info_context->mbmi.ref_frame == LAST_FRAME &&
- (denoise_aggressive || (cpi->closest_reference_frame == LAST_FRAME)))
- {
- // No adjustment if block is considered to be skin area.
- if(x->is_skin)
- rd_adj = 100;
-
- this_rd = ((int64_t)this_rd) * rd_adj / 100;
- }
-
- check_for_encode_breakout(*sse, x);
- return this_rd;
-}
-
-static void calculate_zeromv_rd_adjustment(VP8_COMP *cpi, MACROBLOCK *x,
- int *rd_adjustment)
-{
- MODE_INFO *mic = x->e_mbd.mode_info_context;
- int_mv mv_l, mv_a, mv_al;
- int local_motion_check = 0;
-
- if (cpi->lf_zeromv_pct > 40)
- {
- /* left mb */
- mic -= 1;
- mv_l = mic->mbmi.mv;
-
- if (mic->mbmi.ref_frame != INTRA_FRAME)
- if( abs(mv_l.as_mv.row) < 8 && abs(mv_l.as_mv.col) < 8)
- local_motion_check++;
-
- /* above-left mb */
- mic -= x->e_mbd.mode_info_stride;
- mv_al = mic->mbmi.mv;
-
- if (mic->mbmi.ref_frame != INTRA_FRAME)
- if( abs(mv_al.as_mv.row) < 8 && abs(mv_al.as_mv.col) < 8)
- local_motion_check++;
-
- /* above mb */
- mic += 1;
- mv_a = mic->mbmi.mv;
-
- if (mic->mbmi.ref_frame != INTRA_FRAME)
- if( abs(mv_a.as_mv.row) < 8 && abs(mv_a.as_mv.col) < 8)
- local_motion_check++;
-
- if (((!x->e_mbd.mb_to_top_edge || !x->e_mbd.mb_to_left_edge)
- && local_motion_check >0) || local_motion_check >2 )
- *rd_adjustment = 80;
- else if (local_motion_check > 0)
- *rd_adjustment = 90;
- }
-}
-
-void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
- int recon_uvoffset, int *returnrate,
- int *returndistortion, int *returnintra, int mb_row,
- int mb_col)
-{
- BLOCK *b = &x->block[0];
- BLOCKD *d = &x->e_mbd.block[0];
- MACROBLOCKD *xd = &x->e_mbd;
- MB_MODE_INFO best_mbmode;
-
- int_mv best_ref_mv_sb[2];
- int_mv mode_mv_sb[2][MB_MODE_COUNT];
- int_mv best_ref_mv;
- int_mv *mode_mv;
- MB_PREDICTION_MODE this_mode;
- int num00;
- int mdcounts[4];
- int best_rd = INT_MAX;
- int rd_adjustment = 100;
- int best_intra_rd = INT_MAX;
- int mode_index;
- int rate;
- int rate2;
- int distortion2;
- int bestsme = INT_MAX;
- int best_mode_index = 0;
- unsigned int sse = UINT_MAX, best_rd_sse = UINT_MAX;
-#if CONFIG_TEMPORAL_DENOISING
- unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX;
-#endif
-
- int sf_improved_mv_pred = cpi->sf.improved_mv_pred;
-
-#if CONFIG_MULTI_RES_ENCODING
- int dissim = INT_MAX;
- int parent_ref_frame = 0;
- int_mv parent_ref_mv;
- MB_PREDICTION_MODE parent_mode = 0;
- int parent_ref_valid = 0;
-#endif
-
- int_mv mvp;
-
- int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7};
- int saddone=0;
- /* search range got from mv_pred(). It uses step_param levels. (0-7) */
- int sr=0;
-
- unsigned char *plane[4][3];
- int ref_frame_map[4];
- int sign_bias = 0;
- int dot_artifact_candidate = 0;
- get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
-
- // If the current frame is using LAST as a reference, check for
- // biasing the mode selection for dot artifacts.
- if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
- unsigned char* target_y = x->src.y_buffer;
- unsigned char* target_u = x->block[16].src + *x->block[16].base_src;
- unsigned char* target_v = x->block[20].src + *x->block[20].base_src;
- int stride = x->src.y_stride;
- int stride_uv = x->block[16].src_stride;
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity) {
- const int uv_denoise = (cpi->oxcf.noise_sensitivity >= 2) ? 1 : 0;
- target_y =
- cpi->denoiser.yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset;
- stride = cpi->denoiser.yv12_running_avg[LAST_FRAME].y_stride;
- if (uv_denoise) {
- target_u =
- cpi->denoiser.yv12_running_avg[LAST_FRAME].u_buffer +
- recon_uvoffset;
- target_v =
- cpi->denoiser.yv12_running_avg[LAST_FRAME].v_buffer +
- recon_uvoffset;
- stride_uv = cpi->denoiser.yv12_running_avg[LAST_FRAME].uv_stride;
- }
- }
-#endif
- dot_artifact_candidate =
- check_dot_artifact_candidate(cpi, x, target_y, stride,
- plane[LAST_FRAME][0], mb_row, mb_col, 0);
- // If not found in Y channel, check UV channel.
- if (!dot_artifact_candidate) {
- dot_artifact_candidate =
- check_dot_artifact_candidate(cpi, x, target_u, stride_uv,
- plane[LAST_FRAME][1], mb_row, mb_col, 1);
- if (!dot_artifact_candidate) {
- dot_artifact_candidate =
- check_dot_artifact_candidate(cpi, x, target_v, stride_uv,
- plane[LAST_FRAME][2], mb_row, mb_col, 2);
- }
- }
- }
-
-#if CONFIG_MULTI_RES_ENCODING
- // |parent_ref_valid| will be set here if potentially we can do mv resue for
- // this higher resol (|cpi->oxcf.mr_encoder_id| > 0) frame.
- // |parent_ref_valid| may be reset depending on |parent_ref_frame| for
- // the current macroblock below.
- parent_ref_valid = cpi->oxcf.mr_encoder_id && cpi->mr_low_res_mv_avail;
- if (parent_ref_valid)
- {
- int parent_ref_flag;
-
- get_lower_res_motion_info(cpi, xd, &dissim, &parent_ref_frame,
- &parent_mode, &parent_ref_mv, mb_row, mb_col);
-
- /* TODO(jkoleszar): The references available (ref_frame_flags) to the
- * lower res encoder should match those available to this encoder, but
- * there seems to be a situation where this mismatch can happen in the
- * case of frame dropping and temporal layers. For example,
- * GOLD being disallowed in ref_frame_flags, but being returned as
- * parent_ref_frame.
- *
- * In this event, take the conservative approach of disabling the
- * lower res info for this MB.
- */
-
- parent_ref_flag = 0;
- // Note availability for mv reuse is only based on last and golden.
- if (parent_ref_frame == LAST_FRAME)
- parent_ref_flag = (cpi->ref_frame_flags & VP8_LAST_FRAME);
- else if (parent_ref_frame == GOLDEN_FRAME)
- parent_ref_flag = (cpi->ref_frame_flags & VP8_GOLD_FRAME);
-
- //assert(!parent_ref_frame || parent_ref_flag);
-
- // If |parent_ref_frame| did not match either last or golden then
- // shut off mv reuse.
- if (parent_ref_frame && !parent_ref_flag)
- parent_ref_valid = 0;
-
- // Don't do mv reuse since we want to allow for another mode besides
- // ZEROMV_LAST to remove dot artifact.
- if (dot_artifact_candidate)
- parent_ref_valid = 0;
- }
-#endif
-
- // Check if current macroblock is in skin area.
- {
- const int y = x->src.y_buffer[7 * x->src.y_stride + 7];
- const int cb = x->src.u_buffer[3 * x->src.uv_stride + 3];
- const int cr = x->src.v_buffer[3 * x->src.uv_stride + 3];
- x->is_skin = 0;
- if (!cpi->oxcf.screen_content_mode)
- x->is_skin = is_skin_color(y, cb, cr);
- }
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity) {
- // Under aggressive denoising mode, should we use skin map to reduce denoiser
- // and ZEROMV bias? Will need to revisit the accuracy of this detection for
- // very noisy input. For now keep this as is (i.e., don't turn it off).
- // if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive)
- // x->is_skin = 0;
- }
-#endif
-
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = 0;
- memset(mode_mv_sb, 0, sizeof(mode_mv_sb));
- memset(&best_mbmode, 0, sizeof(best_mbmode));
-
- /* Setup search priorities */
-#if CONFIG_MULTI_RES_ENCODING
- if (parent_ref_valid && parent_ref_frame && dissim < 8)
- {
- ref_frame_map[0] = -1;
- ref_frame_map[1] = parent_ref_frame;
- ref_frame_map[2] = -1;
- ref_frame_map[3] = -1;
- } else
-#endif
- get_reference_search_order(cpi, ref_frame_map);
-
- /* Check to see if there is at least 1 valid reference frame that we need
- * to calculate near_mvs.
- */
- if (ref_frame_map[1] > 0)
- {
- sign_bias = vp8_find_near_mvs_bias(&x->e_mbd,
- x->e_mbd.mode_info_context,
- mode_mv_sb,
- best_ref_mv_sb,
- mdcounts,
- ref_frame_map[1],
- cpi->common.ref_frame_sign_bias);
-
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
- }
-
- /* Count of the number of MBs tested so far this frame */
- x->mbs_tested_so_far++;
-
- *returnintra = INT_MAX;
- x->skip = 0;
-
- x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
-
- /* If the frame has big static background and current MB is in low
- * motion area, its mode decision is biased to ZEROMV mode.
- * No adjustment if cpu_used is <= -12 (i.e., cpi->Speed >= 12).
- * At such speed settings, ZEROMV is already heavily favored.
- */
- if (cpi->Speed < 12) {
- calculate_zeromv_rd_adjustment(cpi, x, &rd_adjustment);
- }
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity) {
- rd_adjustment = (int)(rd_adjustment *
- cpi->denoiser.denoise_pars.pickmode_mv_bias / 100);
- }
-#endif
-
- if (dot_artifact_candidate)
- {
- // Bias against ZEROMV_LAST mode.
- rd_adjustment = 150;
- }
-
-
- /* if we encode a new mv this is important
- * find the best new motion vector
- */
- for (mode_index = 0; mode_index < MAX_MODES; mode_index++)
- {
- int frame_cost;
- int this_rd = INT_MAX;
- int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
-
- if (best_rd <= x->rd_threshes[mode_index])
- continue;
-
- if (this_ref_frame < 0)
- continue;
-
- x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
-
- /* everything but intra */
- if (x->e_mbd.mode_info_context->mbmi.ref_frame)
- {
- x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
- x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
- x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
-
- if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame])
- {
- sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame];
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
- }
-
-#if CONFIG_MULTI_RES_ENCODING
- if (parent_ref_valid)
- {
- if (vp8_mode_order[mode_index] == NEARESTMV &&
- mode_mv[NEARESTMV].as_int ==0)
- continue;
- if (vp8_mode_order[mode_index] == NEARMV &&
- mode_mv[NEARMV].as_int ==0)
- continue;
-
- if (vp8_mode_order[mode_index] == NEWMV && parent_mode == ZEROMV
- && best_ref_mv.as_int==0)
- continue;
- else if(vp8_mode_order[mode_index] == NEWMV && dissim==0
- && best_ref_mv.as_int==parent_ref_mv.as_int)
- continue;
- }
-#endif
- }
-
- /* Check to see if the testing frequency for this mode is at its max
- * If so then prevent it from being tested and increase the threshold
- * for its testing */
- if (x->mode_test_hit_counts[mode_index] &&
- (cpi->mode_check_freq[mode_index] > 1))
- {
- if (x->mbs_tested_so_far <= (cpi->mode_check_freq[mode_index] *
- x->mode_test_hit_counts[mode_index]))
- {
- /* Increase the threshold for coding this mode to make it less
- * likely to be chosen */
- x->rd_thresh_mult[mode_index] += 4;
-
- if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
- x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
-
- x->rd_threshes[mode_index] =
- (cpi->rd_baseline_thresh[mode_index] >> 7) *
- x->rd_thresh_mult[mode_index];
- continue;
- }
- }
-
- /* We have now reached the point where we are going to test the current
- * mode so increment the counter for the number of times it has been
- * tested */
- x->mode_test_hit_counts[mode_index] ++;
-
- rate2 = 0;
- distortion2 = 0;
-
- this_mode = vp8_mode_order[mode_index];
-
- x->e_mbd.mode_info_context->mbmi.mode = this_mode;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
-
- /* Work out the cost assosciated with selecting the reference frame */
- frame_cost =
- x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
- rate2 += frame_cost;
-
- /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
- * unless ARNR filtering is enabled in which case we want
- * an unfiltered alternative */
- if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
- {
- if (this_mode != ZEROMV ||
- x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
- continue;
- }
-
- switch (this_mode)
- {
- case B_PRED:
- /* Pass best so far to pick_intra4x4mby_modes to use as breakout */
- distortion2 = best_rd_sse;
- pick_intra4x4mby_modes(x, &rate, &distortion2);
-
- if (distortion2 == INT_MAX)
- {
- this_rd = INT_MAX;
- }
- else
- {
- rate2 += rate;
- distortion2 = vpx_variance16x16(
- *(b->base_src), b->src_stride,
- x->e_mbd.predictor, 16, &sse);
- this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
-
- if (this_rd < best_intra_rd)
- {
- best_intra_rd = this_rd;
- *returnintra = distortion2;
- }
- }
-
- break;
-
- case SPLITMV:
-
- /* Split MV modes currently not supported when RD is not enabled. */
- break;
-
- case DC_PRED:
- case V_PRED:
- case H_PRED:
- case TM_PRED:
- vp8_build_intra_predictors_mby_s(xd,
- xd->dst.y_buffer - xd->dst.y_stride,
- xd->dst.y_buffer - 1,
- xd->dst.y_stride,
- xd->predictor,
- 16);
- distortion2 = vpx_variance16x16
- (*(b->base_src), b->src_stride,
- x->e_mbd.predictor, 16, &sse);
- rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode];
- this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
-
- if (this_rd < best_intra_rd)
- {
- best_intra_rd = this_rd;
- *returnintra = distortion2;
- }
- break;
-
- case NEWMV:
- {
- int thissme;
- int step_param;
- int further_steps;
- int n = 0;
- int sadpb = x->sadperbit16;
- int_mv mvp_full;
-
- int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL;
- int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL;
- int col_max = (best_ref_mv.as_mv.col>>3)
- + MAX_FULL_PEL_VAL;
- int row_max = (best_ref_mv.as_mv.row>>3)
- + MAX_FULL_PEL_VAL;
-
- int tmp_col_min = x->mv_col_min;
- int tmp_col_max = x->mv_col_max;
- int tmp_row_min = x->mv_row_min;
- int tmp_row_max = x->mv_row_max;
-
- int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1;
-
- /* Further step/diamond searches as necessary */
- step_param = cpi->sf.first_step + speed_adjust;
-
-#if CONFIG_MULTI_RES_ENCODING
- /* If lower-res frame is not available for mv reuse (because of
- frame dropping or different temporal layer pattern), then higher
- resol encoder does motion search without any previous knowledge.
- Also, since last frame motion info is not stored, then we can not
- use improved_mv_pred. */
- if (cpi->oxcf.mr_encoder_id)
- sf_improved_mv_pred = 0;
-
- // Only use parent MV as predictor if this candidate reference frame
- // (|this_ref_frame|) is equal to |parent_ref_frame|.
- if (parent_ref_valid && (parent_ref_frame == this_ref_frame))
- {
- /* Use parent MV as predictor. Adjust search range
- * accordingly.
- */
- mvp.as_int = parent_ref_mv.as_int;
- mvp_full.as_mv.col = parent_ref_mv.as_mv.col>>3;
- mvp_full.as_mv.row = parent_ref_mv.as_mv.row>>3;
-
- if(dissim <=32) step_param += 3;
- else if(dissim <=128) step_param += 2;
- else step_param += 1;
- }else
-#endif
- {
- if(sf_improved_mv_pred)
- {
- if(!saddone)
- {
- vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
- saddone = 1;
- }
-
- vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context,
- &mvp,x->e_mbd.mode_info_context->mbmi.ref_frame,
- cpi->common.ref_frame_sign_bias, &sr,
- &near_sadidx[0]);
-
- sr += speed_adjust;
- /* adjust search range according to sr from mv prediction */
- if(sr > step_param)
- step_param = sr;
-
- mvp_full.as_mv.col = mvp.as_mv.col>>3;
- mvp_full.as_mv.row = mvp.as_mv.row>>3;
- }else
- {
- mvp.as_int = best_ref_mv.as_int;
- mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3;
- mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3;
- }
- }
-
-#if CONFIG_MULTI_RES_ENCODING
- if (parent_ref_valid && (parent_ref_frame == this_ref_frame) &&
- dissim <= 2 &&
- MAX(abs(best_ref_mv.as_mv.row - parent_ref_mv.as_mv.row),
- abs(best_ref_mv.as_mv.col - parent_ref_mv.as_mv.col)) <= 4)
- {
- d->bmi.mv.as_int = mvp_full.as_int;
- mode_mv[NEWMV].as_int = mvp_full.as_int;
-
- cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv,
- x->errorperbit,
- &cpi->fn_ptr[BLOCK_16X16],
- cpi->mb.mvcost,
- &distortion2,&sse);
- }else
-#endif
- {
- /* Get intersection of UMV window and valid MV window to
- * reduce # of checks in diamond search. */
- if (x->mv_col_min < col_min )
- x->mv_col_min = col_min;
- if (x->mv_col_max > col_max )
- x->mv_col_max = col_max;
- if (x->mv_row_min < row_min )
- x->mv_row_min = row_min;
- if (x->mv_row_max > row_max )
- x->mv_row_max = row_max;
-
- further_steps = (cpi->Speed >= 8)?
- 0: (cpi->sf.max_step_search_steps - 1 - step_param);
-
- if (cpi->sf.search_method == HEX)
- {
-#if CONFIG_MULTI_RES_ENCODING
- /* TODO: In higher-res pick_inter_mode, step_param is used to
- * modify hex search range. Here, set step_param to 0 not to
- * change the behavior in lowest-resolution encoder.
- * Will improve it later.
- */
- /* Set step_param to 0 to ensure large-range motion search
- * when mv reuse if not valid (i.e. |parent_ref_valid| = 0),
- * or if this candidate reference frame (|this_ref_frame|) is
- * not equal to |parent_ref_frame|.
- */
- if (!parent_ref_valid || (parent_ref_frame != this_ref_frame))
- step_param = 0;
-#endif
- bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv,
- step_param, sadpb,
- &cpi->fn_ptr[BLOCK_16X16],
- x->mvsadcost, x->mvcost, &best_ref_mv);
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
- }
- else
- {
- bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full,
- &d->bmi.mv, step_param, sadpb, &num00,
- &cpi->fn_ptr[BLOCK_16X16],
- x->mvcost, &best_ref_mv);
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
-
- /* Further step/diamond searches as necessary */
- n = num00;
- num00 = 0;
-
- while (n < further_steps)
- {
- n++;
-
- if (num00)
- num00--;
- else
- {
- thissme =
- cpi->diamond_search_sad(x, b, d, &mvp_full,
- &d->bmi.mv,
- step_param + n,
- sadpb, &num00,
- &cpi->fn_ptr[BLOCK_16X16],
- x->mvcost, &best_ref_mv);
- if (thissme < bestsme)
- {
- bestsme = thissme;
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
- }
- else
- {
- d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
- }
- }
- }
- }
-
- x->mv_col_min = tmp_col_min;
- x->mv_col_max = tmp_col_max;
- x->mv_row_min = tmp_row_min;
- x->mv_row_max = tmp_row_max;
-
- if (bestsme < INT_MAX)
- cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv,
- &best_ref_mv, x->errorperbit,
- &cpi->fn_ptr[BLOCK_16X16],
- cpi->mb.mvcost,
- &distortion2,&sse);
- }
-
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
-
- /* mv cost; */
- rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv,
- cpi->mb.mvcost, 128);
- }
-
- case NEARESTMV:
- case NEARMV:
-
- if (mode_mv[this_mode].as_int == 0)
- continue;
-
- case ZEROMV:
-
- /* Trap vectors that reach beyond the UMV borders
- * Note that ALL New MV, Nearest MV Near MV and Zero MV code drops
- * through to this point because of the lack of break statements
- * in the previous two cases.
- */
- if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
- ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
- ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
- ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max))
- continue;
-
- rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
- x->e_mbd.mode_info_context->mbmi.mv.as_int =
- mode_mv[this_mode].as_int;
- this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x,
- rd_adjustment);
-
- break;
- default:
- break;
- }
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- /* Store for later use by denoiser. */
- // Dont' denoise with GOLDEN OR ALTREF is they are old reference
- // frames (greater than MAX_GF_ARF_DENOISE_RANGE frames in past).
- int skip_old_reference = ((this_ref_frame != LAST_FRAME) &&
- (cpi->common.current_video_frame -
- cpi->current_ref_frames[this_ref_frame] >
- MAX_GF_ARF_DENOISE_RANGE)) ? 1 : 0;
- if (this_mode == ZEROMV && sse < zero_mv_sse &&
- !skip_old_reference)
- {
- zero_mv_sse = sse;
- x->best_zeromv_reference_frame =
- x->e_mbd.mode_info_context->mbmi.ref_frame;
- }
-
- // Store the best NEWMV in x for later use in the denoiser.
- if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV &&
- sse < best_sse && !skip_old_reference)
- {
- best_sse = sse;
- x->best_sse_inter_mode = NEWMV;
- x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv;
- x->need_to_clamp_best_mvs =
- x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs;
- x->best_reference_frame =
- x->e_mbd.mode_info_context->mbmi.ref_frame;
- }
- }
-#endif
-
- if (this_rd < best_rd || x->skip)
- {
- /* Note index of best mode */
- best_mode_index = mode_index;
-
- *returnrate = rate2;
- *returndistortion = distortion2;
- best_rd_sse = sse;
- best_rd = this_rd;
- memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi,
- sizeof(MB_MODE_INFO));
-
- /* Testing this mode gave rise to an improvement in best error
- * score. Lower threshold a bit for next time
- */
- x->rd_thresh_mult[mode_index] =
- (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ?
- x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT;
- x->rd_threshes[mode_index] =
- (cpi->rd_baseline_thresh[mode_index] >> 7) *
- x->rd_thresh_mult[mode_index];
- }
-
- /* If the mode did not help improve the best error case then raise the
- * threshold for testing that mode next time around.
- */
- else
- {
- x->rd_thresh_mult[mode_index] += 4;
-
- if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
- x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
-
- x->rd_threshes[mode_index] =
- (cpi->rd_baseline_thresh[mode_index] >> 7) *
- x->rd_thresh_mult[mode_index];
- }
-
- if (x->skip)
- break;
- }
-
- /* Reduce the activation RD thresholds for the best choice mode */
- if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2)))
- {
- int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 3);
-
- x->rd_thresh_mult[best_mode_index] =
- (x->rd_thresh_mult[best_mode_index]
- >= (MIN_THRESHMULT + best_adjustment)) ?
- x->rd_thresh_mult[best_mode_index] - best_adjustment :
- MIN_THRESHMULT;
- x->rd_threshes[best_mode_index] =
- (cpi->rd_baseline_thresh[best_mode_index] >> 7) *
- x->rd_thresh_mult[best_mode_index];
- }
-
-
- {
- int this_rdbin = (*returndistortion >> 7);
-
- if (this_rdbin >= 1024)
- {
- this_rdbin = 1023;
- }
-
- x->error_bins[this_rdbin] ++;
- }
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- int block_index = mb_row * cpi->common.mb_cols + mb_col;
- int reevaluate = 0;
- int is_noisy = 0;
- if (x->best_sse_inter_mode == DC_PRED)
- {
- /* No best MV found. */
- x->best_sse_inter_mode = best_mbmode.mode;
- x->best_sse_mv = best_mbmode.mv;
- x->need_to_clamp_best_mvs = best_mbmode.need_to_clamp_mvs;
- x->best_reference_frame = best_mbmode.ref_frame;
- best_sse = best_rd_sse;
- }
- // For non-skin blocks that have selected ZEROMV for this current frame,
- // and have been selecting ZEROMV_LAST (on the base layer frame) at
- // least |x~20| consecutive past frames in a row, label the block for
- // possible increase in denoising strength. We also condition this
- // labeling on there being significant denoising in the scene
- if (cpi->oxcf.noise_sensitivity == 4) {
- if (cpi->denoiser.nmse_source_diff >
- 70 * cpi->denoiser.threshold_aggressive_mode / 100)
- is_noisy = 1;
- } else {
- if (cpi->mse_source_denoised > 1000)
- is_noisy = 1;
- }
- x->increase_denoising = 0;
- if (!x->is_skin &&
- x->best_sse_inter_mode == ZEROMV &&
- (x->best_reference_frame == LAST_FRAME ||
- x->best_reference_frame == cpi->closest_reference_frame) &&
- cpi->consec_zero_last[block_index] >= 20 &&
- is_noisy) {
- x->increase_denoising = 1;
- }
- x->denoise_zeromv = 0;
- vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse,
- recon_yoffset, recon_uvoffset,
- &cpi->common.lf_info, mb_row, mb_col,
- block_index);
-
- // Reevaluate ZEROMV after denoising: for large noise content
- // (i.e., cpi->mse_source_denoised is above threshold), do this for all
- // blocks that did not pick ZEROMV as best mode but are using ZEROMV
- // for denoising. Otherwise, always re-evaluate for blocks that picked
- // INTRA mode as best mode.
- // Avoid blocks that have been biased against ZERO_LAST
- // (i.e., dot artifact candidate blocks).
- reevaluate = (best_mbmode.ref_frame == INTRA_FRAME) ||
- (best_mbmode.mode != ZEROMV &&
- x->denoise_zeromv &&
- cpi->mse_source_denoised > 2000);
- if (!dot_artifact_candidate &&
- reevaluate &&
- x->best_zeromv_reference_frame != INTRA_FRAME)
- {
- int this_rd = 0;
- int this_ref_frame = x->best_zeromv_reference_frame;
- rd_adjustment = 100;
- rate2 = x->ref_frame_cost[this_ref_frame] +
- vp8_cost_mv_ref(ZEROMV, mdcounts);
- distortion2 = 0;
-
- /* set up the proper prediction buffers for the frame */
- x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
- x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
- x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
- x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
-
- x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
- this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x,
- rd_adjustment);
-
- if (this_rd < best_rd)
- {
- memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi,
- sizeof(MB_MODE_INFO));
- }
- }
-
- }
-#endif
-
- if (cpi->is_src_frame_alt_ref &&
- (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
- {
- x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
- x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME;
- x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.mb_skip_coeff =
- (cpi->common.mb_no_coeff_skip);
- x->e_mbd.mode_info_context->mbmi.partitioning = 0;
-
- return;
- }
-
- /* set to the best mb mode, this copy can be skip if x->skip since it
- * already has the right content */
- if (!x->skip)
- memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode,
- sizeof(MB_MODE_INFO));
-
- if (best_mbmode.mode <= B_PRED)
- {
- /* set mode_info_context->mbmi.uv_mode */
- pick_intra_mbuv_mode(x);
- }
-
- if (sign_bias
- != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame])
- best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int;
-
- update_mvcount(x, &best_ref_mv);
-}
-
-void vp8_pick_intra_mode(MACROBLOCK *x, int *rate_)
-{
- int error4x4, error16x16 = INT_MAX;
- int rate, best_rate = 0, distortion, best_sse;
- MB_PREDICTION_MODE mode, best_mode = DC_PRED;
- int this_rd;
- unsigned int sse;
- BLOCK *b = &x->block[0];
- MACROBLOCKD *xd = &x->e_mbd;
-
- xd->mode_info_context->mbmi.ref_frame = INTRA_FRAME;
-
- pick_intra_mbuv_mode(x);
-
- for (mode = DC_PRED; mode <= TM_PRED; mode ++)
- {
- xd->mode_info_context->mbmi.mode = mode;
- vp8_build_intra_predictors_mby_s(xd,
- xd->dst.y_buffer - xd->dst.y_stride,
- xd->dst.y_buffer - 1,
- xd->dst.y_stride,
- xd->predictor,
- 16);
- distortion = vpx_variance16x16
- (*(b->base_src), b->src_stride, xd->predictor, 16, &sse);
- rate = x->mbmode_cost[xd->frame_type][mode];
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
- if (error16x16 > this_rd)
- {
- error16x16 = this_rd;
- best_mode = mode;
- best_sse = sse;
- best_rate = rate;
- }
- }
- xd->mode_info_context->mbmi.mode = best_mode;
-
- error4x4 = pick_intra4x4mby_modes(x, &rate,
- &best_sse);
- if (error4x4 < error16x16)
- {
- xd->mode_info_context->mbmi.mode = B_PRED;
- best_rate = rate;
- }
-
- *rate_ = best_rate;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.h
deleted file mode 100644
index cf3b1f8d49c..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_PICKINTER_H_
-#define VP8_ENCODER_PICKINTER_H_
-#include "vpx_config.h"
-#include "vp8/common/onyxc_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
- int recon_uvoffset, int *returnrate,
- int *returndistortion, int *returnintra,
- int mb_row, int mb_col);
-extern void vp8_pick_intra_mode(MACROBLOCK *x, int *rate);
-
-extern int vp8_get_inter_mbpred_error(MACROBLOCK *mb,
- const vp8_variance_fn_ptr_t *vfp,
- unsigned int *sse,
- int_mv this_mv);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_PICKINTER_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/picklpf.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/picklpf.c
deleted file mode 100644
index 875b37f6841..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/picklpf.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "./vpx_dsp_rtcd.h"
-#include "./vpx_scale_rtcd.h"
-#include "vp8/common/onyxc_int.h"
-#include "onyx_int.h"
-#include "quantize.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vpx_scale/vpx_scale.h"
-#include "vp8/common/alloccommon.h"
-#include "vp8/common/loopfilter.h"
-#if ARCH_ARM
-#include "vpx_ports/arm.h"
-#endif
-
-extern int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
-
-static void yv12_copy_partial_frame(YV12_BUFFER_CONFIG *src_ybc,
- YV12_BUFFER_CONFIG *dst_ybc)
-{
- unsigned char *src_y, *dst_y;
- int yheight;
- int ystride;
- int yoffset;
- int linestocopy;
-
- yheight = src_ybc->y_height;
- ystride = src_ybc->y_stride;
-
- /* number of MB rows to use in partial filtering */
- linestocopy = (yheight >> 4) / PARTIAL_FRAME_FRACTION;
- linestocopy = linestocopy ? linestocopy << 4 : 16; /* 16 lines per MB */
-
- /* Copy extra 4 so that full filter context is available if filtering done
- * on the copied partial frame and not original. Partial filter does mb
- * filtering for top row also, which can modify3 pixels above.
- */
- linestocopy += 4;
- /* partial image starts at ~middle of frame (macroblock border)*/
- yoffset = ystride * (((yheight >> 5) * 16) - 4);
- src_y = src_ybc->y_buffer + yoffset;
- dst_y = dst_ybc->y_buffer + yoffset;
-
- memcpy(dst_y, src_y, ystride * linestocopy);
-}
-
-static int calc_partial_ssl_err(YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest)
-{
- int i, j;
- int Total = 0;
- int srcoffset, dstoffset;
- unsigned char *src = source->y_buffer;
- unsigned char *dst = dest->y_buffer;
-
- int linestocopy;
-
- /* number of MB rows to use in partial filtering */
- linestocopy = (source->y_height >> 4) / PARTIAL_FRAME_FRACTION;
- linestocopy = linestocopy ? linestocopy << 4 : 16; /* 16 lines per MB */
-
-
- /* partial image starts at ~middle of frame (macroblock border)*/
- srcoffset = source->y_stride * ((dest->y_height >> 5) * 16);
- dstoffset = dest->y_stride * ((dest->y_height >> 5) * 16);
-
- src += srcoffset;
- dst += dstoffset;
-
- /* Loop through the Y plane raw and reconstruction data summing
- * (square differences)
- */
- for (i = 0; i < linestocopy; i += 16)
- {
- for (j = 0; j < source->y_width; j += 16)
- {
- unsigned int sse;
- Total += vpx_mse16x16(src + j, source->y_stride,
- dst + j, dest->y_stride,
- &sse);
- }
-
- src += 16 * source->y_stride;
- dst += 16 * dest->y_stride;
- }
-
- return Total;
-}
-
-/* Enforce a minimum filter level based upon baseline Q */
-static int get_min_filter_level(VP8_COMP *cpi, int base_qindex)
-{
- int min_filter_level;
-
- if (cpi->source_alt_ref_active && cpi->common.refresh_golden_frame &&
- !cpi->common.refresh_alt_ref_frame)
- min_filter_level = 0;
- else
- {
- if (base_qindex <= 6)
- min_filter_level = 0;
- else if (base_qindex <= 16)
- min_filter_level = 1;
- else
- min_filter_level = (base_qindex / 8);
- }
-
- return min_filter_level;
-}
-
-/* Enforce a maximum filter level based upon baseline Q */
-static int get_max_filter_level(VP8_COMP *cpi, int base_qindex)
-{
- /* PGW August 2006: Highest filter values almost always a bad idea */
-
- /* jbb chg: 20100118 - not so any more with this overquant stuff allow
- * high values with lots of intra coming in.
- */
- int max_filter_level = MAX_LOOP_FILTER;
- (void)base_qindex;
-
- if (cpi->twopass.section_intra_rating > 8)
- max_filter_level = MAX_LOOP_FILTER * 3 / 4;
-
- return max_filter_level;
-}
-
-void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- int best_err = 0;
- int filt_err = 0;
- int min_filter_level = get_min_filter_level(cpi, cm->base_qindex);
- int max_filter_level = get_max_filter_level(cpi, cm->base_qindex);
- int filt_val;
- int best_filt_val;
- YV12_BUFFER_CONFIG * saved_frame = cm->frame_to_show;
-
- /* Replace unfiltered frame buffer with a new one */
- cm->frame_to_show = &cpi->pick_lf_lvl_frame;
-
- if (cm->frame_type == KEY_FRAME)
- cm->sharpness_level = 0;
- else
- cm->sharpness_level = cpi->oxcf.Sharpness;
-
- if (cm->sharpness_level != cm->last_sharpness_level)
- {
- vp8_loop_filter_update_sharpness(&cm->lf_info, cm->sharpness_level);
- cm->last_sharpness_level = cm->sharpness_level;
- }
-
- /* Start the search at the previous frame filter level unless it is
- * now out of range.
- */
- if (cm->filter_level < min_filter_level)
- cm->filter_level = min_filter_level;
- else if (cm->filter_level > max_filter_level)
- cm->filter_level = max_filter_level;
-
- filt_val = cm->filter_level;
- best_filt_val = filt_val;
-
- /* Get the err using the previous frame's filter value. */
-
- /* Copy the unfiltered / processed recon buffer to the new buffer */
- yv12_copy_partial_frame(saved_frame, cm->frame_to_show);
- vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
-
- best_err = calc_partial_ssl_err(sd, cm->frame_to_show);
-
- filt_val -= 1 + (filt_val > 10);
-
- /* Search lower filter levels */
- while (filt_val >= min_filter_level)
- {
- /* Apply the loop filter */
- yv12_copy_partial_frame(saved_frame, cm->frame_to_show);
- vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
-
- /* Get the err for filtered frame */
- filt_err = calc_partial_ssl_err(sd, cm->frame_to_show);
-
- /* Update the best case record or exit loop. */
- if (filt_err < best_err)
- {
- best_err = filt_err;
- best_filt_val = filt_val;
- }
- else
- break;
-
- /* Adjust filter level */
- filt_val -= 1 + (filt_val > 10);
- }
-
- /* Search up (note that we have already done filt_val = cm->filter_level) */
- filt_val = cm->filter_level + 1 + (filt_val > 10);
-
- if (best_filt_val == cm->filter_level)
- {
- /* Resist raising filter level for very small gains */
- best_err -= (best_err >> 10);
-
- while (filt_val < max_filter_level)
- {
- /* Apply the loop filter */
- yv12_copy_partial_frame(saved_frame, cm->frame_to_show);
-
- vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
-
- /* Get the err for filtered frame */
- filt_err = calc_partial_ssl_err(sd, cm->frame_to_show);
-
- /* Update the best case record or exit loop. */
- if (filt_err < best_err)
- {
- /* Do not raise filter level if improvement is < 1 part
- * in 4096
- */
- best_err = filt_err - (filt_err >> 10);
-
- best_filt_val = filt_val;
- }
- else
- break;
-
- /* Adjust filter level */
- filt_val += 1 + (filt_val > 10);
- }
- }
-
- cm->filter_level = best_filt_val;
-
- if (cm->filter_level < min_filter_level)
- cm->filter_level = min_filter_level;
-
- if (cm->filter_level > max_filter_level)
- cm->filter_level = max_filter_level;
-
- /* restore unfiltered frame pointer */
- cm->frame_to_show = saved_frame;
-}
-
-/* Stub function for now Alt LF not used */
-void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val)
-{
- MACROBLOCKD *mbd = &cpi->mb.e_mbd;
- (void) filt_val;
-
- mbd->segment_feature_data[MB_LVL_ALT_LF][0] = cpi->segment_feature_data[MB_LVL_ALT_LF][0];
- mbd->segment_feature_data[MB_LVL_ALT_LF][1] = cpi->segment_feature_data[MB_LVL_ALT_LF][1];
- mbd->segment_feature_data[MB_LVL_ALT_LF][2] = cpi->segment_feature_data[MB_LVL_ALT_LF][2];
- mbd->segment_feature_data[MB_LVL_ALT_LF][3] = cpi->segment_feature_data[MB_LVL_ALT_LF][3];
-}
-
-void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- int best_err = 0;
- int filt_err = 0;
- int min_filter_level = get_min_filter_level(cpi, cm->base_qindex);
- int max_filter_level = get_max_filter_level(cpi, cm->base_qindex);
-
- int filter_step;
- int filt_high = 0;
- int filt_mid;
- int filt_low = 0;
- int filt_best;
- int filt_direction = 0;
-
- /* Bias against raising loop filter and in favor of lowering it */
- int Bias = 0;
-
- int ss_err[MAX_LOOP_FILTER + 1];
-
- YV12_BUFFER_CONFIG * saved_frame = cm->frame_to_show;
-
- memset(ss_err, 0, sizeof(ss_err));
-
- /* Replace unfiltered frame buffer with a new one */
- cm->frame_to_show = &cpi->pick_lf_lvl_frame;
-
- if (cm->frame_type == KEY_FRAME)
- cm->sharpness_level = 0;
- else
- cm->sharpness_level = cpi->oxcf.Sharpness;
-
- /* Start the search at the previous frame filter level unless it is
- * now out of range.
- */
- filt_mid = cm->filter_level;
-
- if (filt_mid < min_filter_level)
- filt_mid = min_filter_level;
- else if (filt_mid > max_filter_level)
- filt_mid = max_filter_level;
-
- /* Define the initial step size */
- filter_step = (filt_mid < 16) ? 4 : filt_mid / 4;
-
- /* Get baseline error score */
-
- /* Copy the unfiltered / processed recon buffer to the new buffer */
- vpx_yv12_copy_y(saved_frame, cm->frame_to_show);
-
- vp8cx_set_alt_lf_level(cpi, filt_mid);
- vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_mid);
-
- best_err = vp8_calc_ss_err(sd, cm->frame_to_show);
-
- ss_err[filt_mid] = best_err;
-
- filt_best = filt_mid;
-
- while (filter_step > 0)
- {
- Bias = (best_err >> (15 - (filt_mid / 8))) * filter_step;
-
- if (cpi->twopass.section_intra_rating < 20)
- Bias = Bias * cpi->twopass.section_intra_rating / 20;
-
- filt_high = ((filt_mid + filter_step) > max_filter_level) ? max_filter_level : (filt_mid + filter_step);
- filt_low = ((filt_mid - filter_step) < min_filter_level) ? min_filter_level : (filt_mid - filter_step);
-
- if ((filt_direction <= 0) && (filt_low != filt_mid))
- {
- if(ss_err[filt_low] == 0)
- {
- /* Get Low filter error score */
- vpx_yv12_copy_y(saved_frame, cm->frame_to_show);
- vp8cx_set_alt_lf_level(cpi, filt_low);
- vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_low);
-
- filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
- ss_err[filt_low] = filt_err;
- }
- else
- filt_err = ss_err[filt_low];
-
- /* If value is close to the best so far then bias towards a
- * lower loop filter value.
- */
- if ((filt_err - Bias) < best_err)
- {
- /* Was it actually better than the previous best? */
- if (filt_err < best_err)
- best_err = filt_err;
-
- filt_best = filt_low;
- }
- }
-
- /* Now look at filt_high */
- if ((filt_direction >= 0) && (filt_high != filt_mid))
- {
- if(ss_err[filt_high] == 0)
- {
- vpx_yv12_copy_y(saved_frame, cm->frame_to_show);
- vp8cx_set_alt_lf_level(cpi, filt_high);
- vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_high);
-
- filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
- ss_err[filt_high] = filt_err;
- }
- else
- filt_err = ss_err[filt_high];
-
- /* Was it better than the previous best? */
- if (filt_err < (best_err - Bias))
- {
- best_err = filt_err;
- filt_best = filt_high;
- }
- }
-
- /* Half the step distance if the best filter value was the same
- * as last time
- */
- if (filt_best == filt_mid)
- {
- filter_step = filter_step / 2;
- filt_direction = 0;
- }
- else
- {
- filt_direction = (filt_best < filt_mid) ? -1 : 1;
- filt_mid = filt_best;
- }
- }
-
- cm->filter_level = filt_best;
-
- /* restore unfiltered frame pointer */
- cm->frame_to_show = saved_frame;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.c
deleted file mode 100644
index c5a7bc67039..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <math.h>
-#include "vpx_mem/vpx_mem.h"
-
-#include "onyx_int.h"
-#include "quantize.h"
-#include "vp8/common/quant_common.h"
-
-void vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d)
-{
- int i, rc, eob;
- int x, y, z, sz;
- short *coeff_ptr = b->coeff;
- short *round_ptr = b->round;
- short *quant_ptr = b->quant_fast;
- short *qcoeff_ptr = d->qcoeff;
- short *dqcoeff_ptr = d->dqcoeff;
- short *dequant_ptr = d->dequant;
-
- eob = -1;
- for (i = 0; i < 16; i++)
- {
- rc = vp8_default_zig_zag1d[i];
- z = coeff_ptr[rc];
-
- sz = (z >> 31); /* sign of z */
- x = (z ^ sz) - sz; /* x = abs(z) */
-
- y = ((x + round_ptr[rc]) * quant_ptr[rc]) >> 16; /* quantize (x) */
- x = (y ^ sz) - sz; /* get the sign back */
- qcoeff_ptr[rc] = x; /* write to destination */
- dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */
-
- if (y)
- {
- eob = i; /* last nonzero coeffs */
- }
- }
- *d->eob = (char)(eob + 1);
-}
-
-void vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d)
-{
- int i, rc, eob;
- int zbin;
- int x, y, z, sz;
- short *zbin_boost_ptr = b->zrun_zbin_boost;
- short *coeff_ptr = b->coeff;
- short *zbin_ptr = b->zbin;
- short *round_ptr = b->round;
- short *quant_ptr = b->quant;
- short *quant_shift_ptr = b->quant_shift;
- short *qcoeff_ptr = d->qcoeff;
- short *dqcoeff_ptr = d->dqcoeff;
- short *dequant_ptr = d->dequant;
- short zbin_oq_value = b->zbin_extra;
-
- memset(qcoeff_ptr, 0, 32);
- memset(dqcoeff_ptr, 0, 32);
-
- eob = -1;
-
- for (i = 0; i < 16; i++)
- {
- rc = vp8_default_zig_zag1d[i];
- z = coeff_ptr[rc];
-
- zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
-
- zbin_boost_ptr ++;
- sz = (z >> 31); /* sign of z */
- x = (z ^ sz) - sz; /* x = abs(z) */
-
- if (x >= zbin)
- {
- x += round_ptr[rc];
- y = ((((x * quant_ptr[rc]) >> 16) + x)
- * quant_shift_ptr[rc]) >> 16; /* quantize (x) */
- x = (y ^ sz) - sz; /* get the sign back */
- qcoeff_ptr[rc] = x; /* write to destination */
- dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */
-
- if (y)
- {
- eob = i; /* last nonzero coeffs */
- zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */
- }
- }
- }
-
- *d->eob = (char)(eob + 1);
-}
-
-void vp8_quantize_mby(MACROBLOCK *x)
-{
- int i;
- int has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED
- && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
-
- for (i = 0; i < 16; i++)
- x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
-
- if(has_2nd_order)
- x->quantize_b(&x->block[24], &x->e_mbd.block[24]);
-}
-
-void vp8_quantize_mb(MACROBLOCK *x)
-{
- int i;
- int has_2nd_order=(x->e_mbd.mode_info_context->mbmi.mode != B_PRED
- && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
-
- for (i = 0; i < 24+has_2nd_order; i++)
- x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
-}
-
-
-void vp8_quantize_mbuv(MACROBLOCK *x)
-{
- int i;
-
- for (i = 16; i < 24; i++)
- x->quantize_b(&x->block[i], &x->e_mbd.block[i]);
-}
-
-static const int qrounding_factors[129] =
-{
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48
-};
-
-
-static const int qzbin_factors[129] =
-{
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80
-};
-
-
-static const int qrounding_factors_y2[129] =
-{
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48,
- 48
-};
-
-
-static const int qzbin_factors_y2[129] =
-{
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80,
- 80
-};
-
-
-static void invert_quant(int improved_quant, short *quant,
- short *shift, short d)
-{
- if(improved_quant)
- {
- unsigned t;
- int l;
- t = d;
- for(l = 0; t > 1; l++)
- t>>=1;
- t = 1 + (1<<(16+l))/d;
- *quant = (short)(t - (1<<16));
- *shift = l;
- /* use multiplication and constant shift by 16 */
- *shift = 1 << (16 - *shift);
- }
- else
- {
- *quant = (1 << 16) / d;
- *shift = 0;
- /* use multiplication and constant shift by 16 */
- *shift = 1 << (16 - *shift);
- }
-}
-
-
-void vp8cx_init_quantizer(VP8_COMP *cpi)
-{
- int i;
- int quant_val;
- int Q;
-
- int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44,
- 44, 44};
-
- for (Q = 0; Q < QINDEX_RANGE; Q++)
- {
- /* dc values */
- quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
- cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0,
- cpi->Y1quant_shift[Q] + 0, quant_val);
- cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
- cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
- cpi->common.Y1dequant[Q][0] = quant_val;
- cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
-
- quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
- cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0,
- cpi->Y2quant_shift[Q] + 0, quant_val);
- cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
- cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
- cpi->common.Y2dequant[Q][0] = quant_val;
- cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
-
- quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
- cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0,
- cpi->UVquant_shift[Q] + 0, quant_val);
- cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
- cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
- cpi->common.UVdequant[Q][0] = quant_val;
- cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
-
- /* all the ac values = ; */
- quant_val = vp8_ac_yquant(Q);
- cpi->Y1quant_fast[Q][1] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 1,
- cpi->Y1quant_shift[Q] + 1, quant_val);
- cpi->Y1zbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
- cpi->Y1round[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
- cpi->common.Y1dequant[Q][1] = quant_val;
- cpi->zrun_zbin_boost_y1[Q][1] = (quant_val * zbin_boost[1]) >> 7;
-
- quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
- cpi->Y2quant_fast[Q][1] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 1,
- cpi->Y2quant_shift[Q] + 1, quant_val);
- cpi->Y2zbin[Q][1] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
- cpi->Y2round[Q][1] = (qrounding_factors_y2[Q] * quant_val) >> 7;
- cpi->common.Y2dequant[Q][1] = quant_val;
- cpi->zrun_zbin_boost_y2[Q][1] = (quant_val * zbin_boost[1]) >> 7;
-
- quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
- cpi->UVquant_fast[Q][1] = (1 << 16) / quant_val;
- invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 1,
- cpi->UVquant_shift[Q] + 1, quant_val);
- cpi->UVzbin[Q][1] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
- cpi->UVround[Q][1] = (qrounding_factors[Q] * quant_val) >> 7;
- cpi->common.UVdequant[Q][1] = quant_val;
- cpi->zrun_zbin_boost_uv[Q][1] = (quant_val * zbin_boost[1]) >> 7;
-
- for (i = 2; i < 16; i++)
- {
- cpi->Y1quant_fast[Q][i] = cpi->Y1quant_fast[Q][1];
- cpi->Y1quant[Q][i] = cpi->Y1quant[Q][1];
- cpi->Y1quant_shift[Q][i] = cpi->Y1quant_shift[Q][1];
- cpi->Y1zbin[Q][i] = cpi->Y1zbin[Q][1];
- cpi->Y1round[Q][i] = cpi->Y1round[Q][1];
- cpi->zrun_zbin_boost_y1[Q][i] = (cpi->common.Y1dequant[Q][1] *
- zbin_boost[i]) >> 7;
-
- cpi->Y2quant_fast[Q][i] = cpi->Y2quant_fast[Q][1];
- cpi->Y2quant[Q][i] = cpi->Y2quant[Q][1];
- cpi->Y2quant_shift[Q][i] = cpi->Y2quant_shift[Q][1];
- cpi->Y2zbin[Q][i] = cpi->Y2zbin[Q][1];
- cpi->Y2round[Q][i] = cpi->Y2round[Q][1];
- cpi->zrun_zbin_boost_y2[Q][i] = (cpi->common.Y2dequant[Q][1] *
- zbin_boost[i]) >> 7;
-
- cpi->UVquant_fast[Q][i] = cpi->UVquant_fast[Q][1];
- cpi->UVquant[Q][i] = cpi->UVquant[Q][1];
- cpi->UVquant_shift[Q][i] = cpi->UVquant_shift[Q][1];
- cpi->UVzbin[Q][i] = cpi->UVzbin[Q][1];
- cpi->UVround[Q][i] = cpi->UVround[Q][1];
- cpi->zrun_zbin_boost_uv[Q][i] = (cpi->common.UVdequant[Q][1] *
- zbin_boost[i]) >> 7;
- }
- }
-}
-
-#define ZBIN_EXTRA_Y \
- (( cpi->common.Y1dequant[QIndex][1] * \
- ( x->zbin_over_quant + \
- x->zbin_mode_boost + \
- x->act_zbin_adj ) ) >> 7)
-
-#define ZBIN_EXTRA_UV \
- (( cpi->common.UVdequant[QIndex][1] * \
- ( x->zbin_over_quant + \
- x->zbin_mode_boost + \
- x->act_zbin_adj ) ) >> 7)
-
-#define ZBIN_EXTRA_Y2 \
- (( cpi->common.Y2dequant[QIndex][1] * \
- ( (x->zbin_over_quant / 2) + \
- x->zbin_mode_boost + \
- x->act_zbin_adj ) ) >> 7)
-
-void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x, int ok_to_skip)
-{
- int i;
- int QIndex;
- MACROBLOCKD *xd = &x->e_mbd;
- int zbin_extra;
-
- /* Select the baseline MB Q index. */
- if (xd->segmentation_enabled)
- {
- /* Abs Value */
- if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
- QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
- /* Delta Value */
- else
- {
- QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
- /* Clamp to valid range */
- QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;
- }
- }
- else
- QIndex = cpi->common.base_qindex;
-
- /* This initialization should be called at least once. Use ok_to_skip to
- * decide if it is ok to skip.
- * Before encoding a frame, this function is always called with ok_to_skip
- * =0, which means no skiping of calculations. The "last" values are
- * initialized at that time.
- */
- if (!ok_to_skip || QIndex != x->q_index)
- {
-
- xd->dequant_y1_dc[0] = 1;
- xd->dequant_y1[0] = cpi->common.Y1dequant[QIndex][0];
- xd->dequant_y2[0] = cpi->common.Y2dequant[QIndex][0];
- xd->dequant_uv[0] = cpi->common.UVdequant[QIndex][0];
-
- for (i = 1; i < 16; i++)
- {
- xd->dequant_y1_dc[i] =
- xd->dequant_y1[i] = cpi->common.Y1dequant[QIndex][1];
- xd->dequant_y2[i] = cpi->common.Y2dequant[QIndex][1];
- xd->dequant_uv[i] = cpi->common.UVdequant[QIndex][1];
- }
-#if 1
- /*TODO: Remove dequant from BLOCKD. This is a temporary solution until
- * the quantizer code uses a passed in pointer to the dequant constants.
- * This will also require modifications to the x86 and neon assembly.
- * */
- for (i = 0; i < 16; i++)
- x->e_mbd.block[i].dequant = xd->dequant_y1;
- for (i = 16; i < 24; i++)
- x->e_mbd.block[i].dequant = xd->dequant_uv;
- x->e_mbd.block[24].dequant = xd->dequant_y2;
-#endif
-
- /* Y */
- zbin_extra = ZBIN_EXTRA_Y;
-
- for (i = 0; i < 16; i++)
- {
- x->block[i].quant = cpi->Y1quant[QIndex];
- x->block[i].quant_fast = cpi->Y1quant_fast[QIndex];
- x->block[i].quant_shift = cpi->Y1quant_shift[QIndex];
- x->block[i].zbin = cpi->Y1zbin[QIndex];
- x->block[i].round = cpi->Y1round[QIndex];
- x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex];
- x->block[i].zbin_extra = (short)zbin_extra;
- }
-
- /* UV */
- zbin_extra = ZBIN_EXTRA_UV;
-
- for (i = 16; i < 24; i++)
- {
- x->block[i].quant = cpi->UVquant[QIndex];
- x->block[i].quant_fast = cpi->UVquant_fast[QIndex];
- x->block[i].quant_shift = cpi->UVquant_shift[QIndex];
- x->block[i].zbin = cpi->UVzbin[QIndex];
- x->block[i].round = cpi->UVround[QIndex];
- x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
- x->block[i].zbin_extra = (short)zbin_extra;
- }
-
- /* Y2 */
- zbin_extra = ZBIN_EXTRA_Y2;
-
- x->block[24].quant_fast = cpi->Y2quant_fast[QIndex];
- x->block[24].quant = cpi->Y2quant[QIndex];
- x->block[24].quant_shift = cpi->Y2quant_shift[QIndex];
- x->block[24].zbin = cpi->Y2zbin[QIndex];
- x->block[24].round = cpi->Y2round[QIndex];
- x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex];
- x->block[24].zbin_extra = (short)zbin_extra;
-
- /* save this macroblock QIndex for vp8_update_zbin_extra() */
- x->q_index = QIndex;
-
- x->last_zbin_over_quant = x->zbin_over_quant;
- x->last_zbin_mode_boost = x->zbin_mode_boost;
- x->last_act_zbin_adj = x->act_zbin_adj;
-
-
-
- }
- else if(x->last_zbin_over_quant != x->zbin_over_quant
- || x->last_zbin_mode_boost != x->zbin_mode_boost
- || x->last_act_zbin_adj != x->act_zbin_adj)
- {
- /* Y */
- zbin_extra = ZBIN_EXTRA_Y;
-
- for (i = 0; i < 16; i++)
- x->block[i].zbin_extra = (short)zbin_extra;
-
- /* UV */
- zbin_extra = ZBIN_EXTRA_UV;
-
- for (i = 16; i < 24; i++)
- x->block[i].zbin_extra = (short)zbin_extra;
-
- /* Y2 */
- zbin_extra = ZBIN_EXTRA_Y2;
- x->block[24].zbin_extra = (short)zbin_extra;
-
- x->last_zbin_over_quant = x->zbin_over_quant;
- x->last_zbin_mode_boost = x->zbin_mode_boost;
- x->last_act_zbin_adj = x->act_zbin_adj;
- }
-}
-
-void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x)
-{
- int i;
- int QIndex = x->q_index;
- int zbin_extra;
-
- /* Y */
- zbin_extra = ZBIN_EXTRA_Y;
-
- for (i = 0; i < 16; i++)
- x->block[i].zbin_extra = (short)zbin_extra;
-
- /* UV */
- zbin_extra = ZBIN_EXTRA_UV;
-
- for (i = 16; i < 24; i++)
- x->block[i].zbin_extra = (short)zbin_extra;
-
- /* Y2 */
- zbin_extra = ZBIN_EXTRA_Y2;
- x->block[24].zbin_extra = (short)zbin_extra;
-}
-#undef ZBIN_EXTRA_Y
-#undef ZBIN_EXTRA_UV
-#undef ZBIN_EXTRA_Y2
-
-void vp8cx_frame_init_quantizer(VP8_COMP *cpi)
-{
- /* Clear Zbin mode boost for default case */
- cpi->mb.zbin_mode_boost = 0;
-
- /* MB level quantizer setup */
- vp8cx_mb_init_quantizer(cpi, &cpi->mb, 0);
-}
-
-
-void vp8_set_quantizer(struct VP8_COMP *cpi, int Q)
-{
- VP8_COMMON *cm = &cpi->common;
- MACROBLOCKD *mbd = &cpi->mb.e_mbd;
- int update = 0;
- int new_delta_q;
- int new_uv_delta_q;
- cm->base_qindex = Q;
-
- /* if any of the delta_q values are changing update flag has to be set */
- /* currently only y2dc_delta_q may change */
-
- cm->y1dc_delta_q = 0;
- cm->y2ac_delta_q = 0;
-
- if (Q < 4)
- {
- new_delta_q = 4-Q;
- }
- else
- new_delta_q = 0;
-
- update |= cm->y2dc_delta_q != new_delta_q;
- cm->y2dc_delta_q = new_delta_q;
-
- new_uv_delta_q = 0;
- // For screen content, lower the q value for UV channel. For now, select
- // conservative delta; same delta for dc and ac, and decrease it with lower
- // Q, and set to 0 below some threshold. May want to condition this in
- // future on the variance/energy in UV channel.
- if (cpi->oxcf.screen_content_mode && Q > 40) {
- new_uv_delta_q = -(int)(0.15 * Q);
- // Check range: magnitude of delta is 4 bits.
- if (new_uv_delta_q < -15) {
- new_uv_delta_q = -15;
- }
- }
- update |= cm->uvdc_delta_q != new_uv_delta_q;
- cm->uvdc_delta_q = new_uv_delta_q;
- cm->uvac_delta_q = new_uv_delta_q;
-
- /* Set Segment specific quatizers */
- mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LVL_ALT_Q][0];
- mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LVL_ALT_Q][1];
- mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LVL_ALT_Q][2];
- mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LVL_ALT_Q][3];
-
- /* quantizer has to be reinitialized for any delta_q changes */
- if(update)
- vp8cx_init_quantizer(cpi);
-
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.h
deleted file mode 100644
index 7d36c2b45fe..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/quantize.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_QUANTIZE_H_
-#define VP8_ENCODER_QUANTIZE_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct VP8_COMP;
-struct macroblock;
-extern void vp8_quantize_mb(struct macroblock *x);
-extern void vp8_quantize_mby(struct macroblock *x);
-extern void vp8_quantize_mbuv(struct macroblock *x);
-extern void vp8_set_quantizer(struct VP8_COMP *cpi, int Q);
-extern void vp8cx_frame_init_quantizer(struct VP8_COMP *cpi);
-extern void vp8_update_zbin_extra(struct VP8_COMP *cpi, struct macroblock *x);
-extern void vp8cx_mb_init_quantizer(struct VP8_COMP *cpi, struct macroblock *x, int ok_to_skip);
-extern void vp8cx_init_quantizer(struct VP8_COMP *cpi);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_QUANTIZE_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.c
deleted file mode 100644
index e8796a1fcfb..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.c
+++ /dev/null
@@ -1,1609 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include <assert.h>
-
-#include "math.h"
-#include "vp8/common/common.h"
-#include "ratectrl.h"
-#include "vp8/common/entropymode.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/systemdependent.h"
-#include "encodemv.h"
-
-
-#define MIN_BPB_FACTOR 0.01
-#define MAX_BPB_FACTOR 50
-
-extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
-
-
-
-#ifdef MODE_STATS
-extern int y_modes[5];
-extern int uv_modes[4];
-extern int b_modes[10];
-
-extern int inter_y_modes[10];
-extern int inter_uv_modes[4];
-extern int inter_b_modes[10];
-#endif
-
-/* Bits Per MB at different Q (Multiplied by 512) */
-#define BPER_MB_NORMBITS 9
-
-/* Work in progress recalibration of baseline rate tables based on
- * the assumption that bits per mb is inversely proportional to the
- * quantizer value.
- */
-const int vp8_bits_per_mb[2][QINDEX_RANGE] =
-{
- /* Intra case 450000/Qintra */
- {
- 1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000,
- 409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705,
- 250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545,
- 195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714,
- 155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000,
- 121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651,
- 102272, 100000, 97826, 97826, 95744, 93750, 91836, 90000,
- 88235, 86538, 84905, 83333, 81818, 80357, 78947, 77586,
- 76271, 75000, 73770, 72580, 71428, 70312, 69230, 68181,
- 67164, 66176, 65217, 64285, 63380, 62500, 61643, 60810,
- 60000, 59210, 59210, 58441, 57692, 56962, 56250, 55555,
- 54878, 54216, 53571, 52941, 52325, 51724, 51136, 50561,
- 49450, 48387, 47368, 46875, 45918, 45000, 44554, 44117,
- 43269, 42452, 41666, 40909, 40178, 39473, 38793, 38135,
- 36885, 36290, 35714, 35156, 34615, 34090, 33582, 33088,
- 32608, 32142, 31468, 31034, 30405, 29801, 29220, 28662,
- },
- /* Inter case 285000/Qinter */
- {
- 712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090,
- 237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000,
- 142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555,
- 101785, 98275, 95000, 91935, 89062, 86363, 83823, 81428,
- 79166, 77027, 75000, 73076, 71250, 69512, 67857, 66279,
- 64772, 63333, 61956, 60638, 59375, 58163, 57000, 55882,
- 54807, 53773, 52777, 51818, 50892, 50000, 49137, 47500,
- 45967, 44531, 43181, 41911, 40714, 39583, 38513, 37500,
- 36538, 35625, 34756, 33928, 33139, 32386, 31666, 30978,
- 30319, 29687, 29081, 28500, 27941, 27403, 26886, 26388,
- 25909, 25446, 25000, 24568, 23949, 23360, 22800, 22265,
- 21755, 21268, 20802, 20357, 19930, 19520, 19127, 18750,
- 18387, 18037, 17701, 17378, 17065, 16764, 16473, 16101,
- 15745, 15405, 15079, 14766, 14467, 14179, 13902, 13636,
- 13380, 13133, 12895, 12666, 12445, 12179, 11924, 11632,
- 11445, 11220, 11003, 10795, 10594, 10401, 10215, 10035,
- }
-};
-
-static const int kf_boost_qadjustment[QINDEX_RANGE] =
-{
- 128, 129, 130, 131, 132, 133, 134, 135,
- 136, 137, 138, 139, 140, 141, 142, 143,
- 144, 145, 146, 147, 148, 149, 150, 151,
- 152, 153, 154, 155, 156, 157, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175,
- 176, 177, 178, 179, 180, 181, 182, 183,
- 184, 185, 186, 187, 188, 189, 190, 191,
- 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 200, 201, 201, 202, 203, 203, 203,
- 204, 204, 205, 205, 206, 206, 207, 207,
- 208, 208, 209, 209, 210, 210, 211, 211,
- 212, 212, 213, 213, 214, 214, 215, 215,
- 216, 216, 217, 217, 218, 218, 219, 219,
- 220, 220, 220, 220, 220, 220, 220, 220,
- 220, 220, 220, 220, 220, 220, 220, 220,
-};
-
-/* #define GFQ_ADJUSTMENT (Q+100) */
-#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
-const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
-{
- 80, 82, 84, 86, 88, 90, 92, 94,
- 96, 97, 98, 99, 100, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127,
- 128, 129, 130, 131, 132, 133, 134, 135,
- 136, 137, 138, 139, 140, 141, 142, 143,
- 144, 145, 146, 147, 148, 149, 150, 151,
- 152, 153, 154, 155, 156, 157, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167,
- 168, 169, 170, 171, 172, 173, 174, 175,
- 176, 177, 178, 179, 180, 181, 182, 183,
- 184, 184, 185, 185, 186, 186, 187, 187,
- 188, 188, 189, 189, 190, 190, 191, 191,
- 192, 192, 193, 193, 194, 194, 194, 194,
- 195, 195, 196, 196, 197, 197, 198, 198
-};
-
-/*
-const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
-{
- 100,101,102,103,104,105,105,106,
- 106,107,107,108,109,109,110,111,
- 112,113,114,115,116,117,118,119,
- 120,121,122,123,124,125,126,127,
- 128,129,130,131,132,133,134,135,
- 136,137,138,139,140,141,142,143,
- 144,145,146,147,148,149,150,151,
- 152,153,154,155,156,157,158,159,
- 160,161,162,163,164,165,166,167,
- 168,169,170,170,171,171,172,172,
- 173,173,173,174,174,174,175,175,
- 175,176,176,176,177,177,177,177,
- 178,178,179,179,180,180,181,181,
- 182,182,183,183,184,184,185,185,
- 186,186,187,187,188,188,189,189,
- 190,190,191,191,192,192,193,193,
-};
-*/
-
-static const int kf_gf_boost_qlimits[QINDEX_RANGE] =
-{
- 150, 155, 160, 165, 170, 175, 180, 185,
- 190, 195, 200, 205, 210, 215, 220, 225,
- 230, 235, 240, 245, 250, 255, 260, 265,
- 270, 275, 280, 285, 290, 295, 300, 305,
- 310, 320, 330, 340, 350, 360, 370, 380,
- 390, 400, 410, 420, 430, 440, 450, 460,
- 470, 480, 490, 500, 510, 520, 530, 540,
- 550, 560, 570, 580, 590, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
- 600, 600, 600, 600, 600, 600, 600, 600,
-};
-
-static const int gf_adjust_table[101] =
-{
- 100,
- 115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
- 240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
- 350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
- 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
-};
-
-static const int gf_intra_usage_adjustment[20] =
-{
- 125, 120, 115, 110, 105, 100, 95, 85, 80, 75,
- 70, 65, 60, 55, 50, 50, 50, 50, 50, 50,
-};
-
-static const int gf_interval_table[101] =
-{
- 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-};
-
-static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
-
-
-void vp8_save_coding_context(VP8_COMP *cpi)
-{
- CODING_CONTEXT *const cc = & cpi->coding_context;
-
- /* Stores a snapshot of key state variables which can subsequently be
- * restored with a call to vp8_restore_coding_context. These functions are
- * intended for use in a re-code loop in vp8_compress_frame where the
- * quantizer value is adjusted between loop iterations.
- */
-
- cc->frames_since_key = cpi->frames_since_key;
- cc->filter_level = cpi->common.filter_level;
- cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due;
- cc->frames_since_golden = cpi->frames_since_golden;
-
- vp8_copy(cc->mvc, cpi->common.fc.mvc);
- vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts);
-
- vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
- vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
-
- vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
- vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
-
-
- /* Stats */
-#ifdef MODE_STATS
- vp8_copy(cc->y_modes, y_modes);
- vp8_copy(cc->uv_modes, uv_modes);
- vp8_copy(cc->b_modes, b_modes);
- vp8_copy(cc->inter_y_modes, inter_y_modes);
- vp8_copy(cc->inter_uv_modes, inter_uv_modes);
- vp8_copy(cc->inter_b_modes, inter_b_modes);
-#endif
-
- cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
-}
-
-
-void vp8_restore_coding_context(VP8_COMP *cpi)
-{
- CODING_CONTEXT *const cc = & cpi->coding_context;
-
- /* Restore key state variables to the snapshot state stored in the
- * previous call to vp8_save_coding_context.
- */
-
- cpi->frames_since_key = cc->frames_since_key;
- cpi->common.filter_level = cc->filter_level;
- cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due;
- cpi->frames_since_golden = cc->frames_since_golden;
-
- vp8_copy(cpi->common.fc.mvc, cc->mvc);
-
- vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
-
- vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob);
- vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob);
-
- vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
- vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
-
- /* Stats */
-#ifdef MODE_STATS
- vp8_copy(y_modes, cc->y_modes);
- vp8_copy(uv_modes, cc->uv_modes);
- vp8_copy(b_modes, cc->b_modes);
- vp8_copy(inter_y_modes, cc->inter_y_modes);
- vp8_copy(inter_uv_modes, cc->inter_uv_modes);
- vp8_copy(inter_b_modes, cc->inter_b_modes);
-#endif
-
-
- cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
-}
-
-
-void vp8_setup_key_frame(VP8_COMP *cpi)
-{
- /* Setup for Key frame: */
-
- vp8_default_coef_probs(& cpi->common);
-
- memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
- {
- int flag[2] = {1, 1};
- vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
- }
-
- /* Make sure we initialize separate contexts for altref,gold, and normal.
- * TODO shouldn't need 3 different copies of structure to do this!
- */
- memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
- memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
- memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
-
- cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
-
- /* Provisional interval before next GF */
- if (cpi->auto_gold)
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
- else
- cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
-
- cpi->common.refresh_golden_frame = 1;
- cpi->common.refresh_alt_ref_frame = 1;
-}
-
-
-static int estimate_bits_at_q(int frame_kind, int Q, int MBs,
- double correction_factor)
-{
- int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
-
- /* Attempt to retain reasonable accuracy without overflow. The cutoff is
- * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
- * largest Bpm takes 20 bits.
- */
- if (MBs > (1 << 11))
- return (Bpm >> BPER_MB_NORMBITS) * MBs;
- else
- return (Bpm * MBs) >> BPER_MB_NORMBITS;
-}
-
-
-static void calc_iframe_target_size(VP8_COMP *cpi)
-{
- /* boost defaults to half second */
- int kf_boost;
- uint64_t target;
-
- /* Clear down mmx registers to allow floating point in what follows */
- vp8_clear_system_state();
-
- if (cpi->oxcf.fixed_q >= 0)
- {
- int Q = cpi->oxcf.key_q;
-
- target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
- cpi->key_frame_rate_correction_factor);
- }
- else if (cpi->pass == 2)
- {
- /* New Two pass RC */
- target = cpi->per_frame_bandwidth;
- }
- /* First Frame is a special case */
- else if (cpi->common.current_video_frame == 0)
- {
- /* 1 Pass there is no information on which to base size so use
- * bandwidth per second * fraction of the initial buffer
- * level
- */
- target = cpi->oxcf.starting_buffer_level / 2;
-
- if(target > cpi->oxcf.target_bandwidth * 3 / 2)
- target = cpi->oxcf.target_bandwidth * 3 / 2;
- }
- else
- {
- /* if this keyframe was forced, use a more recent Q estimate */
- int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY)
- ? cpi->avg_frame_qindex : cpi->ni_av_qi;
-
- int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
- /* Boost depends somewhat on frame rate: only used for 1 layer case. */
- if (cpi->oxcf.number_of_layers == 1) {
- kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
- }
- else {
- /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
- kf_boost = initial_boost;
- }
-
- /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
- kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
-
- /* frame separation adjustment ( down) */
- if (cpi->frames_since_key < cpi->output_framerate / 2)
- kf_boost = (int)(kf_boost
- * cpi->frames_since_key / (cpi->output_framerate / 2));
-
- /* Minimal target size is |2* per_frame_bandwidth|. */
- if (kf_boost < 16)
- kf_boost = 16;
-
- target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
- }
-
-
- if (cpi->oxcf.rc_max_intra_bitrate_pct)
- {
- unsigned int max_rate = cpi->per_frame_bandwidth
- * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
-
- if (target > max_rate)
- target = max_rate;
- }
-
- cpi->this_frame_target = (int)target;
-
- /* TODO: if we separate rate targeting from Q targetting, move this.
- * Reset the active worst quality to the baseline value for key frames.
- */
- if (cpi->pass != 2)
- cpi->active_worst_quality = cpi->worst_quality;
-
-#if 0
- {
- FILE *f;
-
- f = fopen("kf_boost.stt", "a");
- fprintf(f, " %8u %10d %10d %10d\n",
- cpi->common.current_video_frame, cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
-
- fclose(f);
- }
-#endif
-}
-
-
-/* Do the best we can to define the parameters for the next GF based on what
- * information we have available.
- */
-static void calc_gf_params(VP8_COMP *cpi)
-{
- int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
- int Boost = 0;
-
- int gf_frame_useage = 0; /* Golden frame useage since last GF */
- int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
- cpi->recent_ref_frame_usage[LAST_FRAME] +
- cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
- cpi->recent_ref_frame_usage[ALTREF_FRAME];
-
- int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
-
- if (tot_mbs)
- gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
-
- if (pct_gf_active > gf_frame_useage)
- gf_frame_useage = pct_gf_active;
-
- /* Not two pass */
- if (cpi->pass != 2)
- {
- /* Single Pass lagged mode: TBD */
- if (0)
- {
- }
-
- /* Single Pass compression: Has to use current and historical data */
- else
- {
-#if 0
- /* Experimental code */
- int index = cpi->one_pass_frame_index;
- int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
-
- /* ************** Experimental code - incomplete */
- /*
- double decay_val = 1.0;
- double IIAccumulator = 0.0;
- double last_iiaccumulator = 0.0;
- double IIRatio;
-
- cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
-
- for ( i = 0; i < (frames_to_scan - 1); i++ )
- {
- if ( index < 0 )
- index = MAX_LAG_BUFFERS;
- index --;
-
- if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
- {
- IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
-
- if ( IIRatio > 30.0 )
- IIRatio = 30.0;
- }
- else
- IIRatio = 30.0;
-
- IIAccumulator += IIRatio * decay_val;
-
- decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
-
- if ( (i > MIN_GF_INTERVAL) &&
- ((IIAccumulator - last_iiaccumulator) < 2.0) )
- {
- break;
- }
- last_iiaccumulator = IIAccumulator;
- }
-
- Boost = IIAccumulator*100.0/16.0;
- cpi->baseline_gf_interval = i;
-
- */
-#else
-
- /*************************************************************/
- /* OLD code */
-
- /* Adjust boost based upon ambient Q */
- Boost = GFQ_ADJUSTMENT;
-
- /* Adjust based upon most recently measure intra useage */
- Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
-
- /* Adjust gf boost based upon GF usage since last GF */
- Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
-#endif
- }
-
- /* golden frame boost without recode loop often goes awry. be
- * safe by keeping numbers down.
- */
- if (!cpi->sf.recode_loop)
- {
- if (cpi->compressor_speed == 2)
- Boost = Boost / 2;
- }
-
- /* Apply an upper limit based on Q for 1 pass encodes */
- if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
- Boost = kf_gf_boost_qlimits[Q];
-
- /* Apply lower limits to boost. */
- else if (Boost < 110)
- Boost = 110;
-
- /* Note the boost used */
- cpi->last_boost = Boost;
-
- }
-
- /* Estimate next interval
- * This is updated once the real frame size/boost is known.
- */
- if (cpi->oxcf.fixed_q == -1)
- {
- if (cpi->pass == 2) /* 2 Pass */
- {
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
- }
- else /* 1 Pass */
- {
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
-
- if (cpi->last_boost > 750)
- cpi->frames_till_gf_update_due++;
-
- if (cpi->last_boost > 1000)
- cpi->frames_till_gf_update_due++;
-
- if (cpi->last_boost > 1250)
- cpi->frames_till_gf_update_due++;
-
- if (cpi->last_boost >= 1500)
- cpi->frames_till_gf_update_due ++;
-
- if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
- cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
-
- if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
- cpi->frames_till_gf_update_due = cpi->max_gf_interval;
- }
- }
- else
- cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
-
- /* ARF on or off */
- if (cpi->pass != 2)
- {
- /* For now Alt ref is not allowed except in 2 pass modes. */
- cpi->source_alt_ref_pending = 0;
-
- /*if ( cpi->oxcf.fixed_q == -1)
- {
- if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
- cpi->source_alt_ref_pending = 1;
- else
- cpi->source_alt_ref_pending = 0;
- }*/
- }
-}
-
-
-static void calc_pframe_target_size(VP8_COMP *cpi)
-{
- int min_frame_target;
- int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
-
- if ( cpi->current_layer > 0)
- cpi->per_frame_bandwidth =
- cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
-
- min_frame_target = 0;
-
- if (cpi->pass == 2)
- {
- min_frame_target = cpi->min_frame_bandwidth;
-
- if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
- min_frame_target = cpi->av_per_frame_bandwidth >> 5;
- }
- else if (min_frame_target < cpi->per_frame_bandwidth / 4)
- min_frame_target = cpi->per_frame_bandwidth / 4;
-
-
- /* Special alt reference frame case */
- if((cpi->common.refresh_alt_ref_frame) && (cpi->oxcf.number_of_layers == 1))
- {
- if (cpi->pass == 2)
- {
- /* Per frame bit target for the alt ref frame */
- cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
- cpi->this_frame_target = cpi->per_frame_bandwidth;
- }
-
- /* One Pass ??? TBD */
- }
-
- /* Normal frames (gf,and inter) */
- else
- {
- /* 2 pass */
- if (cpi->pass == 2)
- {
- cpi->this_frame_target = cpi->per_frame_bandwidth;
- }
- /* 1 pass */
- else
- {
- int Adjustment;
- /* Make rate adjustment to recover bits spent in key frame
- * Test to see if the key frame inter data rate correction
- * should still be in force
- */
- if (cpi->kf_overspend_bits > 0)
- {
- Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
-
- if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
- Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
-
- cpi->kf_overspend_bits -= Adjustment;
-
- /* Calculate an inter frame bandwidth target for the next
- * few frames designed to recover any extra bits spent on
- * the key frame.
- */
- cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
-
- if (cpi->this_frame_target < min_frame_target)
- cpi->this_frame_target = min_frame_target;
- }
- else
- cpi->this_frame_target = cpi->per_frame_bandwidth;
-
- /* If appropriate make an adjustment to recover bits spent on a
- * recent GF
- */
- if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
- {
- Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
-
- if (Adjustment > (cpi->this_frame_target - min_frame_target))
- Adjustment = (cpi->this_frame_target - min_frame_target);
-
- cpi->gf_overspend_bits -= Adjustment;
- cpi->this_frame_target -= Adjustment;
- }
-
- /* Apply small + and - boosts for non gf frames */
- if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
- (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
- {
- /* % Adjustment limited to the range 1% to 10% */
- Adjustment = (cpi->last_boost - 100) >> 5;
-
- if (Adjustment < 1)
- Adjustment = 1;
- else if (Adjustment > 10)
- Adjustment = 10;
-
- /* Convert to bits */
- Adjustment = (cpi->this_frame_target * Adjustment) / 100;
-
- if (Adjustment > (cpi->this_frame_target - min_frame_target))
- Adjustment = (cpi->this_frame_target - min_frame_target);
-
- if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1))
- {
- Adjustment = (cpi->current_gf_interval - 1) * Adjustment;
- // Limit adjustment to 10% of current target.
- if (Adjustment > (10 * cpi->this_frame_target) / 100)
- Adjustment = (10 * cpi->this_frame_target) / 100;
- cpi->this_frame_target += Adjustment;
- }
- else
- cpi->this_frame_target -= Adjustment;
- }
- }
- }
-
- /* Sanity check that the total sum of adjustments is not above the
- * maximum allowed That is that having allowed for KF and GF penalties
- * we have not pushed the current interframe target to low. If the
- * adjustment we apply here is not capable of recovering all the extra
- * bits we have spent in the KF or GF then the remainder will have to
- * be recovered over a longer time span via other buffer / rate control
- * mechanisms.
- */
- if (cpi->this_frame_target < min_frame_target)
- cpi->this_frame_target = min_frame_target;
-
- if (!cpi->common.refresh_alt_ref_frame)
- /* Note the baseline target data rate for this inter frame. */
- cpi->inter_frame_target = cpi->this_frame_target;
-
- /* One Pass specific code */
- if (cpi->pass == 0)
- {
- /* Adapt target frame size with respect to any buffering constraints: */
- if (cpi->buffered_mode)
- {
- int one_percent_bits = (int)
- (1 + cpi->oxcf.optimal_buffer_level / 100);
-
- if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
- (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
- {
- int percent_low = 0;
-
- /* Decide whether or not we need to adjust the frame data
- * rate target.
- *
- * If we are are below the optimal buffer fullness level
- * and adherence to buffering constraints is important to
- * the end usage then adjust the per frame target.
- */
- if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
- (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
- {
- percent_low = (int)
- ((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
- one_percent_bits);
- }
- /* Are we overshooting the long term clip data rate... */
- else if (cpi->bits_off_target < 0)
- {
- /* Adjust per frame data target downwards to compensate. */
- percent_low = (int)(100 * -cpi->bits_off_target /
- (cpi->total_byte_count * 8));
- }
-
- if (percent_low > cpi->oxcf.under_shoot_pct)
- percent_low = cpi->oxcf.under_shoot_pct;
- else if (percent_low < 0)
- percent_low = 0;
-
- /* lower the target bandwidth for this frame. */
- cpi->this_frame_target -=
- (cpi->this_frame_target * percent_low) / 200;
-
- /* Are we using allowing control of active_worst_allowed_q
- * according to buffer level.
- */
- if (cpi->auto_worst_q && cpi->ni_frames > 150)
- {
- int64_t critical_buffer_level;
-
- /* For streaming applications the most important factor is
- * cpi->buffer_level as this takes into account the
- * specified short term buffering constraints. However,
- * hitting the long term clip data rate target is also
- * important.
- */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- /* Take the smaller of cpi->buffer_level and
- * cpi->bits_off_target
- */
- critical_buffer_level =
- (cpi->buffer_level < cpi->bits_off_target)
- ? cpi->buffer_level : cpi->bits_off_target;
- }
- /* For local file playback short term buffering constraints
- * are less of an issue
- */
- else
- {
- /* Consider only how we are doing for the clip as a
- * whole
- */
- critical_buffer_level = cpi->bits_off_target;
- }
-
- /* Set the active worst quality based upon the selected
- * buffer fullness number.
- */
- if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
- {
- if ( critical_buffer_level >
- (cpi->oxcf.optimal_buffer_level >> 2) )
- {
- int64_t qadjustment_range =
- cpi->worst_quality - cpi->ni_av_qi;
- int64_t above_base =
- (critical_buffer_level -
- (cpi->oxcf.optimal_buffer_level >> 2));
-
- /* Step active worst quality down from
- * cpi->ni_av_qi when (critical_buffer_level ==
- * cpi->optimal_buffer_level) to
- * cpi->worst_quality when
- * (critical_buffer_level ==
- * cpi->optimal_buffer_level >> 2)
- */
- cpi->active_worst_quality =
- cpi->worst_quality -
- (int)((qadjustment_range * above_base) /
- (cpi->oxcf.optimal_buffer_level*3>>2));
- }
- else
- {
- cpi->active_worst_quality = cpi->worst_quality;
- }
- }
- else
- {
- cpi->active_worst_quality = cpi->ni_av_qi;
- }
- }
- else
- {
- cpi->active_worst_quality = cpi->worst_quality;
- }
- }
- else
- {
- int percent_high = 0;
-
- if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
- {
- percent_high = (int)((cpi->buffer_level
- - cpi->oxcf.optimal_buffer_level)
- / one_percent_bits);
- }
- else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
- {
- percent_high = (int)((100 * cpi->bits_off_target)
- / (cpi->total_byte_count * 8));
- }
-
- if (percent_high > cpi->oxcf.over_shoot_pct)
- percent_high = cpi->oxcf.over_shoot_pct;
- else if (percent_high < 0)
- percent_high = 0;
-
- cpi->this_frame_target += (cpi->this_frame_target *
- percent_high) / 200;
-
- /* Are we allowing control of active_worst_allowed_q according
- * to buffer level.
- */
- if (cpi->auto_worst_q && cpi->ni_frames > 150)
- {
- /* When using the relaxed buffer model stick to the
- * user specified value
- */
- cpi->active_worst_quality = cpi->ni_av_qi;
- }
- else
- {
- cpi->active_worst_quality = cpi->worst_quality;
- }
- }
-
- /* Set active_best_quality to prevent quality rising too high */
- cpi->active_best_quality = cpi->best_quality;
-
- /* Worst quality obviously must not be better than best quality */
- if (cpi->active_worst_quality <= cpi->active_best_quality)
- cpi->active_worst_quality = cpi->active_best_quality + 1;
-
- if(cpi->active_worst_quality > 127)
- cpi->active_worst_quality = 127;
- }
- /* Unbuffered mode (eg. video conferencing) */
- else
- {
- /* Set the active worst quality */
- cpi->active_worst_quality = cpi->worst_quality;
- }
-
- /* Special trap for constrained quality mode
- * "active_worst_quality" may never drop below cq level
- * for any frame type.
- */
- if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
- cpi->active_worst_quality < cpi->cq_target_quality)
- {
- cpi->active_worst_quality = cpi->cq_target_quality;
- }
- }
-
- /* Test to see if we have to drop a frame
- * The auto-drop frame code is only used in buffered mode.
- * In unbufferd mode (eg vide conferencing) the descision to
- * code or drop a frame is made outside the codec in response to real
- * world comms or buffer considerations.
- */
- if (cpi->drop_frames_allowed &&
- (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
- ((cpi->common.frame_type != KEY_FRAME)))
- {
- /* Check for a buffer underun-crisis in which case we have to drop
- * a frame
- */
- if ((cpi->buffer_level < 0))
- {
-#if 0
- FILE *f = fopen("dec.stt", "a");
- fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
- (int) cpi->common.current_video_frame,
- cpi->decimation_factor, cpi->common.horiz_scale,
- (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
- fclose(f);
-#endif
- cpi->drop_frame = 1;
-
- /* Update the buffer level variable. */
- cpi->bits_off_target += cpi->av_per_frame_bandwidth;
- if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
- cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
- cpi->buffer_level = cpi->bits_off_target;
-
- if (cpi->oxcf.number_of_layers > 1) {
- unsigned int i;
-
- // Propagate bits saved by dropping the frame to higher layers.
- for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers;
- i++) {
- LAYER_CONTEXT *lc = &cpi->layer_context[i];
- lc->bits_off_target += (int)(lc->target_bandwidth /
- lc->framerate);
- if (lc->bits_off_target > lc->maximum_buffer_size)
- lc->bits_off_target = lc->maximum_buffer_size;
- lc->buffer_level = lc->bits_off_target;
- }
- }
- }
- }
-
- /* Adjust target frame size for Golden Frames: */
- if (cpi->oxcf.error_resilient_mode == 0 &&
- (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
- {
- int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
-
- int gf_frame_useage = 0; /* Golden frame useage since last GF */
- int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
- cpi->recent_ref_frame_usage[LAST_FRAME] +
- cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
- cpi->recent_ref_frame_usage[ALTREF_FRAME];
-
- int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
-
- if (tot_mbs)
- gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
-
- if (pct_gf_active > gf_frame_useage)
- gf_frame_useage = pct_gf_active;
-
- /* Is a fixed manual GF frequency being used */
- if (cpi->auto_gold)
- {
- /* For one pass throw a GF if recent frame intra useage is
- * low or the GF useage is high
- */
- if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
- cpi->common.refresh_golden_frame = 1;
-
- /* Two pass GF descision */
- else if (cpi->pass == 2)
- cpi->common.refresh_golden_frame = 1;
- }
-
-#if 0
-
- /* Debug stats */
- if (0)
- {
- FILE *f;
-
- f = fopen("gf_useaget.stt", "a");
- fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
- cpi->common.current_video_frame, cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
- fclose(f);
- }
-
-#endif
-
- if (cpi->common.refresh_golden_frame == 1)
- {
-#if 0
-
- if (0)
- {
- FILE *f;
-
- f = fopen("GFexit.stt", "a");
- fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
- fclose(f);
- }
-
-#endif
-
- if (cpi->auto_adjust_gold_quantizer)
- {
- calc_gf_params(cpi);
- }
-
- /* If we are using alternate ref instead of gf then do not apply the
- * boost It will instead be applied to the altref update Jims
- * modified boost
- */
- if (!cpi->source_alt_ref_active)
- {
- if (cpi->oxcf.fixed_q < 0)
- {
- if (cpi->pass == 2)
- {
- /* The spend on the GF is defined in the two pass
- * code for two pass encodes
- */
- cpi->this_frame_target = cpi->per_frame_bandwidth;
- }
- else
- {
- int Boost = cpi->last_boost;
- int frames_in_section = cpi->frames_till_gf_update_due + 1;
- int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
- int bits_in_section = cpi->inter_frame_target * frames_in_section;
-
- /* Normalize Altboost and allocations chunck down to
- * prevent overflow
- */
- while (Boost > 1000)
- {
- Boost /= 2;
- allocation_chunks /= 2;
- }
-
- /* Avoid loss of precision but avoid overflow */
- if ((bits_in_section >> 7) > allocation_chunks)
- cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
- else
- cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
- }
- }
- else
- cpi->this_frame_target =
- (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0)
- * cpi->last_boost) / 100;
-
- }
- /* If there is an active ARF at this location use the minimum
- * bits on this frame even if it is a contructed arf.
- * The active maximum quantizer insures that an appropriate
- * number of bits will be spent if needed for contstructed ARFs.
- */
- else
- {
- cpi->this_frame_target = 0;
- }
-
- cpi->current_gf_interval = cpi->frames_till_gf_update_due;
-
- }
- }
-
- cpi->per_frame_bandwidth = old_per_frame_bandwidth;
-}
-
-
-void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
-{
- int Q = cpi->common.base_qindex;
- int correction_factor = 100;
- double rate_correction_factor;
- double adjustment_limit;
-
- int projected_size_based_on_q = 0;
-
- /* Clear down mmx registers to allow floating point in what follows */
- vp8_clear_system_state();
-
- if (cpi->common.frame_type == KEY_FRAME)
- {
- rate_correction_factor = cpi->key_frame_rate_correction_factor;
- }
- else
- {
- if (cpi->oxcf.number_of_layers == 1 &&
- (cpi->common.refresh_alt_ref_frame ||
- cpi->common.refresh_golden_frame))
- rate_correction_factor = cpi->gf_rate_correction_factor;
- else
- rate_correction_factor = cpi->rate_correction_factor;
- }
-
- /* Work out how big we would have expected the frame to be at this Q
- * given the current correction factor. Stay in double to avoid int
- * overflow when values are large
- */
- projected_size_based_on_q = (int)(((.5 + rate_correction_factor * vp8_bits_per_mb[cpi->common.frame_type][Q]) * cpi->common.MBs) / (1 << BPER_MB_NORMBITS));
-
- /* Make some allowance for cpi->zbin_over_quant */
- if (cpi->mb.zbin_over_quant > 0)
- {
- int Z = cpi->mb.zbin_over_quant;
- double Factor = 0.99;
- double factor_adjustment = 0.01 / 256.0;
-
- while (Z > 0)
- {
- Z --;
- projected_size_based_on_q =
- (int)(Factor * projected_size_based_on_q);
- Factor += factor_adjustment;
-
- if (Factor >= 0.999)
- Factor = 0.999;
- }
- }
-
- /* Work out a size correction factor. */
- if (projected_size_based_on_q > 0)
- correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
-
- /* More heavily damped adjustment used if we have been oscillating
- * either side of target
- */
- switch (damp_var)
- {
- case 0:
- adjustment_limit = 0.75;
- break;
- case 1:
- adjustment_limit = 0.375;
- break;
- case 2:
- default:
- adjustment_limit = 0.25;
- break;
- }
-
- if (correction_factor > 102)
- {
- /* We are not already at the worst allowable quality */
- correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
- rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
-
- /* Keep rate_correction_factor within limits */
- if (rate_correction_factor > MAX_BPB_FACTOR)
- rate_correction_factor = MAX_BPB_FACTOR;
- }
- else if (correction_factor < 99)
- {
- /* We are not already at the best allowable quality */
- correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
- rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
-
- /* Keep rate_correction_factor within limits */
- if (rate_correction_factor < MIN_BPB_FACTOR)
- rate_correction_factor = MIN_BPB_FACTOR;
- }
-
- if (cpi->common.frame_type == KEY_FRAME)
- cpi->key_frame_rate_correction_factor = rate_correction_factor;
- else
- {
- if (cpi->oxcf.number_of_layers == 1 &&
- (cpi->common.refresh_alt_ref_frame ||
- cpi->common.refresh_golden_frame))
- cpi->gf_rate_correction_factor = rate_correction_factor;
- else
- cpi->rate_correction_factor = rate_correction_factor;
- }
-}
-
-
-int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
-{
- int Q = cpi->active_worst_quality;
-
- if (cpi->force_maxqp == 1) {
- cpi->active_worst_quality = cpi->worst_quality;
- return cpi->worst_quality;
- }
-
- /* Reset Zbin OQ value */
- cpi->mb.zbin_over_quant = 0;
-
- if (cpi->oxcf.fixed_q >= 0)
- {
- Q = cpi->oxcf.fixed_q;
-
- if (cpi->common.frame_type == KEY_FRAME)
- {
- Q = cpi->oxcf.key_q;
- }
- else if (cpi->oxcf.number_of_layers == 1 &&
- cpi->common.refresh_alt_ref_frame)
- {
- Q = cpi->oxcf.alt_q;
- }
- else if (cpi->oxcf.number_of_layers == 1 &&
- cpi->common.refresh_golden_frame)
- {
- Q = cpi->oxcf.gold_q;
- }
- }
- else
- {
- int i;
- int last_error = INT_MAX;
- int target_bits_per_mb;
- int bits_per_mb_at_this_q;
- double correction_factor;
-
- /* Select the appropriate correction factor based upon type of frame. */
- if (cpi->common.frame_type == KEY_FRAME)
- correction_factor = cpi->key_frame_rate_correction_factor;
- else
- {
- if (cpi->oxcf.number_of_layers == 1 &&
- (cpi->common.refresh_alt_ref_frame ||
- cpi->common.refresh_golden_frame))
- correction_factor = cpi->gf_rate_correction_factor;
- else
- correction_factor = cpi->rate_correction_factor;
- }
-
- /* Calculate required scaling factor based on target frame size and
- * size of frame produced using previous Q
- */
- if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
- /* Case where we would overflow int */
- target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;
- else
- target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
-
- i = cpi->active_best_quality;
-
- do
- {
- bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
-
- if (bits_per_mb_at_this_q <= target_bits_per_mb)
- {
- if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
- Q = i;
- else
- Q = i - 1;
-
- break;
- }
- else
- last_error = bits_per_mb_at_this_q - target_bits_per_mb;
- }
- while (++i <= cpi->active_worst_quality);
-
-
- /* If we are at MAXQ then enable Q over-run which seeks to claw
- * back additional bits through things like the RD multiplier
- * and zero bin size.
- */
- if (Q >= MAXQ)
- {
- int zbin_oqmax;
-
- double Factor = 0.99;
- double factor_adjustment = 0.01 / 256.0;
-
- if (cpi->common.frame_type == KEY_FRAME)
- zbin_oqmax = 0;
- else if (cpi->oxcf.number_of_layers == 1 &&
- (cpi->common.refresh_alt_ref_frame ||
- (cpi->common.refresh_golden_frame &&
- !cpi->source_alt_ref_active)))
- zbin_oqmax = 16;
- else
- zbin_oqmax = ZBIN_OQ_MAX;
-
- /*{
- double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
- double Oq;
-
- Factor = Factor/1.2683;
-
- Oq = pow( Factor, (1.0/-0.165) );
-
- if ( Oq > zbin_oqmax )
- Oq = zbin_oqmax;
-
- cpi->zbin_over_quant = (int)Oq;
- }*/
-
- /* Each incrment in the zbin is assumed to have a fixed effect
- * on bitrate. This is not of course true. The effect will be
- * highly clip dependent and may well have sudden steps. The
- * idea here is to acheive higher effective quantizers than the
- * normal maximum by expanding the zero bin and hence
- * decreasing the number of low magnitude non zero coefficients.
- */
- while (cpi->mb.zbin_over_quant < zbin_oqmax)
- {
- cpi->mb.zbin_over_quant ++;
-
- if (cpi->mb.zbin_over_quant > zbin_oqmax)
- cpi->mb.zbin_over_quant = zbin_oqmax;
-
- /* Adjust bits_per_mb_at_this_q estimate */
- bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
- Factor += factor_adjustment;
-
- if (Factor >= 0.999)
- Factor = 0.999;
-
- /* Break out if we get down to the target rate */
- if (bits_per_mb_at_this_q <= target_bits_per_mb)
- break;
- }
-
- }
- }
-
- return Q;
-}
-
-
-static int estimate_keyframe_frequency(VP8_COMP *cpi)
-{
- int i;
-
- /* Average key frame frequency */
- int av_key_frame_frequency = 0;
-
- /* First key frame at start of sequence is a special case. We have no
- * frequency data.
- */
- if (cpi->key_frame_count == 1)
- {
- /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
- * whichever is smaller.
- */
- int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1;
- av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
-
- if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
- av_key_frame_frequency = key_freq;
-
- cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
- = av_key_frame_frequency;
- }
- else
- {
- unsigned int total_weight = 0;
- int last_kf_interval =
- (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
-
- /* reset keyframe context and calculate weighted average of last
- * KEY_FRAME_CONTEXT keyframes
- */
- for (i = 0; i < KEY_FRAME_CONTEXT; i++)
- {
- if (i < KEY_FRAME_CONTEXT - 1)
- cpi->prior_key_frame_distance[i]
- = cpi->prior_key_frame_distance[i+1];
- else
- cpi->prior_key_frame_distance[i] = last_kf_interval;
-
- av_key_frame_frequency += prior_key_frame_weight[i]
- * cpi->prior_key_frame_distance[i];
- total_weight += prior_key_frame_weight[i];
- }
-
- av_key_frame_frequency /= total_weight;
-
- }
- // TODO (marpan): Given the checks above, |av_key_frame_frequency|
- // should always be above 0. But for now we keep the sanity check in.
- if (av_key_frame_frequency == 0)
- av_key_frame_frequency = 1;
- return av_key_frame_frequency;
-}
-
-
-void vp8_adjust_key_frame_context(VP8_COMP *cpi)
-{
- /* Clear down mmx registers to allow floating point in what follows */
- vp8_clear_system_state();
-
- /* Do we have any key frame overspend to recover? */
- /* Two-pass overspend handled elsewhere. */
- if ((cpi->pass != 2)
- && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
- {
- int overspend;
-
- /* Update the count of key frame overspend to be recovered in
- * subsequent frames. A portion of the KF overspend is treated as gf
- * overspend (and hence recovered more quickly) as the kf is also a
- * gf. Otherwise the few frames following each kf tend to get more
- * bits allocated than those following other gfs.
- */
- overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
-
- if (cpi->oxcf.number_of_layers > 1)
- cpi->kf_overspend_bits += overspend;
- else
- {
- cpi->kf_overspend_bits += overspend * 7 / 8;
- cpi->gf_overspend_bits += overspend * 1 / 8;
- }
-
- /* Work out how much to try and recover per frame. */
- cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits
- / estimate_keyframe_frequency(cpi);
- }
-
- cpi->frames_since_key = 0;
- cpi->key_frame_count++;
-}
-
-
-void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
-{
- /* Set-up bounds on acceptable frame size: */
- if (cpi->oxcf.fixed_q >= 0)
- {
- /* Fixed Q scenario: frame size never outranges target
- * (there is no target!)
- */
- *frame_under_shoot_limit = 0;
- *frame_over_shoot_limit = INT_MAX;
- }
- else
- {
- if (cpi->common.frame_type == KEY_FRAME)
- {
- *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
- }
- else
- {
- if (cpi->oxcf.number_of_layers > 1 ||
- cpi->common.refresh_alt_ref_frame ||
- cpi->common.refresh_golden_frame)
- {
- *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
- }
- else
- {
- /* For CBR take buffer fullness into account */
- if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
- {
- if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
- {
- /* Buffer is too full so relax overshoot and tighten
- * undershoot
- */
- *frame_over_shoot_limit = cpi->this_frame_target * 12 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
- }
- else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
- {
- /* Buffer is too low so relax undershoot and tighten
- * overshoot
- */
- *frame_over_shoot_limit = cpi->this_frame_target * 10 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
- }
- else
- {
- *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
- }
- }
- /* VBR and CQ mode */
- /* Note that tighter restrictions here can help quality
- * but hurt encode speed
- */
- else
- {
- /* Stron overshoot limit for constrained quality */
- if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
- {
- *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
- }
- else
- {
- *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
- *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
- }
- }
- }
- }
-
- /* For very small rate targets where the fractional adjustment
- * (eg * 7/8) may be tiny make sure there is at least a minimum
- * range.
- */
- *frame_over_shoot_limit += 200;
- *frame_under_shoot_limit -= 200;
- if ( *frame_under_shoot_limit < 0 )
- *frame_under_shoot_limit = 0;
-
- }
-}
-
-
-/* return of 0 means drop frame */
-int vp8_pick_frame_size(VP8_COMP *cpi)
-{
- VP8_COMMON *cm = &cpi->common;
-
- if (cm->frame_type == KEY_FRAME)
- calc_iframe_target_size(cpi);
- else
- {
- calc_pframe_target_size(cpi);
-
- /* Check if we're dropping the frame: */
- if (cpi->drop_frame)
- {
- cpi->drop_frame = 0;
- return 0;
- }
- }
- return 1;
-}
-// If this just encoded frame (mcomp/transform/quant, but before loopfilter and
-// pack_bitstream) has large overshoot, and was not being encoded close to the
-// max QP, then drop this frame and force next frame to be encoded at max QP.
-// Condition this on 1 pass CBR with screen content mode and frame dropper off.
-// TODO(marpan): Should do this exit condition during the encode_frame
-// (i.e., halfway during the encoding of the frame) to save cycles.
-int vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) {
- if (cpi->pass == 0 &&
- cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
- cpi->drop_frames_allowed == 0 &&
- cpi->common.frame_type != KEY_FRAME) {
- // Note: the "projected_frame_size" from encode_frame() only gives estimate
- // of mode/motion vector rate (in non-rd mode): so below we only require
- // that projected_frame_size is somewhat greater than per-frame-bandwidth,
- // but add additional condition with high threshold on prediction residual.
-
- // QP threshold: only allow dropping if we are not close to qp_max.
- int thresh_qp = 3 * cpi->worst_quality >> 2;
- // Rate threshold, in bytes.
- int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3);
- // Threshold for the average (over all macroblocks) of the pixel-sum
- // residual error over 16x16 block. Should add QP dependence on threshold?
- int thresh_pred_err_mb = (256 << 4);
- int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs);
- if (Q < thresh_qp &&
- cpi->projected_frame_size > thresh_rate &&
- pred_err_mb > thresh_pred_err_mb) {
- // Drop this frame: advance frame counters, and set force_maxqp flag.
- cpi->common.current_video_frame++;
- cpi->frames_since_key++;
- // Flag to indicate we will force next frame to be encoded at max QP.
- cpi->force_maxqp = 1;
- return 1;
- } else {
- cpi->force_maxqp = 0;
- return 0;
- }
- cpi->force_maxqp = 0;
- return 0;
- }
- cpi->force_maxqp = 0;
- return 0;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.h
deleted file mode 100644
index 703de9ff550..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ratectrl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_RATECTRL_H_
-#define VP8_ENCODER_RATECTRL_H_
-
-#include "onyx_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void vp8_save_coding_context(VP8_COMP *cpi);
-extern void vp8_restore_coding_context(VP8_COMP *cpi);
-
-extern void vp8_setup_key_frame(VP8_COMP *cpi);
-extern void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var);
-extern int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame);
-extern void vp8_adjust_key_frame_context(VP8_COMP *cpi);
-extern void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit);
-
-/* return of 0 means drop frame */
-extern int vp8_pick_frame_size(VP8_COMP *cpi);
-
-extern int vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_RATECTRL_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c
deleted file mode 100644
index 17194f0d449..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c
+++ /dev/null
@@ -1,2644 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <stdio.h>
-#include <math.h>
-#include <limits.h>
-#include <assert.h>
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "./vpx_dsp_rtcd.h"
-#include "tokenize.h"
-#include "treewriter.h"
-#include "onyx_int.h"
-#include "modecosts.h"
-#include "encodeintra.h"
-#include "pickinter.h"
-#include "vp8/common/entropymode.h"
-#include "vp8/common/reconinter.h"
-#include "vp8/common/reconintra4x4.h"
-#include "vp8/common/findnearmv.h"
-#include "vp8/common/quant_common.h"
-#include "encodemb.h"
-#include "quantize.h"
-#include "vp8/common/variance.h"
-#include "mcomp.h"
-#include "rdopt.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/systemdependent.h"
-#if CONFIG_TEMPORAL_DENOISING
-#include "denoising.h"
-#endif
-extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x);
-
-#define MAXF(a,b) (((a) > (b)) ? (a) : (b))
-
-typedef struct rate_distortion_struct
-{
- int rate2;
- int rate_y;
- int rate_uv;
- int distortion2;
- int distortion_uv;
-} RATE_DISTORTION;
-
-typedef struct best_mode_struct
-{
- int yrd;
- int rd;
- int intra_rd;
- MB_MODE_INFO mbmode;
- union b_mode_info bmodes[16];
- PARTITION_INFO partition;
-} BEST_MODE;
-
-static const int auto_speed_thresh[17] =
-{
- 1000,
- 200,
- 150,
- 130,
- 150,
- 125,
- 120,
- 115,
- 115,
- 115,
- 115,
- 115,
- 115,
- 115,
- 115,
- 115,
- 105
-};
-
-const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES] =
-{
- ZEROMV,
- DC_PRED,
-
- NEARESTMV,
- NEARMV,
-
- ZEROMV,
- NEARESTMV,
-
- ZEROMV,
- NEARESTMV,
-
- NEARMV,
- NEARMV,
-
- V_PRED,
- H_PRED,
- TM_PRED,
-
- NEWMV,
- NEWMV,
- NEWMV,
-
- SPLITMV,
- SPLITMV,
- SPLITMV,
-
- B_PRED,
-};
-
-/* This table determines the search order in reference frame priority order,
- * which may not necessarily match INTRA,LAST,GOLDEN,ARF
- */
-const int vp8_ref_frame_order[MAX_MODES] =
-{
- 1,
- 0,
-
- 1,
- 1,
-
- 2,
- 2,
-
- 3,
- 3,
-
- 2,
- 3,
-
- 0,
- 0,
- 0,
-
- 1,
- 2,
- 3,
-
- 1,
- 2,
- 3,
-
- 0,
-};
-
-static void fill_token_costs(
- int c[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS],
- const vp8_prob p[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES]
-)
-{
- int i, j, k;
-
-
- for (i = 0; i < BLOCK_TYPES; i++)
- for (j = 0; j < COEF_BANDS; j++)
- for (k = 0; k < PREV_COEF_CONTEXTS; k++)
-
- /* check for pt=0 and band > 1 if block type 0
- * and 0 if blocktype 1
- */
- if (k == 0 && j > (i == 0))
- vp8_cost_tokens2(c[i][j][k], p [i][j][k], vp8_coef_tree, 2);
- else
- vp8_cost_tokens(c[i][j][k], p [i][j][k], vp8_coef_tree);
-}
-
-static const int rd_iifactor[32] =
-{
- 4, 4, 3, 2, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* values are now correlated to quantizer */
-static const int sad_per_bit16lut[QINDEX_RANGE] =
-{
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 10, 10,
- 10, 10, 10, 10, 10, 10, 11, 11,
- 11, 11, 11, 11, 12, 12, 12, 12,
- 12, 12, 13, 13, 13, 13, 14, 14
-};
-static const int sad_per_bit4lut[QINDEX_RANGE] =
-{
- 2, 2, 2, 2, 2, 2, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 5, 5,
- 5, 5, 5, 5, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 8, 8, 8,
- 8, 8, 9, 9, 9, 9, 9, 9,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 11, 11, 11, 11, 11, 11, 11, 11,
- 12, 12, 12, 12, 12, 12, 12, 12,
- 13, 13, 13, 13, 13, 13, 13, 14,
- 14, 14, 14, 14, 15, 15, 15, 15,
- 16, 16, 16, 16, 17, 17, 17, 18,
- 18, 18, 19, 19, 19, 20, 20, 20,
-};
-
-void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex)
-{
- cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex];
- cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
-}
-
-void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue)
-{
- int q;
- int i;
- double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
- double rdconst = 2.80;
-
- vp8_clear_system_state();
-
- /* Further tests required to see if optimum is different
- * for key frames, golden frames and arf frames.
- */
- cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
-
- /* Extend rate multiplier along side quantizer zbin increases */
- if (cpi->mb.zbin_over_quant > 0)
- {
- double oq_factor;
- double modq;
-
- /* Experimental code using the same basic equation as used for Q above
- * The units of cpi->mb.zbin_over_quant are 1/128 of Q bin size
- */
- oq_factor = 1.0 + ((double)0.0015625 * cpi->mb.zbin_over_quant);
- modq = (int)((double)capped_q * oq_factor);
- cpi->RDMULT = (int)(rdconst * (modq * modq));
- }
-
- if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME))
- {
- if (cpi->twopass.next_iiratio > 31)
- cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4;
- else
- cpi->RDMULT +=
- (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4;
- }
-
- cpi->mb.errorperbit = (cpi->RDMULT / 110);
- cpi->mb.errorperbit += (cpi->mb.errorperbit==0);
-
- vp8_set_speed_features(cpi);
-
- for (i = 0; i < MAX_MODES; i++)
- {
- x->mode_test_hit_counts[i] = 0;
- }
-
- q = (int)pow(Qvalue, 1.25);
-
- if (q < 8)
- q = 8;
-
- if (cpi->RDMULT > 1000)
- {
- cpi->RDDIV = 1;
- cpi->RDMULT /= 100;
-
- for (i = 0; i < MAX_MODES; i++)
- {
- if (cpi->sf.thresh_mult[i] < INT_MAX)
- {
- x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100;
- }
- else
- {
- x->rd_threshes[i] = INT_MAX;
- }
-
- cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
- }
- }
- else
- {
- cpi->RDDIV = 100;
-
- for (i = 0; i < MAX_MODES; i++)
- {
- if (cpi->sf.thresh_mult[i] < (INT_MAX / q))
- {
- x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q;
- }
- else
- {
- x->rd_threshes[i] = INT_MAX;
- }
-
- cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
- }
- }
-
- {
- /* build token cost array for the type of frame we have now */
- FRAME_CONTEXT *l = &cpi->lfc_n;
-
- if(cpi->common.refresh_alt_ref_frame)
- l = &cpi->lfc_a;
- else if(cpi->common.refresh_golden_frame)
- l = &cpi->lfc_g;
-
- fill_token_costs(
- cpi->mb.token_costs,
- (const vp8_prob( *)[8][3][11]) l->coef_probs
- );
- /*
- fill_token_costs(
- cpi->mb.token_costs,
- (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs);
- */
-
-
- /* TODO make these mode costs depend on last,alt or gold too. (jbb) */
- vp8_init_mode_costs(cpi);
- }
-
-}
-
-void vp8_auto_select_speed(VP8_COMP *cpi)
-{
- int milliseconds_for_compress = (int)(1000000 / cpi->framerate);
-
- milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16;
-
-#if 0
-
- if (0)
- {
- FILE *f;
-
- f = fopen("speed.stt", "a");
- fprintf(f, " %8ld %10ld %10ld %10ld\n",
- cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time);
- fclose(f);
- }
-
-#endif
-
- if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_time - cpi->avg_pick_mode_time) < milliseconds_for_compress)
- {
- if (cpi->avg_pick_mode_time == 0)
- {
- cpi->Speed = 4;
- }
- else
- {
- if (milliseconds_for_compress * 100 < cpi->avg_encode_time * 95)
- {
- cpi->Speed += 2;
- cpi->avg_pick_mode_time = 0;
- cpi->avg_encode_time = 0;
-
- if (cpi->Speed > 16)
- {
- cpi->Speed = 16;
- }
- }
-
- if (milliseconds_for_compress * 100 > cpi->avg_encode_time * auto_speed_thresh[cpi->Speed])
- {
- cpi->Speed -= 1;
- cpi->avg_pick_mode_time = 0;
- cpi->avg_encode_time = 0;
-
- /* In real-time mode, cpi->speed is in [4, 16]. */
- if (cpi->Speed < 4)
- {
- cpi->Speed = 4;
- }
- }
- }
- }
- else
- {
- cpi->Speed += 4;
-
- if (cpi->Speed > 16)
- cpi->Speed = 16;
-
-
- cpi->avg_pick_mode_time = 0;
- cpi->avg_encode_time = 0;
- }
-}
-
-int vp8_block_error_c(short *coeff, short *dqcoeff)
-{
- int i;
- int error = 0;
-
- for (i = 0; i < 16; i++)
- {
- int this_diff = coeff[i] - dqcoeff[i];
- error += this_diff * this_diff;
- }
-
- return error;
-}
-
-int vp8_mbblock_error_c(MACROBLOCK *mb, int dc)
-{
- BLOCK *be;
- BLOCKD *bd;
- int i, j;
- int berror, error = 0;
-
- for (i = 0; i < 16; i++)
- {
- be = &mb->block[i];
- bd = &mb->e_mbd.block[i];
-
- berror = 0;
-
- for (j = dc; j < 16; j++)
- {
- int this_diff = be->coeff[j] - bd->dqcoeff[j];
- berror += this_diff * this_diff;
- }
-
- error += berror;
- }
-
- return error;
-}
-
-int vp8_mbuverror_c(MACROBLOCK *mb)
-{
-
- BLOCK *be;
- BLOCKD *bd;
-
-
- int i;
- int error = 0;
-
- for (i = 16; i < 24; i++)
- {
- be = &mb->block[i];
- bd = &mb->e_mbd.block[i];
-
- error += vp8_block_error_c(be->coeff, bd->dqcoeff);
- }
-
- return error;
-}
-
-int VP8_UVSSE(MACROBLOCK *x)
-{
- unsigned char *uptr, *vptr;
- unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src);
- unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src);
- int uv_stride = x->block[16].src_stride;
-
- unsigned int sse1 = 0;
- unsigned int sse2 = 0;
- int mv_row = x->e_mbd.mode_info_context->mbmi.mv.as_mv.row;
- int mv_col = x->e_mbd.mode_info_context->mbmi.mv.as_mv.col;
- int offset;
- int pre_stride = x->e_mbd.pre.uv_stride;
-
- if (mv_row < 0)
- mv_row -= 1;
- else
- mv_row += 1;
-
- if (mv_col < 0)
- mv_col -= 1;
- else
- mv_col += 1;
-
- mv_row /= 2;
- mv_col /= 2;
-
- offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
- uptr = x->e_mbd.pre.u_buffer + offset;
- vptr = x->e_mbd.pre.v_buffer + offset;
-
- if ((mv_row | mv_col) & 7)
- {
- vp8_sub_pixel_variance8x8(uptr, pre_stride,
- mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2);
- vp8_sub_pixel_variance8x8(vptr, pre_stride,
- mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1);
- sse2 += sse1;
- }
- else
- {
- vpx_variance8x8(uptr, pre_stride,
- upred_ptr, uv_stride, &sse2);
- vpx_variance8x8(vptr, pre_stride,
- vpred_ptr, uv_stride, &sse1);
- sse2 += sse1;
- }
- return sse2;
-
-}
-
-static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
-{
- int c = !type; /* start at coef 0, unless Y with Y2 */
- int eob = (int)(*b->eob);
- int pt ; /* surrounding block/prev coef predictor */
- int cost = 0;
- short *qcoeff_ptr = b->qcoeff;
-
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- assert(eob <= 16);
- for (; c < eob; c++)
- {
- const int v = qcoeff_ptr[vp8_default_zig_zag1d[c]];
- const int t = vp8_dct_value_tokens_ptr[v].Token;
- cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [t];
- cost += vp8_dct_value_cost_ptr[v];
- pt = vp8_prev_token_class[t];
- }
-
- if (c < 16)
- cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [DCT_EOB_TOKEN];
-
- pt = (c != !type); /* is eob first coefficient; */
- *a = *l = pt;
-
- return cost;
-}
-
-static int vp8_rdcost_mby(MACROBLOCK *mb)
-{
- int cost = 0;
- int b;
- MACROBLOCKD *x = &mb->e_mbd;
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
-
- memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- for (b = 0; b < 16; b++)
- cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
-
- cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2,
- ta + vp8_block2above[24], tl + vp8_block2left[24]);
-
- return cost;
-}
-
-static void macro_block_yrd( MACROBLOCK *mb,
- int *Rate,
- int *Distortion)
-{
- int b;
- MACROBLOCKD *const x = &mb->e_mbd;
- BLOCK *const mb_y2 = mb->block + 24;
- BLOCKD *const x_y2 = x->block + 24;
- short *Y2DCPtr = mb_y2->src_diff;
- BLOCK *beptr;
- int d;
-
- vp8_subtract_mby( mb->src_diff, *(mb->block[0].base_src),
- mb->block[0].src_stride, mb->e_mbd.predictor, 16);
-
- /* Fdct and building the 2nd order block */
- for (beptr = mb->block; beptr < mb->block + 16; beptr += 2)
- {
- mb->short_fdct8x4(beptr->src_diff, beptr->coeff, 32);
- *Y2DCPtr++ = beptr->coeff[0];
- *Y2DCPtr++ = beptr->coeff[16];
- }
-
- /* 2nd order fdct */
- mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
-
- /* Quantization */
- for (b = 0; b < 16; b++)
- {
- mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]);
- }
-
- /* DC predication and Quantization of 2nd Order block */
- mb->quantize_b(mb_y2, x_y2);
-
- /* Distortion */
- d = vp8_mbblock_error(mb, 1) << 2;
- d += vp8_block_error(mb_y2->coeff, x_y2->dqcoeff);
-
- *Distortion = (d >> 4);
-
- /* rate */
- *Rate = vp8_rdcost_mby(mb);
-}
-
-static void copy_predictor(unsigned char *dst, const unsigned char *predictor)
-{
- const unsigned int *p = (const unsigned int *)predictor;
- unsigned int *d = (unsigned int *)dst;
- d[0] = p[0];
- d[4] = p[4];
- d[8] = p[8];
- d[12] = p[12];
-}
-static int rd_pick_intra4x4block(
- MACROBLOCK *x,
- BLOCK *be,
- BLOCKD *b,
- B_PREDICTION_MODE *best_mode,
- const int *bmode_costs,
- ENTROPY_CONTEXT *a,
- ENTROPY_CONTEXT *l,
-
- int *bestrate,
- int *bestratey,
- int *bestdistortion)
-{
- B_PREDICTION_MODE mode;
- int best_rd = INT_MAX;
- int rate = 0;
- int distortion;
-
- ENTROPY_CONTEXT ta = *a, tempa = *a;
- ENTROPY_CONTEXT tl = *l, templ = *l;
- /*
- * The predictor buffer is a 2d buffer with a stride of 16. Create
- * a temp buffer that meets the stride requirements, but we are only
- * interested in the left 4x4 block
- * */
- DECLARE_ALIGNED(16, unsigned char, best_predictor[16*4]);
- DECLARE_ALIGNED(16, short, best_dqcoeff[16]);
- int dst_stride = x->e_mbd.dst.y_stride;
- unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
-
- unsigned char *Above = dst - dst_stride;
- unsigned char *yleft = dst - 1;
- unsigned char top_left = Above[-1];
-
- for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++)
- {
- int this_rd;
- int ratey;
-
- rate = bmode_costs[mode];
-
- vp8_intra4x4_predict(Above, yleft, dst_stride, mode,
- b->predictor, 16, top_left);
- vp8_subtract_b(be, b, 16);
- x->short_fdct4x4(be->src_diff, be->coeff, 32);
- x->quantize_b(be, b);
-
- tempa = ta;
- templ = tl;
-
- ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ);
- rate += ratey;
- distortion = vp8_block_error(be->coeff, b->dqcoeff) >> 2;
-
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
- if (this_rd < best_rd)
- {
- *bestrate = rate;
- *bestratey = ratey;
- *bestdistortion = distortion;
- best_rd = this_rd;
- *best_mode = mode;
- *a = tempa;
- *l = templ;
- copy_predictor(best_predictor, b->predictor);
- memcpy(best_dqcoeff, b->dqcoeff, 32);
- }
- }
- b->bmi.as_mode = *best_mode;
-
- vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride);
-
- return best_rd;
-}
-
-static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate,
- int *rate_y, int *Distortion, int best_rd)
-{
- MACROBLOCKD *const xd = &mb->e_mbd;
- int i;
- int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
- int distortion = 0;
- int tot_rate_y = 0;
- int64_t total_rd = 0;
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
- const int *bmode_costs;
-
- memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
-
- bmode_costs = mb->inter_bmode_costs;
-
- for (i = 0; i < 16; i++)
- {
- MODE_INFO *const mic = xd->mode_info_context;
- const int mis = xd->mode_info_stride;
- B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
- int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_IS_SAFE(d);
-
- if (mb->e_mbd.frame_type == KEY_FRAME)
- {
- const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
- const B_PREDICTION_MODE L = left_block_mode(mic, i);
-
- bmode_costs = mb->bmode_costs[A][L];
- }
-
- total_rd += rd_pick_intra4x4block(
- mb, mb->block + i, xd->block + i, &best_mode, bmode_costs,
- ta + vp8_block2above[i],
- tl + vp8_block2left[i], &r, &ry, &d);
-
- cost += r;
- distortion += d;
- tot_rate_y += ry;
-
- mic->bmi[i].as_mode = best_mode;
-
- if(total_rd >= (int64_t)best_rd)
- break;
- }
-
- if(total_rd >= (int64_t)best_rd)
- return INT_MAX;
-
- *Rate = cost;
- *rate_y = tot_rate_y;
- *Distortion = distortion;
-
- return RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
-}
-
-
-static int rd_pick_intra16x16mby_mode(MACROBLOCK *x,
- int *Rate,
- int *rate_y,
- int *Distortion)
-{
- MB_PREDICTION_MODE mode;
- MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
- int rate, ratey;
- int distortion;
- int best_rd = INT_MAX;
- int this_rd;
- MACROBLOCKD *xd = &x->e_mbd;
-
- /* Y Search for 16x16 intra prediction mode */
- for (mode = DC_PRED; mode <= TM_PRED; mode++)
- {
- xd->mode_info_context->mbmi.mode = mode;
-
- vp8_build_intra_predictors_mby_s(xd,
- xd->dst.y_buffer - xd->dst.y_stride,
- xd->dst.y_buffer - 1,
- xd->dst.y_stride,
- xd->predictor,
- 16);
-
- macro_block_yrd(x, &ratey, &distortion);
- rate = ratey + x->mbmode_cost[xd->frame_type]
- [xd->mode_info_context->mbmi.mode];
-
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
- if (this_rd < best_rd)
- {
- mode_selected = mode;
- best_rd = this_rd;
- *Rate = rate;
- *rate_y = ratey;
- *Distortion = distortion;
- }
- }
-
- xd->mode_info_context->mbmi.mode = mode_selected;
- return best_rd;
-}
-
-static int rd_cost_mbuv(MACROBLOCK *mb)
-{
- int b;
- int cost = 0;
- MACROBLOCKD *x = &mb->e_mbd;
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
-
- memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
- for (b = 16; b < 24; b++)
- cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV,
- ta + vp8_block2above[b], tl + vp8_block2left[b]);
-
- return cost;
-}
-
-
-static int rd_inter16x16_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
- int *distortion, int fullpixel)
-{
- (void)cpi;
- (void)fullpixel;
-
- vp8_build_inter16x16_predictors_mbuv(&x->e_mbd);
- vp8_subtract_mbuv(x->src_diff,
- x->src.u_buffer, x->src.v_buffer, x->src.uv_stride,
- &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8);
-
- vp8_transform_mbuv(x);
- vp8_quantize_mbuv(x);
-
- *rate = rd_cost_mbuv(x);
- *distortion = vp8_mbuverror(x) / 4;
-
- return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
-}
-
-static int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
- int *distortion, int fullpixel)
-{
- (void)cpi;
- (void)fullpixel;
-
- vp8_build_inter4x4_predictors_mbuv(&x->e_mbd);
- vp8_subtract_mbuv(x->src_diff,
- x->src.u_buffer, x->src.v_buffer, x->src.uv_stride,
- &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8);
-
- vp8_transform_mbuv(x);
- vp8_quantize_mbuv(x);
-
- *rate = rd_cost_mbuv(x);
- *distortion = vp8_mbuverror(x) / 4;
-
- return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
-}
-
-static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate,
- int *rate_tokenonly, int *distortion)
-{
- MB_PREDICTION_MODE mode;
- MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
- int best_rd = INT_MAX;
- int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r);
- int rate_to;
- MACROBLOCKD *xd = &x->e_mbd;
-
- for (mode = DC_PRED; mode <= TM_PRED; mode++)
- {
- int this_rate;
- int this_distortion;
- int this_rd;
-
- xd->mode_info_context->mbmi.uv_mode = mode;
-
- vp8_build_intra_predictors_mbuv_s(xd,
- xd->dst.u_buffer - xd->dst.uv_stride,
- xd->dst.v_buffer - xd->dst.uv_stride,
- xd->dst.u_buffer - 1,
- xd->dst.v_buffer - 1,
- xd->dst.uv_stride,
- &xd->predictor[256], &xd->predictor[320],
- 8);
-
-
- vp8_subtract_mbuv(x->src_diff,
- x->src.u_buffer, x->src.v_buffer, x->src.uv_stride,
- &xd->predictor[256], &xd->predictor[320], 8);
- vp8_transform_mbuv(x);
- vp8_quantize_mbuv(x);
-
- rate_to = rd_cost_mbuv(x);
- this_rate = rate_to + x->intra_uv_mode_cost[xd->frame_type][xd->mode_info_context->mbmi.uv_mode];
-
- this_distortion = vp8_mbuverror(x) / 4;
-
- this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion);
-
- if (this_rd < best_rd)
- {
- best_rd = this_rd;
- d = this_distortion;
- r = this_rate;
- *rate_tokenonly = rate_to;
- mode_selected = mode;
- }
- }
-
- *rate = r;
- *distortion = d;
-
- xd->mode_info_context->mbmi.uv_mode = mode_selected;
-}
-
-int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4])
-{
- vp8_prob p [VP8_MVREFS-1];
- assert(NEARESTMV <= m && m <= SPLITMV);
- vp8_mv_ref_probs(p, near_mv_ref_ct);
- return vp8_cost_token(vp8_mv_ref_tree, p,
- vp8_mv_ref_encoding_array + (m - NEARESTMV));
-}
-
-void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv)
-{
- x->e_mbd.mode_info_context->mbmi.mode = mb;
- x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int;
-}
-
-static int labels2mode(
- MACROBLOCK *x,
- int const *labelings, int which_label,
- B_PREDICTION_MODE this_mode,
- int_mv *this_mv, int_mv *best_ref_mv,
- int *mvcost[2]
-)
-{
- MACROBLOCKD *const xd = & x->e_mbd;
- MODE_INFO *const mic = xd->mode_info_context;
- const int mis = xd->mode_info_stride;
-
- int cost = 0;
- int thismvcost = 0;
-
- /* We have to be careful retrieving previously-encoded motion vectors.
- Ones from this macroblock have to be pulled from the BLOCKD array
- as they have not yet made it to the bmi array in our MB_MODE_INFO. */
-
- int i = 0;
-
- do
- {
- BLOCKD *const d = xd->block + i;
- const int row = i >> 2, col = i & 3;
-
- B_PREDICTION_MODE m;
-
- if (labelings[i] != which_label)
- continue;
-
- if (col && labelings[i] == labelings[i-1])
- m = LEFT4X4;
- else if (row && labelings[i] == labelings[i-4])
- m = ABOVE4X4;
- else
- {
- /* the only time we should do costing for new motion vector
- * or mode is when we are on a new label (jbb May 08, 2007)
- */
- switch (m = this_mode)
- {
- case NEW4X4 :
- thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102);
- break;
- case LEFT4X4:
- this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
- break;
- case ABOVE4X4:
- this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis);
- break;
- case ZERO4X4:
- this_mv->as_int = 0;
- break;
- default:
- break;
- }
-
- if (m == ABOVE4X4) /* replace above with left if same */
- {
- int_mv left_mv;
-
- left_mv.as_int = col ? d[-1].bmi.mv.as_int :
- left_block_mv(mic, i);
-
- if (left_mv.as_int == this_mv->as_int)
- m = LEFT4X4;
- }
-
- cost = x->inter_bmode_costs[ m];
- }
-
- d->bmi.mv.as_int = this_mv->as_int;
-
- x->partition_info->bmi[i].mode = m;
- x->partition_info->bmi[i].mv.as_int = this_mv->as_int;
-
- }
- while (++i < 16);
-
- cost += thismvcost ;
- return cost;
-}
-
-static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
- int which_label, ENTROPY_CONTEXT *ta,
- ENTROPY_CONTEXT *tl)
-{
- int cost = 0;
- int b;
- MACROBLOCKD *x = &mb->e_mbd;
-
- for (b = 0; b < 16; b++)
- if (labels[ b] == which_label)
- cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC,
- ta + vp8_block2above[b],
- tl + vp8_block2left[b]);
-
- return cost;
-
-}
-static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x, int const *labels, int which_label)
-{
- int i;
- unsigned int distortion = 0;
- int pre_stride = x->e_mbd.pre.y_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
-
-
- for (i = 0; i < 16; i++)
- {
- if (labels[i] == which_label)
- {
- BLOCKD *bd = &x->e_mbd.block[i];
- BLOCK *be = &x->block[i];
-
- vp8_build_inter_predictors_b(bd, 16, base_pre, pre_stride, x->e_mbd.subpixel_predict);
- vp8_subtract_b(be, bd, 16);
- x->short_fdct4x4(be->src_diff, be->coeff, 32);
- x->quantize_b(be, bd);
-
- distortion += vp8_block_error(be->coeff, bd->dqcoeff);
- }
- }
-
- return distortion;
-}
-
-
-static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0};
-
-
-typedef struct
-{
- int_mv *ref_mv;
- int_mv mvp;
-
- int segment_rd;
- int segment_num;
- int r;
- int d;
- int segment_yrate;
- B_PREDICTION_MODE modes[16];
- int_mv mvs[16];
- unsigned char eobs[16];
-
- int mvthresh;
- int *mdcounts;
-
- int_mv sv_mvp[4]; /* save 4 mvp from 8x8 */
- int sv_istep[2]; /* save 2 initial step_param for 16x8/8x16 */
-
-} BEST_SEG_INFO;
-
-
-static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
- BEST_SEG_INFO *bsi, unsigned int segmentation)
-{
- int i;
- int const *labels;
- int br = 0;
- int bd = 0;
- B_PREDICTION_MODE this_mode;
-
-
- int label_count;
- int this_segment_rd = 0;
- int label_mv_thresh;
- int rate = 0;
- int sbr = 0;
- int sbd = 0;
- int segmentyrate = 0;
-
- vp8_variance_fn_ptr_t *v_fn_ptr;
-
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
- ENTROPY_CONTEXT_PLANES t_above_b, t_left_b;
- ENTROPY_CONTEXT *ta_b;
- ENTROPY_CONTEXT *tl_b;
-
- memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
- ta_b = (ENTROPY_CONTEXT *)&t_above_b;
- tl_b = (ENTROPY_CONTEXT *)&t_left_b;
-
- br = 0;
- bd = 0;
-
- v_fn_ptr = &cpi->fn_ptr[segmentation];
- labels = vp8_mbsplits[segmentation];
- label_count = vp8_mbsplit_count[segmentation];
-
- /* 64 makes this threshold really big effectively making it so that we
- * very rarely check mvs on segments. setting this to 1 would make mv
- * thresh roughly equal to what it is for macroblocks
- */
- label_mv_thresh = 1 * bsi->mvthresh / label_count ;
-
- /* Segmentation method overheads */
- rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + segmentation);
- rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts);
- this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
- br += rate;
-
- for (i = 0; i < label_count; i++)
- {
- int_mv mode_mv[B_MODE_COUNT];
- int best_label_rd = INT_MAX;
- B_PREDICTION_MODE mode_selected = ZERO4X4;
- int bestlabelyrate = 0;
-
- /* search for the best motion vector on this segment */
- for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++)
- {
- int this_rd;
- int distortion;
- int labelyrate;
- ENTROPY_CONTEXT_PLANES t_above_s, t_left_s;
- ENTROPY_CONTEXT *ta_s;
- ENTROPY_CONTEXT *tl_s;
-
- memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta_s = (ENTROPY_CONTEXT *)&t_above_s;
- tl_s = (ENTROPY_CONTEXT *)&t_left_s;
-
- if (this_mode == NEW4X4)
- {
- int sseshift;
- int num00;
- int step_param = 0;
- int further_steps;
- int n;
- int thissme;
- int bestsme = INT_MAX;
- int_mv temp_mv;
- BLOCK *c;
- BLOCKD *e;
-
- /* Is the best so far sufficiently good that we cant justify
- * doing a new motion search.
- */
- if (best_label_rd < label_mv_thresh)
- break;
-
- if(cpi->compressor_speed)
- {
- if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8)
- {
- bsi->mvp.as_int = bsi->sv_mvp[i].as_int;
- if (i==1 && segmentation == BLOCK_16X8)
- bsi->mvp.as_int = bsi->sv_mvp[2].as_int;
-
- step_param = bsi->sv_istep[i];
- }
-
- /* use previous block's result as next block's MV
- * predictor.
- */
- if (segmentation == BLOCK_4X4 && i>0)
- {
- bsi->mvp.as_int = x->e_mbd.block[i-1].bmi.mv.as_int;
- if (i==4 || i==8 || i==12)
- bsi->mvp.as_int = x->e_mbd.block[i-4].bmi.mv.as_int;
- step_param = 2;
- }
- }
-
- further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
-
- {
- int sadpb = x->sadperbit4;
- int_mv mvp_full;
-
- mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3;
- mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3;
-
- /* find first label */
- n = vp8_mbsplit_offset[segmentation][i];
-
- c = &x->block[n];
- e = &x->e_mbd.block[n];
-
- {
- bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full,
- &mode_mv[NEW4X4], step_param,
- sadpb, &num00, v_fn_ptr,
- x->mvcost, bsi->ref_mv);
-
- n = num00;
- num00 = 0;
-
- while (n < further_steps)
- {
- n++;
-
- if (num00)
- num00--;
- else
- {
- thissme = cpi->diamond_search_sad(x, c, e,
- &mvp_full, &temp_mv,
- step_param + n, sadpb,
- &num00, v_fn_ptr,
- x->mvcost, bsi->ref_mv);
-
- if (thissme < bestsme)
- {
- bestsme = thissme;
- mode_mv[NEW4X4].as_int = temp_mv.as_int;
- }
- }
- }
- }
-
- sseshift = segmentation_to_sseshift[segmentation];
-
- /* Should we do a full search (best quality only) */
- if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000)
- {
- /* Check if mvp_full is within the range. */
- vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
-
- thissme = cpi->full_search_sad(x, c, e, &mvp_full,
- sadpb, 16, v_fn_ptr,
- x->mvcost, bsi->ref_mv);
-
- if (thissme < bestsme)
- {
- bestsme = thissme;
- mode_mv[NEW4X4].as_int = e->bmi.mv.as_int;
- }
- else
- {
- /* The full search result is actually worse so
- * re-instate the previous best vector
- */
- e->bmi.mv.as_int = mode_mv[NEW4X4].as_int;
- }
- }
- }
-
- if (bestsme < INT_MAX)
- {
- int disto;
- unsigned int sse;
- cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4],
- bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost,
- &disto, &sse);
- }
- } /* NEW4X4 */
-
- rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode],
- bsi->ref_mv, x->mvcost);
-
- /* Trap vectors that reach beyond the UMV borders */
- if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
- ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max))
- {
- continue;
- }
-
- distortion = vp8_encode_inter_mb_segment(x, labels, i) / 4;
-
- labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s);
- rate += labelyrate;
-
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
- if (this_rd < best_label_rd)
- {
- sbr = rate;
- sbd = distortion;
- bestlabelyrate = labelyrate;
- mode_selected = this_mode;
- best_label_rd = this_rd;
-
- memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES));
-
- }
- } /*for each 4x4 mode*/
-
- memcpy(ta, ta_b, sizeof(ENTROPY_CONTEXT_PLANES));
- memcpy(tl, tl_b, sizeof(ENTROPY_CONTEXT_PLANES));
-
- labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected],
- bsi->ref_mv, x->mvcost);
-
- br += sbr;
- bd += sbd;
- segmentyrate += bestlabelyrate;
- this_segment_rd += best_label_rd;
-
- if (this_segment_rd >= bsi->segment_rd)
- break;
-
- } /* for each label */
-
- if (this_segment_rd < bsi->segment_rd)
- {
- bsi->r = br;
- bsi->d = bd;
- bsi->segment_yrate = segmentyrate;
- bsi->segment_rd = this_segment_rd;
- bsi->segment_num = segmentation;
-
- /* store everything needed to come back to this!! */
- for (i = 0; i < 16; i++)
- {
- bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv;
- bsi->modes[i] = x->partition_info->bmi[i].mode;
- bsi->eobs[i] = x->e_mbd.eobs[i];
- }
- }
-}
-
-static
-void vp8_cal_step_param(int sr, int *sp)
-{
- int step = 0;
-
- if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP;
- else if (sr < 1) sr = 1;
-
- while (sr>>=1)
- step++;
-
- *sp = MAX_MVSEARCH_STEPS - 1 - step;
-}
-
-static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
- int_mv *best_ref_mv, int best_rd,
- int *mdcounts, int *returntotrate,
- int *returnyrate, int *returndistortion,
- int mvthresh)
-{
- int i;
- BEST_SEG_INFO bsi;
-
- memset(&bsi, 0, sizeof(bsi));
-
- bsi.segment_rd = best_rd;
- bsi.ref_mv = best_ref_mv;
- bsi.mvp.as_int = best_ref_mv->as_int;
- bsi.mvthresh = mvthresh;
- bsi.mdcounts = mdcounts;
-
- for(i = 0; i < 16; i++)
- {
- bsi.modes[i] = ZERO4X4;
- }
-
- if(cpi->compressor_speed == 0)
- {
- /* for now, we will keep the original segmentation order
- when in best quality mode */
- rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
- rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
- rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
- rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
- }
- else
- {
- int sr;
-
- rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
-
- if (bsi.segment_rd < best_rd)
- {
- int col_min = ((best_ref_mv->as_mv.col+7)>>3) - MAX_FULL_PEL_VAL;
- int row_min = ((best_ref_mv->as_mv.row+7)>>3) - MAX_FULL_PEL_VAL;
- int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL;
- int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL;
-
- int tmp_col_min = x->mv_col_min;
- int tmp_col_max = x->mv_col_max;
- int tmp_row_min = x->mv_row_min;
- int tmp_row_max = x->mv_row_max;
-
- /* Get intersection of UMV window and valid MV window to reduce # of checks in diamond search. */
- if (x->mv_col_min < col_min )
- x->mv_col_min = col_min;
- if (x->mv_col_max > col_max )
- x->mv_col_max = col_max;
- if (x->mv_row_min < row_min )
- x->mv_row_min = row_min;
- if (x->mv_row_max > row_max )
- x->mv_row_max = row_max;
-
- /* Get 8x8 result */
- bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int;
- bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int;
- bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int;
- bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int;
-
- /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range according to the closeness of 2 MV. */
- /* block 8X16 */
- {
- sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col))>>3);
- vp8_cal_step_param(sr, &bsi.sv_istep[0]);
-
- sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3);
- vp8_cal_step_param(sr, &bsi.sv_istep[1]);
-
- rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
- }
-
- /* block 16X8 */
- {
- sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col))>>3);
- vp8_cal_step_param(sr, &bsi.sv_istep[0]);
-
- sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3);
- vp8_cal_step_param(sr, &bsi.sv_istep[1]);
-
- rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
- }
-
- /* If 8x8 is better than 16x8/8x16, then do 4x4 search */
- /* Not skip 4x4 if speed=0 (good quality) */
- if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8) /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
- {
- bsi.mvp.as_int = bsi.sv_mvp[0].as_int;
- rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
- }
-
- /* restore UMV window */
- x->mv_col_min = tmp_col_min;
- x->mv_col_max = tmp_col_max;
- x->mv_row_min = tmp_row_min;
- x->mv_row_max = tmp_row_max;
- }
- }
-
- /* set it to the best */
- for (i = 0; i < 16; i++)
- {
- BLOCKD *bd = &x->e_mbd.block[i];
-
- bd->bmi.mv.as_int = bsi.mvs[i].as_int;
- *bd->eob = bsi.eobs[i];
- }
-
- *returntotrate = bsi.r;
- *returndistortion = bsi.d;
- *returnyrate = bsi.segment_yrate;
-
- /* save partitions */
- x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num;
- x->partition_info->count = vp8_mbsplit_count[bsi.segment_num];
-
- for (i = 0; i < x->partition_info->count; i++)
- {
- int j;
-
- j = vp8_mbsplit_offset[bsi.segment_num][i];
-
- x->partition_info->bmi[i].mode = bsi.modes[j];
- x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv;
- }
- /*
- * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int
- */
- x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int;
-
- return bsi.segment_rd;
-}
-
-/* The improved MV prediction */
-void vp8_mv_pred
-(
- VP8_COMP *cpi,
- MACROBLOCKD *xd,
- const MODE_INFO *here,
- int_mv *mvp,
- int refframe,
- int *ref_frame_sign_bias,
- int *sr,
- int near_sadidx[]
-)
-{
- const MODE_INFO *above = here - xd->mode_info_stride;
- const MODE_INFO *left = here - 1;
- const MODE_INFO *aboveleft = above - 1;
- int_mv near_mvs[8];
- int near_ref[8];
- int_mv mv;
- int vcnt=0;
- int find=0;
- int mb_offset;
-
- int mvx[8];
- int mvy[8];
- int i;
-
- mv.as_int = 0;
-
- if(here->mbmi.ref_frame != INTRA_FRAME)
- {
- near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int = near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int = near_mvs[6].as_int = near_mvs[7].as_int = 0;
- near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] = near_ref[5] = near_ref[6] = near_ref[7] = 0;
-
- /* read in 3 nearby block's MVs from current frame as prediction
- * candidates.
- */
- if (above->mbmi.ref_frame != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = above->mbmi.mv.as_int;
- mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = above->mbmi.ref_frame;
- }
- vcnt++;
- if (left->mbmi.ref_frame != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = left->mbmi.mv.as_int;
- mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = left->mbmi.ref_frame;
- }
- vcnt++;
- if (aboveleft->mbmi.ref_frame != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int;
- mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = aboveleft->mbmi.ref_frame;
- }
- vcnt++;
-
- /* read in 5 nearby block's MVs from last frame. */
- if(cpi->common.last_frame_type != KEY_FRAME)
- {
- mb_offset = (-xd->mb_to_top_edge/128 + 1) * (xd->mode_info_stride +1) + (-xd->mb_to_left_edge/128 +1) ;
-
- /* current in last frame */
- if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int;
- mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = cpi->lf_ref_frame[mb_offset];
- }
- vcnt++;
-
- /* above in last frame */
- if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1] != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - xd->mode_info_stride-1].as_int;
- mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride-1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1];
- }
- vcnt++;
-
- /* left in last frame */
- if (cpi->lf_ref_frame[mb_offset-1] != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = cpi->lfmv[mb_offset -1].as_int;
- mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset -1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1];
- }
- vcnt++;
-
- /* right in last frame */
- if (cpi->lf_ref_frame[mb_offset +1] != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = cpi->lfmv[mb_offset +1].as_int;
- mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = cpi->lf_ref_frame[mb_offset +1];
- }
- vcnt++;
-
- /* below in last frame */
- if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1] != INTRA_FRAME)
- {
- near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + xd->mode_info_stride +1].as_int;
- mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
- near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1];
- }
- vcnt++;
- }
-
- for(i=0; i< vcnt; i++)
- {
- if(near_ref[near_sadidx[i]] != INTRA_FRAME)
- {
- if(here->mbmi.ref_frame == near_ref[near_sadidx[i]])
- {
- mv.as_int = near_mvs[near_sadidx[i]].as_int;
- find = 1;
- if (i < 3)
- *sr = 3;
- else
- *sr = 2;
- break;
- }
- }
- }
-
- if(!find)
- {
- for(i=0; i<vcnt; i++)
- {
- mvx[i] = near_mvs[i].as_mv.row;
- mvy[i] = near_mvs[i].as_mv.col;
- }
-
- insertsortmv(mvx, vcnt);
- insertsortmv(mvy, vcnt);
- mv.as_mv.row = mvx[vcnt/2];
- mv.as_mv.col = mvy[vcnt/2];
-
- /* sr is set to 0 to allow calling function to decide the search
- * range.
- */
- *sr = 0;
- }
- }
-
- /* Set up return values */
- mvp->as_int = mv.as_int;
- vp8_clamp_mv2(mvp, xd);
-}
-
-void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffset, int near_sadidx[])
-{
- /* near_sad indexes:
- * 0-cf above, 1-cf left, 2-cf aboveleft,
- * 3-lf current, 4-lf above, 5-lf left, 6-lf right, 7-lf below
- */
- int near_sad[8] = {0};
- BLOCK *b = &x->block[0];
- unsigned char *src_y_ptr = *(b->base_src);
-
- /* calculate sad for current frame 3 nearby MBs. */
- if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0)
- {
- near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX;
- }else if(xd->mb_to_top_edge==0)
- { /* only has left MB for sad calculation. */
- near_sad[0] = near_sad[2] = INT_MAX;
- near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride);
- }else if(xd->mb_to_left_edge ==0)
- { /* only has left MB for sad calculation. */
- near_sad[1] = near_sad[2] = INT_MAX;
- near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride);
- }else
- {
- near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride);
- near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride);
- near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride);
- }
-
- if(cpi->common.last_frame_type != KEY_FRAME)
- {
- /* calculate sad for last frame 5 nearby MBs. */
- unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset;
- int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride;
-
- if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX;
- if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX;
- if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX;
- if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX;
-
- if(near_sad[4] != INT_MAX)
- near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - pre_y_stride *16, pre_y_stride);
- if(near_sad[5] != INT_MAX)
- near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - 16, pre_y_stride);
- near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer, pre_y_stride);
- if(near_sad[6] != INT_MAX)
- near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + 16, pre_y_stride);
- if(near_sad[7] != INT_MAX)
- near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + pre_y_stride *16, pre_y_stride);
- }
-
- if(cpi->common.last_frame_type != KEY_FRAME)
- {
- insertsortsad(near_sad, near_sadidx, 8);
- }else
- {
- insertsortsad(near_sad, near_sadidx, 3);
- }
-}
-
-static void rd_update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv)
-{
- if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV)
- {
- int i;
-
- for (i = 0; i < x->partition_info->count; i++)
- {
- if (x->partition_info->bmi[i].mode == NEW4X4)
- {
- x->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row
- - best_ref_mv->as_mv.row) >> 1)]++;
- x->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col
- - best_ref_mv->as_mv.col) >> 1)]++;
- }
- }
- }
- else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
- {
- x->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row
- - best_ref_mv->as_mv.row) >> 1)]++;
- x->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col
- - best_ref_mv->as_mv.col) >> 1)]++;
- }
-}
-
-static int evaluate_inter_mode_rd(int mdcounts[4],
- RATE_DISTORTION* rd,
- int* disable_skip,
- VP8_COMP *cpi, MACROBLOCK *x)
-{
- MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
- BLOCK *b = &x->block[0];
- MACROBLOCKD *xd = &x->e_mbd;
- int distortion;
- vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.predictor, 16);
-
- if (cpi->active_map_enabled && x->active_ptr[0] == 0) {
- x->skip = 1;
- }
- else if (x->encode_breakout)
- {
- unsigned int sse;
- unsigned int var;
- unsigned int threshold = (xd->block[0].dequant[1]
- * xd->block[0].dequant[1] >>4);
-
- if(threshold < x->encode_breakout)
- threshold = x->encode_breakout;
-
- var = vpx_variance16x16
- (*(b->base_src), b->src_stride,
- x->e_mbd.predictor, 16, &sse);
-
- if (sse < threshold)
- {
- unsigned int q2dc = xd->block[24].dequant[0];
- /* If theres is no codeable 2nd order dc
- or a very small uniform pixel change change */
- if ((sse - var < q2dc * q2dc >>4) ||
- (sse /2 > var && sse-var < 64))
- {
- /* Check u and v to make sure skip is ok */
- unsigned int sse2 = VP8_UVSSE(x);
- if (sse2 * 2 < threshold)
- {
- x->skip = 1;
- rd->distortion2 = sse + sse2;
- rd->rate2 = 500;
-
- /* for best_yrd calculation */
- rd->rate_uv = 0;
- rd->distortion_uv = sse2;
-
- *disable_skip = 1;
- return RDCOST(x->rdmult, x->rddiv, rd->rate2,
- rd->distortion2);
- }
- }
- }
- }
-
-
- /* Add in the Mv/mode cost */
- rd->rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
-
- /* Y cost and distortion */
- macro_block_yrd(x, &rd->rate_y, &distortion);
- rd->rate2 += rd->rate_y;
- rd->distortion2 += distortion;
-
- /* UV cost and distortion */
- rd_inter16x16_uv(cpi, x, &rd->rate_uv, &rd->distortion_uv,
- cpi->common.full_pixel);
- rd->rate2 += rd->rate_uv;
- rd->distortion2 += rd->distortion_uv;
- return INT_MAX;
-}
-
-static int calculate_final_rd_costs(int this_rd,
- RATE_DISTORTION* rd,
- int* other_cost,
- int disable_skip,
- int uv_intra_tteob,
- int intra_rd_penalty,
- VP8_COMP *cpi, MACROBLOCK *x)
-{
- MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
-
- /* Where skip is allowable add in the default per mb cost for the no
- * skip case. where we then decide to skip we have to delete this and
- * replace it with the cost of signalling a skip
- */
- if (cpi->common.mb_no_coeff_skip)
- {
- *other_cost += vp8_cost_bit(cpi->prob_skip_false, 0);
- rd->rate2 += *other_cost;
- }
-
- /* Estimate the reference frame signaling cost and add it
- * to the rolling cost variable.
- */
- rd->rate2 +=
- x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
-
- if (!disable_skip)
- {
- /* Test for the condition where skip block will be activated
- * because there are no non zero coefficients and make any
- * necessary adjustment for rate
- */
- if (cpi->common.mb_no_coeff_skip)
- {
- int i;
- int tteob;
- int has_y2_block = (this_mode!=SPLITMV && this_mode!=B_PRED);
-
- tteob = 0;
- if(has_y2_block)
- tteob += x->e_mbd.eobs[24];
-
- for (i = 0; i < 16; i++)
- tteob += (x->e_mbd.eobs[i] > has_y2_block);
-
- if (x->e_mbd.mode_info_context->mbmi.ref_frame)
- {
- for (i = 16; i < 24; i++)
- tteob += x->e_mbd.eobs[i];
- }
- else
- tteob += uv_intra_tteob;
-
- if (tteob == 0)
- {
- rd->rate2 -= (rd->rate_y + rd->rate_uv);
- /* for best_yrd calculation */
- rd->rate_uv = 0;
-
- /* Back out no skip flag costing and add in skip flag costing */
- if (cpi->prob_skip_false)
- {
- int prob_skip_cost;
-
- prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1);
- prob_skip_cost -= vp8_cost_bit(cpi->prob_skip_false, 0);
- rd->rate2 += prob_skip_cost;
- *other_cost += prob_skip_cost;
- }
- }
- }
- /* Calculate the final RD estimate for this mode */
- this_rd = RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2);
- if (this_rd < INT_MAX && x->e_mbd.mode_info_context->mbmi.ref_frame
- == INTRA_FRAME)
- this_rd += intra_rd_penalty;
- }
- return this_rd;
-}
-
-static void update_best_mode(BEST_MODE* best_mode, int this_rd,
- RATE_DISTORTION* rd, int other_cost, MACROBLOCK *x)
-{
- MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
-
- other_cost +=
- x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
-
- /* Calculate the final y RD estimate for this mode */
- best_mode->yrd = RDCOST(x->rdmult, x->rddiv, (rd->rate2-rd->rate_uv-other_cost),
- (rd->distortion2-rd->distortion_uv));
-
- best_mode->rd = this_rd;
- memcpy(&best_mode->mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(MB_MODE_INFO));
- memcpy(&best_mode->partition, x->partition_info, sizeof(PARTITION_INFO));
-
- if ((this_mode == B_PRED) || (this_mode == SPLITMV))
- {
- int i;
- for (i = 0; i < 16; i++)
- {
- best_mode->bmodes[i] = x->e_mbd.block[i].bmi;
- }
- }
-}
-
-void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
- int recon_uvoffset, int *returnrate,
- int *returndistortion, int *returnintra,
- int mb_row, int mb_col)
-{
- BLOCK *b = &x->block[0];
- BLOCKD *d = &x->e_mbd.block[0];
- MACROBLOCKD *xd = &x->e_mbd;
- int_mv best_ref_mv_sb[2];
- int_mv mode_mv_sb[2][MB_MODE_COUNT];
- int_mv best_ref_mv;
- int_mv *mode_mv;
- MB_PREDICTION_MODE this_mode;
- int num00;
- int best_mode_index = 0;
- BEST_MODE best_mode;
-
- int i;
- int mode_index;
- int mdcounts[4];
- int rate;
- RATE_DISTORTION rd;
- int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
- int uv_intra_tteob = 0;
- int uv_intra_done = 0;
-
- MB_PREDICTION_MODE uv_intra_mode = 0;
- int_mv mvp;
- int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7};
- int saddone=0;
- /* search range got from mv_pred(). It uses step_param levels. (0-7) */
- int sr=0;
-
- unsigned char *plane[4][3];
- int ref_frame_map[4];
- int sign_bias = 0;
-
- int intra_rd_penalty = 10* vp8_dc_quant(cpi->common.base_qindex,
- cpi->common.y1dc_delta_q);
-
-#if CONFIG_TEMPORAL_DENOISING
- unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX,
- best_rd_sse = UINT_MAX;
-#endif
-
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = 0;
- best_mode.rd = INT_MAX;
- best_mode.yrd = INT_MAX;
- best_mode.intra_rd = INT_MAX;
- memset(mode_mv_sb, 0, sizeof(mode_mv_sb));
- memset(&best_mode.mbmode, 0, sizeof(best_mode.mbmode));
- memset(&best_mode.bmodes, 0, sizeof(best_mode.bmodes));
-
- /* Setup search priorities */
- get_reference_search_order(cpi, ref_frame_map);
-
- /* Check to see if there is at least 1 valid reference frame that we need
- * to calculate near_mvs.
- */
- if (ref_frame_map[1] > 0)
- {
- sign_bias = vp8_find_near_mvs_bias(&x->e_mbd,
- x->e_mbd.mode_info_context,
- mode_mv_sb,
- best_ref_mv_sb,
- mdcounts,
- ref_frame_map[1],
- cpi->common.ref_frame_sign_bias);
-
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
- }
-
- get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
-
- *returnintra = INT_MAX;
- /* Count of the number of MBs tested so far this frame */
- x->mbs_tested_so_far++;
-
- x->skip = 0;
-
- for (mode_index = 0; mode_index < MAX_MODES; mode_index++)
- {
- int this_rd = INT_MAX;
- int disable_skip = 0;
- int other_cost = 0;
- int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
-
- /* Test best rd so far against threshold for trying this mode. */
- if (best_mode.rd <= x->rd_threshes[mode_index])
- continue;
-
- if (this_ref_frame < 0)
- continue;
-
- /* These variables hold are rolling total cost and distortion for
- * this mode
- */
- rd.rate2 = 0;
- rd.distortion2 = 0;
-
- this_mode = vp8_mode_order[mode_index];
-
- x->e_mbd.mode_info_context->mbmi.mode = this_mode;
- x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
-
- /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
- * unless ARNR filtering is enabled in which case we want
- * an unfiltered alternative
- */
- if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
- {
- if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
- continue;
- }
-
- /* everything but intra */
- if (x->e_mbd.mode_info_context->mbmi.ref_frame)
- {
- x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
- x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
- x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
-
- if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame])
- {
- sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame];
- mode_mv = mode_mv_sb[sign_bias];
- best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
- }
- }
-
- /* Check to see if the testing frequency for this mode is at its
- * max If so then prevent it from being tested and increase the
- * threshold for its testing
- */
- if (x->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_index] > 1))
- {
- if (x->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * x->mode_test_hit_counts[mode_index])
- {
- /* Increase the threshold for coding this mode to make it
- * less likely to be chosen
- */
- x->rd_thresh_mult[mode_index] += 4;
-
- if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
- x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
-
- x->rd_threshes[mode_index] =
- (cpi->rd_baseline_thresh[mode_index] >> 7) *
- x->rd_thresh_mult[mode_index];
-
- continue;
- }
- }
-
- /* We have now reached the point where we are going to test the
- * current mode so increment the counter for the number of times
- * it has been tested
- */
- x->mode_test_hit_counts[mode_index] ++;
-
- /* Experimental code. Special case for gf and arf zeromv modes.
- * Increase zbin size to supress noise
- */
- if (x->zbin_mode_boost_enabled)
- {
- if ( this_ref_frame == INTRA_FRAME )
- x->zbin_mode_boost = 0;
- else
- {
- if (vp8_mode_order[mode_index] == ZEROMV)
- {
- if (this_ref_frame != LAST_FRAME)
- x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
- else
- x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
- }
- else if (vp8_mode_order[mode_index] == SPLITMV)
- x->zbin_mode_boost = 0;
- else
- x->zbin_mode_boost = MV_ZBIN_BOOST;
- }
-
- vp8_update_zbin_extra(cpi, x);
- }
-
- if(!uv_intra_done && this_ref_frame == INTRA_FRAME)
- {
- rd_pick_intra_mbuv_mode(x, &uv_intra_rate,
- &uv_intra_rate_tokenonly,
- &uv_intra_distortion);
- uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
-
- /*
- * Total of the eobs is used later to further adjust rate2. Since uv
- * block's intra eobs will be overwritten when we check inter modes,
- * we need to save uv_intra_tteob here.
- */
- for (i = 16; i < 24; i++)
- uv_intra_tteob += x->e_mbd.eobs[i];
-
- uv_intra_done = 1;
- }
-
- switch (this_mode)
- {
- case B_PRED:
- {
- int tmp_rd;
-
- /* Note the rate value returned here includes the cost of
- * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED]
- */
- int distortion;
- tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion, best_mode.yrd);
- rd.rate2 += rate;
- rd.distortion2 += distortion;
-
- if(tmp_rd < best_mode.yrd)
- {
- rd.rate2 += uv_intra_rate;
- rd.rate_uv = uv_intra_rate_tokenonly;
- rd.distortion2 += uv_intra_distortion;
- rd.distortion_uv = uv_intra_distortion;
- }
- else
- {
- this_rd = INT_MAX;
- disable_skip = 1;
- }
- }
- break;
-
- case SPLITMV:
- {
- int tmp_rd;
- int this_rd_thresh;
- int distortion;
-
- this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ?
- x->rd_threshes[THR_NEW1] : x->rd_threshes[THR_NEW3];
- this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ?
- x->rd_threshes[THR_NEW2] : this_rd_thresh;
-
- tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
- best_mode.yrd, mdcounts,
- &rate, &rd.rate_y, &distortion, this_rd_thresh) ;
-
- rd.rate2 += rate;
- rd.distortion2 += distortion;
-
- /* If even the 'Y' rd value of split is higher than best so far
- * then dont bother looking at UV
- */
- if (tmp_rd < best_mode.yrd)
- {
- /* Now work out UV cost and add it in */
- rd_inter4x4_uv(cpi, x, &rd.rate_uv, &rd.distortion_uv, cpi->common.full_pixel);
- rd.rate2 += rd.rate_uv;
- rd.distortion2 += rd.distortion_uv;
- }
- else
- {
- this_rd = INT_MAX;
- disable_skip = 1;
- }
- }
- break;
- case DC_PRED:
- case V_PRED:
- case H_PRED:
- case TM_PRED:
- {
- int distortion;
- x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
-
- vp8_build_intra_predictors_mby_s(xd,
- xd->dst.y_buffer - xd->dst.y_stride,
- xd->dst.y_buffer - 1,
- xd->dst.y_stride,
- xd->predictor,
- 16);
- macro_block_yrd(x, &rd.rate_y, &distortion) ;
- rd.rate2 += rd.rate_y;
- rd.distortion2 += distortion;
- rd.rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode];
- rd.rate2 += uv_intra_rate;
- rd.rate_uv = uv_intra_rate_tokenonly;
- rd.distortion2 += uv_intra_distortion;
- rd.distortion_uv = uv_intra_distortion;
- }
- break;
-
- case NEWMV:
- {
- int thissme;
- int bestsme = INT_MAX;
- int step_param = cpi->sf.first_step;
- int further_steps;
- int n;
- int do_refine=1; /* If last step (1-away) of n-step search doesn't pick the center point as the best match,
- we will do a final 1-away diamond refining search */
-
- int sadpb = x->sadperbit16;
- int_mv mvp_full;
-
- int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL;
- int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL;
- int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL;
- int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL;
-
- int tmp_col_min = x->mv_col_min;
- int tmp_col_max = x->mv_col_max;
- int tmp_row_min = x->mv_row_min;
- int tmp_row_max = x->mv_row_max;
-
- if(!saddone)
- {
- vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] );
- saddone = 1;
- }
-
- vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
- x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
-
- mvp_full.as_mv.col = mvp.as_mv.col>>3;
- mvp_full.as_mv.row = mvp.as_mv.row>>3;
-
- /* Get intersection of UMV window and valid MV window to
- * reduce # of checks in diamond search.
- */
- if (x->mv_col_min < col_min )
- x->mv_col_min = col_min;
- if (x->mv_col_max > col_max )
- x->mv_col_max = col_max;
- if (x->mv_row_min < row_min )
- x->mv_row_min = row_min;
- if (x->mv_row_max > row_max )
- x->mv_row_max = row_max;
-
- /* adjust search range according to sr from mv prediction */
- if(sr > step_param)
- step_param = sr;
-
- /* Initial step/diamond search */
- {
- bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv,
- step_param, sadpb, &num00,
- &cpi->fn_ptr[BLOCK_16X16],
- x->mvcost, &best_ref_mv);
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
-
- /* Further step/diamond searches as necessary */
- further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
-
- n = num00;
- num00 = 0;
-
- /* If there won't be more n-step search, check to see if refining search is needed. */
- if (n > further_steps)
- do_refine = 0;
-
- while (n < further_steps)
- {
- n++;
-
- if (num00)
- num00--;
- else
- {
- thissme = cpi->diamond_search_sad(x, b, d, &mvp_full,
- &d->bmi.mv, step_param + n, sadpb, &num00,
- &cpi->fn_ptr[BLOCK_16X16], x->mvcost,
- &best_ref_mv);
-
- /* check to see if refining search is needed. */
- if (num00 > (further_steps-n))
- do_refine = 0;
-
- if (thissme < bestsme)
- {
- bestsme = thissme;
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
- }
- else
- {
- d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
- }
- }
- }
- }
-
- /* final 1-away diamond refining search */
- if (do_refine == 1)
- {
- int search_range;
-
- search_range = 8;
-
- thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb,
- search_range, &cpi->fn_ptr[BLOCK_16X16],
- x->mvcost, &best_ref_mv);
-
- if (thissme < bestsme)
- {
- bestsme = thissme;
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
- }
- else
- {
- d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
- }
- }
-
- x->mv_col_min = tmp_col_min;
- x->mv_col_max = tmp_col_max;
- x->mv_row_min = tmp_row_min;
- x->mv_row_max = tmp_row_max;
-
- if (bestsme < INT_MAX)
- {
- int dis; /* TODO: use dis in distortion calculation later. */
- unsigned int sse;
- cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv,
- x->errorperbit,
- &cpi->fn_ptr[BLOCK_16X16],
- x->mvcost, &dis, &sse);
- }
-
- mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
-
- /* Add the new motion vector cost to our rolling cost variable */
- rd.rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96);
- }
-
- case NEARESTMV:
- case NEARMV:
- /* Clip "next_nearest" so that it does not extend to far out
- * of image
- */
- vp8_clamp_mv2(&mode_mv[this_mode], xd);
-
- /* Do not bother proceeding if the vector (from newmv, nearest
- * or near) is 0,0 as this should then be coded using the zeromv
- * mode.
- */
- if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && (mode_mv[this_mode].as_int == 0))
- continue;
-
- case ZEROMV:
-
- /* Trap vectors that reach beyond the UMV borders
- * Note that ALL New MV, Nearest MV Near MV and Zero MV code
- * drops through to this point because of the lack of break
- * statements in the previous two cases.
- */
- if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
- ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max))
- continue;
-
- vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]);
- this_rd = evaluate_inter_mode_rd(mdcounts, &rd,
- &disable_skip, cpi, x);
- break;
-
- default:
- break;
- }
-
- this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost,
- disable_skip, uv_intra_tteob,
- intra_rd_penalty, cpi, x);
-
- /* Keep record of best intra distortion */
- if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) &&
- (this_rd < best_mode.intra_rd) )
- {
- best_mode.intra_rd = this_rd;
- *returnintra = rd.distortion2 ;
- }
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- unsigned int sse;
- vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&sse,
- mode_mv[this_mode]);
-
- if (sse < best_rd_sse)
- best_rd_sse = sse;
-
- /* Store for later use by denoiser. */
- if (this_mode == ZEROMV && sse < zero_mv_sse )
- {
- zero_mv_sse = sse;
- x->best_zeromv_reference_frame =
- x->e_mbd.mode_info_context->mbmi.ref_frame;
- }
-
- /* Store the best NEWMV in x for later use in the denoiser. */
- if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV &&
- sse < best_sse)
- {
- best_sse = sse;
- vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&best_sse,
- mode_mv[this_mode]);
- x->best_sse_inter_mode = NEWMV;
- x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv;
- x->need_to_clamp_best_mvs =
- x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs;
- x->best_reference_frame =
- x->e_mbd.mode_info_context->mbmi.ref_frame;
- }
- }
-#endif
-
- /* Did this mode help.. i.i is it the new best mode */
- if (this_rd < best_mode.rd || x->skip)
- {
- /* Note index of best mode so far */
- best_mode_index = mode_index;
- *returnrate = rd.rate2;
- *returndistortion = rd.distortion2;
- if (this_mode <= B_PRED)
- {
- x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode;
- /* required for left and above block mv */
- x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
- }
- update_best_mode(&best_mode, this_rd, &rd, other_cost, x);
-
-
- /* Testing this mode gave rise to an improvement in best error
- * score. Lower threshold a bit for next time
- */
- x->rd_thresh_mult[mode_index] =
- (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ?
- x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT;
- }
-
- /* If the mode did not help improve the best error case then raise
- * the threshold for testing that mode next time around.
- */
- else
- {
- x->rd_thresh_mult[mode_index] += 4;
-
- if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
- x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
- }
- x->rd_threshes[mode_index] =
- (cpi->rd_baseline_thresh[mode_index] >> 7) *
- x->rd_thresh_mult[mode_index];
-
- if (x->skip)
- break;
-
- }
-
- /* Reduce the activation RD thresholds for the best choice mode */
- if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2)))
- {
- int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 2);
-
- x->rd_thresh_mult[best_mode_index] =
- (x->rd_thresh_mult[best_mode_index] >=
- (MIN_THRESHMULT + best_adjustment)) ?
- x->rd_thresh_mult[best_mode_index] - best_adjustment :
- MIN_THRESHMULT;
- x->rd_threshes[best_mode_index] =
- (cpi->rd_baseline_thresh[best_mode_index] >> 7) *
- x->rd_thresh_mult[best_mode_index];
- }
-
-#if CONFIG_TEMPORAL_DENOISING
- if (cpi->oxcf.noise_sensitivity)
- {
- int block_index = mb_row * cpi->common.mb_cols + mb_col;
- if (x->best_sse_inter_mode == DC_PRED)
- {
- /* No best MV found. */
- x->best_sse_inter_mode = best_mode.mbmode.mode;
- x->best_sse_mv = best_mode.mbmode.mv;
- x->need_to_clamp_best_mvs = best_mode.mbmode.need_to_clamp_mvs;
- x->best_reference_frame = best_mode.mbmode.ref_frame;
- best_sse = best_rd_sse;
- }
- vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse,
- recon_yoffset, recon_uvoffset,
- &cpi->common.lf_info, mb_row, mb_col,
- block_index);
-
- /* Reevaluate ZEROMV after denoising. */
- if (best_mode.mbmode.ref_frame == INTRA_FRAME &&
- x->best_zeromv_reference_frame != INTRA_FRAME)
- {
- int this_rd = INT_MAX;
- int disable_skip = 0;
- int other_cost = 0;
- int this_ref_frame = x->best_zeromv_reference_frame;
- rd.rate2 = x->ref_frame_cost[this_ref_frame] +
- vp8_cost_mv_ref(ZEROMV, mdcounts);
- rd.distortion2 = 0;
-
- /* set up the proper prediction buffers for the frame */
- x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
- x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
- x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
- x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
-
- x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
-
- this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x);
- this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost,
- disable_skip, uv_intra_tteob,
- intra_rd_penalty, cpi, x);
- if (this_rd < best_mode.rd || x->skip)
- {
- *returnrate = rd.rate2;
- *returndistortion = rd.distortion2;
- update_best_mode(&best_mode, this_rd, &rd, other_cost, x);
- }
- }
-
- }
-#endif
-
- if (cpi->is_src_frame_alt_ref &&
- (best_mode.mbmode.mode != ZEROMV || best_mode.mbmode.ref_frame != ALTREF_FRAME))
- {
- x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
- x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME;
- x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.mb_skip_coeff =
- (cpi->common.mb_no_coeff_skip);
- x->e_mbd.mode_info_context->mbmi.partitioning = 0;
- return;
- }
-
-
- /* macroblock modes */
- memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mode.mbmode, sizeof(MB_MODE_INFO));
-
- if (best_mode.mbmode.mode == B_PRED)
- {
- for (i = 0; i < 16; i++)
- xd->mode_info_context->bmi[i].as_mode = best_mode.bmodes[i].as_mode;
- }
-
- if (best_mode.mbmode.mode == SPLITMV)
- {
- for (i = 0; i < 16; i++)
- xd->mode_info_context->bmi[i].mv.as_int = best_mode.bmodes[i].mv.as_int;
-
- memcpy(x->partition_info, &best_mode.partition, sizeof(PARTITION_INFO));
-
- x->e_mbd.mode_info_context->mbmi.mv.as_int =
- x->partition_info->bmi[15].mv.as_int;
- }
-
- if (sign_bias
- != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame])
- best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int;
-
- rd_update_mvcount(x, &best_ref_mv);
-}
-
-void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate_)
-{
- int error4x4, error16x16;
- int rate4x4, rate16x16 = 0, rateuv;
- int dist4x4, dist16x16, distuv;
- int rate;
- int rate4x4_tokenonly = 0;
- int rate16x16_tokenonly = 0;
- int rateuv_tokenonly = 0;
-
- x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
-
- rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv);
- rate = rateuv;
-
- error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly,
- &dist16x16);
-
- error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly,
- &dist4x4, error16x16);
-
- if (error4x4 < error16x16)
- {
- x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
- rate += rate4x4;
- }
- else
- {
- rate += rate16x16;
- }
-
- *rate_ = rate;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.h
deleted file mode 100644
index b4fcd10b61e..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_RDOPT_H_
-#define VP8_ENCODER_RDOPT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) )
-
-static void insertsortmv(int arr[], int len)
-{
- int i, j, k;
-
- for ( i = 1 ; i <= len-1 ; i++ )
- {
- for ( j = 0 ; j < i ; j++ )
- {
- if ( arr[j] > arr[i] )
- {
- int temp;
-
- temp = arr[i];
-
- for ( k = i; k >j; k--)
- arr[k] = arr[k - 1] ;
-
- arr[j] = temp ;
- }
- }
- }
-}
-
-static void insertsortsad(int arr[],int idx[], int len)
-{
- int i, j, k;
-
- for ( i = 1 ; i <= len-1 ; i++ )
- {
- for ( j = 0 ; j < i ; j++ )
- {
- if ( arr[j] > arr[i] )
- {
- int temp, tempi;
-
- temp = arr[i];
- tempi = idx[i];
-
- for ( k = i; k >j; k--)
- {
- arr[k] = arr[k - 1] ;
- idx[k] = idx[k - 1];
- }
-
- arr[j] = temp ;
- idx[j] = tempi;
- }
- }
- }
-}
-
-extern void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue);
-extern void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x,
- int recon_yoffset, int recon_uvoffset,
- int *returnrate, int *returndistortion,
- int *returnintra, int mb_row, int mb_col);
-extern void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate);
-
-
-static void get_plane_pointers(const YV12_BUFFER_CONFIG *fb,
- unsigned char *plane[3],
- unsigned int recon_yoffset,
- unsigned int recon_uvoffset)
-{
- plane[0] = fb->y_buffer + recon_yoffset;
- plane[1] = fb->u_buffer + recon_uvoffset;
- plane[2] = fb->v_buffer + recon_uvoffset;
-}
-
-
-static void get_predictor_pointers(const VP8_COMP *cpi,
- unsigned char *plane[4][3],
- unsigned int recon_yoffset,
- unsigned int recon_uvoffset)
-{
- if (cpi->ref_frame_flags & VP8_LAST_FRAME)
- get_plane_pointers(&cpi->common.yv12_fb[cpi->common.lst_fb_idx],
- plane[LAST_FRAME], recon_yoffset, recon_uvoffset);
-
- if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
- get_plane_pointers(&cpi->common.yv12_fb[cpi->common.gld_fb_idx],
- plane[GOLDEN_FRAME], recon_yoffset, recon_uvoffset);
-
- if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
- get_plane_pointers(&cpi->common.yv12_fb[cpi->common.alt_fb_idx],
- plane[ALTREF_FRAME], recon_yoffset, recon_uvoffset);
-}
-
-
-static void get_reference_search_order(const VP8_COMP *cpi,
- int ref_frame_map[4])
-{
- int i=0;
-
- ref_frame_map[i++] = INTRA_FRAME;
- if (cpi->ref_frame_flags & VP8_LAST_FRAME)
- ref_frame_map[i++] = LAST_FRAME;
- if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
- ref_frame_map[i++] = GOLDEN_FRAME;
- if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
- ref_frame_map[i++] = ALTREF_FRAME;
- for(; i<4; i++)
- ref_frame_map[i] = -1;
-}
-
-
-extern void vp8_mv_pred
-(
- VP8_COMP *cpi,
- MACROBLOCKD *xd,
- const MODE_INFO *here,
- int_mv *mvp,
- int refframe,
- int *ref_frame_sign_bias,
- int *sr,
- int near_sadidx[]
-);
-void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffset, int near_sadidx[]);
-int VP8_UVSSE(MACROBLOCK *x);
-int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]);
-void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_RDOPT_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.c
deleted file mode 100644
index fdd22fceb6e..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "segmentation.h"
-#include "vpx_mem/vpx_mem.h"
-
-void vp8_update_gf_useage_maps(VP8_COMP *cpi, VP8_COMMON *cm, MACROBLOCK *x)
-{
- int mb_row, mb_col;
-
- MODE_INFO *this_mb_mode_info = cm->mi;
-
- x->gf_active_ptr = (signed char *)cpi->gf_active_flags;
-
- if ((cm->frame_type == KEY_FRAME) || (cm->refresh_golden_frame))
- {
- /* Reset Gf useage monitors */
- memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
- cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
- }
- else
- {
- /* for each macroblock row in image */
- for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
- {
- /* for each macroblock col in image */
- for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
- {
-
- /* If using golden then set GF active flag if not already set.
- * If using last frame 0,0 mode then leave flag as it is
- * else if using non 0,0 motion or intra modes then clear
- * flag if it is currently set
- */
- if ((this_mb_mode_info->mbmi.ref_frame == GOLDEN_FRAME) || (this_mb_mode_info->mbmi.ref_frame == ALTREF_FRAME))
- {
- if (*(x->gf_active_ptr) == 0)
- {
- *(x->gf_active_ptr) = 1;
- cpi->gf_active_count ++;
- }
- }
- else if ((this_mb_mode_info->mbmi.mode != ZEROMV) && *(x->gf_active_ptr))
- {
- *(x->gf_active_ptr) = 0;
- cpi->gf_active_count--;
- }
-
- x->gf_active_ptr++; /* Step onto next entry */
- this_mb_mode_info++; /* skip to next mb */
-
- }
-
- /* this is to account for the border */
- this_mb_mode_info++;
- }
- }
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.h
deleted file mode 100644
index 6b5500594e6..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/segmentation.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef VP8_ENCODER_SEGMENTATION_H_
-#define VP8_ENCODER_SEGMENTATION_H_
-
-#include "string.h"
-#include "vp8/common/blockd.h"
-#include "onyx_int.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void vp8_update_gf_useage_maps(VP8_COMP *cpi, VP8_COMMON *cm, MACROBLOCK *x);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_SEGMENTATION_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ssim.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ssim.c
deleted file mode 100644
index e75160836dc..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/ssim.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "onyx_int.h"
-
-void vp8_ssim_parms_16x16_c
-(
- unsigned char *s,
- int sp,
- unsigned char *r,
- int rp,
- unsigned long *sum_s,
- unsigned long *sum_r,
- unsigned long *sum_sq_s,
- unsigned long *sum_sq_r,
- unsigned long *sum_sxr
-)
-{
- int i,j;
- for(i=0;i<16;i++,s+=sp,r+=rp)
- {
- for(j=0;j<16;j++)
- {
- *sum_s += s[j];
- *sum_r += r[j];
- *sum_sq_s += s[j] * s[j];
- *sum_sq_r += r[j] * r[j];
- *sum_sxr += s[j] * r[j];
- }
- }
-}
-void vp8_ssim_parms_8x8_c
-(
- unsigned char *s,
- int sp,
- unsigned char *r,
- int rp,
- unsigned long *sum_s,
- unsigned long *sum_r,
- unsigned long *sum_sq_s,
- unsigned long *sum_sq_r,
- unsigned long *sum_sxr
-)
-{
- int i,j;
- for(i=0;i<8;i++,s+=sp,r+=rp)
- {
- for(j=0;j<8;j++)
- {
- *sum_s += s[j];
- *sum_r += r[j];
- *sum_sq_s += s[j] * s[j];
- *sum_sq_r += r[j] * r[j];
- *sum_sxr += s[j] * r[j];
- }
- }
-}
-
-const static int64_t cc1 = 26634; // (64^2*(.01*255)^2
-const static int64_t cc2 = 239708; // (64^2*(.03*255)^2
-
-static double similarity
-(
- unsigned long sum_s,
- unsigned long sum_r,
- unsigned long sum_sq_s,
- unsigned long sum_sq_r,
- unsigned long sum_sxr,
- int count
-)
-{
- int64_t ssim_n, ssim_d;
- int64_t c1, c2;
-
- //scale the constants by number of pixels
- c1 = (cc1*count*count)>>12;
- c2 = (cc2*count*count)>>12;
-
- ssim_n = (2*sum_s*sum_r+ c1)*((int64_t) 2*count*sum_sxr-
- (int64_t) 2*sum_s*sum_r+c2);
-
- ssim_d = (sum_s*sum_s +sum_r*sum_r+c1)*
- ((int64_t)count*sum_sq_s-(int64_t)sum_s*sum_s +
- (int64_t)count*sum_sq_r-(int64_t) sum_r*sum_r +c2) ;
-
- return ssim_n * 1.0 / ssim_d;
-}
-
-static double ssim_16x16(unsigned char *s,int sp, unsigned char *r,int rp)
-{
- unsigned long sum_s=0,sum_r=0,sum_sq_s=0,sum_sq_r=0,sum_sxr=0;
- vp8_ssim_parms_16x16(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
- return similarity(sum_s, sum_r, sum_sq_s, sum_sq_r, sum_sxr, 256);
-}
-static double ssim_8x8(unsigned char *s,int sp, unsigned char *r,int rp)
-{
- unsigned long sum_s=0,sum_r=0,sum_sq_s=0,sum_sq_r=0,sum_sxr=0;
- vp8_ssim_parms_8x8(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
- return similarity(sum_s, sum_r, sum_sq_s, sum_sq_r, sum_sxr, 64);
-}
-
-// TODO: (jbb) tried to scale this function such that we may be able to use it
-// for distortion metric in mode selection code ( provided we do a reconstruction)
-long dssim(unsigned char *s,int sp, unsigned char *r,int rp)
-{
- unsigned long sum_s=0,sum_r=0,sum_sq_s=0,sum_sq_r=0,sum_sxr=0;
- int64_t ssim3;
- int64_t ssim_n1,ssim_n2;
- int64_t ssim_d1,ssim_d2;
- int64_t ssim_t1,ssim_t2;
- int64_t c1, c2;
-
- // normalize by 256/64
- c1 = cc1*16;
- c2 = cc2*16;
-
- vp8_ssim_parms_16x16(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
- ssim_n1 = (2*sum_s*sum_r+ c1);
-
- ssim_n2 =((int64_t) 2*256*sum_sxr-(int64_t) 2*sum_s*sum_r+c2);
-
- ssim_d1 =((int64_t)sum_s*sum_s +(int64_t)sum_r*sum_r+c1);
-
- ssim_d2 = (256 * (int64_t) sum_sq_s-(int64_t) sum_s*sum_s +
- (int64_t) 256*sum_sq_r-(int64_t) sum_r*sum_r +c2) ;
-
- ssim_t1 = 256 - 256 * ssim_n1 / ssim_d1;
- ssim_t2 = 256 - 256 * ssim_n2 / ssim_d2;
-
- ssim3 = 256 *ssim_t1 * ssim_t2;
- if(ssim3 <0 )
- ssim3=0;
- return (long)( ssim3 );
-}
-
-// We are using a 8x8 moving window with starting location of each 8x8 window
-// on the 4x4 pixel grid. Such arrangement allows the windows to overlap
-// block boundaries to penalize blocking artifacts.
-double vp8_ssim2
-(
- unsigned char *img1,
- unsigned char *img2,
- int stride_img1,
- int stride_img2,
- int width,
- int height
-)
-{
- int i,j;
- int samples =0;
- double ssim_total=0;
-
- // sample point start with each 4x4 location
- for(i=0; i < height-8; i+=4, img1 += stride_img1*4, img2 += stride_img2*4)
- {
- for(j=0; j < width-8; j+=4 )
- {
- double v = ssim_8x8(img1+j, stride_img1, img2+j, stride_img2);
- ssim_total += v;
- samples++;
- }
- }
- ssim_total /= samples;
- return ssim_total;
-}
-double vp8_calc_ssim
-(
- YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest,
- int lumamask,
- double *weight
-)
-{
- double a, b, c;
- double ssimv;
-
- a = vp8_ssim2(source->y_buffer, dest->y_buffer,
- source->y_stride, dest->y_stride, source->y_width,
- source->y_height);
-
- b = vp8_ssim2(source->u_buffer, dest->u_buffer,
- source->uv_stride, dest->uv_stride, source->uv_width,
- source->uv_height);
-
- c = vp8_ssim2(source->v_buffer, dest->v_buffer,
- source->uv_stride, dest->uv_stride, source->uv_width,
- source->uv_height);
-
- ssimv = a * .8 + .1 * (b + c);
-
- *weight = 1;
-
- return ssimv;
-}
-
-double vp8_calc_ssimg
-(
- YV12_BUFFER_CONFIG *source,
- YV12_BUFFER_CONFIG *dest,
- double *ssim_y,
- double *ssim_u,
- double *ssim_v
-)
-{
- double ssim_all = 0;
- double a, b, c;
-
- a = vp8_ssim2(source->y_buffer, dest->y_buffer,
- source->y_stride, dest->y_stride, source->y_width,
- source->y_height);
-
- b = vp8_ssim2(source->u_buffer, dest->u_buffer,
- source->uv_stride, dest->uv_stride, source->uv_width,
- source->uv_height);
-
- c = vp8_ssim2(source->v_buffer, dest->v_buffer,
- source->uv_stride, dest->uv_stride, source->uv_width,
- source->uv_height);
- *ssim_y = a;
- *ssim_u = b;
- *ssim_v = c;
- ssim_all = (a * 4 + b + c) /6;
-
- return ssim_all;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/temporal_filter.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/temporal_filter.c
deleted file mode 100644
index ba8b0097710..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/temporal_filter.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vp8/common/onyxc_int.h"
-#include "onyx_int.h"
-#include "vp8/common/systemdependent.h"
-#include "quantize.h"
-#include "vp8/common/alloccommon.h"
-#include "mcomp.h"
-#include "firstpass.h"
-#include "vpx_scale/vpx_scale.h"
-#include "vp8/common/extend.h"
-#include "ratectrl.h"
-#include "vp8/common/quant_common.h"
-#include "segmentation.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/swapyv12buffer.h"
-#include "vp8/common/threading.h"
-#include "vpx_ports/vpx_timer.h"
-
-#include <math.h>
-#include <limits.h>
-
-#define ALT_REF_MC_ENABLED 1 /* dis/enable MC in AltRef filtering */
-#define ALT_REF_SUBPEL_ENABLED 1 /* dis/enable subpel in MC AltRef filtering */
-
-#if VP8_TEMPORAL_ALT_REF
-
-static void vp8_temporal_filter_predictors_mb_c
-(
- MACROBLOCKD *x,
- unsigned char *y_mb_ptr,
- unsigned char *u_mb_ptr,
- unsigned char *v_mb_ptr,
- int stride,
- int mv_row,
- int mv_col,
- unsigned char *pred
-)
-{
- int offset;
- unsigned char *yptr, *uptr, *vptr;
-
- /* Y */
- yptr = y_mb_ptr + (mv_row >> 3) * stride + (mv_col >> 3);
-
- if ((mv_row | mv_col) & 7)
- {
- x->subpixel_predict16x16(yptr, stride,
- mv_col & 7, mv_row & 7, &pred[0], 16);
- }
- else
- {
- vp8_copy_mem16x16(yptr, stride, &pred[0], 16);
- }
-
- /* U & V */
- mv_row >>= 1;
- mv_col >>= 1;
- stride = (stride + 1) >> 1;
- offset = (mv_row >> 3) * stride + (mv_col >> 3);
- uptr = u_mb_ptr + offset;
- vptr = v_mb_ptr + offset;
-
- if ((mv_row | mv_col) & 7)
- {
- x->subpixel_predict8x8(uptr, stride,
- mv_col & 7, mv_row & 7, &pred[256], 8);
- x->subpixel_predict8x8(vptr, stride,
- mv_col & 7, mv_row & 7, &pred[320], 8);
- }
- else
- {
- vp8_copy_mem8x8(uptr, stride, &pred[256], 8);
- vp8_copy_mem8x8(vptr, stride, &pred[320], 8);
- }
-}
-void vp8_temporal_filter_apply_c
-(
- unsigned char *frame1,
- unsigned int stride,
- unsigned char *frame2,
- unsigned int block_size,
- int strength,
- int filter_weight,
- unsigned int *accumulator,
- unsigned short *count
-)
-{
- unsigned int i, j, k;
- int modifier;
- int byte = 0;
- const int rounding = strength > 0 ? 1 << (strength - 1) : 0;
-
- for (i = 0,k = 0; i < block_size; i++)
- {
- for (j = 0; j < block_size; j++, k++)
- {
-
- int src_byte = frame1[byte];
- int pixel_value = *frame2++;
-
- modifier = src_byte - pixel_value;
- /* This is an integer approximation of:
- * float coeff = (3.0 * modifer * modifier) / pow(2, strength);
- * modifier = (int)roundf(coeff > 16 ? 0 : 16-coeff);
- */
- modifier *= modifier;
- modifier *= 3;
- modifier += rounding;
- modifier >>= strength;
-
- if (modifier > 16)
- modifier = 16;
-
- modifier = 16 - modifier;
- modifier *= filter_weight;
-
- count[k] += modifier;
- accumulator[k] += modifier * pixel_value;
-
- byte++;
- }
-
- byte += stride - block_size;
- }
-}
-
-#if ALT_REF_MC_ENABLED
-
-static int vp8_temporal_filter_find_matching_mb_c
-(
- VP8_COMP *cpi,
- YV12_BUFFER_CONFIG *arf_frame,
- YV12_BUFFER_CONFIG *frame_ptr,
- int mb_offset,
- int error_thresh
-)
-{
- MACROBLOCK *x = &cpi->mb;
- int step_param;
- int sadpb = x->sadperbit16;
- int bestsme = INT_MAX;
-
- BLOCK *b = &x->block[0];
- BLOCKD *d = &x->e_mbd.block[0];
- int_mv best_ref_mv1;
- int_mv best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
-
- /* Save input state */
- unsigned char **base_src = b->base_src;
- int src = b->src;
- int src_stride = b->src_stride;
- unsigned char *base_pre = x->e_mbd.pre.y_buffer;
- int pre = d->offset;
- int pre_stride = x->e_mbd.pre.y_stride;
-
- (void)error_thresh;
-
- best_ref_mv1.as_int = 0;
- best_ref_mv1_full.as_mv.col = best_ref_mv1.as_mv.col >>3;
- best_ref_mv1_full.as_mv.row = best_ref_mv1.as_mv.row >>3;
-
- /* Setup frame pointers */
- b->base_src = &arf_frame->y_buffer;
- b->src_stride = arf_frame->y_stride;
- b->src = mb_offset;
-
- x->e_mbd.pre.y_buffer = frame_ptr->y_buffer;
- x->e_mbd.pre.y_stride = frame_ptr->y_stride;
- d->offset = mb_offset;
-
- /* Further step/diamond searches as necessary */
- if (cpi->Speed < 8)
- {
- step_param = cpi->sf.first_step + (cpi->Speed > 5);
- }
- else
- {
- step_param = cpi->sf.first_step + 2;
- }
-
- /* TODO Check that the 16x16 vf & sdf are selected here */
- /* Ignore mv costing by sending NULL cost arrays */
- bestsme = vp8_hex_search(x, b, d, &best_ref_mv1_full, &d->bmi.mv,
- step_param, sadpb,
- &cpi->fn_ptr[BLOCK_16X16],
- NULL, NULL, &best_ref_mv1);
-
-#if ALT_REF_SUBPEL_ENABLED
- /* Try sub-pixel MC? */
- {
- int distortion;
- unsigned int sse;
- /* Ignore mv costing by sending NULL cost array */
- bestsme = cpi->find_fractional_mv_step(x, b, d,
- &d->bmi.mv,
- &best_ref_mv1,
- x->errorperbit,
- &cpi->fn_ptr[BLOCK_16X16],
- NULL, &distortion, &sse);
- }
-#endif
-
- /* Save input state */
- b->base_src = base_src;
- b->src = src;
- b->src_stride = src_stride;
- x->e_mbd.pre.y_buffer = base_pre;
- d->offset = pre;
- x->e_mbd.pre.y_stride = pre_stride;
-
- return bestsme;
-}
-#endif
-
-static void vp8_temporal_filter_iterate_c
-(
- VP8_COMP *cpi,
- int frame_count,
- int alt_ref_index,
- int strength
-)
-{
- int byte;
- int frame;
- int mb_col, mb_row;
- unsigned int filter_weight;
- int mb_cols = cpi->common.mb_cols;
- int mb_rows = cpi->common.mb_rows;
- int mb_y_offset = 0;
- int mb_uv_offset = 0;
- DECLARE_ALIGNED(16, unsigned int, accumulator[16*16 + 8*8 + 8*8]);
- DECLARE_ALIGNED(16, unsigned short, count[16*16 + 8*8 + 8*8]);
- MACROBLOCKD *mbd = &cpi->mb.e_mbd;
- YV12_BUFFER_CONFIG *f = cpi->frames[alt_ref_index];
- unsigned char *dst1, *dst2;
- DECLARE_ALIGNED(16, unsigned char, predictor[16*16 + 8*8 + 8*8]);
-
- /* Save input state */
- unsigned char *y_buffer = mbd->pre.y_buffer;
- unsigned char *u_buffer = mbd->pre.u_buffer;
- unsigned char *v_buffer = mbd->pre.v_buffer;
-
- for (mb_row = 0; mb_row < mb_rows; mb_row++)
- {
-#if ALT_REF_MC_ENABLED
- /* Source frames are extended to 16 pixels. This is different than
- * L/A/G reference frames that have a border of 32 (VP8BORDERINPIXELS)
- * A 6 tap filter is used for motion search. This requires 2 pixels
- * before and 3 pixels after. So the largest Y mv on a border would
- * then be 16 - 3. The UV blocks are half the size of the Y and
- * therefore only extended by 8. The largest mv that a UV block
- * can support is 8 - 3. A UV mv is half of a Y mv.
- * (16 - 3) >> 1 == 6 which is greater than 8 - 3.
- * To keep the mv in play for both Y and UV planes the max that it
- * can be on a border is therefore 16 - 5.
- */
- cpi->mb.mv_row_min = -((mb_row * 16) + (16 - 5));
- cpi->mb.mv_row_max = ((cpi->common.mb_rows - 1 - mb_row) * 16)
- + (16 - 5);
-#endif
-
- for (mb_col = 0; mb_col < mb_cols; mb_col++)
- {
- int i, j, k;
- int stride;
-
- memset(accumulator, 0, 384*sizeof(unsigned int));
- memset(count, 0, 384*sizeof(unsigned short));
-
-#if ALT_REF_MC_ENABLED
- cpi->mb.mv_col_min = -((mb_col * 16) + (16 - 5));
- cpi->mb.mv_col_max = ((cpi->common.mb_cols - 1 - mb_col) * 16)
- + (16 - 5);
-#endif
-
- for (frame = 0; frame < frame_count; frame++)
- {
- if (cpi->frames[frame] == NULL)
- continue;
-
- mbd->block[0].bmi.mv.as_mv.row = 0;
- mbd->block[0].bmi.mv.as_mv.col = 0;
-
- if (frame == alt_ref_index)
- {
- filter_weight = 2;
- }
- else
- {
- int err = 0;
-#if ALT_REF_MC_ENABLED
-#define THRESH_LOW 10000
-#define THRESH_HIGH 20000
- /* Find best match in this frame by MC */
- err = vp8_temporal_filter_find_matching_mb_c
- (cpi,
- cpi->frames[alt_ref_index],
- cpi->frames[frame],
- mb_y_offset,
- THRESH_LOW);
-#endif
- /* Assign higher weight to matching MB if it's error
- * score is lower. If not applying MC default behavior
- * is to weight all MBs equal.
- */
- filter_weight = err<THRESH_LOW
- ? 2 : err<THRESH_HIGH ? 1 : 0;
- }
-
- if (filter_weight != 0)
- {
- /* Construct the predictors */
- vp8_temporal_filter_predictors_mb_c
- (mbd,
- cpi->frames[frame]->y_buffer + mb_y_offset,
- cpi->frames[frame]->u_buffer + mb_uv_offset,
- cpi->frames[frame]->v_buffer + mb_uv_offset,
- cpi->frames[frame]->y_stride,
- mbd->block[0].bmi.mv.as_mv.row,
- mbd->block[0].bmi.mv.as_mv.col,
- predictor);
-
- /* Apply the filter (YUV) */
- vp8_temporal_filter_apply
- (f->y_buffer + mb_y_offset,
- f->y_stride,
- predictor,
- 16,
- strength,
- filter_weight,
- accumulator,
- count);
-
- vp8_temporal_filter_apply
- (f->u_buffer + mb_uv_offset,
- f->uv_stride,
- predictor + 256,
- 8,
- strength,
- filter_weight,
- accumulator + 256,
- count + 256);
-
- vp8_temporal_filter_apply
- (f->v_buffer + mb_uv_offset,
- f->uv_stride,
- predictor + 320,
- 8,
- strength,
- filter_weight,
- accumulator + 320,
- count + 320);
- }
- }
-
- /* Normalize filter output to produce AltRef frame */
- dst1 = cpi->alt_ref_buffer.y_buffer;
- stride = cpi->alt_ref_buffer.y_stride;
- byte = mb_y_offset;
- for (i = 0,k = 0; i < 16; i++)
- {
- for (j = 0; j < 16; j++, k++)
- {
- unsigned int pval = accumulator[k] + (count[k] >> 1);
- pval *= cpi->fixed_divide[count[k]];
- pval >>= 19;
-
- dst1[byte] = (unsigned char)pval;
-
- /* move to next pixel */
- byte++;
- }
-
- byte += stride - 16;
- }
-
- dst1 = cpi->alt_ref_buffer.u_buffer;
- dst2 = cpi->alt_ref_buffer.v_buffer;
- stride = cpi->alt_ref_buffer.uv_stride;
- byte = mb_uv_offset;
- for (i = 0,k = 256; i < 8; i++)
- {
- for (j = 0; j < 8; j++, k++)
- {
- int m=k+64;
-
- /* U */
- unsigned int pval = accumulator[k] + (count[k] >> 1);
- pval *= cpi->fixed_divide[count[k]];
- pval >>= 19;
- dst1[byte] = (unsigned char)pval;
-
- /* V */
- pval = accumulator[m] + (count[m] >> 1);
- pval *= cpi->fixed_divide[count[m]];
- pval >>= 19;
- dst2[byte] = (unsigned char)pval;
-
- /* move to next pixel */
- byte++;
- }
-
- byte += stride - 8;
- }
-
- mb_y_offset += 16;
- mb_uv_offset += 8;
- }
-
- mb_y_offset += 16*(f->y_stride-mb_cols);
- mb_uv_offset += 8*(f->uv_stride-mb_cols);
- }
-
- /* Restore input state */
- mbd->pre.y_buffer = y_buffer;
- mbd->pre.u_buffer = u_buffer;
- mbd->pre.v_buffer = v_buffer;
-}
-
-void vp8_temporal_filter_prepare_c
-(
- VP8_COMP *cpi,
- int distance
-)
-{
- int frame = 0;
-
- int num_frames_backward = 0;
- int num_frames_forward = 0;
- int frames_to_blur_backward = 0;
- int frames_to_blur_forward = 0;
- int frames_to_blur = 0;
- int start_frame = 0;
-
- int strength = cpi->oxcf.arnr_strength;
-
- int blur_type = cpi->oxcf.arnr_type;
-
- int max_frames = cpi->active_arnr_frames;
-
- num_frames_backward = distance;
- num_frames_forward = vp8_lookahead_depth(cpi->lookahead)
- - (num_frames_backward + 1);
-
- switch (blur_type)
- {
- case 1:
- /* Backward Blur */
-
- frames_to_blur_backward = num_frames_backward;
-
- if (frames_to_blur_backward >= max_frames)
- frames_to_blur_backward = max_frames - 1;
-
- frames_to_blur = frames_to_blur_backward + 1;
- break;
-
- case 2:
- /* Forward Blur */
-
- frames_to_blur_forward = num_frames_forward;
-
- if (frames_to_blur_forward >= max_frames)
- frames_to_blur_forward = max_frames - 1;
-
- frames_to_blur = frames_to_blur_forward + 1;
- break;
-
- case 3:
- default:
- /* Center Blur */
- frames_to_blur_forward = num_frames_forward;
- frames_to_blur_backward = num_frames_backward;
-
- if (frames_to_blur_forward > frames_to_blur_backward)
- frames_to_blur_forward = frames_to_blur_backward;
-
- if (frames_to_blur_backward > frames_to_blur_forward)
- frames_to_blur_backward = frames_to_blur_forward;
-
- /* When max_frames is even we have 1 more frame backward than forward */
- if (frames_to_blur_forward > (max_frames - 1) / 2)
- frames_to_blur_forward = ((max_frames - 1) / 2);
-
- if (frames_to_blur_backward > (max_frames / 2))
- frames_to_blur_backward = (max_frames / 2);
-
- frames_to_blur = frames_to_blur_backward + frames_to_blur_forward + 1;
- break;
- }
-
- start_frame = distance + frames_to_blur_forward;
-
- /* Setup frame pointers, NULL indicates frame not included in filter */
- memset(cpi->frames, 0, max_frames*sizeof(YV12_BUFFER_CONFIG *));
- for (frame = 0; frame < frames_to_blur; frame++)
- {
- int which_buffer = start_frame - frame;
- struct lookahead_entry* buf = vp8_lookahead_peek(cpi->lookahead,
- which_buffer,
- PEEK_FORWARD);
- cpi->frames[frames_to_blur-1-frame] = &buf->img;
- }
-
- vp8_temporal_filter_iterate_c (
- cpi,
- frames_to_blur,
- frames_to_blur_backward,
- strength );
-}
-#endif
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.c
deleted file mode 100644
index afd46fb2197..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include "onyx_int.h"
-#include "tokenize.h"
-#include "vpx_mem/vpx_mem.h"
-
-/* Global event counters used for accumulating statistics across several
- compressions, then generating context.c = initial stats. */
-
-#ifdef VP8_ENTROPY_STATS
-_int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
-void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ;
-void vp8_fix_contexts(MACROBLOCKD *x);
-
-#include "dct_value_tokens.h"
-#include "dct_value_cost.h"
-
-const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens +
- DCT_MAX_VALUE;
-const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;
-
-#if 0
-int skip_true_count = 0;
-int skip_false_count = 0;
-#endif
-
-/* function used to generate dct_value_tokens and dct_value_cost tables */
-/*
-static void fill_value_tokens()
-{
-
- TOKENVALUE *t = dct_value_tokens + DCT_MAX_VALUE;
- const vp8_extra_bit_struct *e = vp8_extra_bits;
-
- int i = -DCT_MAX_VALUE;
- int sign = 1;
-
- do
- {
- if (!i)
- sign = 0;
-
- {
- const int a = sign ? -i : i;
- int eb = sign;
-
- if (a > 4)
- {
- int j = 4;
-
- while (++j < 11 && e[j].base_val <= a) {}
-
- t[i].Token = --j;
- eb |= (a - e[j].base_val) << 1;
- }
- else
- t[i].Token = a;
-
- t[i].Extra = eb;
- }
-
- // initialize the cost for extra bits for all possible coefficient value.
- {
- int cost = 0;
- const vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token;
-
- if (p->base_val)
- {
- const int extra = t[i].Extra;
- const int Length = p->Len;
-
- if (Length)
- cost += vp8_treed_cost(p->tree, p->prob, extra >> 1, Length);
-
- cost += vp8_cost_bit(vp8_prob_half, extra & 1); // sign
- dct_value_cost[i + DCT_MAX_VALUE] = cost;
- }
-
- }
-
- }
- while (++i < DCT_MAX_VALUE);
-
- vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
- vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;
-}
-*/
-
-static void tokenize2nd_order_b
-(
- MACROBLOCK *x,
- TOKENEXTRA **tp,
- VP8_COMP *cpi
-)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- int pt; /* near block/prev token context index */
- int c; /* start at DC */
- TOKENEXTRA *t = *tp;/* store tokens starting here */
- const BLOCKD *b;
- const short *qcoeff_ptr;
- ENTROPY_CONTEXT * a;
- ENTROPY_CONTEXT * l;
- int band, rc, v, token;
- int eob;
-
- b = xd->block + 24;
- qcoeff_ptr = b->qcoeff;
- a = (ENTROPY_CONTEXT *)xd->above_context + 8;
- l = (ENTROPY_CONTEXT *)xd->left_context + 8;
- eob = xd->eobs[24];
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- if(!eob)
- {
- /* c = band for this case */
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
- t->skip_eob_node = 0;
-
- ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN];
- t++;
- *tp = t;
- *a = *l = 0;
- return;
- }
-
- v = qcoeff_ptr[0];
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
- t->Token = token;
-
- t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts [1] [0] [pt] [token];
- pt = vp8_prev_token_class[token];
- t++;
- c = 1;
-
- for (; c < eob; c++)
- {
- rc = vp8_default_zig_zag1d[c];
- band = vp8_coef_bands[c];
- v = qcoeff_ptr[rc];
-
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
-
- t->Token = token;
- t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
-
- t->skip_eob_node = ((pt == 0));
-
- ++x->coef_counts [1] [band] [pt] [token];
-
- pt = vp8_prev_token_class[token];
- t++;
- }
- if (c < 16)
- {
- band = vp8_coef_bands[c];
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
-
- t->skip_eob_node = 0;
-
- ++x->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN];
-
- t++;
- }
-
- *tp = t;
- *a = *l = 1;
-
-}
-
-static void tokenize1st_order_b
-(
- MACROBLOCK *x,
- TOKENEXTRA **tp,
- int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
- VP8_COMP *cpi
-)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- unsigned int block;
- const BLOCKD *b;
- int pt; /* near block/prev token context index */
- int c;
- int token;
- TOKENEXTRA *t = *tp;/* store tokens starting here */
- const short *qcoeff_ptr;
- ENTROPY_CONTEXT * a;
- ENTROPY_CONTEXT * l;
- int band, rc, v;
- int tmp1, tmp2;
-
- b = xd->block;
- /* Luma */
- for (block = 0; block < 16; block++, b++)
- {
- const int eob = *b->eob;
- tmp1 = vp8_block2above[block];
- tmp2 = vp8_block2left[block];
- qcoeff_ptr = b->qcoeff;
- a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
- l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
-
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- c = type ? 0 : 1;
-
- if(c >= eob)
- {
- /* c = band for this case */
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
- t->skip_eob_node = 0;
-
- ++x->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN];
- t++;
- *tp = t;
- *a = *l = 0;
- continue;
- }
-
- v = qcoeff_ptr[c];
-
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
- t->Token = token;
-
- t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts [type] [c] [pt] [token];
- pt = vp8_prev_token_class[token];
- t++;
- c++;
-
- assert(eob <= 16);
- for (; c < eob; c++)
- {
- rc = vp8_default_zig_zag1d[c];
- band = vp8_coef_bands[c];
- v = qcoeff_ptr[rc];
-
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
-
- t->Token = token;
- t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
-
- t->skip_eob_node = (pt == 0);
- ++x->coef_counts [type] [band] [pt] [token];
-
- pt = vp8_prev_token_class[token];
- t++;
- }
- if (c < 16)
- {
- band = vp8_coef_bands[c];
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
-
- t->skip_eob_node = 0;
- ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN];
-
- t++;
- }
- *tp = t;
- *a = *l = 1;
- }
-
- /* Chroma */
- for (block = 16; block < 24; block++, b++)
- {
- const int eob = *b->eob;
- tmp1 = vp8_block2above[block];
- tmp2 = vp8_block2left[block];
- qcoeff_ptr = b->qcoeff;
- a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
- l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
-
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- if(!eob)
- {
- /* c = band for this case */
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
- t->skip_eob_node = 0;
-
- ++x->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN];
- t++;
- *tp = t;
- *a = *l = 0;
- continue;
- }
-
- v = qcoeff_ptr[0];
-
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
- t->Token = token;
-
- t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts [2] [0] [pt] [token];
- pt = vp8_prev_token_class[token];
- t++;
- c = 1;
-
- assert(eob <= 16);
- for (; c < eob; c++)
- {
- rc = vp8_default_zig_zag1d[c];
- band = vp8_coef_bands[c];
- v = qcoeff_ptr[rc];
-
- t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
- token = vp8_dct_value_tokens_ptr[v].Token;
-
- t->Token = token;
- t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
-
- t->skip_eob_node = (pt == 0);
-
- ++x->coef_counts [2] [band] [pt] [token];
-
- pt = vp8_prev_token_class[token];
- t++;
- }
- if (c < 16)
- {
- band = vp8_coef_bands[c];
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];
-
- t->skip_eob_node = 0;
-
- ++x->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN];
-
- t++;
- }
- *tp = t;
- *a = *l = 1;
- }
-}
-
-
-static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block)
-{
- int skip = 1;
- int i = 0;
-
- if (has_y2_block)
- {
- for (i = 0; i < 16; i++)
- skip &= (x->eobs[i] < 2);
- }
-
- for (; i < 24 + has_y2_block; i++)
- skip &= (!x->eobs[i]);
-
- return skip;
-}
-
-
-void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- int plane_type;
- int has_y2_block;
-
- has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED
- && xd->mode_info_context->mbmi.mode != SPLITMV);
-
- xd->mode_info_context->mbmi.mb_skip_coeff =
- mb_is_skippable(xd, has_y2_block);
- if (xd->mode_info_context->mbmi.mb_skip_coeff)
- {
- if (!cpi->common.mb_no_coeff_skip)
- {
- vp8_stuff_mb(cpi, x, t);
- }
- else
- {
- vp8_fix_contexts(xd);
- x->skip_true_count++;
- }
-
- return;
- }
-
- plane_type = 3;
- if(has_y2_block)
- {
- tokenize2nd_order_b(x, t, cpi);
- plane_type = 0;
- }
-
- tokenize1st_order_b(x, t, plane_type, cpi);
-}
-
-
-#ifdef VP8_ENTROPY_STATS
-
-void init_context_counters(void)
-{
- memset(context_counters, 0, sizeof(context_counters));
-}
-
-void print_context_counters()
-{
-
- int type, band, pt, t;
-
- FILE *const f = fopen("context.c", "w");
-
- fprintf(f, "#include \"entropy.h\"\n");
-
- fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n");
-
- fprintf(f, "int Contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];\n\n");
-
- fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {");
-
-# define Comma( X) (X? ",":"")
-
- type = 0;
-
- do
- {
- fprintf(f, "%s\n { /* block Type %d */", Comma(type), type);
-
- band = 0;
-
- do
- {
- fprintf(f, "%s\n { /* Coeff Band %d */", Comma(band), band);
-
- pt = 0;
-
- do
- {
- fprintf(f, "%s\n {", Comma(pt));
-
- t = 0;
-
- do
- {
- const _int64 x = context_counters [type] [band] [pt] [t];
- const int y = (int) x;
-
- assert(x == (_int64) y); /* no overflow handling yet */
- fprintf(f, "%s %d", Comma(t), y);
-
- }
- while (++t < MAX_ENTROPY_TOKENS);
-
- fprintf(f, "}");
- }
- while (++pt < PREV_COEF_CONTEXTS);
-
- fprintf(f, "\n }");
-
- }
- while (++band < COEF_BANDS);
-
- fprintf(f, "\n }");
- }
- while (++type < BLOCK_TYPES);
-
- fprintf(f, "\n};\n");
- fclose(f);
-}
-#endif
-
-
-static void stuff2nd_order_b
-(
- TOKENEXTRA **tp,
- ENTROPY_CONTEXT *a,
- ENTROPY_CONTEXT *l,
- VP8_COMP *cpi,
- MACROBLOCK *x
-)
-{
- int pt; /* near block/prev token context index */
- TOKENEXTRA *t = *tp; /* store tokens starting here */
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN];
- ++t;
-
- *tp = t;
- pt = 0;
- *a = *l = pt;
-}
-
-static void stuff1st_order_b
-(
- TOKENEXTRA **tp,
- ENTROPY_CONTEXT *a,
- ENTROPY_CONTEXT *l,
- int type,
- VP8_COMP *cpi,
- MACROBLOCK *x
-)
-{
- int pt; /* near block/prev token context index */
- int band;
- TOKENEXTRA *t = *tp; /* store tokens starting here */
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- band = type ? 0 : 1;
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN];
- ++t;
- *tp = t;
- pt = 0; /* 0 <-> all coeff data is zero */
- *a = *l = pt;
-}
-
-static
-void stuff1st_order_buv
-(
- TOKENEXTRA **tp,
- ENTROPY_CONTEXT *a,
- ENTROPY_CONTEXT *l,
- VP8_COMP *cpi,
- MACROBLOCK *x
-)
-{
- int pt; /* near block/prev token context index */
- TOKENEXTRA *t = *tp; /* store tokens starting here */
- VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
- t->Token = DCT_EOB_TOKEN;
- t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
- t->skip_eob_node = 0;
- ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN];
- ++t;
- *tp = t;
- pt = 0; /* 0 <-> all coeff data is zero */
- *a = *l = pt;
-}
-
-void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
-{
- MACROBLOCKD *xd = &x->e_mbd;
- ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context;
- ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context;
- int plane_type;
- int b;
- plane_type = 3;
- if((xd->mode_info_context->mbmi.mode != B_PRED
- && xd->mode_info_context->mbmi.mode != SPLITMV))
- {
- stuff2nd_order_b(t,
- A + vp8_block2above[24], L + vp8_block2left[24], cpi, x);
- plane_type = 0;
- }
-
- for (b = 0; b < 16; b++)
- stuff1st_order_b(t,
- A + vp8_block2above[b],
- L + vp8_block2left[b], plane_type, cpi, x);
-
- for (b = 16; b < 24; b++)
- stuff1st_order_buv(t,
- A + vp8_block2above[b],
- L + vp8_block2left[b], cpi, x);
-
-}
-void vp8_fix_contexts(MACROBLOCKD *x)
-{
- /* Clear entropy contexts for Y2 blocks */
- if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
- {
- memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
- memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
- }
- else
- {
- memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
- memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
- }
-
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.h
deleted file mode 100644
index b73a9ee1c89..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/tokenize.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_TOKENIZE_H_
-#define VP8_ENCODER_TOKENIZE_H_
-
-#include "vp8/common/entropy.h"
-#include "block.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void vp8_tokenize_initialize();
-
-typedef struct
-{
- short Token;
- short Extra;
-} TOKENVALUE;
-
-typedef struct
-{
- const vp8_prob *context_tree;
- short Extra;
- unsigned char Token;
- unsigned char skip_eob_node;
-} TOKENEXTRA;
-
-int rd_cost_mby(MACROBLOCKD *);
-
-#ifdef VP8_ENTROPY_STATS
-void init_context_counters();
-void print_context_counters();
-
-extern _int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
-
-extern const short *const vp8_dct_value_cost_ptr;
-/* TODO: The Token field should be broken out into a separate char array to
- * improve cache locality, since it's needed for costing when the rest of the
- * fields are not.
- */
-extern const TOKENVALUE *const vp8_dct_value_tokens_ptr;
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_TOKENIZE_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.c
deleted file mode 100644
index ef25f670b3a..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "treewriter.h"
-
-static void cost(
- int *const C,
- vp8_tree T,
- const vp8_prob *const P,
- int i,
- int c
-)
-{
- const vp8_prob p = P [i>>1];
-
- do
- {
- const vp8_tree_index j = T[i];
- const int d = c + vp8_cost_bit(p, i & 1);
-
- if (j <= 0)
- C[-j] = d;
- else
- cost(C, T, P, j, d);
- }
- while (++i & 1);
-}
-void vp8_cost_tokens(int *c, const vp8_prob *p, vp8_tree t)
-{
- cost(c, t, p, 0, 0);
-}
-void vp8_cost_tokens2(int *c, const vp8_prob *p, vp8_tree t,int start)
-{
- cost(c, t, p, start, 0);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.h
deleted file mode 100644
index cfb2730ab3b..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/treewriter.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VP8_ENCODER_TREEWRITER_H_
-#define VP8_ENCODER_TREEWRITER_H_
-
-/* Trees map alphabets into huffman-like codes suitable for an arithmetic
- bit coder. Timothy S Murphy 11 October 2004 */
-
-#include "vp8/common/treecoder.h"
-
-#include "boolhuff.h" /* for now */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef BOOL_CODER vp8_writer;
-
-#define vp8_write vp8_encode_bool
-#define vp8_write_literal vp8_encode_value
-#define vp8_write_bit( W, V) vp8_write( W, V, vp8_prob_half)
-
-#define vp8bc_write vp8bc_write_bool
-#define vp8bc_write_literal vp8bc_write_bits
-#define vp8bc_write_bit( W, V) vp8bc_write_bits( W, V, 1)
-
-
-/* Approximate length of an encoded bool in 256ths of a bit at given prob */
-
-#define vp8_cost_zero( x) ( vp8_prob_cost[x])
-#define vp8_cost_one( x) vp8_cost_zero( vp8_complement(x))
-
-#define vp8_cost_bit( x, b) vp8_cost_zero( (b)? vp8_complement(x) : (x) )
-
-/* VP8BC version is scaled by 2^20 rather than 2^8; see bool_coder.h */
-
-
-/* Both of these return bits, not scaled bits. */
-
-static unsigned int vp8_cost_branch(const unsigned int ct[2], vp8_prob p)
-{
- /* Imitate existing calculation */
-
- return ((ct[0] * vp8_cost_zero(p))
- + (ct[1] * vp8_cost_one(p))) >> 8;
-}
-
-/* Small functions to write explicit values and tokens, as well as
- estimate their lengths. */
-
-static void vp8_treed_write
-(
- vp8_writer *const w,
- vp8_tree t,
- const vp8_prob *const p,
- int v,
- int n /* number of bits in v, assumed nonzero */
-)
-{
- vp8_tree_index i = 0;
-
- do
- {
- const int b = (v >> --n) & 1;
- vp8_write(w, b, p[i>>1]);
- i = t[i+b];
- }
- while (n);
-}
-static void vp8_write_token
-(
- vp8_writer *const w,
- vp8_tree t,
- const vp8_prob *const p,
- vp8_token *const x
-)
-{
- vp8_treed_write(w, t, p, x->value, x->Len);
-}
-
-static int vp8_treed_cost(
- vp8_tree t,
- const vp8_prob *const p,
- int v,
- int n /* number of bits in v, assumed nonzero */
-)
-{
- int c = 0;
- vp8_tree_index i = 0;
-
- do
- {
- const int b = (v >> --n) & 1;
- c += vp8_cost_bit(p[i>>1], b);
- i = t[i+b];
- }
- while (n);
-
- return c;
-}
-static int vp8_cost_token
-(
- vp8_tree t,
- const vp8_prob *const p,
- vp8_token *const x
-)
-{
- return vp8_treed_cost(t, p, x->value, x->Len);
-}
-
-/* Fill array of costs for all possible token values. */
-
-void vp8_cost_tokens(
- int *Costs, const vp8_prob *, vp8_tree
-);
-
-void vp8_cost_tokens2(
- int *Costs, const vp8_prob *, vp8_tree, int
-);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // VP8_ENCODER_TREEWRITER_H_
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_mmx.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_mmx.asm
deleted file mode 100644
index 6f188cb94a8..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_mmx.asm
+++ /dev/null
@@ -1,241 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;void vp8_short_fdct4x4_mmx(short *input, short *output, int pitch)
-global sym(vp8_short_fdct4x4_mmx) PRIVATE
-sym(vp8_short_fdct4x4_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 3
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- mov rsi, arg(0) ; input
- mov rdi, arg(1) ; output
-
- movsxd rax, dword ptr arg(2) ;pitch
-
- lea rcx, [rsi + rax*2]
- ; read the input data
- movq mm0, [rsi]
- movq mm1, [rsi + rax]
-
- movq mm2, [rcx]
- movq mm4, [rcx + rax]
-
- ; transpose for the first stage
- movq mm3, mm0 ; 00 01 02 03
- movq mm5, mm2 ; 20 21 22 23
-
- punpcklwd mm0, mm1 ; 00 10 01 11
- punpckhwd mm3, mm1 ; 02 12 03 13
-
- punpcklwd mm2, mm4 ; 20 30 21 31
- punpckhwd mm5, mm4 ; 22 32 23 33
-
- movq mm1, mm0 ; 00 10 01 11
- punpckldq mm0, mm2 ; 00 10 20 30
-
- punpckhdq mm1, mm2 ; 01 11 21 31
-
- movq mm2, mm3 ; 02 12 03 13
- punpckldq mm2, mm5 ; 02 12 22 32
-
- punpckhdq mm3, mm5 ; 03 13 23 33
-
- ; mm0 0
- ; mm1 1
- ; mm2 2
- ; mm3 3
-
- ; first stage
- movq mm5, mm0
- movq mm4, mm1
-
- paddw mm0, mm3 ; a1 = 0 + 3
- paddw mm1, mm2 ; b1 = 1 + 2
-
- psubw mm4, mm2 ; c1 = 1 - 2
- psubw mm5, mm3 ; d1 = 0 - 3
-
- psllw mm5, 3
- psllw mm4, 3
-
- psllw mm0, 3
- psllw mm1, 3
-
- ; output 0 and 2
- movq mm2, mm0 ; a1
-
- paddw mm0, mm1 ; op[0] = a1 + b1
- psubw mm2, mm1 ; op[2] = a1 - b1
-
- ; output 1 and 3
- ; interleave c1, d1
- movq mm1, mm5 ; d1
- punpcklwd mm1, mm4 ; c1 d1
- punpckhwd mm5, mm4 ; c1 d1
-
- movq mm3, mm1
- movq mm4, mm5
-
- pmaddwd mm1, MMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
- pmaddwd mm4, MMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
-
- pmaddwd mm3, MMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
- pmaddwd mm5, MMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
-
- paddd mm1, MMWORD PTR[GLOBAL(_14500)]
- paddd mm4, MMWORD PTR[GLOBAL(_14500)]
- paddd mm3, MMWORD PTR[GLOBAL(_7500)]
- paddd mm5, MMWORD PTR[GLOBAL(_7500)]
-
- psrad mm1, 12 ; (c1 * 2217 + d1 * 5352 + 14500)>>12
- psrad mm4, 12 ; (c1 * 2217 + d1 * 5352 + 14500)>>12
- psrad mm3, 12 ; (d1 * 2217 - c1 * 5352 + 7500)>>12
- psrad mm5, 12 ; (d1 * 2217 - c1 * 5352 + 7500)>>12
-
- packssdw mm1, mm4 ; op[1]
- packssdw mm3, mm5 ; op[3]
-
- ; done with vertical
- ; transpose for the second stage
- movq mm4, mm0 ; 00 10 20 30
- movq mm5, mm2 ; 02 12 22 32
-
- punpcklwd mm0, mm1 ; 00 01 10 11
- punpckhwd mm4, mm1 ; 20 21 30 31
-
- punpcklwd mm2, mm3 ; 02 03 12 13
- punpckhwd mm5, mm3 ; 22 23 32 33
-
- movq mm1, mm0 ; 00 01 10 11
- punpckldq mm0, mm2 ; 00 01 02 03
-
- punpckhdq mm1, mm2 ; 01 22 12 13
-
- movq mm2, mm4 ; 20 31 30 31
- punpckldq mm2, mm5 ; 20 21 22 23
-
- punpckhdq mm4, mm5 ; 30 31 32 33
-
- ; mm0 0
- ; mm1 1
- ; mm2 2
- ; mm3 4
-
- movq mm5, mm0
- movq mm3, mm1
-
- paddw mm0, mm4 ; a1 = 0 + 3
- paddw mm1, mm2 ; b1 = 1 + 2
-
- psubw mm3, mm2 ; c1 = 1 - 2
- psubw mm5, mm4 ; d1 = 0 - 3
-
- pxor mm6, mm6 ; zero out for compare
-
- pcmpeqw mm6, mm5 ; d1 != 0
-
- pandn mm6, MMWORD PTR[GLOBAL(_cmp_mask)] ; clear upper,
- ; and keep bit 0 of lower
-
- ; output 0 and 2
- movq mm2, mm0 ; a1
-
- paddw mm0, mm1 ; a1 + b1
- psubw mm2, mm1 ; a1 - b1
-
- paddw mm0, MMWORD PTR[GLOBAL(_7w)]
- paddw mm2, MMWORD PTR[GLOBAL(_7w)]
-
- psraw mm0, 4 ; op[0] = (a1 + b1 + 7)>>4
- psraw mm2, 4 ; op[8] = (a1 - b1 + 7)>>4
-
- movq MMWORD PTR[rdi + 0 ], mm0
- movq MMWORD PTR[rdi + 16], mm2
-
- ; output 1 and 3
- ; interleave c1, d1
- movq mm1, mm5 ; d1
- punpcklwd mm1, mm3 ; c1 d1
- punpckhwd mm5, mm3 ; c1 d1
-
- movq mm3, mm1
- movq mm4, mm5
-
- pmaddwd mm1, MMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
- pmaddwd mm4, MMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
-
- pmaddwd mm3, MMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
- pmaddwd mm5, MMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
-
- paddd mm1, MMWORD PTR[GLOBAL(_12000)]
- paddd mm4, MMWORD PTR[GLOBAL(_12000)]
- paddd mm3, MMWORD PTR[GLOBAL(_51000)]
- paddd mm5, MMWORD PTR[GLOBAL(_51000)]
-
- psrad mm1, 16 ; (c1 * 2217 + d1 * 5352 + 14500)>>16
- psrad mm4, 16 ; (c1 * 2217 + d1 * 5352 + 14500)>>16
- psrad mm3, 16 ; (d1 * 2217 - c1 * 5352 + 7500)>>16
- psrad mm5, 16 ; (d1 * 2217 - c1 * 5352 + 7500)>>16
-
- packssdw mm1, mm4 ; op[4]
- packssdw mm3, mm5 ; op[12]
-
- paddw mm1, mm6 ; op[4] += (d1!=0)
-
- movq MMWORD PTR[rdi + 8 ], mm1
- movq MMWORD PTR[rdi + 24], mm3
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-SECTION_RODATA
-align 8
-_5352_2217:
- dw 5352
- dw 2217
- dw 5352
- dw 2217
-align 8
-_2217_neg5352:
- dw 2217
- dw -5352
- dw 2217
- dw -5352
-align 8
-_cmp_mask:
- times 4 dw 1
-align 8
-_7w:
- times 4 dw 7
-align 8
-_14500:
- times 2 dd 14500
-align 8
-_7500:
- times 2 dd 7500
-align 8
-_12000:
- times 2 dd 12000
-align 8
-_51000:
- times 2 dd 51000
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_sse2.asm
deleted file mode 100644
index d06bca5927f..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/dct_sse2.asm
+++ /dev/null
@@ -1,432 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-%macro STACK_FRAME_CREATE 0
-%if ABI_IS_32BIT
- %define input rsi
- %define output rdi
- %define pitch rax
- push rbp
- mov rbp, rsp
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- mov rsi, arg(0)
- mov rdi, arg(1)
-
- movsxd rax, dword ptr arg(2)
- lea rcx, [rsi + rax*2]
-%else
- %if LIBVPX_YASM_WIN64
- %define input rcx
- %define output rdx
- %define pitch r8
- SAVE_XMM 7, u
- %else
- %define input rdi
- %define output rsi
- %define pitch rdx
- %endif
-%endif
-%endmacro
-
-%macro STACK_FRAME_DESTROY 0
- %define input
- %define output
- %define pitch
-
-%if ABI_IS_32BIT
- pop rdi
- pop rsi
- RESTORE_GOT
- pop rbp
-%else
- %if LIBVPX_YASM_WIN64
- RESTORE_XMM
- %endif
-%endif
- ret
-%endmacro
-
-;void vp8_short_fdct4x4_sse2(short *input, short *output, int pitch)
-global sym(vp8_short_fdct4x4_sse2) PRIVATE
-sym(vp8_short_fdct4x4_sse2):
-
- STACK_FRAME_CREATE
-
- movq xmm0, MMWORD PTR[input ] ;03 02 01 00
- movq xmm2, MMWORD PTR[input+ pitch] ;13 12 11 10
- lea input, [input+2*pitch]
- movq xmm1, MMWORD PTR[input ] ;23 22 21 20
- movq xmm3, MMWORD PTR[input+ pitch] ;33 32 31 30
-
- punpcklqdq xmm0, xmm2 ;13 12 11 10 03 02 01 00
- punpcklqdq xmm1, xmm3 ;33 32 31 30 23 22 21 20
-
- movdqa xmm2, xmm0
- punpckldq xmm0, xmm1 ;23 22 03 02 21 20 01 00
- punpckhdq xmm2, xmm1 ;33 32 13 12 31 30 11 10
- movdqa xmm1, xmm0
- punpckldq xmm0, xmm2 ;31 21 30 20 11 10 01 00
- pshufhw xmm1, xmm1, 0b1h ;22 23 02 03 xx xx xx xx
- pshufhw xmm2, xmm2, 0b1h ;32 33 12 13 xx xx xx xx
-
- punpckhdq xmm1, xmm2 ;32 33 22 23 12 13 02 03
- movdqa xmm3, xmm0
- paddw xmm0, xmm1 ;b1 a1 b1 a1 b1 a1 b1 a1
- psubw xmm3, xmm1 ;c1 d1 c1 d1 c1 d1 c1 d1
- psllw xmm0, 3 ;b1 <<= 3 a1 <<= 3
- psllw xmm3, 3 ;c1 <<= 3 d1 <<= 3
-
- movdqa xmm1, xmm0
- pmaddwd xmm0, XMMWORD PTR[GLOBAL(_mult_add)] ;a1 + b1
- pmaddwd xmm1, XMMWORD PTR[GLOBAL(_mult_sub)] ;a1 - b1
- movdqa xmm4, xmm3
- pmaddwd xmm3, XMMWORD PTR[GLOBAL(_5352_2217)] ;c1*2217 + d1*5352
- pmaddwd xmm4, XMMWORD PTR[GLOBAL(_2217_neg5352)];d1*2217 - c1*5352
-
- paddd xmm3, XMMWORD PTR[GLOBAL(_14500)]
- paddd xmm4, XMMWORD PTR[GLOBAL(_7500)]
- psrad xmm3, 12 ;(c1 * 2217 + d1 * 5352 + 14500)>>12
- psrad xmm4, 12 ;(d1 * 2217 - c1 * 5352 + 7500)>>12
-
- packssdw xmm0, xmm1 ;op[2] op[0]
- packssdw xmm3, xmm4 ;op[3] op[1]
- ; 23 22 21 20 03 02 01 00
- ;
- ; 33 32 31 30 13 12 11 10
- ;
- movdqa xmm2, xmm0
- punpcklqdq xmm0, xmm3 ;13 12 11 10 03 02 01 00
- punpckhqdq xmm2, xmm3 ;23 22 21 20 33 32 31 30
-
- movdqa xmm3, xmm0
- punpcklwd xmm0, xmm2 ;32 30 22 20 12 10 02 00
- punpckhwd xmm3, xmm2 ;33 31 23 21 13 11 03 01
- movdqa xmm2, xmm0
- punpcklwd xmm0, xmm3 ;13 12 11 10 03 02 01 00
- punpckhwd xmm2, xmm3 ;33 32 31 30 23 22 21 20
-
- movdqa xmm5, XMMWORD PTR[GLOBAL(_7)]
- pshufd xmm2, xmm2, 04eh
- movdqa xmm3, xmm0
- paddw xmm0, xmm2 ;b1 b1 b1 b1 a1 a1 a1 a1
- psubw xmm3, xmm2 ;c1 c1 c1 c1 d1 d1 d1 d1
-
- pshufd xmm0, xmm0, 0d8h ;b1 b1 a1 a1 b1 b1 a1 a1
- movdqa xmm2, xmm3 ;save d1 for compare
- pshufd xmm3, xmm3, 0d8h ;c1 c1 d1 d1 c1 c1 d1 d1
- pshuflw xmm0, xmm0, 0d8h ;b1 b1 a1 a1 b1 a1 b1 a1
- pshuflw xmm3, xmm3, 0d8h ;c1 c1 d1 d1 c1 d1 c1 d1
- pshufhw xmm0, xmm0, 0d8h ;b1 a1 b1 a1 b1 a1 b1 a1
- pshufhw xmm3, xmm3, 0d8h ;c1 d1 c1 d1 c1 d1 c1 d1
- movdqa xmm1, xmm0
- pmaddwd xmm0, XMMWORD PTR[GLOBAL(_mult_add)] ;a1 + b1
- pmaddwd xmm1, XMMWORD PTR[GLOBAL(_mult_sub)] ;a1 - b1
-
- pxor xmm4, xmm4 ;zero out for compare
- paddd xmm0, xmm5
- paddd xmm1, xmm5
- pcmpeqw xmm2, xmm4
- psrad xmm0, 4 ;(a1 + b1 + 7)>>4
- psrad xmm1, 4 ;(a1 - b1 + 7)>>4
- pandn xmm2, XMMWORD PTR[GLOBAL(_cmp_mask)] ;clear upper,
- ;and keep bit 0 of lower
-
- movdqa xmm4, xmm3
- pmaddwd xmm3, XMMWORD PTR[GLOBAL(_5352_2217)] ;c1*2217 + d1*5352
- pmaddwd xmm4, XMMWORD PTR[GLOBAL(_2217_neg5352)] ;d1*2217 - c1*5352
- paddd xmm3, XMMWORD PTR[GLOBAL(_12000)]
- paddd xmm4, XMMWORD PTR[GLOBAL(_51000)]
- packssdw xmm0, xmm1 ;op[8] op[0]
- psrad xmm3, 16 ;(c1 * 2217 + d1 * 5352 + 12000)>>16
- psrad xmm4, 16 ;(d1 * 2217 - c1 * 5352 + 51000)>>16
-
- packssdw xmm3, xmm4 ;op[12] op[4]
- movdqa xmm1, xmm0
- paddw xmm3, xmm2 ;op[4] += (d1!=0)
- punpcklqdq xmm0, xmm3 ;op[4] op[0]
- punpckhqdq xmm1, xmm3 ;op[12] op[8]
-
- movdqa XMMWORD PTR[output + 0], xmm0
- movdqa XMMWORD PTR[output + 16], xmm1
-
- STACK_FRAME_DESTROY
-
-;void vp8_short_fdct8x4_sse2(short *input, short *output, int pitch)
-global sym(vp8_short_fdct8x4_sse2) PRIVATE
-sym(vp8_short_fdct8x4_sse2):
-
- STACK_FRAME_CREATE
-
- ; read the input data
- movdqa xmm0, [input ]
- movdqa xmm2, [input+ pitch]
- lea input, [input+2*pitch]
- movdqa xmm4, [input ]
- movdqa xmm3, [input+ pitch]
-
- ; transpose for the first stage
- movdqa xmm1, xmm0 ; 00 01 02 03 04 05 06 07
- movdqa xmm5, xmm4 ; 20 21 22 23 24 25 26 27
-
- punpcklwd xmm0, xmm2 ; 00 10 01 11 02 12 03 13
- punpckhwd xmm1, xmm2 ; 04 14 05 15 06 16 07 17
-
- punpcklwd xmm4, xmm3 ; 20 30 21 31 22 32 23 33
- punpckhwd xmm5, xmm3 ; 24 34 25 35 26 36 27 37
-
- movdqa xmm2, xmm0 ; 00 10 01 11 02 12 03 13
- punpckldq xmm0, xmm4 ; 00 10 20 30 01 11 21 31
-
- punpckhdq xmm2, xmm4 ; 02 12 22 32 03 13 23 33
-
- movdqa xmm4, xmm1 ; 04 14 05 15 06 16 07 17
- punpckldq xmm4, xmm5 ; 04 14 24 34 05 15 25 35
-
- punpckhdq xmm1, xmm5 ; 06 16 26 36 07 17 27 37
- movdqa xmm3, xmm2 ; 02 12 22 32 03 13 23 33
-
- punpckhqdq xmm3, xmm1 ; 03 13 23 33 07 17 27 37
- punpcklqdq xmm2, xmm1 ; 02 12 22 32 06 16 26 36
-
- movdqa xmm1, xmm0 ; 00 10 20 30 01 11 21 31
- punpcklqdq xmm0, xmm4 ; 00 10 20 30 04 14 24 34
-
- punpckhqdq xmm1, xmm4 ; 01 11 21 32 05 15 25 35
-
- ; xmm0 0
- ; xmm1 1
- ; xmm2 2
- ; xmm3 3
-
- ; first stage
- movdqa xmm5, xmm0
- movdqa xmm4, xmm1
-
- paddw xmm0, xmm3 ; a1 = 0 + 3
- paddw xmm1, xmm2 ; b1 = 1 + 2
-
- psubw xmm4, xmm2 ; c1 = 1 - 2
- psubw xmm5, xmm3 ; d1 = 0 - 3
-
- psllw xmm5, 3
- psllw xmm4, 3
-
- psllw xmm0, 3
- psllw xmm1, 3
-
- ; output 0 and 2
- movdqa xmm2, xmm0 ; a1
-
- paddw xmm0, xmm1 ; op[0] = a1 + b1
- psubw xmm2, xmm1 ; op[2] = a1 - b1
-
- ; output 1 and 3
- ; interleave c1, d1
- movdqa xmm1, xmm5 ; d1
- punpcklwd xmm1, xmm4 ; c1 d1
- punpckhwd xmm5, xmm4 ; c1 d1
-
- movdqa xmm3, xmm1
- movdqa xmm4, xmm5
-
- pmaddwd xmm1, XMMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
- pmaddwd xmm4, XMMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
-
- pmaddwd xmm3, XMMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
- pmaddwd xmm5, XMMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
-
- paddd xmm1, XMMWORD PTR[GLOBAL(_14500)]
- paddd xmm4, XMMWORD PTR[GLOBAL(_14500)]
- paddd xmm3, XMMWORD PTR[GLOBAL(_7500)]
- paddd xmm5, XMMWORD PTR[GLOBAL(_7500)]
-
- psrad xmm1, 12 ; (c1 * 2217 + d1 * 5352 + 14500)>>12
- psrad xmm4, 12 ; (c1 * 2217 + d1 * 5352 + 14500)>>12
- psrad xmm3, 12 ; (d1 * 2217 - c1 * 5352 + 7500)>>12
- psrad xmm5, 12 ; (d1 * 2217 - c1 * 5352 + 7500)>>12
-
- packssdw xmm1, xmm4 ; op[1]
- packssdw xmm3, xmm5 ; op[3]
-
- ; done with vertical
- ; transpose for the second stage
- movdqa xmm4, xmm0 ; 00 10 20 30 04 14 24 34
- movdqa xmm5, xmm2 ; 02 12 22 32 06 16 26 36
-
- punpcklwd xmm0, xmm1 ; 00 01 10 11 20 21 30 31
- punpckhwd xmm4, xmm1 ; 04 05 14 15 24 25 34 35
-
- punpcklwd xmm2, xmm3 ; 02 03 12 13 22 23 32 33
- punpckhwd xmm5, xmm3 ; 06 07 16 17 26 27 36 37
-
- movdqa xmm1, xmm0 ; 00 01 10 11 20 21 30 31
- punpckldq xmm0, xmm2 ; 00 01 02 03 10 11 12 13
-
- punpckhdq xmm1, xmm2 ; 20 21 22 23 30 31 32 33
-
- movdqa xmm2, xmm4 ; 04 05 14 15 24 25 34 35
- punpckldq xmm2, xmm5 ; 04 05 06 07 14 15 16 17
-
- punpckhdq xmm4, xmm5 ; 24 25 26 27 34 35 36 37
- movdqa xmm3, xmm1 ; 20 21 22 23 30 31 32 33
-
- punpckhqdq xmm3, xmm4 ; 30 31 32 33 34 35 36 37
- punpcklqdq xmm1, xmm4 ; 20 21 22 23 24 25 26 27
-
- movdqa xmm4, xmm0 ; 00 01 02 03 10 11 12 13
- punpcklqdq xmm0, xmm2 ; 00 01 02 03 04 05 06 07
-
- punpckhqdq xmm4, xmm2 ; 10 11 12 13 14 15 16 17
-
- ; xmm0 0
- ; xmm1 4
- ; xmm2 1
- ; xmm3 3
-
- movdqa xmm5, xmm0
- movdqa xmm2, xmm1
-
- paddw xmm0, xmm3 ; a1 = 0 + 3
- paddw xmm1, xmm4 ; b1 = 1 + 2
-
- psubw xmm4, xmm2 ; c1 = 1 - 2
- psubw xmm5, xmm3 ; d1 = 0 - 3
-
- pxor xmm6, xmm6 ; zero out for compare
-
- pcmpeqw xmm6, xmm5 ; d1 != 0
-
- pandn xmm6, XMMWORD PTR[GLOBAL(_cmp_mask8x4)] ; clear upper,
- ; and keep bit 0 of lower
-
- ; output 0 and 2
- movdqa xmm2, xmm0 ; a1
-
- paddw xmm0, xmm1 ; a1 + b1
- psubw xmm2, xmm1 ; a1 - b1
-
- paddw xmm0, XMMWORD PTR[GLOBAL(_7w)]
- paddw xmm2, XMMWORD PTR[GLOBAL(_7w)]
-
- psraw xmm0, 4 ; op[0] = (a1 + b1 + 7)>>4
- psraw xmm2, 4 ; op[8] = (a1 - b1 + 7)>>4
-
- ; output 1 and 3
- ; interleave c1, d1
- movdqa xmm1, xmm5 ; d1
- punpcklwd xmm1, xmm4 ; c1 d1
- punpckhwd xmm5, xmm4 ; c1 d1
-
- movdqa xmm3, xmm1
- movdqa xmm4, xmm5
-
- pmaddwd xmm1, XMMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
- pmaddwd xmm4, XMMWORD PTR[GLOBAL (_5352_2217)] ; c1*2217 + d1*5352
-
- pmaddwd xmm3, XMMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
- pmaddwd xmm5, XMMWORD PTR[GLOBAL(_2217_neg5352)] ; d1*2217 - c1*5352
-
- paddd xmm1, XMMWORD PTR[GLOBAL(_12000)]
- paddd xmm4, XMMWORD PTR[GLOBAL(_12000)]
- paddd xmm3, XMMWORD PTR[GLOBAL(_51000)]
- paddd xmm5, XMMWORD PTR[GLOBAL(_51000)]
-
- psrad xmm1, 16 ; (c1 * 2217 + d1 * 5352 + 14500)>>16
- psrad xmm4, 16 ; (c1 * 2217 + d1 * 5352 + 14500)>>16
- psrad xmm3, 16 ; (d1 * 2217 - c1 * 5352 + 7500)>>16
- psrad xmm5, 16 ; (d1 * 2217 - c1 * 5352 + 7500)>>16
-
- packssdw xmm1, xmm4 ; op[4]
- packssdw xmm3, xmm5 ; op[12]
-
- paddw xmm1, xmm6 ; op[4] += (d1!=0)
-
- movdqa xmm4, xmm0
- movdqa xmm5, xmm2
-
- punpcklqdq xmm0, xmm1
- punpckhqdq xmm4, xmm1
-
- punpcklqdq xmm2, xmm3
- punpckhqdq xmm5, xmm3
-
- movdqa XMMWORD PTR[output + 0 ], xmm0
- movdqa XMMWORD PTR[output + 16], xmm2
- movdqa XMMWORD PTR[output + 32], xmm4
- movdqa XMMWORD PTR[output + 48], xmm5
-
- STACK_FRAME_DESTROY
-
-SECTION_RODATA
-align 16
-_5352_2217:
- dw 5352
- dw 2217
- dw 5352
- dw 2217
- dw 5352
- dw 2217
- dw 5352
- dw 2217
-align 16
-_2217_neg5352:
- dw 2217
- dw -5352
- dw 2217
- dw -5352
- dw 2217
- dw -5352
- dw 2217
- dw -5352
-align 16
-_mult_add:
- times 8 dw 1
-align 16
-_cmp_mask:
- times 4 dw 1
- times 4 dw 0
-align 16
-_cmp_mask8x4:
- times 8 dw 1
-align 16
-_mult_sub:
- dw 1
- dw -1
- dw 1
- dw -1
- dw 1
- dw -1
- dw 1
- dw -1
-align 16
-_7:
- times 4 dd 7
-align 16
-_7w:
- times 8 dw 7
-align 16
-_14500:
- times 4 dd 14500
-align 16
-_7500:
- times 4 dd 7500
-align 16
-_12000:
- times 4 dd 12000
-align 16
-_51000:
- times 4 dd 51000
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/denoising_sse2.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/denoising_sse2.c
deleted file mode 100644
index 101d646ef43..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/denoising_sse2.c
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "vp8/encoder/denoising.h"
-#include "vp8/common/reconinter.h"
-#include "vpx/vpx_integer.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8_rtcd.h"
-
-#include <emmintrin.h>
-#include "vpx_ports/emmintrin_compat.h"
-
-/* Compute the sum of all pixel differences of this MB. */
-static INLINE unsigned int abs_sum_diff_16x1(__m128i acc_diff) {
- const __m128i k_1 = _mm_set1_epi16(1);
- const __m128i acc_diff_lo = _mm_srai_epi16(
- _mm_unpacklo_epi8(acc_diff, acc_diff), 8);
- const __m128i acc_diff_hi = _mm_srai_epi16(
- _mm_unpackhi_epi8(acc_diff, acc_diff), 8);
- const __m128i acc_diff_16 = _mm_add_epi16(acc_diff_lo, acc_diff_hi);
- const __m128i hg_fe_dc_ba = _mm_madd_epi16(acc_diff_16, k_1);
- const __m128i hgfe_dcba = _mm_add_epi32(hg_fe_dc_ba,
- _mm_srli_si128(hg_fe_dc_ba, 8));
- const __m128i hgfedcba = _mm_add_epi32(hgfe_dcba,
- _mm_srli_si128(hgfe_dcba, 4));
- unsigned int sum_diff = abs(_mm_cvtsi128_si32(hgfedcba));
-
- return sum_diff;
-}
-
-int vp8_denoiser_filter_sse2(unsigned char *mc_running_avg_y,
- int mc_avg_y_stride,
- unsigned char *running_avg_y, int avg_y_stride,
- unsigned char *sig, int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising)
-{
- unsigned char *running_avg_y_start = running_avg_y;
- unsigned char *sig_start = sig;
- unsigned int sum_diff_thresh;
- int r;
- int shift_inc = (increase_denoising &&
- motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) ? 1 : 0;
- __m128i acc_diff = _mm_setzero_si128();
- const __m128i k_0 = _mm_setzero_si128();
- const __m128i k_4 = _mm_set1_epi8(4 + shift_inc);
- const __m128i k_8 = _mm_set1_epi8(8);
- const __m128i k_16 = _mm_set1_epi8(16);
- /* Modify each level's adjustment according to motion_magnitude. */
- const __m128i l3 = _mm_set1_epi8(
- (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD) ?
- 7 + shift_inc : 6);
- /* Difference between level 3 and level 2 is 2. */
- const __m128i l32 = _mm_set1_epi8(2);
- /* Difference between level 2 and level 1 is 1. */
- const __m128i l21 = _mm_set1_epi8(1);
-
- for (r = 0; r < 16; ++r)
- {
- /* Calculate differences */
- const __m128i v_sig = _mm_loadu_si128((__m128i *)(&sig[0]));
- const __m128i v_mc_running_avg_y = _mm_loadu_si128(
- (__m128i *)(&mc_running_avg_y[0]));
- __m128i v_running_avg_y;
- const __m128i pdiff = _mm_subs_epu8(v_mc_running_avg_y, v_sig);
- const __m128i ndiff = _mm_subs_epu8(v_sig, v_mc_running_avg_y);
- /* Obtain the sign. FF if diff is negative. */
- const __m128i diff_sign = _mm_cmpeq_epi8(pdiff, k_0);
- /* Clamp absolute difference to 16 to be used to get mask. Doing this
- * allows us to use _mm_cmpgt_epi8, which operates on signed byte. */
- const __m128i clamped_absdiff = _mm_min_epu8(
- _mm_or_si128(pdiff, ndiff), k_16);
- /* Get masks for l2 l1 and l0 adjustments */
- const __m128i mask2 = _mm_cmpgt_epi8(k_16, clamped_absdiff);
- const __m128i mask1 = _mm_cmpgt_epi8(k_8, clamped_absdiff);
- const __m128i mask0 = _mm_cmpgt_epi8(k_4, clamped_absdiff);
- /* Get adjustments for l2, l1, and l0 */
- __m128i adj2 = _mm_and_si128(mask2, l32);
- const __m128i adj1 = _mm_and_si128(mask1, l21);
- const __m128i adj0 = _mm_and_si128(mask0, clamped_absdiff);
- __m128i adj, padj, nadj;
-
- /* Combine the adjustments and get absolute adjustments. */
- adj2 = _mm_add_epi8(adj2, adj1);
- adj = _mm_sub_epi8(l3, adj2);
- adj = _mm_andnot_si128(mask0, adj);
- adj = _mm_or_si128(adj, adj0);
-
- /* Restore the sign and get positive and negative adjustments. */
- padj = _mm_andnot_si128(diff_sign, adj);
- nadj = _mm_and_si128(diff_sign, adj);
-
- /* Calculate filtered value. */
- v_running_avg_y = _mm_adds_epu8(v_sig, padj);
- v_running_avg_y = _mm_subs_epu8(v_running_avg_y, nadj);
- _mm_storeu_si128((__m128i *)running_avg_y, v_running_avg_y);
-
- /* Adjustments <=7, and each element in acc_diff can fit in signed
- * char.
- */
- acc_diff = _mm_adds_epi8(acc_diff, padj);
- acc_diff = _mm_subs_epi8(acc_diff, nadj);
-
- /* Update pointers for next iteration. */
- sig += sig_stride;
- mc_running_avg_y += mc_avg_y_stride;
- running_avg_y += avg_y_stride;
- }
-
- {
- /* Compute the sum of all pixel differences of this MB. */
- unsigned int abs_sum_diff = abs_sum_diff_16x1(acc_diff);
- sum_diff_thresh = SUM_DIFF_THRESHOLD;
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH;
- if (abs_sum_diff > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising),
- // check if we can still apply some (weaker) temporal filtering to
- // this block, that would otherwise not be denoised at all. Simplest
- // is to apply an additional adjustment to running_avg_y to bring it
- // closer to sig. The adjustment is capped by a maximum delta, and
- // chosen such that in most cases the resulting sum_diff will be
- // within the acceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over the
- // threshold.
- int delta = ((abs_sum_diff - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- const __m128i k_delta = _mm_set1_epi8(delta);
- sig -= sig_stride * 16;
- mc_running_avg_y -= mc_avg_y_stride * 16;
- running_avg_y -= avg_y_stride * 16;
- for (r = 0; r < 16; ++r) {
- __m128i v_running_avg_y =
- _mm_loadu_si128((__m128i *)(&running_avg_y[0]));
- // Calculate differences.
- const __m128i v_sig = _mm_loadu_si128((__m128i *)(&sig[0]));
- const __m128i v_mc_running_avg_y =
- _mm_loadu_si128((__m128i *)(&mc_running_avg_y[0]));
- const __m128i pdiff = _mm_subs_epu8(v_mc_running_avg_y, v_sig);
- const __m128i ndiff = _mm_subs_epu8(v_sig, v_mc_running_avg_y);
- // Obtain the sign. FF if diff is negative.
- const __m128i diff_sign = _mm_cmpeq_epi8(pdiff, k_0);
- // Clamp absolute difference to delta to get the adjustment.
- const __m128i adj =
- _mm_min_epu8(_mm_or_si128(pdiff, ndiff), k_delta);
- // Restore the sign and get positive and negative adjustments.
- __m128i padj, nadj;
- padj = _mm_andnot_si128(diff_sign, adj);
- nadj = _mm_and_si128(diff_sign, adj);
- // Calculate filtered value.
- v_running_avg_y = _mm_subs_epu8(v_running_avg_y, padj);
- v_running_avg_y = _mm_adds_epu8(v_running_avg_y, nadj);
- _mm_storeu_si128((__m128i *)running_avg_y, v_running_avg_y);
-
- // Accumulate the adjustments.
- acc_diff = _mm_subs_epi8(acc_diff, padj);
- acc_diff = _mm_adds_epi8(acc_diff, nadj);
-
- // Update pointers for next iteration.
- sig += sig_stride;
- mc_running_avg_y += mc_avg_y_stride;
- running_avg_y += avg_y_stride;
- }
- abs_sum_diff = abs_sum_diff_16x1(acc_diff);
- if (abs_sum_diff > sum_diff_thresh) {
- return COPY_BLOCK;
- }
- } else {
- return COPY_BLOCK;
- }
- }
- }
-
- vp8_copy_mem16x16(running_avg_y_start, avg_y_stride, sig_start, sig_stride);
- return FILTER_BLOCK;
-}
-
-int vp8_denoiser_filter_uv_sse2(unsigned char *mc_running_avg,
- int mc_avg_stride,
- unsigned char *running_avg, int avg_stride,
- unsigned char *sig, int sig_stride,
- unsigned int motion_magnitude,
- int increase_denoising) {
- unsigned char *running_avg_start = running_avg;
- unsigned char *sig_start = sig;
- unsigned int sum_diff_thresh;
- int r;
- int shift_inc = (increase_denoising &&
- motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD_UV) ? 1 : 0;
- __m128i acc_diff = _mm_setzero_si128();
- const __m128i k_0 = _mm_setzero_si128();
- const __m128i k_4 = _mm_set1_epi8(4 + shift_inc);
- const __m128i k_8 = _mm_set1_epi8(8);
- const __m128i k_16 = _mm_set1_epi8(16);
- /* Modify each level's adjustment according to motion_magnitude. */
- const __m128i l3 = _mm_set1_epi8(
- (motion_magnitude <= MOTION_MAGNITUDE_THRESHOLD_UV) ?
- 7 + shift_inc : 6);
- /* Difference between level 3 and level 2 is 2. */
- const __m128i l32 = _mm_set1_epi8(2);
- /* Difference between level 2 and level 1 is 1. */
- const __m128i l21 = _mm_set1_epi8(1);
-
- {
- const __m128i k_1 = _mm_set1_epi16(1);
- __m128i vec_sum_block = _mm_setzero_si128();
-
- // Avoid denoising color signal if its close to average level.
- for (r = 0; r < 8; ++r) {
- const __m128i v_sig = _mm_loadl_epi64((__m128i *)(&sig[0]));
- const __m128i v_sig_unpack = _mm_unpacklo_epi8(v_sig, k_0);
- vec_sum_block = _mm_add_epi16(vec_sum_block, v_sig_unpack);
- sig += sig_stride;
- }
- sig -= sig_stride * 8;
- {
- const __m128i hg_fe_dc_ba = _mm_madd_epi16(vec_sum_block, k_1);
- const __m128i hgfe_dcba = _mm_add_epi32(hg_fe_dc_ba,
- _mm_srli_si128(hg_fe_dc_ba, 8));
- const __m128i hgfedcba = _mm_add_epi32(hgfe_dcba,
- _mm_srli_si128(hgfe_dcba, 4));
- const int sum_block = _mm_cvtsi128_si32(hgfedcba);
- if (abs(sum_block - (128 * 8 * 8)) < SUM_DIFF_FROM_AVG_THRESH_UV) {
- return COPY_BLOCK;
- }
- }
- }
-
- for (r = 0; r < 4; ++r) {
- /* Calculate differences */
- const __m128i v_sig_low = _mm_castpd_si128(
- _mm_load_sd((double *)(&sig[0])));
- const __m128i v_sig = _mm_castpd_si128(
- _mm_loadh_pd(_mm_castsi128_pd(v_sig_low),
- (double *)(&sig[sig_stride])));
- const __m128i v_mc_running_avg_low = _mm_castpd_si128(
- _mm_load_sd((double *)(&mc_running_avg[0])));
- const __m128i v_mc_running_avg = _mm_castpd_si128(
- _mm_loadh_pd(_mm_castsi128_pd(v_mc_running_avg_low),
- (double *)(&mc_running_avg[mc_avg_stride])));
- const __m128i pdiff = _mm_subs_epu8(v_mc_running_avg, v_sig);
- const __m128i ndiff = _mm_subs_epu8(v_sig, v_mc_running_avg);
- /* Obtain the sign. FF if diff is negative. */
- const __m128i diff_sign = _mm_cmpeq_epi8(pdiff, k_0);
- /* Clamp absolute difference to 16 to be used to get mask. Doing this
- * allows us to use _mm_cmpgt_epi8, which operates on signed byte. */
- const __m128i clamped_absdiff = _mm_min_epu8(
- _mm_or_si128(pdiff, ndiff), k_16);
- /* Get masks for l2 l1 and l0 adjustments */
- const __m128i mask2 = _mm_cmpgt_epi8(k_16, clamped_absdiff);
- const __m128i mask1 = _mm_cmpgt_epi8(k_8, clamped_absdiff);
- const __m128i mask0 = _mm_cmpgt_epi8(k_4, clamped_absdiff);
- /* Get adjustments for l2, l1, and l0 */
- __m128i adj2 = _mm_and_si128(mask2, l32);
- const __m128i adj1 = _mm_and_si128(mask1, l21);
- const __m128i adj0 = _mm_and_si128(mask0, clamped_absdiff);
- __m128i adj, padj, nadj;
- __m128i v_running_avg;
-
- /* Combine the adjustments and get absolute adjustments. */
- adj2 = _mm_add_epi8(adj2, adj1);
- adj = _mm_sub_epi8(l3, adj2);
- adj = _mm_andnot_si128(mask0, adj);
- adj = _mm_or_si128(adj, adj0);
-
- /* Restore the sign and get positive and negative adjustments. */
- padj = _mm_andnot_si128(diff_sign, adj);
- nadj = _mm_and_si128(diff_sign, adj);
-
- /* Calculate filtered value. */
- v_running_avg = _mm_adds_epu8(v_sig, padj);
- v_running_avg = _mm_subs_epu8(v_running_avg, nadj);
-
- _mm_storel_pd((double *)&running_avg[0],
- _mm_castsi128_pd(v_running_avg));
- _mm_storeh_pd((double *)&running_avg[avg_stride],
- _mm_castsi128_pd(v_running_avg));
-
- /* Adjustments <=7, and each element in acc_diff can fit in signed
- * char.
- */
- acc_diff = _mm_adds_epi8(acc_diff, padj);
- acc_diff = _mm_subs_epi8(acc_diff, nadj);
-
- /* Update pointers for next iteration. */
- sig += sig_stride * 2;
- mc_running_avg += mc_avg_stride * 2;
- running_avg += avg_stride * 2;
- }
-
- {
- unsigned int abs_sum_diff = abs_sum_diff_16x1(acc_diff);
- sum_diff_thresh = SUM_DIFF_THRESHOLD_UV;
- if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH_UV;
- if (abs_sum_diff > sum_diff_thresh) {
- // Before returning to copy the block (i.e., apply no denoising),
- // check if we can still apply some (weaker) temporal filtering to
- // this block, that would otherwise not be denoised at all. Simplest
- // is to apply an additional adjustment to running_avg_y to bring it
- // closer to sig. The adjustment is capped by a maximum delta, and
- // chosen such that in most cases the resulting sum_diff will be
- // within the acceptable range given by sum_diff_thresh.
-
- // The delta is set by the excess of absolute pixel diff over the
- // threshold.
- int delta = ((abs_sum_diff - sum_diff_thresh) >> 8) + 1;
- // Only apply the adjustment for max delta up to 3.
- if (delta < 4) {
- const __m128i k_delta = _mm_set1_epi8(delta);
- sig -= sig_stride * 8;
- mc_running_avg -= mc_avg_stride * 8;
- running_avg -= avg_stride * 8;
- for (r = 0; r < 4; ++r) {
- // Calculate differences.
- const __m128i v_sig_low = _mm_castpd_si128(
- _mm_load_sd((double *)(&sig[0])));
- const __m128i v_sig = _mm_castpd_si128(
- _mm_loadh_pd(_mm_castsi128_pd(v_sig_low),
- (double *)(&sig[sig_stride])));
- const __m128i v_mc_running_avg_low = _mm_castpd_si128(
- _mm_load_sd((double *)(&mc_running_avg[0])));
- const __m128i v_mc_running_avg = _mm_castpd_si128(
- _mm_loadh_pd(_mm_castsi128_pd(v_mc_running_avg_low),
- (double *)(&mc_running_avg[mc_avg_stride])));
- const __m128i pdiff = _mm_subs_epu8(v_mc_running_avg, v_sig);
- const __m128i ndiff = _mm_subs_epu8(v_sig, v_mc_running_avg);
- // Obtain the sign. FF if diff is negative.
- const __m128i diff_sign = _mm_cmpeq_epi8(pdiff, k_0);
- // Clamp absolute difference to delta to get the adjustment.
- const __m128i adj =
- _mm_min_epu8(_mm_or_si128(pdiff, ndiff), k_delta);
- // Restore the sign and get positive and negative adjustments.
- __m128i padj, nadj;
- const __m128i v_running_avg_low = _mm_castpd_si128(
- _mm_load_sd((double *)(&running_avg[0])));
- __m128i v_running_avg = _mm_castpd_si128(
- _mm_loadh_pd(_mm_castsi128_pd(v_running_avg_low),
- (double *)(&running_avg[avg_stride])));
- padj = _mm_andnot_si128(diff_sign, adj);
- nadj = _mm_and_si128(diff_sign, adj);
- // Calculate filtered value.
- v_running_avg = _mm_subs_epu8(v_running_avg, padj);
- v_running_avg = _mm_adds_epu8(v_running_avg, nadj);
-
- _mm_storel_pd((double *)&running_avg[0],
- _mm_castsi128_pd(v_running_avg));
- _mm_storeh_pd((double *)&running_avg[avg_stride],
- _mm_castsi128_pd(v_running_avg));
-
- // Accumulate the adjustments.
- acc_diff = _mm_subs_epi8(acc_diff, padj);
- acc_diff = _mm_adds_epi8(acc_diff, nadj);
-
- // Update pointers for next iteration.
- sig += sig_stride * 2;
- mc_running_avg += mc_avg_stride * 2;
- running_avg += avg_stride * 2;
- }
- abs_sum_diff = abs_sum_diff_16x1(acc_diff);
- if (abs_sum_diff > sum_diff_thresh) {
- return COPY_BLOCK;
- }
- } else {
- return COPY_BLOCK;
- }
- }
- }
-
- vp8_copy_mem8x8(running_avg_start, avg_stride, sig_start, sig_stride);
- return FILTER_BLOCK;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/encodeopt.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/encodeopt.asm
deleted file mode 100644
index fe26b18e561..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/encodeopt.asm
+++ /dev/null
@@ -1,386 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;int vp8_block_error_xmm(short *coeff_ptr, short *dcoef_ptr)
-global sym(vp8_block_error_xmm) PRIVATE
-sym(vp8_block_error_xmm):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 2
- push rsi
- push rdi
- ; end prologue
-
- mov rsi, arg(0) ;coeff_ptr
- mov rdi, arg(1) ;dcoef_ptr
-
- movdqa xmm0, [rsi]
- movdqa xmm1, [rdi]
-
- movdqa xmm2, [rsi+16]
- movdqa xmm3, [rdi+16]
-
- psubw xmm0, xmm1
- psubw xmm2, xmm3
-
- pmaddwd xmm0, xmm0
- pmaddwd xmm2, xmm2
-
- paddd xmm0, xmm2
-
- pxor xmm5, xmm5
- movdqa xmm1, xmm0
-
- punpckldq xmm0, xmm5
- punpckhdq xmm1, xmm5
-
- paddd xmm0, xmm1
- movdqa xmm1, xmm0
-
- psrldq xmm0, 8
- paddd xmm0, xmm1
-
- movq rax, xmm0
-
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;int vp8_block_error_mmx(short *coeff_ptr, short *dcoef_ptr)
-global sym(vp8_block_error_mmx) PRIVATE
-sym(vp8_block_error_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 2
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;coeff_ptr
- pxor mm7, mm7
-
- mov rdi, arg(1) ;dcoef_ptr
- movq mm3, [rsi]
-
- movq mm4, [rdi]
- movq mm5, [rsi+8]
-
- movq mm6, [rdi+8]
- pxor mm1, mm1 ; from movd mm1, dc ; dc =0
-
- movq mm2, mm7
- psubw mm5, mm6
-
- por mm1, mm2
- pmaddwd mm5, mm5
-
- pcmpeqw mm1, mm7
- psubw mm3, mm4
-
- pand mm1, mm3
- pmaddwd mm1, mm1
-
- paddd mm1, mm5
- movq mm3, [rsi+16]
-
- movq mm4, [rdi+16]
- movq mm5, [rsi+24]
-
- movq mm6, [rdi+24]
- psubw mm5, mm6
-
- pmaddwd mm5, mm5
- psubw mm3, mm4
-
- pmaddwd mm3, mm3
- paddd mm3, mm5
-
- paddd mm1, mm3
- movq mm0, mm1
-
- psrlq mm1, 32
- paddd mm0, mm1
-
- movq rax, mm0
-
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;int vp8_mbblock_error_mmx_impl(short *coeff_ptr, short *dcoef_ptr, int dc);
-global sym(vp8_mbblock_error_mmx_impl) PRIVATE
-sym(vp8_mbblock_error_mmx_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 3
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;coeff_ptr
- pxor mm7, mm7
-
- mov rdi, arg(1) ;dcoef_ptr
- pxor mm2, mm2
-
- movd mm1, dword ptr arg(2) ;dc
- por mm1, mm2
-
- pcmpeqw mm1, mm7
- mov rcx, 16
-
-.mberror_loop_mmx:
- movq mm3, [rsi]
- movq mm4, [rdi]
-
- movq mm5, [rsi+8]
- movq mm6, [rdi+8]
-
-
- psubw mm5, mm6
- pmaddwd mm5, mm5
-
- psubw mm3, mm4
- pand mm3, mm1
-
- pmaddwd mm3, mm3
- paddd mm2, mm5
-
- paddd mm2, mm3
- movq mm3, [rsi+16]
-
- movq mm4, [rdi+16]
- movq mm5, [rsi+24]
-
- movq mm6, [rdi+24]
- psubw mm5, mm6
-
- pmaddwd mm5, mm5
- psubw mm3, mm4
-
- pmaddwd mm3, mm3
- paddd mm2, mm5
-
- paddd mm2, mm3
- add rsi, 32
-
- add rdi, 32
- sub rcx, 1
-
- jnz .mberror_loop_mmx
-
- movq mm0, mm2
- psrlq mm2, 32
-
- paddd mm0, mm2
- movq rax, mm0
-
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;int vp8_mbblock_error_xmm_impl(short *coeff_ptr, short *dcoef_ptr, int dc);
-global sym(vp8_mbblock_error_xmm_impl) PRIVATE
-sym(vp8_mbblock_error_xmm_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 3
- SAVE_XMM 6
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;coeff_ptr
- pxor xmm6, xmm6
-
- mov rdi, arg(1) ;dcoef_ptr
- pxor xmm4, xmm4
-
- movd xmm5, dword ptr arg(2) ;dc
- por xmm5, xmm4
-
- pcmpeqw xmm5, xmm6
- mov rcx, 16
-
-.mberror_loop:
- movdqa xmm0, [rsi]
- movdqa xmm1, [rdi]
-
- movdqa xmm2, [rsi+16]
- movdqa xmm3, [rdi+16]
-
-
- psubw xmm2, xmm3
- pmaddwd xmm2, xmm2
-
- psubw xmm0, xmm1
- pand xmm0, xmm5
-
- pmaddwd xmm0, xmm0
- add rsi, 32
-
- add rdi, 32
-
- sub rcx, 1
- paddd xmm4, xmm2
-
- paddd xmm4, xmm0
- jnz .mberror_loop
-
- movdqa xmm0, xmm4
- punpckldq xmm0, xmm6
-
- punpckhdq xmm4, xmm6
- paddd xmm0, xmm4
-
- movdqa xmm1, xmm0
- psrldq xmm0, 8
-
- paddd xmm0, xmm1
- movq rax, xmm0
-
- pop rdi
- pop rsi
- ; begin epilog
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;int vp8_mbuverror_mmx_impl(short *s_ptr, short *d_ptr);
-global sym(vp8_mbuverror_mmx_impl) PRIVATE
-sym(vp8_mbuverror_mmx_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 2
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;s_ptr
- mov rdi, arg(1) ;d_ptr
-
- mov rcx, 16
- pxor mm7, mm7
-
-.mbuverror_loop_mmx:
-
- movq mm1, [rsi]
- movq mm2, [rdi]
-
- psubw mm1, mm2
- pmaddwd mm1, mm1
-
-
- movq mm3, [rsi+8]
- movq mm4, [rdi+8]
-
- psubw mm3, mm4
- pmaddwd mm3, mm3
-
-
- paddd mm7, mm1
- paddd mm7, mm3
-
-
- add rsi, 16
- add rdi, 16
-
- dec rcx
- jnz .mbuverror_loop_mmx
-
- movq mm0, mm7
- psrlq mm7, 32
-
- paddd mm0, mm7
- movq rax, mm0
-
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;int vp8_mbuverror_xmm_impl(short *s_ptr, short *d_ptr);
-global sym(vp8_mbuverror_xmm_impl) PRIVATE
-sym(vp8_mbuverror_xmm_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 2
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;s_ptr
- mov rdi, arg(1) ;d_ptr
-
- mov rcx, 16
- pxor xmm3, xmm3
-
-.mbuverror_loop:
-
- movdqa xmm1, [rsi]
- movdqa xmm2, [rdi]
-
- psubw xmm1, xmm2
- pmaddwd xmm1, xmm1
-
- paddd xmm3, xmm1
-
- add rsi, 16
- add rdi, 16
-
- dec rcx
- jnz .mbuverror_loop
-
- pxor xmm0, xmm0
- movdqa xmm1, xmm3
-
- movdqa xmm2, xmm1
- punpckldq xmm1, xmm0
-
- punpckhdq xmm2, xmm0
- paddd xmm1, xmm2
-
- movdqa xmm2, xmm1
-
- psrldq xmm1, 8
- paddd xmm1, xmm2
-
- movq rax, xmm1
-
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/fwalsh_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/fwalsh_sse2.asm
deleted file mode 100644
index f4989279f48..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/fwalsh_sse2.asm
+++ /dev/null
@@ -1,164 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;void vp8_short_walsh4x4_sse2(short *input, short *output, int pitch)
-global sym(vp8_short_walsh4x4_sse2) PRIVATE
-sym(vp8_short_walsh4x4_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 3
- SAVE_XMM 7
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- mov rsi, arg(0) ; input
- mov rdi, arg(1) ; output
- movsxd rdx, dword ptr arg(2) ; pitch
-
- ; first for loop
- movq xmm0, MMWORD PTR [rsi] ; load input
- movq xmm1, MMWORD PTR [rsi + rdx]
- lea rsi, [rsi + rdx*2]
- movq xmm2, MMWORD PTR [rsi]
- movq xmm3, MMWORD PTR [rsi + rdx]
-
- punpcklwd xmm0, xmm1
- punpcklwd xmm2, xmm3
-
- movdqa xmm1, xmm0
- punpckldq xmm0, xmm2 ; ip[1] ip[0]
- punpckhdq xmm1, xmm2 ; ip[3] ip[2]
-
- movdqa xmm2, xmm0
- paddw xmm0, xmm1
- psubw xmm2, xmm1
-
- psllw xmm0, 2 ; d1 a1
- psllw xmm2, 2 ; c1 b1
-
- movdqa xmm1, xmm0
- punpcklqdq xmm0, xmm2 ; b1 a1
- punpckhqdq xmm1, xmm2 ; c1 d1
-
- pxor xmm6, xmm6
- movq xmm6, xmm0
- pxor xmm7, xmm7
- pcmpeqw xmm7, xmm6
- paddw xmm7, [GLOBAL(c1)]
-
- movdqa xmm2, xmm0
- paddw xmm0, xmm1 ; b1+c1 a1+d1
- psubw xmm2, xmm1 ; b1-c1 a1-d1
- paddw xmm0, xmm7 ; b1+c1 a1+d1+(a1!=0)
-
- ; second for loop
- ; input: 13 9 5 1 12 8 4 0 (xmm0)
- ; 14 10 6 2 15 11 7 3 (xmm2)
- ; after shuffle:
- ; 13 5 9 1 12 4 8 0 (xmm0)
- ; 14 6 10 2 15 7 11 3 (xmm1)
- pshuflw xmm3, xmm0, 0xd8
- pshufhw xmm0, xmm3, 0xd8
- pshuflw xmm3, xmm2, 0xd8
- pshufhw xmm1, xmm3, 0xd8
-
- movdqa xmm2, xmm0
- pmaddwd xmm0, [GLOBAL(c1)] ; d11 a11 d10 a10
- pmaddwd xmm2, [GLOBAL(cn1)] ; c11 b11 c10 b10
- movdqa xmm3, xmm1
- pmaddwd xmm1, [GLOBAL(c1)] ; d12 a12 d13 a13
- pmaddwd xmm3, [GLOBAL(cn1)] ; c12 b12 c13 b13
-
- pshufd xmm4, xmm0, 0xd8 ; d11 d10 a11 a10
- pshufd xmm5, xmm2, 0xd8 ; c11 c10 b11 b10
- pshufd xmm6, xmm1, 0x72 ; d13 d12 a13 a12
- pshufd xmm7, xmm3, 0x72 ; c13 c12 b13 b12
-
- movdqa xmm0, xmm4
- punpcklqdq xmm0, xmm5 ; b11 b10 a11 a10
- punpckhqdq xmm4, xmm5 ; c11 c10 d11 d10
- movdqa xmm1, xmm6
- punpcklqdq xmm1, xmm7 ; b13 b12 a13 a12
- punpckhqdq xmm6, xmm7 ; c13 c12 d13 d12
-
- movdqa xmm2, xmm0
- paddd xmm0, xmm4 ; b21 b20 a21 a20
- psubd xmm2, xmm4 ; c21 c20 d21 d20
- movdqa xmm3, xmm1
- paddd xmm1, xmm6 ; b23 b22 a23 a22
- psubd xmm3, xmm6 ; c23 c22 d23 d22
-
- pxor xmm4, xmm4
- movdqa xmm5, xmm4
- pcmpgtd xmm4, xmm0
- pcmpgtd xmm5, xmm2
- pand xmm4, [GLOBAL(cd1)]
- pand xmm5, [GLOBAL(cd1)]
-
- pxor xmm6, xmm6
- movdqa xmm7, xmm6
- pcmpgtd xmm6, xmm1
- pcmpgtd xmm7, xmm3
- pand xmm6, [GLOBAL(cd1)]
- pand xmm7, [GLOBAL(cd1)]
-
- paddd xmm0, xmm4
- paddd xmm2, xmm5
- paddd xmm0, [GLOBAL(cd3)]
- paddd xmm2, [GLOBAL(cd3)]
- paddd xmm1, xmm6
- paddd xmm3, xmm7
- paddd xmm1, [GLOBAL(cd3)]
- paddd xmm3, [GLOBAL(cd3)]
-
- psrad xmm0, 3
- psrad xmm1, 3
- psrad xmm2, 3
- psrad xmm3, 3
- movdqa xmm4, xmm0
- punpcklqdq xmm0, xmm1 ; a23 a22 a21 a20
- punpckhqdq xmm4, xmm1 ; b23 b22 b21 b20
- movdqa xmm5, xmm2
- punpckhqdq xmm2, xmm3 ; c23 c22 c21 c20
- punpcklqdq xmm5, xmm3 ; d23 d22 d21 d20
-
- packssdw xmm0, xmm4 ; b23 b22 b21 b20 a23 a22 a21 a20
- packssdw xmm2, xmm5 ; d23 d22 d21 d20 c23 c22 c21 c20
-
- movdqa XMMWORD PTR [rdi], xmm0
- movdqa XMMWORD PTR [rdi + 16], xmm2
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_GOT
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
-
-SECTION_RODATA
-align 16
-c1:
- dw 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001
-align 16
-cn1:
- dw 0x0001, 0xffff, 0x0001, 0xffff, 0x0001, 0xffff, 0x0001, 0xffff
-align 16
-cd1:
- dd 0x00000001, 0x00000001, 0x00000001, 0x00000001
-align 16
-cd3:
- dd 0x00000003, 0x00000003, 0x00000003, 0x00000003
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_mmx.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_mmx.asm
deleted file mode 100644
index 2864ce16d99..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_mmx.asm
+++ /dev/null
@@ -1,286 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;int vp8_fast_quantize_b_impl_mmx(short *coeff_ptr, short *zbin_ptr,
-; short *qcoeff_ptr,short *dequant_ptr,
-; short *scan_mask, short *round_ptr,
-; short *quant_ptr, short *dqcoeff_ptr);
-global sym(vp8_fast_quantize_b_impl_mmx) PRIVATE
-sym(vp8_fast_quantize_b_impl_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 8
- push rsi
- push rdi
- ; end prolog
-
-
- mov rsi, arg(0) ;coeff_ptr
- movq mm0, [rsi]
-
- mov rax, arg(1) ;zbin_ptr
- movq mm1, [rax]
-
- movq mm3, mm0
- psraw mm0, 15
-
- pxor mm3, mm0
- psubw mm3, mm0 ; abs
-
- movq mm2, mm3
- pcmpgtw mm1, mm2
-
- pandn mm1, mm2
- movq mm3, mm1
-
- mov rdx, arg(6) ;quant_ptr
- movq mm1, [rdx]
-
- mov rcx, arg(5) ;round_ptr
- movq mm2, [rcx]
-
- paddw mm3, mm2
- pmulhuw mm3, mm1
-
- pxor mm3, mm0
- psubw mm3, mm0 ;gain the sign back
-
- mov rdi, arg(2) ;qcoeff_ptr
- movq mm0, mm3
-
- movq [rdi], mm3
-
- mov rax, arg(3) ;dequant_ptr
- movq mm2, [rax]
-
- pmullw mm3, mm2
- mov rax, arg(7) ;dqcoeff_ptr
-
- movq [rax], mm3
-
- ; next 8
- movq mm4, [rsi+8]
-
- mov rax, arg(1) ;zbin_ptr
- movq mm5, [rax+8]
-
- movq mm7, mm4
- psraw mm4, 15
-
- pxor mm7, mm4
- psubw mm7, mm4 ; abs
-
- movq mm6, mm7
- pcmpgtw mm5, mm6
-
- pandn mm5, mm6
- movq mm7, mm5
-
- movq mm5, [rdx+8]
- movq mm6, [rcx+8]
-
- paddw mm7, mm6
- pmulhuw mm7, mm5
-
- pxor mm7, mm4
- psubw mm7, mm4;gain the sign back
-
- mov rdi, arg(2) ;qcoeff_ptr
-
- movq mm1, mm7
- movq [rdi+8], mm7
-
- mov rax, arg(3) ;dequant_ptr
- movq mm6, [rax+8]
-
- pmullw mm7, mm6
- mov rax, arg(7) ;dqcoeff_ptr
-
- movq [rax+8], mm7
-
-
- ; next 8
- movq mm4, [rsi+16]
-
- mov rax, arg(1) ;zbin_ptr
- movq mm5, [rax+16]
-
- movq mm7, mm4
- psraw mm4, 15
-
- pxor mm7, mm4
- psubw mm7, mm4 ; abs
-
- movq mm6, mm7
- pcmpgtw mm5, mm6
-
- pandn mm5, mm6
- movq mm7, mm5
-
- movq mm5, [rdx+16]
- movq mm6, [rcx+16]
-
- paddw mm7, mm6
- pmulhuw mm7, mm5
-
- pxor mm7, mm4
- psubw mm7, mm4;gain the sign back
-
- mov rdi, arg(2) ;qcoeff_ptr
-
- movq mm1, mm7
- movq [rdi+16], mm7
-
- mov rax, arg(3) ;dequant_ptr
- movq mm6, [rax+16]
-
- pmullw mm7, mm6
- mov rax, arg(7) ;dqcoeff_ptr
-
- movq [rax+16], mm7
-
-
- ; next 8
- movq mm4, [rsi+24]
-
- mov rax, arg(1) ;zbin_ptr
- movq mm5, [rax+24]
-
- movq mm7, mm4
- psraw mm4, 15
-
- pxor mm7, mm4
- psubw mm7, mm4 ; abs
-
- movq mm6, mm7
- pcmpgtw mm5, mm6
-
- pandn mm5, mm6
- movq mm7, mm5
-
- movq mm5, [rdx+24]
- movq mm6, [rcx+24]
-
- paddw mm7, mm6
- pmulhuw mm7, mm5
-
- pxor mm7, mm4
- psubw mm7, mm4;gain the sign back
-
- mov rdi, arg(2) ;qcoeff_ptr
-
- movq mm1, mm7
- movq [rdi+24], mm7
-
- mov rax, arg(3) ;dequant_ptr
- movq mm6, [rax+24]
-
- pmullw mm7, mm6
- mov rax, arg(7) ;dqcoeff_ptr
-
- movq [rax+24], mm7
-
-
-
- mov rdi, arg(4) ;scan_mask
- mov rsi, arg(2) ;qcoeff_ptr
-
- pxor mm5, mm5
- pxor mm7, mm7
-
- movq mm0, [rsi]
- movq mm1, [rsi+8]
-
- movq mm2, [rdi]
- movq mm3, [rdi+8];
-
- pcmpeqw mm0, mm7
- pcmpeqw mm1, mm7
-
- pcmpeqw mm6, mm6
- pxor mm0, mm6
-
- pxor mm1, mm6
- psrlw mm0, 15
-
- psrlw mm1, 15
- pmaddwd mm0, mm2
-
- pmaddwd mm1, mm3
- movq mm5, mm0
-
- paddd mm5, mm1
-
- movq mm0, [rsi+16]
- movq mm1, [rsi+24]
-
- movq mm2, [rdi+16]
- movq mm3, [rdi+24];
-
- pcmpeqw mm0, mm7
- pcmpeqw mm1, mm7
-
- pcmpeqw mm6, mm6
- pxor mm0, mm6
-
- pxor mm1, mm6
- psrlw mm0, 15
-
- psrlw mm1, 15
- pmaddwd mm0, mm2
-
- pmaddwd mm1, mm3
- paddd mm5, mm0
-
- paddd mm5, mm1
- movq mm0, mm5
-
- psrlq mm5, 32
- paddd mm0, mm5
-
- ; eob adjustment begins here
- movq rcx, mm0
- and rcx, 0xffff
-
- xor rdx, rdx
- sub rdx, rcx ; rdx=-rcx
-
- bsr rax, rcx
- inc rax
-
- sar rdx, 31
- and rax, rdx
- ; Substitute the sse assembly for the old mmx mixed assembly/C. The
- ; following is kept as reference
- ; movq rcx, mm0
- ; bsr rax, rcx
- ;
- ; mov eob, rax
- ; mov eee, rcx
- ;
- ;if(eee==0)
- ;{
- ; eob=-1;
- ;}
- ;else if(eee<0)
- ;{
- ; eob=15;
- ;}
- ;d->eob = eob+1;
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse2.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse2.c
deleted file mode 100644
index b4e92e04b22..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse2.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "vpx_ports/x86.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/encoder/block.h"
-#include "vp8/common/entropy.h" /* vp8_default_inv_zig_zag */
-
-#include <mmintrin.h> /* MMX */
-#include <xmmintrin.h> /* SSE */
-#include <emmintrin.h> /* SSE2 */
-
-#define SELECT_EOB(i, z) \
- do { \
- short boost = *zbin_boost_ptr; \
- int cmp = (x[z] < boost) | (y[z] == 0); \
- zbin_boost_ptr++; \
- if (cmp) \
- break; \
- qcoeff_ptr[z] = y[z]; \
- eob = i; \
- zbin_boost_ptr = b->zrun_zbin_boost; \
- } while (0)
-
-void vp8_regular_quantize_b_sse2(BLOCK *b, BLOCKD *d)
-{
- char eob = 0;
- short *zbin_boost_ptr;
- short *qcoeff_ptr = d->qcoeff;
- DECLARE_ALIGNED(16, short, x[16]);
- DECLARE_ALIGNED(16, short, y[16]);
-
- __m128i sz0, x0, sz1, x1, y0, y1, x_minus_zbin0, x_minus_zbin1;
- __m128i quant_shift0 = _mm_load_si128((__m128i *)(b->quant_shift));
- __m128i quant_shift1 = _mm_load_si128((__m128i *)(b->quant_shift + 8));
- __m128i z0 = _mm_load_si128((__m128i *)(b->coeff));
- __m128i z1 = _mm_load_si128((__m128i *)(b->coeff+8));
- __m128i zbin_extra = _mm_cvtsi32_si128(b->zbin_extra);
- __m128i zbin0 = _mm_load_si128((__m128i *)(b->zbin));
- __m128i zbin1 = _mm_load_si128((__m128i *)(b->zbin + 8));
- __m128i round0 = _mm_load_si128((__m128i *)(b->round));
- __m128i round1 = _mm_load_si128((__m128i *)(b->round + 8));
- __m128i quant0 = _mm_load_si128((__m128i *)(b->quant));
- __m128i quant1 = _mm_load_si128((__m128i *)(b->quant + 8));
- __m128i dequant0 = _mm_load_si128((__m128i *)(d->dequant));
- __m128i dequant1 = _mm_load_si128((__m128i *)(d->dequant + 8));
-
- memset(qcoeff_ptr, 0, 32);
-
- /* Duplicate to all lanes. */
- zbin_extra = _mm_shufflelo_epi16(zbin_extra, 0);
- zbin_extra = _mm_unpacklo_epi16(zbin_extra, zbin_extra);
-
- /* Sign of z: z >> 15 */
- sz0 = _mm_srai_epi16(z0, 15);
- sz1 = _mm_srai_epi16(z1, 15);
-
- /* x = abs(z): (z ^ sz) - sz */
- x0 = _mm_xor_si128(z0, sz0);
- x1 = _mm_xor_si128(z1, sz1);
- x0 = _mm_sub_epi16(x0, sz0);
- x1 = _mm_sub_epi16(x1, sz1);
-
- /* zbin[] + zbin_extra */
- zbin0 = _mm_add_epi16(zbin0, zbin_extra);
- zbin1 = _mm_add_epi16(zbin1, zbin_extra);
-
- /* In C x is compared to zbin where zbin = zbin[] + boost + extra. Rebalance
- * the equation because boost is the only value which can change:
- * x - (zbin[] + extra) >= boost */
- x_minus_zbin0 = _mm_sub_epi16(x0, zbin0);
- x_minus_zbin1 = _mm_sub_epi16(x1, zbin1);
-
- _mm_store_si128((__m128i *)(x), x_minus_zbin0);
- _mm_store_si128((__m128i *)(x + 8), x_minus_zbin1);
-
- /* All the remaining calculations are valid whether they are done now with
- * simd or later inside the loop one at a time. */
- x0 = _mm_add_epi16(x0, round0);
- x1 = _mm_add_epi16(x1, round1);
-
- y0 = _mm_mulhi_epi16(x0, quant0);
- y1 = _mm_mulhi_epi16(x1, quant1);
-
- y0 = _mm_add_epi16(y0, x0);
- y1 = _mm_add_epi16(y1, x1);
-
- /* Instead of shifting each value independently we convert the scaling
- * factor with 1 << (16 - shift) so we can use multiply/return high half. */
- y0 = _mm_mulhi_epi16(y0, quant_shift0);
- y1 = _mm_mulhi_epi16(y1, quant_shift1);
-
- /* Return the sign: (y ^ sz) - sz */
- y0 = _mm_xor_si128(y0, sz0);
- y1 = _mm_xor_si128(y1, sz1);
- y0 = _mm_sub_epi16(y0, sz0);
- y1 = _mm_sub_epi16(y1, sz1);
-
- _mm_store_si128((__m128i *)(y), y0);
- _mm_store_si128((__m128i *)(y + 8), y1);
-
- zbin_boost_ptr = b->zrun_zbin_boost;
-
- /* The loop gets unrolled anyway. Avoid the vp8_default_zig_zag1d lookup. */
- SELECT_EOB(1, 0);
- SELECT_EOB(2, 1);
- SELECT_EOB(3, 4);
- SELECT_EOB(4, 8);
- SELECT_EOB(5, 5);
- SELECT_EOB(6, 2);
- SELECT_EOB(7, 3);
- SELECT_EOB(8, 6);
- SELECT_EOB(9, 9);
- SELECT_EOB(10, 12);
- SELECT_EOB(11, 13);
- SELECT_EOB(12, 10);
- SELECT_EOB(13, 7);
- SELECT_EOB(14, 11);
- SELECT_EOB(15, 14);
- SELECT_EOB(16, 15);
-
- y0 = _mm_load_si128((__m128i *)(d->qcoeff));
- y1 = _mm_load_si128((__m128i *)(d->qcoeff + 8));
-
- /* dqcoeff = qcoeff * dequant */
- y0 = _mm_mullo_epi16(y0, dequant0);
- y1 = _mm_mullo_epi16(y1, dequant1);
-
- _mm_store_si128((__m128i *)(d->dqcoeff), y0);
- _mm_store_si128((__m128i *)(d->dqcoeff + 8), y1);
-
- *d->eob = eob;
-}
-
-void vp8_fast_quantize_b_sse2(BLOCK *b, BLOCKD *d)
-{
- __m128i z0 = _mm_load_si128((__m128i *)(b->coeff));
- __m128i z1 = _mm_load_si128((__m128i *)(b->coeff + 8));
- __m128i round0 = _mm_load_si128((__m128i *)(b->round));
- __m128i round1 = _mm_load_si128((__m128i *)(b->round + 8));
- __m128i quant_fast0 = _mm_load_si128((__m128i *)(b->quant_fast));
- __m128i quant_fast1 = _mm_load_si128((__m128i *)(b->quant_fast + 8));
- __m128i dequant0 = _mm_load_si128((__m128i *)(d->dequant));
- __m128i dequant1 = _mm_load_si128((__m128i *)(d->dequant + 8));
- __m128i inv_zig_zag0 = _mm_load_si128((const __m128i *)(vp8_default_inv_zig_zag));
- __m128i inv_zig_zag1 = _mm_load_si128((const __m128i *)(vp8_default_inv_zig_zag + 8));
-
- __m128i sz0, sz1, x0, x1, y0, y1, xdq0, xdq1, zeros, ones;
-
- /* sign of z: z >> 15 */
- sz0 = _mm_srai_epi16(z0, 15);
- sz1 = _mm_srai_epi16(z1, 15);
-
- /* x = abs(z): (z ^ sz) - sz */
- x0 = _mm_xor_si128(z0, sz0);
- x1 = _mm_xor_si128(z1, sz1);
- x0 = _mm_sub_epi16(x0, sz0);
- x1 = _mm_sub_epi16(x1, sz1);
-
- /* x += round */
- x0 = _mm_add_epi16(x0, round0);
- x1 = _mm_add_epi16(x1, round1);
-
- /* y = (x * quant) >> 16 */
- y0 = _mm_mulhi_epi16(x0, quant_fast0);
- y1 = _mm_mulhi_epi16(x1, quant_fast1);
-
- /* x = abs(y) = (y ^ sz) - sz */
- y0 = _mm_xor_si128(y0, sz0);
- y1 = _mm_xor_si128(y1, sz1);
- x0 = _mm_sub_epi16(y0, sz0);
- x1 = _mm_sub_epi16(y1, sz1);
-
- /* qcoeff = x */
- _mm_store_si128((__m128i *)(d->qcoeff), x0);
- _mm_store_si128((__m128i *)(d->qcoeff + 8), x1);
-
- /* x * dequant */
- xdq0 = _mm_mullo_epi16(x0, dequant0);
- xdq1 = _mm_mullo_epi16(x1, dequant1);
-
- /* dqcoeff = x * dequant */
- _mm_store_si128((__m128i *)(d->dqcoeff), xdq0);
- _mm_store_si128((__m128i *)(d->dqcoeff + 8), xdq1);
-
- /* build a mask for the zig zag */
- zeros = _mm_setzero_si128();
-
- x0 = _mm_cmpeq_epi16(x0, zeros);
- x1 = _mm_cmpeq_epi16(x1, zeros);
-
- ones = _mm_cmpeq_epi16(zeros, zeros);
-
- x0 = _mm_xor_si128(x0, ones);
- x1 = _mm_xor_si128(x1, ones);
-
- x0 = _mm_and_si128(x0, inv_zig_zag0);
- x1 = _mm_and_si128(x1, inv_zig_zag1);
-
- x0 = _mm_max_epi16(x0, x1);
-
- /* now down to 8 */
- x1 = _mm_shuffle_epi32(x0, 0xE); // 0b00001110
-
- x0 = _mm_max_epi16(x0, x1);
-
- /* only 4 left */
- x1 = _mm_shufflelo_epi16(x0, 0xE); // 0b00001110
-
- x0 = _mm_max_epi16(x0, x1);
-
- /* okay, just 2! */
- x1 = _mm_shufflelo_epi16(x0, 0x1); // 0b00000001
-
- x0 = _mm_max_epi16(x0, x1);
-
- *d->eob = 0xFF & _mm_cvtsi128_si32(x0);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse4.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse4.c
deleted file mode 100644
index 601dd23a2f7..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_sse4.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include <smmintrin.h> /* SSE4.1 */
-
-#include "./vp8_rtcd.h"
-#include "vp8/encoder/block.h"
-#include "vp8/common/entropy.h" /* vp8_default_inv_zig_zag */
-
-#define SELECT_EOB(i, z, x, y, q) \
- do { \
- short boost = *zbin_boost_ptr; \
- short x_z = _mm_extract_epi16(x, z); \
- short y_z = _mm_extract_epi16(y, z); \
- int cmp = (x_z < boost) | (y_z == 0); \
- zbin_boost_ptr++; \
- if (cmp) \
- break; \
- q = _mm_insert_epi16(q, y_z, z); \
- eob = i; \
- zbin_boost_ptr = b->zrun_zbin_boost; \
- } while (0)
-
-void vp8_regular_quantize_b_sse4_1(BLOCK *b, BLOCKD *d) {
- char eob = 0;
- short *zbin_boost_ptr = b->zrun_zbin_boost;
-
- __m128i sz0, x0, sz1, x1, y0, y1, x_minus_zbin0, x_minus_zbin1,
- dqcoeff0, dqcoeff1;
- __m128i quant_shift0 = _mm_load_si128((__m128i *)(b->quant_shift));
- __m128i quant_shift1 = _mm_load_si128((__m128i *)(b->quant_shift + 8));
- __m128i z0 = _mm_load_si128((__m128i *)(b->coeff));
- __m128i z1 = _mm_load_si128((__m128i *)(b->coeff+8));
- __m128i zbin_extra = _mm_cvtsi32_si128(b->zbin_extra);
- __m128i zbin0 = _mm_load_si128((__m128i *)(b->zbin));
- __m128i zbin1 = _mm_load_si128((__m128i *)(b->zbin + 8));
- __m128i round0 = _mm_load_si128((__m128i *)(b->round));
- __m128i round1 = _mm_load_si128((__m128i *)(b->round + 8));
- __m128i quant0 = _mm_load_si128((__m128i *)(b->quant));
- __m128i quant1 = _mm_load_si128((__m128i *)(b->quant + 8));
- __m128i dequant0 = _mm_load_si128((__m128i *)(d->dequant));
- __m128i dequant1 = _mm_load_si128((__m128i *)(d->dequant + 8));
- __m128i qcoeff0 = _mm_setzero_si128();
- __m128i qcoeff1 = _mm_setzero_si128();
-
- /* Duplicate to all lanes. */
- zbin_extra = _mm_shufflelo_epi16(zbin_extra, 0);
- zbin_extra = _mm_unpacklo_epi16(zbin_extra, zbin_extra);
-
- /* Sign of z: z >> 15 */
- sz0 = _mm_srai_epi16(z0, 15);
- sz1 = _mm_srai_epi16(z1, 15);
-
- /* x = abs(z): (z ^ sz) - sz */
- x0 = _mm_xor_si128(z0, sz0);
- x1 = _mm_xor_si128(z1, sz1);
- x0 = _mm_sub_epi16(x0, sz0);
- x1 = _mm_sub_epi16(x1, sz1);
-
- /* zbin[] + zbin_extra */
- zbin0 = _mm_add_epi16(zbin0, zbin_extra);
- zbin1 = _mm_add_epi16(zbin1, zbin_extra);
-
- /* In C x is compared to zbin where zbin = zbin[] + boost + extra. Rebalance
- * the equation because boost is the only value which can change:
- * x - (zbin[] + extra) >= boost */
- x_minus_zbin0 = _mm_sub_epi16(x0, zbin0);
- x_minus_zbin1 = _mm_sub_epi16(x1, zbin1);
-
- /* All the remaining calculations are valid whether they are done now with
- * simd or later inside the loop one at a time. */
- x0 = _mm_add_epi16(x0, round0);
- x1 = _mm_add_epi16(x1, round1);
-
- y0 = _mm_mulhi_epi16(x0, quant0);
- y1 = _mm_mulhi_epi16(x1, quant1);
-
- y0 = _mm_add_epi16(y0, x0);
- y1 = _mm_add_epi16(y1, x1);
-
- /* Instead of shifting each value independently we convert the scaling
- * factor with 1 << (16 - shift) so we can use multiply/return high half. */
- y0 = _mm_mulhi_epi16(y0, quant_shift0);
- y1 = _mm_mulhi_epi16(y1, quant_shift1);
-
- /* Return the sign: (y ^ sz) - sz */
- y0 = _mm_xor_si128(y0, sz0);
- y1 = _mm_xor_si128(y1, sz1);
- y0 = _mm_sub_epi16(y0, sz0);
- y1 = _mm_sub_epi16(y1, sz1);
-
- /* The loop gets unrolled anyway. Avoid the vp8_default_zig_zag1d lookup. */
- SELECT_EOB(1, 0, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(2, 1, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(3, 4, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(4, 0, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(5, 5, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(6, 2, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(7, 3, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(8, 6, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(9, 1, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(10, 4, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(11, 5, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(12, 2, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(13, 7, x_minus_zbin0, y0, qcoeff0);
- SELECT_EOB(14, 3, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(15, 6, x_minus_zbin1, y1, qcoeff1);
- SELECT_EOB(16, 7, x_minus_zbin1, y1, qcoeff1);
-
- _mm_store_si128((__m128i *)(d->qcoeff), qcoeff0);
- _mm_store_si128((__m128i *)(d->qcoeff + 8), qcoeff1);
-
- dqcoeff0 = _mm_mullo_epi16(qcoeff0, dequant0);
- dqcoeff1 = _mm_mullo_epi16(qcoeff1, dequant1);
-
- _mm_store_si128((__m128i *)(d->dqcoeff), dqcoeff0);
- _mm_store_si128((__m128i *)(d->dqcoeff + 8), dqcoeff1);
-
- *d->eob = eob;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_ssse3.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_ssse3.c
deleted file mode 100644
index 14282db8016..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/quantize_ssse3.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <tmmintrin.h> /* SSSE3 */
-
-#include "vp8/encoder/block.h"
-
-/* bitscan reverse (bsr) */
-#if defined(_MSC_VER)
-#include <intrin.h>
-#pragma intrinsic(_BitScanReverse)
-static int bsr(int mask) {
- unsigned long eob;
- _BitScanReverse(&eob, mask);
- eob++;
- if (mask == 0)
- eob = 0;
- return eob;
-}
-#else
-static int bsr(int mask) {
- int eob;
-#if defined(__GNUC__) && __GNUC__
- __asm__ __volatile__("bsr %1, %0" : "=r" (eob) : "r" (mask) : "flags");
-#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
- asm volatile("bsr %1, %0" : "=r" (eob) : "r" (mask) : "flags");
-#endif
- eob++;
- if (mask == 0)
- eob = 0;
- return eob;
-}
-#endif
-
-void vp8_fast_quantize_b_ssse3(BLOCK *b, BLOCKD *d) {
- int eob, mask;
-
- __m128i z0 = _mm_load_si128((__m128i *)(b->coeff));
- __m128i z1 = _mm_load_si128((__m128i *)(b->coeff + 8));
- __m128i round0 = _mm_load_si128((__m128i *)(b->round));
- __m128i round1 = _mm_load_si128((__m128i *)(b->round + 8));
- __m128i quant_fast0 = _mm_load_si128((__m128i *)(b->quant_fast));
- __m128i quant_fast1 = _mm_load_si128((__m128i *)(b->quant_fast + 8));
- __m128i dequant0 = _mm_load_si128((__m128i *)(d->dequant));
- __m128i dequant1 = _mm_load_si128((__m128i *)(d->dequant + 8));
-
- __m128i sz0, sz1, x, x0, x1, y0, y1, zeros, abs0, abs1;
-
- DECLARE_ALIGNED(16, const uint8_t, pshufb_zig_zag_mask[16]) =
- { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 };
- __m128i zig_zag = _mm_load_si128((const __m128i *)pshufb_zig_zag_mask);
-
- /* sign of z: z >> 15 */
- sz0 = _mm_srai_epi16(z0, 15);
- sz1 = _mm_srai_epi16(z1, 15);
-
- /* x = abs(z) */
- x0 = _mm_abs_epi16(z0);
- x1 = _mm_abs_epi16(z1);
-
- /* x += round */
- x0 = _mm_add_epi16(x0, round0);
- x1 = _mm_add_epi16(x1, round1);
-
- /* y = (x * quant) >> 16 */
- y0 = _mm_mulhi_epi16(x0, quant_fast0);
- y1 = _mm_mulhi_epi16(x1, quant_fast1);
-
- /* ASM saves Y for EOB */
- /* I think we can ignore that because adding the sign doesn't change anything
- * and multiplying 0 by dequant is OK as well */
- abs0 = y0;
- abs1 = y1;
-
- /* Restore the sign bit. */
- y0 = _mm_xor_si128(y0, sz0);
- y1 = _mm_xor_si128(y1, sz1);
- x0 = _mm_sub_epi16(y0, sz0);
- x1 = _mm_sub_epi16(y1, sz1);
-
- /* qcoeff = x */
- _mm_store_si128((__m128i *)(d->qcoeff), x0);
- _mm_store_si128((__m128i *)(d->qcoeff + 8), x1);
-
- /* x * dequant */
- x0 = _mm_mullo_epi16(x0, dequant0);
- x1 = _mm_mullo_epi16(x1, dequant1);
-
- /* dqcoeff = x * dequant */
- _mm_store_si128((__m128i *)(d->dqcoeff), x0);
- _mm_store_si128((__m128i *)(d->dqcoeff + 8), x1);
-
- zeros = _mm_setzero_si128();
-
- x0 = _mm_cmpgt_epi16(abs0, zeros);
- x1 = _mm_cmpgt_epi16(abs1, zeros);
-
- x = _mm_packs_epi16(x0, x1);
-
- x = _mm_shuffle_epi8(x, zig_zag);
-
- mask = _mm_movemask_epi8(x);
-
- eob = bsr(mask);
-
- *d->eob = 0xFF & eob;
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/ssim_opt_x86_64.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/ssim_opt_x86_64.asm
deleted file mode 100644
index 5964a85f2cf..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/ssim_opt_x86_64.asm
+++ /dev/null
@@ -1,216 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-%include "vpx_ports/x86_abi_support.asm"
-
-; tabulate_ssim - sums sum_s,sum_r,sum_sq_s,sum_sq_r, sum_sxr
-%macro TABULATE_SSIM 0
- paddusw xmm15, xmm3 ; sum_s
- paddusw xmm14, xmm4 ; sum_r
- movdqa xmm1, xmm3
- pmaddwd xmm1, xmm1
- paddd xmm13, xmm1 ; sum_sq_s
- movdqa xmm2, xmm4
- pmaddwd xmm2, xmm2
- paddd xmm12, xmm2 ; sum_sq_r
- pmaddwd xmm3, xmm4
- paddd xmm11, xmm3 ; sum_sxr
-%endmacro
-
-; Sum across the register %1 starting with q words
-%macro SUM_ACROSS_Q 1
- movdqa xmm2,%1
- punpckldq %1,xmm0
- punpckhdq xmm2,xmm0
- paddq %1,xmm2
- movdqa xmm2,%1
- punpcklqdq %1,xmm0
- punpckhqdq xmm2,xmm0
- paddq %1,xmm2
-%endmacro
-
-; Sum across the register %1 starting with q words
-%macro SUM_ACROSS_W 1
- movdqa xmm1, %1
- punpcklwd %1,xmm0
- punpckhwd xmm1,xmm0
- paddd %1, xmm1
- SUM_ACROSS_Q %1
-%endmacro
-;void ssim_parms_sse2(
-; unsigned char *s,
-; int sp,
-; unsigned char *r,
-; int rp
-; unsigned long *sum_s,
-; unsigned long *sum_r,
-; unsigned long *sum_sq_s,
-; unsigned long *sum_sq_r,
-; unsigned long *sum_sxr);
-;
-; TODO: Use parm passing through structure, probably don't need the pxors
-; ( calling app will initialize to 0 ) could easily fit everything in sse2
-; without too much hastle, and can probably do better estimates with psadw
-; or pavgb At this point this is just meant to be first pass for calculating
-; all the parms needed for 16x16 ssim so we can play with dssim as distortion
-; in mode selection code.
-global sym(vp8_ssim_parms_16x16_sse2) PRIVATE
-sym(vp8_ssim_parms_16x16_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 9
- SAVE_XMM 15
- push rsi
- push rdi
- ; end prolog
-
- mov rsi, arg(0) ;s
- mov rcx, arg(1) ;sp
- mov rdi, arg(2) ;r
- mov rax, arg(3) ;rp
-
- pxor xmm0, xmm0
- pxor xmm15,xmm15 ;sum_s
- pxor xmm14,xmm14 ;sum_r
- pxor xmm13,xmm13 ;sum_sq_s
- pxor xmm12,xmm12 ;sum_sq_r
- pxor xmm11,xmm11 ;sum_sxr
-
- mov rdx, 16 ;row counter
-.NextRow:
-
- ;grab source and reference pixels
- movdqu xmm5, [rsi]
- movdqu xmm6, [rdi]
- movdqa xmm3, xmm5
- movdqa xmm4, xmm6
- punpckhbw xmm3, xmm0 ; high_s
- punpckhbw xmm4, xmm0 ; high_r
-
- TABULATE_SSIM
-
- movdqa xmm3, xmm5
- movdqa xmm4, xmm6
- punpcklbw xmm3, xmm0 ; low_s
- punpcklbw xmm4, xmm0 ; low_r
-
- TABULATE_SSIM
-
- add rsi, rcx ; next s row
- add rdi, rax ; next r row
-
- dec rdx ; counter
- jnz .NextRow
-
- SUM_ACROSS_W xmm15
- SUM_ACROSS_W xmm14
- SUM_ACROSS_Q xmm13
- SUM_ACROSS_Q xmm12
- SUM_ACROSS_Q xmm11
-
- mov rdi,arg(4)
- movd [rdi], xmm15;
- mov rdi,arg(5)
- movd [rdi], xmm14;
- mov rdi,arg(6)
- movd [rdi], xmm13;
- mov rdi,arg(7)
- movd [rdi], xmm12;
- mov rdi,arg(8)
- movd [rdi], xmm11;
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void ssim_parms_sse2(
-; unsigned char *s,
-; int sp,
-; unsigned char *r,
-; int rp
-; unsigned long *sum_s,
-; unsigned long *sum_r,
-; unsigned long *sum_sq_s,
-; unsigned long *sum_sq_r,
-; unsigned long *sum_sxr);
-;
-; TODO: Use parm passing through structure, probably don't need the pxors
-; ( calling app will initialize to 0 ) could easily fit everything in sse2
-; without too much hastle, and can probably do better estimates with psadw
-; or pavgb At this point this is just meant to be first pass for calculating
-; all the parms needed for 16x16 ssim so we can play with dssim as distortion
-; in mode selection code.
-global sym(vp8_ssim_parms_8x8_sse2) PRIVATE
-sym(vp8_ssim_parms_8x8_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 9
- SAVE_XMM 15
- push rsi
- push rdi
- ; end prolog
-
- mov rsi, arg(0) ;s
- mov rcx, arg(1) ;sp
- mov rdi, arg(2) ;r
- mov rax, arg(3) ;rp
-
- pxor xmm0, xmm0
- pxor xmm15,xmm15 ;sum_s
- pxor xmm14,xmm14 ;sum_r
- pxor xmm13,xmm13 ;sum_sq_s
- pxor xmm12,xmm12 ;sum_sq_r
- pxor xmm11,xmm11 ;sum_sxr
-
- mov rdx, 8 ;row counter
-.NextRow:
-
- ;grab source and reference pixels
- movq xmm3, [rsi]
- movq xmm4, [rdi]
- punpcklbw xmm3, xmm0 ; low_s
- punpcklbw xmm4, xmm0 ; low_r
-
- TABULATE_SSIM
-
- add rsi, rcx ; next s row
- add rdi, rax ; next r row
-
- dec rdx ; counter
- jnz .NextRow
-
- SUM_ACROSS_W xmm15
- SUM_ACROSS_W xmm14
- SUM_ACROSS_Q xmm13
- SUM_ACROSS_Q xmm12
- SUM_ACROSS_Q xmm11
-
- mov rdi,arg(4)
- movd [rdi], xmm15;
- mov rdi,arg(5)
- movd [rdi], xmm14;
- mov rdi,arg(6)
- movd [rdi], xmm13;
- mov rdi,arg(7)
- movd [rdi], xmm12;
- mov rdi,arg(8)
- movd [rdi], xmm11;
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_mmx.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_mmx.asm
deleted file mode 100644
index 794dd22f7ed..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_mmx.asm
+++ /dev/null
@@ -1,223 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;void vp8_subtract_b_mmx_impl(unsigned char *z, int src_stride,
-; short *diff, unsigned char *Predictor,
-; int pitch);
-global sym(vp8_subtract_b_mmx_impl) PRIVATE
-sym(vp8_subtract_b_mmx_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
-
- mov rdi, arg(2) ;diff
- mov rax, arg(3) ;Predictor
- mov rsi, arg(0) ;z
- movsxd rdx, dword ptr arg(1);src_stride;
- movsxd rcx, dword ptr arg(4);pitch
- pxor mm7, mm7
-
- movd mm0, [rsi]
- movd mm1, [rax]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq [rdi], mm0
-
-
- movd mm0, [rsi+rdx]
- movd mm1, [rax+rcx]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq [rdi+rcx*2],mm0
-
-
- movd mm0, [rsi+rdx*2]
- movd mm1, [rax+rcx*2]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq [rdi+rcx*4], mm0
-
- lea rsi, [rsi+rdx*2]
- lea rcx, [rcx+rcx*2]
-
-
-
- movd mm0, [rsi+rdx]
- movd mm1, [rax+rcx]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq [rdi+rcx*2], mm0
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_subtract_mby_mmx(short *diff, unsigned char *src, int src_stride,
-;unsigned char *pred, int pred_stride)
-global sym(vp8_subtract_mby_mmx) PRIVATE
-sym(vp8_subtract_mby_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
- mov rdi, arg(0) ;diff
- mov rsi, arg(1) ;src
- movsxd rdx, dword ptr arg(2);src_stride
- mov rax, arg(3) ;pred
- push rbx
- movsxd rbx, dword ptr arg(4);pred_stride
-
- pxor mm0, mm0
- mov rcx, 16
-
-
-.submby_loop:
- movq mm1, [rsi]
- movq mm3, [rax]
-
- movq mm2, mm1
- movq mm4, mm3
-
- punpcklbw mm1, mm0
- punpcklbw mm3, mm0
-
- punpckhbw mm2, mm0
- punpckhbw mm4, mm0
-
- psubw mm1, mm3
- psubw mm2, mm4
-
- movq [rdi], mm1
- movq [rdi+8], mm2
-
- movq mm1, [rsi+8]
- movq mm3, [rax+8]
-
- movq mm2, mm1
- movq mm4, mm3
-
- punpcklbw mm1, mm0
- punpcklbw mm3, mm0
-
- punpckhbw mm2, mm0
- punpckhbw mm4, mm0
-
- psubw mm1, mm3
- psubw mm2, mm4
-
- movq [rdi+16], mm1
- movq [rdi+24], mm2
- add rdi, 32
- lea rax, [rax+rbx]
- lea rsi, [rsi+rdx]
- dec rcx
- jnz .submby_loop
-
- pop rbx
- pop rdi
- pop rsi
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;vp8_subtract_mbuv_mmx(short *diff, unsigned char *usrc, unsigned char *vsrc,
-; int src_stride, unsigned char *upred,
-; unsigned char *vpred, int pred_stride)
-
-global sym(vp8_subtract_mbuv_mmx) PRIVATE
-sym(vp8_subtract_mbuv_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 7
- push rsi
- push rdi
- ; end prolog
-
- mov rdi, arg(0) ;diff
- mov rsi, arg(1) ;usrc
- movsxd rdx, dword ptr arg(3);src_stride;
- mov rax, arg(4) ;upred
- add rdi, 256*2 ;diff = diff + 256 (shorts)
- mov rcx, 8
- push rbx
- movsxd rbx, dword ptr arg(6);pred_stride
-
- pxor mm7, mm7
-
-.submbu_loop:
- movq mm0, [rsi]
- movq mm1, [rax]
- movq mm3, mm0
- movq mm4, mm1
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- punpckhbw mm3, mm7
- punpckhbw mm4, mm7
- psubw mm0, mm1
- psubw mm3, mm4
- movq [rdi], mm0
- movq [rdi+8], mm3
- add rdi, 16
- add rsi, rdx
- add rax, rbx
-
- dec rcx
- jnz .submbu_loop
-
- mov rsi, arg(2) ;vsrc
- mov rax, arg(5) ;vpred
- mov rcx, 8
-
-.submbv_loop:
- movq mm0, [rsi]
- movq mm1, [rax]
- movq mm3, mm0
- movq mm4, mm1
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- punpckhbw mm3, mm7
- punpckhbw mm4, mm7
- psubw mm0, mm1
- psubw mm3, mm4
- movq [rdi], mm0
- movq [rdi+8], mm3
- add rdi, 16
- add rsi, rdx
- add rax, rbx
-
- dec rcx
- jnz .submbv_loop
-
- pop rbx
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_sse2.asm
deleted file mode 100644
index a5d17f5beff..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/subtract_sse2.asm
+++ /dev/null
@@ -1,245 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-;void vp8_subtract_b_sse2_impl(unsigned char *z, int src_stride,
-; short *diff, unsigned char *Predictor,
-; int pitch);
-global sym(vp8_subtract_b_sse2_impl) PRIVATE
-sym(vp8_subtract_b_sse2_impl):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- mov rdi, arg(2) ;diff
- mov rax, arg(3) ;Predictor
- mov rsi, arg(0) ;z
- movsxd rdx, dword ptr arg(1);src_stride;
- movsxd rcx, dword ptr arg(4);pitch
- pxor mm7, mm7
-
- movd mm0, [rsi]
- movd mm1, [rax]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq MMWORD PTR [rdi], mm0
-
- movd mm0, [rsi+rdx]
- movd mm1, [rax+rcx]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq MMWORD PTR [rdi+rcx*2], mm0
-
- movd mm0, [rsi+rdx*2]
- movd mm1, [rax+rcx*2]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq MMWORD PTR [rdi+rcx*4], mm0
-
- lea rsi, [rsi+rdx*2]
- lea rcx, [rcx+rcx*2]
-
- movd mm0, [rsi+rdx]
- movd mm1, [rax+rcx]
- punpcklbw mm0, mm7
- punpcklbw mm1, mm7
- psubw mm0, mm1
- movq MMWORD PTR [rdi+rcx*2], mm0
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-
-;void vp8_subtract_mby_sse2(short *diff, unsigned char *src, int src_stride,
-;unsigned char *pred, int pred_stride)
-global sym(vp8_subtract_mby_sse2) PRIVATE
-sym(vp8_subtract_mby_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- mov rdi, arg(0) ;diff
- mov rsi, arg(1) ;src
- movsxd rdx, dword ptr arg(2);src_stride
- mov rax, arg(3) ;pred
- movdqa xmm4, [GLOBAL(t80)]
- push rbx
- mov rcx, 8 ; do two lines at one time
- movsxd rbx, dword ptr arg(4);pred_stride
-
-.submby_loop:
- movdqa xmm0, [rsi] ; src
- movdqa xmm1, [rax] ; pred
-
- movdqa xmm2, xmm0
- psubb xmm0, xmm1
-
- pxor xmm1, xmm4 ;convert to signed values
- pxor xmm2, xmm4
- pcmpgtb xmm1, xmm2 ; obtain sign information
-
- movdqa xmm2, xmm0
- punpcklbw xmm0, xmm1 ; put sign back to subtraction
- punpckhbw xmm2, xmm1 ; put sign back to subtraction
-
- movdqa xmm3, [rsi + rdx]
- movdqa xmm5, [rax + rbx]
-
- lea rsi, [rsi+rdx*2]
- lea rax, [rax+rbx*2]
-
- movdqa [rdi], xmm0
- movdqa [rdi +16], xmm2
-
- movdqa xmm1, xmm3
- psubb xmm3, xmm5
-
- pxor xmm5, xmm4 ;convert to signed values
- pxor xmm1, xmm4
- pcmpgtb xmm5, xmm1 ; obtain sign information
-
- movdqa xmm1, xmm3
- punpcklbw xmm3, xmm5 ; put sign back to subtraction
- punpckhbw xmm1, xmm5 ; put sign back to subtraction
-
- movdqa [rdi +32], xmm3
- movdqa [rdi +48], xmm1
-
- add rdi, 64
- dec rcx
- jnz .submby_loop
-
- pop rbx
- pop rdi
- pop rsi
- ; begin epilog
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;vp8_subtract_mbuv_sse2(short *diff, unsigned char *usrc, unsigned char *vsrc,
-; int src_stride, unsigned char *upred,
-; unsigned char *vpred, int pred_stride)
-global sym(vp8_subtract_mbuv_sse2) PRIVATE
-sym(vp8_subtract_mbuv_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 7
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- movdqa xmm4, [GLOBAL(t80)]
- mov rdi, arg(0) ;diff
- mov rsi, arg(1) ;usrc
- movsxd rdx, dword ptr arg(3);src_stride;
- mov rax, arg(4) ;upred
- add rdi, 256*2 ;diff = diff + 256 (shorts)
- mov rcx, 4
- push rbx
- movsxd rbx, dword ptr arg(6);pred_stride
-
- ;u
-.submbu_loop:
- movq xmm0, [rsi] ; src
- movq xmm2, [rsi+rdx] ; src -- next line
- movq xmm1, [rax] ; pred
- movq xmm3, [rax+rbx] ; pred -- next line
- lea rsi, [rsi + rdx*2]
- lea rax, [rax + rbx*2]
-
- punpcklqdq xmm0, xmm2
- punpcklqdq xmm1, xmm3
-
- movdqa xmm2, xmm0
- psubb xmm0, xmm1 ; subtraction with sign missed
-
- pxor xmm1, xmm4 ;convert to signed values
- pxor xmm2, xmm4
- pcmpgtb xmm1, xmm2 ; obtain sign information
-
- movdqa xmm2, xmm0
- movdqa xmm3, xmm1
- punpcklbw xmm0, xmm1 ; put sign back to subtraction
- punpckhbw xmm2, xmm3 ; put sign back to subtraction
-
- movdqa [rdi], xmm0 ; store difference
- movdqa [rdi +16], xmm2 ; store difference
- add rdi, 32
- sub rcx, 1
- jnz .submbu_loop
-
- mov rsi, arg(2) ;vsrc
- mov rax, arg(5) ;vpred
- mov rcx, 4
-
- ;v
-.submbv_loop:
- movq xmm0, [rsi] ; src
- movq xmm2, [rsi+rdx] ; src -- next line
- movq xmm1, [rax] ; pred
- movq xmm3, [rax+rbx] ; pred -- next line
- lea rsi, [rsi + rdx*2]
- lea rax, [rax + rbx*2]
-
- punpcklqdq xmm0, xmm2
- punpcklqdq xmm1, xmm3
-
- movdqa xmm2, xmm0
- psubb xmm0, xmm1 ; subtraction with sign missed
-
- pxor xmm1, xmm4 ;convert to signed values
- pxor xmm2, xmm4
- pcmpgtb xmm1, xmm2 ; obtain sign information
-
- movdqa xmm2, xmm0
- movdqa xmm3, xmm1
- punpcklbw xmm0, xmm1 ; put sign back to subtraction
- punpckhbw xmm2, xmm3 ; put sign back to subtraction
-
- movdqa [rdi], xmm0 ; store difference
- movdqa [rdi +16], xmm2 ; store difference
- add rdi, 32
- sub rcx, 1
- jnz .submbv_loop
-
- pop rbx
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-SECTION_RODATA
-align 16
-t80:
- times 16 db 0x80
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/temporal_filter_apply_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/temporal_filter_apply_sse2.asm
deleted file mode 100644
index bd92b398a0b..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/temporal_filter_apply_sse2.asm
+++ /dev/null
@@ -1,207 +0,0 @@
-;
-; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
-;
-; Use of this source code is governed by a BSD-style license
-; that can be found in the LICENSE file in the root of the source
-; tree. An additional intellectual property rights grant can be found
-; in the file PATENTS. All contributing project authors may
-; be found in the AUTHORS file in the root of the source tree.
-;
-
-
-%include "vpx_ports/x86_abi_support.asm"
-
-; void vp8_temporal_filter_apply_sse2 | arg
-; (unsigned char *frame1, | 0
-; unsigned int stride, | 1
-; unsigned char *frame2, | 2
-; unsigned int block_size, | 3
-; int strength, | 4
-; int filter_weight, | 5
-; unsigned int *accumulator, | 6
-; unsigned short *count) | 7
-global sym(vp8_temporal_filter_apply_sse2) PRIVATE
-sym(vp8_temporal_filter_apply_sse2):
-
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 8
- SAVE_XMM 7
- GET_GOT rbx
- push rsi
- push rdi
- ALIGN_STACK 16, rax
- %define block_size 0
- %define strength 16
- %define filter_weight 32
- %define rounding_bit 48
- %define rbp_backup 64
- %define stack_size 80
- sub rsp, stack_size
- mov [rsp + rbp_backup], rbp
- ; end prolog
-
- mov rdx, arg(3)
- mov [rsp + block_size], rdx
- movd xmm6, arg(4)
- movdqa [rsp + strength], xmm6 ; where strength is used, all 16 bytes are read
-
- ; calculate the rounding bit outside the loop
- ; 0x8000 >> (16 - strength)
- mov rdx, 16
- sub rdx, arg(4) ; 16 - strength
- movq xmm4, rdx ; can't use rdx w/ shift
- movdqa xmm5, [GLOBAL(_const_top_bit)]
- psrlw xmm5, xmm4
- movdqa [rsp + rounding_bit], xmm5
-
- mov rsi, arg(0) ; src/frame1
- mov rdx, arg(2) ; predictor frame
- mov rdi, arg(6) ; accumulator
- mov rax, arg(7) ; count
-
- ; dup the filter weight and store for later
- movd xmm0, arg(5) ; filter_weight
- pshuflw xmm0, xmm0, 0
- punpcklwd xmm0, xmm0
- movdqa [rsp + filter_weight], xmm0
-
- mov rbp, arg(1) ; stride
- pxor xmm7, xmm7 ; zero for extraction
-
- lea rcx, [rdx + 16*16*1]
- cmp dword ptr [rsp + block_size], 8
- jne .temporal_filter_apply_load_16
- lea rcx, [rdx + 8*8*1]
-
-.temporal_filter_apply_load_8:
- movq xmm0, [rsi] ; first row
- lea rsi, [rsi + rbp] ; += stride
- punpcklbw xmm0, xmm7 ; src[ 0- 7]
- movq xmm1, [rsi] ; second row
- lea rsi, [rsi + rbp] ; += stride
- punpcklbw xmm1, xmm7 ; src[ 8-15]
- jmp .temporal_filter_apply_load_finished
-
-.temporal_filter_apply_load_16:
- movdqa xmm0, [rsi] ; src (frame1)
- lea rsi, [rsi + rbp] ; += stride
- movdqa xmm1, xmm0
- punpcklbw xmm0, xmm7 ; src[ 0- 7]
- punpckhbw xmm1, xmm7 ; src[ 8-15]
-
-.temporal_filter_apply_load_finished:
- movdqa xmm2, [rdx] ; predictor (frame2)
- movdqa xmm3, xmm2
- punpcklbw xmm2, xmm7 ; pred[ 0- 7]
- punpckhbw xmm3, xmm7 ; pred[ 8-15]
-
- ; modifier = src_byte - pixel_value
- psubw xmm0, xmm2 ; src - pred[ 0- 7]
- psubw xmm1, xmm3 ; src - pred[ 8-15]
-
- ; modifier *= modifier
- pmullw xmm0, xmm0 ; modifer[ 0- 7]^2
- pmullw xmm1, xmm1 ; modifer[ 8-15]^2
-
- ; modifier *= 3
- pmullw xmm0, [GLOBAL(_const_3w)]
- pmullw xmm1, [GLOBAL(_const_3w)]
-
- ; modifer += 0x8000 >> (16 - strength)
- paddw xmm0, [rsp + rounding_bit]
- paddw xmm1, [rsp + rounding_bit]
-
- ; modifier >>= strength
- psrlw xmm0, [rsp + strength]
- psrlw xmm1, [rsp + strength]
-
- ; modifier = 16 - modifier
- ; saturation takes care of modifier > 16
- movdqa xmm3, [GLOBAL(_const_16w)]
- movdqa xmm2, [GLOBAL(_const_16w)]
- psubusw xmm3, xmm1
- psubusw xmm2, xmm0
-
- ; modifier *= filter_weight
- pmullw xmm2, [rsp + filter_weight]
- pmullw xmm3, [rsp + filter_weight]
-
- ; count
- movdqa xmm4, [rax]
- movdqa xmm5, [rax+16]
- ; += modifier
- paddw xmm4, xmm2
- paddw xmm5, xmm3
- ; write back
- movdqa [rax], xmm4
- movdqa [rax+16], xmm5
- lea rax, [rax + 16*2] ; count += 16*(sizeof(short))
-
- ; load and extract the predictor up to shorts
- pxor xmm7, xmm7
- movdqa xmm0, [rdx]
- lea rdx, [rdx + 16*1] ; pred += 16*(sizeof(char))
- movdqa xmm1, xmm0
- punpcklbw xmm0, xmm7 ; pred[ 0- 7]
- punpckhbw xmm1, xmm7 ; pred[ 8-15]
-
- ; modifier *= pixel_value
- pmullw xmm0, xmm2
- pmullw xmm1, xmm3
-
- ; expand to double words
- movdqa xmm2, xmm0
- punpcklwd xmm0, xmm7 ; [ 0- 3]
- punpckhwd xmm2, xmm7 ; [ 4- 7]
- movdqa xmm3, xmm1
- punpcklwd xmm1, xmm7 ; [ 8-11]
- punpckhwd xmm3, xmm7 ; [12-15]
-
- ; accumulator
- movdqa xmm4, [rdi]
- movdqa xmm5, [rdi+16]
- movdqa xmm6, [rdi+32]
- movdqa xmm7, [rdi+48]
- ; += modifier
- paddd xmm4, xmm0
- paddd xmm5, xmm2
- paddd xmm6, xmm1
- paddd xmm7, xmm3
- ; write back
- movdqa [rdi], xmm4
- movdqa [rdi+16], xmm5
- movdqa [rdi+32], xmm6
- movdqa [rdi+48], xmm7
- lea rdi, [rdi + 16*4] ; accumulator += 16*(sizeof(int))
-
- cmp rdx, rcx
- je .temporal_filter_apply_epilog
- pxor xmm7, xmm7 ; zero for extraction
- cmp dword ptr [rsp + block_size], 16
- je .temporal_filter_apply_load_16
- jmp .temporal_filter_apply_load_8
-
-.temporal_filter_apply_epilog:
- ; begin epilog
- mov rbp, [rsp + rbp_backup]
- add rsp, stack_size
- pop rsp
- pop rdi
- pop rsi
- RESTORE_GOT
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
-
-SECTION_RODATA
-align 16
-_const_3w:
- times 8 dw 3
-align 16
-_const_top_bit:
- times 8 dw 1<<15
-align 16
-_const_16w
- times 8 dw 16
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_mmx.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_mmx.c
deleted file mode 100644
index cf3d8ca4a34..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_mmx.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "vpx_ports/x86.h"
-#include "vp8/encoder/block.h"
-
-void vp8_short_fdct4x4_mmx(short *input, short *output, int pitch);
-void vp8_short_fdct8x4_mmx(short *input, short *output, int pitch)
-{
- vp8_short_fdct4x4_mmx(input, output, pitch);
- vp8_short_fdct4x4_mmx(input + 4, output + 16, pitch);
-}
-
-int vp8_fast_quantize_b_impl_mmx(short *coeff_ptr, short *zbin_ptr,
- short *qcoeff_ptr, short *dequant_ptr,
- const short *scan_mask, short *round_ptr,
- short *quant_ptr, short *dqcoeff_ptr);
-void vp8_fast_quantize_b_mmx(BLOCK *b, BLOCKD *d)
-{
- const short *scan_mask = vp8_default_zig_zag_mask;
- short *coeff_ptr = b->coeff;
- short *zbin_ptr = b->zbin;
- short *round_ptr = b->round;
- short *quant_ptr = b->quant_fast;
- short *qcoeff_ptr = d->qcoeff;
- short *dqcoeff_ptr = d->dqcoeff;
- short *dequant_ptr = d->dequant;
-
- *d->eob = (char)vp8_fast_quantize_b_impl_mmx(
- coeff_ptr,
- zbin_ptr,
- qcoeff_ptr,
- dequant_ptr,
- scan_mask,
-
- round_ptr,
- quant_ptr,
- dqcoeff_ptr
- );
-}
-
-int vp8_mbblock_error_mmx_impl(short *coeff_ptr, short *dcoef_ptr, int dc);
-int vp8_mbblock_error_mmx(MACROBLOCK *mb, int dc)
-{
- short *coeff_ptr = mb->block[0].coeff;
- short *dcoef_ptr = mb->e_mbd.block[0].dqcoeff;
- return vp8_mbblock_error_mmx_impl(coeff_ptr, dcoef_ptr, dc);
-}
-
-int vp8_mbuverror_mmx_impl(short *s_ptr, short *d_ptr);
-int vp8_mbuverror_mmx(MACROBLOCK *mb)
-{
- short *s_ptr = &mb->coeff[256];
- short *d_ptr = &mb->e_mbd.dqcoeff[256];
- return vp8_mbuverror_mmx_impl(s_ptr, d_ptr);
-}
-
-void vp8_subtract_b_mmx_impl(unsigned char *z, int src_stride,
- short *diff, unsigned char *predictor,
- int pitch);
-void vp8_subtract_b_mmx(BLOCK *be, BLOCKD *bd, int pitch)
-{
- unsigned char *z = *(be->base_src) + be->src;
- unsigned int src_stride = be->src_stride;
- short *diff = &be->src_diff[0];
- unsigned char *predictor = &bd->predictor[0];
- vp8_subtract_b_mmx_impl(z, src_stride, diff, predictor, pitch);
-}
diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_sse2.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_sse2.c
deleted file mode 100644
index 3dfbee368a2..00000000000
--- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/x86/vp8_enc_stubs_sse2.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "vpx_ports/x86.h"
-#include "vp8/encoder/block.h"
-
-int vp8_mbblock_error_xmm_impl(short *coeff_ptr, short *dcoef_ptr, int dc);
-int vp8_mbblock_error_xmm(MACROBLOCK *mb, int dc)
-{
- short *coeff_ptr = mb->block[0].coeff;
- short *dcoef_ptr = mb->e_mbd.block[0].dqcoeff;
- return vp8_mbblock_error_xmm_impl(coeff_ptr, dcoef_ptr, dc);
-}
-
-int vp8_mbuverror_xmm_impl(short *s_ptr, short *d_ptr);
-int vp8_mbuverror_xmm(MACROBLOCK *mb)
-{
- short *s_ptr = &mb->coeff[256];
- short *d_ptr = &mb->e_mbd.dqcoeff[256];
- return vp8_mbuverror_xmm_impl(s_ptr, d_ptr);
-}
-
-void vp8_subtract_b_sse2_impl(unsigned char *z, int src_stride,
- short *diff, unsigned char *predictor,
- int pitch);
-void vp8_subtract_b_sse2(BLOCK *be, BLOCKD *bd, int pitch)
-{
- unsigned char *z = *(be->base_src) + be->src;
- unsigned int src_stride = be->src_stride;
- short *diff = &be->src_diff[0];
- unsigned char *predictor = &bd->predictor[0];
- vp8_subtract_b_sse2_impl(z, src_stride, diff, predictor, pitch);
-}