Compare commits

...

1420 Commits

Author SHA1 Message Date
John Koleszar
229273391f Merge "add emmintrin_compat.h for builds with gcc < 4" into vp9-preview 2012-12-21 14:21:50 -08:00
John Koleszar
b14f65189d Merge "configure: test for -msse4" into vp9-preview 2012-12-21 14:20:15 -08:00
Jim Bankoski
ad64ca4494 fixed sizes of global arrays
Change-Id: Ibc077cf1c1da0c86063f88c6d3073c6876989119
2012-12-21 13:09:04 -08:00
James Zern
9dab3ce624 add emmintrin_compat.h for builds with gcc < 4
Change-Id: If7822e6fcd0d3568b934032322b19ba3e401df26
2012-12-20 14:56:13 -08:00
James Zern
3162b4f23c configure: test for -msse4
not present in < GCC 4.2

Change-Id: I7b1a3078fd782644b1c432ce682d2160ffc2263a
2012-12-20 14:08:59 -08:00
Jim Bankoski
1dffce7f96 add private to assembly files to insure proper chromebuild
Change-Id: I6e43ca73f35401a974ed8ee27738d4318f09fd37
2012-12-20 09:40:18 -08:00
Scott LaVarnway
a6b2070d1a Disabled x86inc style assembly functions.... part 2
Missed a file

Change-Id: I33179de6755bc9eda9ad906e4fec6902ace435a5
2012-12-19 14:13:25 -08:00
Scott LaVarnway
08dabbcee1 Disabled x86inc style assembly functions
Temporary fix for 32-bit mac build errors.

Change-Id: I2038f033cac16ea796097d0edd0f1c3da03246d7
2012-12-19 11:53:43 -08:00
Yaowu Xu
c29fb02903 Merge "Problem of over smoothing with intra modes." into vp9-preview 2012-12-18 14:22:19 -08:00
Yaowu Xu
0405cd8e9f fixed a warning
where variable is used without initialization

Change-Id: Ic6b52623802641060cad4a72271050aeaf20ad5c
2012-12-17 11:11:07 -08:00
Paul Wilkins
d8f5d1b257 Problem of over smoothing with intra modes.
In some cases intra modes in inter frames give
an over smoothed appearance. Especially with
noisy but flat content.

Also in some cases there were problems with key
frame sizing again with very flat but noisy content.

These are temporary changes to help alleviate the
visual problems but will almost certainly hurt metric
results especially at the very low data rate end.

Change-Id: I11549179a19277ffc283d9788bc70168f2a8bdc9
2012-12-17 11:54:17 +00:00
Yaowu Xu
6247b239bc reset segement map on key frame
This is to fix a decoder crash when decoder skips a number of frame to
continue decoding from a later key frame.

Change-Id: I3ba116eba6c3440e0528a21f53745f694302e4ad
2012-12-14 06:35:32 -08:00
Yaowu Xu
f8ff3e5d47 prevents redefine of INT64_MAX
MSVC 2012 (_MSC_VER=1600) introduced the definition, this commit
prevents the redefinition of the macro

Change-Id: I7de92e7e9e865a342f2bcc4b071f8d3c9b2a508c
2012-12-13 16:09:52 -08:00
Yaowu Xu
fd6f492604 remove floating point inverse transforms
Change-Id: I9c651bd7c161974bf5f929446361b00d85e57a3f
2012-12-13 16:02:25 -08:00
Scott LaVarnway
b575394e21 Improved vp9_ihtllm_c
As suggested by Yaowu, we can use eob to reduce the complexity
of the vp9_ihtllm_c function.  For the 1080p test clip used, the decoder
performance improved by 17%.

Change-Id: I32486f2f06f9b8f60467d2a574209aa3a3daa435
2012-12-12 15:49:39 -08:00
Frank Galligan
b192d99f73 Fix ads2gas script to look for ALIGN as a word.
Change-Id: I4efc4f4e87e8666b69257de82c5c5dd4aadee28c
2012-12-10 16:30:32 -08:00
John Koleszar
d984763867 configure: add --enable-external-build support
First attempt at avoiding all the compile-time environment detection for
cases where you can generate the environments statically, as when the
real build is being performed by another build system.

Change-Id: Ie3cf95d71d6c5169900f31e263b84bc123cdf73f
2012-12-10 12:39:55 -08:00
Jim Bankoski
fccebcba57 Merge "Fix implicit cast." into vp9-preview 2012-12-07 17:16:01 -08:00
Jim Bankoski
26a4918282 Merge "Fix meaninglesss if." into vp9-preview 2012-12-07 17:15:52 -08:00
Frank Galligan
1c0ee77589 Fix meaninglesss if.
Change-Id: I0cb06d77805246fe39d39ad3bc5df3c3f52c7050
2012-12-07 15:44:39 -08:00
Frank Galligan
8d449ce0a9 Remove unused symbols from vp9 asm offsets C files.
Change-Id: I366e6d175da3012f1c8607fd7fad99fbbb616091
2012-12-07 15:38:40 -08:00
Frank Galligan
eec0bc4f1e Fix implicit cast.
Change-Id: I1eb7433061a6c529471026e0ebdc6467942062eb
2012-12-07 15:25:44 -08:00
John Koleszar
434336b072 libvpx_test: ensure rtcd init functions are called
In addition to allowing tests to use the RTCD-enabled functions (perhaps transitively)
without having run a full encode/decode test yet, this fixes a linking issue with
Apple's G++ whereby the Common symbols (the function pointers themselves) wouldn't
be resolved. Fixing this linking issue is the primary impetus for this patch, as none
of the tests exercise the RTCD functionality except through the main API.

Change-Id: I12aed91ca37a707e5309aa6cb9c38a649c06bc6a
2012-12-06 14:02:36 -08:00
Johann
52d350febf Begin to refactor vpx_scale usage in VP9
Only declare the functions in vpx_scale RTCD and include the relevant
header.

Remove unused files and functions in vpx_scale to avoid wasting time
renaming. vpx_scale/win32/scaleopt.c contains functions which have not
been called in a long time but are potentially optimized.

The 'vp8' functions have not been renamed yet. That is for after the
cleanup.

Change-Id: I2c325a101d60fa9d27e7dfcd5b52a864b4a1e09c
2012-12-05 08:59:40 -08:00
Johann
a905672906 Remove ARM optimizations from VP9
Change-Id: I9f0ae635fb9a95c4aa1529c177ccb07e2b76970b
2012-12-05 08:59:25 -08:00
Johann
4a9b95470c Update ARM for vpx_scale changes
Refactor asm_offsets for vpx_scale.

Change-Id: I2db0eeb28c8e757bd033c6614a1e5319a1a204a5
2012-12-05 08:59:17 -08:00
John Koleszar
4a4d2aa55c vp9_bilinear_filters_mmx: add missing extern specifiers
Change-Id: Ibabf18947f90cb4f45052763ebf44cfb8209bd8b
2012-12-05 08:27:48 -08:00
Yaowu Xu
c202100fe4 Enable unit tests to build with MSVC
Change-Id: Ie80597221bee494679ae2ba50cca22dea2609cba
2012-12-04 12:29:26 -08:00
Yaowu Xu
6a5e6e0549 Fix the build with MSVC
1. remove the dependency on non existing "vp9_temporal_filter_x86.h"
2. prefix filenames with vp9_ in obj_int_extract.bat to reflect the
change of the actual filenames.

Change-Id: Ib1b4d96ac41788f76917764a6722d8461c857302
2012-12-04 09:12:49 -08:00
Frank Galligan
48556db7b2 Merge "vp9: Fix assert check." into vp9-preview 2012-12-03 17:29:46 -08:00
Jim Bankoski
b95338c7ab Merge "fixes --disable-vp9-encoder" into vp9-preview 2012-12-03 12:41:31 -08:00
Jim Bankoski
d9038b3c60 fixes --disable-vp9-encoder
Change-Id: I467bf0fdf3b35326bcce58d5459e6d2dbfd6c5e5
2012-12-03 12:21:16 -08:00
Frank Galligan
0d687ed22b vp9: Fix assert check.
Change-Id: If0cc1ab60dff6abd67dae7c7b3dc83a1afd7fe65
2012-12-03 12:18:59 -08:00
Frank Galligan
3e0ea7f6e1 vp9: Remove superfluous command.
- vpx_calloc is called on arf_not_zz above.
- Note The removed vpx_memset call had an issue with sizeof.

Change-Id: I86fd7a167d0a042e581e613e2a6c0b5e63073fc6
2012-12-03 10:26:15 -08:00
John Koleszar
271d635ce7 Merge "Rename vpx_scale/rtcd.c to vpx_scale/vpx_scale_rtcd.c" into experimental 2012-12-03 09:18:45 -08:00
Deb Mukherjee
8b92f1e023 Supports inter-intra prediction with superblocks
Adds support for compound inter-intra prediction with superblocks.
Also, fixes a bug that disabled intra modes for superblocks.

Change-Id: I4d711317e1bc19df8c2f32dc645429f7fff31036
2012-12-01 15:19:55 -08:00
Frank Galligan
5f9e0caf0d Rename vpx_scale/rtcd.c to vpx_scale/vpx_scale_rtcd.c
Change-Id: I4765ca3dab880a3673c15fb56b2d912ec2ea194e
2012-11-30 15:53:17 -08:00
Deb Mukherjee
6632330702 Adds switchable filters with superblocks
Allows switchbale filters to be used without mismatch when the
superblock experiment is on.

Also removes a spurious clamping code in decodemv.c which causes
rare encode/decode mismatches.

Change-Id: I809d9ee0b2859552b613500b539a615515b863ae
2012-11-30 09:37:08 -08:00
Jim Bankoski
9f9370425b warnings in various experiments
Change-Id: Ib5106d4772450f8026f823dd743f162ab833b1d6
2012-11-30 07:31:37 -08:00
Jim Bankoski
2b8dc065d1 google style guide include guards
Change-Id: I2c252f3ddcc99e96c1f5d3dab8bcb25a2a3637ea
2012-11-30 07:30:59 -08:00
Yunqing Wang
eebc0b49f1 Merge "Further improve macroblock loop filters" into experimental 2012-11-29 16:07:14 -08:00
Deb Mukherjee
d7489ea45e Merge "Minor refactoring of superblock decoding" into experimental 2012-11-29 15:33:42 -08:00
Deb Mukherjee
be08b5af1a Minor refactoring of superblock decoding
Refactoring for improved readability - no bitstream or
performance change.

Change-Id: I4488ed4715f8dbe38c66431106478669041b8b33
2012-11-29 15:26:56 -08:00
Jim Bankoski
3e3fffe038 a vp8 warning to boot.
Change-Id: I32ed051c8b4d3e5afa4e13bb4e3b2ca5e922ff64
2012-11-29 14:24:54 -08:00
Jim Bankoski
e3bdae1fc7 intrinsic warnings begone
Change-Id: I6a224c590b6a2c5b91f9084ffb8083d18223a206
2012-11-29 14:14:26 -08:00
Jim Bankoski
d0a20fd22c last remaining warning
Change-Id: I1f49d96cdb5e342041c9a72ef31df361a1b609eb
2012-11-29 14:07:21 -08:00
Jim Bankoski
51e770deb1 fix implicit warnings idct etc
Change-Id: I54a122cc8c0b6ed2dbc3c6ecfcd44736cd40b687
2012-11-29 11:23:02 -08:00
Jim Bankoski
ef3c01ed67 Additional warning message cleanup.
Change-Id: I429a97ac57db3de0bf67ce3f3fe0c6b409f77a9e
2012-11-29 10:10:51 -08:00
Yaowu Xu
ff2f9de828 Merge changes Iaa67bcf1,Ibea3bc80 into experimental
* changes:
  more warning cleanup
  unused variables & warnings
2012-11-29 09:34:10 -08:00
Yaowu Xu
b3055ec020 Merge "more unused variables." into experimental 2012-11-29 09:33:59 -08:00
Yaowu Xu
8422ef772d Merge "unused variable" into experimental 2012-11-29 09:33:52 -08:00
Yaowu Xu
e007eb89cf Merge "unused var removed" into experimental 2012-11-29 09:33:41 -08:00
Yaowu Xu
6431007df3 Merge "minor fix to eob check for setting CONTEXT" into experimental 2012-11-29 09:27:00 -08:00
Yaowu Xu
7ab1d3e49f minor fix to eob check for setting CONTEXT
Previously, the "!=" check is logically incorrect when eob is at 0 and
effective coefficient starting position is 1. This commit should have
no effect on bitstream.

Change-Id: I6ce3a847c7e72bfbe4f7c74f88e3310c6b9b6d30
2012-11-29 09:10:15 -08:00
Jim Bankoski
00b27a3647 more warning cleanup
Change-Id: Iaa67bcf1e866dfe255c4e458d4e51e9c708ffcf4
2012-11-29 09:07:12 -08:00
Jim Bankoski
a802f5e783 unused variables & warnings
Change-Id: Ibea3bc80eb26a975faaa60268bbc93237f82bc57
2012-11-29 09:02:47 -08:00
Jim Bankoski
cf671e2756 more unused variables.
Change-Id: Ibe11e9275949b26a77fa9c8ac2e7c356ae533d5d
2012-11-29 08:54:59 -08:00
Jim Bankoski
6e02947e29 unused variable
Change-Id: I1302a6eaa840d419e8bb9ad0673e42ef139d3fee
2012-11-29 08:51:19 -08:00
Jim Bankoski
705220ee71 unused var removed
Change-Id: I9d0efdff0c79ea4bdd660098106b64776bdd4483
2012-11-29 08:50:20 -08:00
Jim Bankoski
245fba74b7 signed mismatch mvrefcount
Change-Id: Ie34820c1b6eaba9cf9316415a46f48af79c41646
2012-11-29 08:13:18 -08:00
Jim Bankoski
abd74ed594 warning error missing void
Change-Id: I914bcc669297d3414261486bf1bfb716c2ecc804
2012-11-29 07:47:50 -08:00
Jim Bankoski
030e268a90 ihtllm moves to rtcd
clears up some warnings

Change-Id: I9899637497c6ad7519f098e055ab98580ae6d688
2012-11-29 07:19:38 -08:00
Jim Bankoski
e69b5258fd fix vp9_vp8 files renamed
Change-Id: I20c426e91ee49666db42e20eb074095ab6b8ec5d
2012-11-29 06:53:08 -08:00
Jim Bankoski
13dbf1fb17 more rtcd cleanup
Change-Id: Ieefd76e164ca4aa87597da0412977614ddfbacb7
2012-11-28 17:27:15 -08:00
Deb Mukherjee
0de214260b Merge "Fixing 8x8/4x4 ADST for intra modes with tx select" into experimental 2012-11-28 16:59:17 -08:00
Deb Mukherjee
0742b1e4ae Fixing 8x8/4x4 ADST for intra modes with tx select
This patch allows use of 8x8 and 4x4 ADST correctly for Intra
16x16 modes and Intra 8x8 modes when the block size selected
is smaller than the prediction mode. Also includes some cleanups
and refactoring.

Rebase.

Change-Id: Ie3257bdf07bdb9c6e9476915e3a80183c8fa005a
2012-11-28 16:21:12 -08:00
Yaowu Xu
b2f27d909a Merge "remove the vp9_default_mode_contexts_a" into experimental 2012-11-28 13:56:42 -08:00
Yaowu Xu
1cc5739669 remove the vp9_default_mode_contexts_a
Given the way mode_context is updated, the benefit of an additional
default is not signficant.

Change-Id: I67489453e8781340b18e26a1cc2f04e9221004a2
2012-11-28 11:14:30 -08:00
Jim Bankoski
c67873989f fixed includes to be fully specified
Change-Id: Ia1cce221f8511561b9cbd8edb7726fbc286ff243
2012-11-28 10:53:17 -08:00
Jim Bankoski
926d95cd84 Merge "remove postproc invokes" into experimental 2012-11-28 10:30:42 -08:00
John Koleszar
00e2c6bf7a Merge "Clamp decoded feature data" into experimental 2012-11-28 10:08:37 -08:00
John Koleszar
b07fcf5f6f Merge "Revert "make: flatten object file directories"" into experimental 2012-11-28 10:08:22 -08:00
Jim Bankoski
85cba19e16 remove postproc invokes
and some miscellaneous invoke left overs

Change-Id: I63191b1bfd3bea4ce30cceaeb686ec850570fc43
2012-11-28 10:00:25 -08:00
Yaowu Xu
3e976bba21 Localize Y2 entropy coding context
This commit makes sure Y2 entropy coding context is always updated on
every macroblock even there is no Y2 block.

Change-Id: Ie307cfc46526efe55613be39f9f178d2531b56ba
2012-11-28 09:27:36 -08:00
Yunqing Wang
d202138621 Further improve macroblock loop filters
This change included:
1. Aligned reads in vp9_mbloop_filter_vertical_edge function.
Since we actually read 16 bytes, we can align the reads to read
starting at (s - 8) instead of (s - 5).
2. Combined u, v loop filters.
3. Added 8x16 transpose.

This gave 2% decoder performance gain (tulip clip).

Change-Id: Ib14c2f1645c4a3436df17fe2f24789506bf0bb58
2012-11-28 09:27:07 -08:00
Yaowu Xu
12da793d00 removed redundant mode_context data structures
This commit removed a couple of redundant data structures in frame
coding contextsm, mode_context and mode_context_a, and changed to
use vp9_mode_contexts only. The switch of the context for different
frame type now relies on the switch of frame coding context between
lfc and lfc_a. This commit also removed a number of memcpy among
these redundant data structure.

Change-Id: I42e8174bd60f466b0860afc44c1263896471b0f3
2012-11-28 09:24:30 -08:00
John Koleszar
a1f15814be Clamp decoded feature data
Not all segment feature data elements are full-range powers of two, so
there are values that can be encoded that are invalid. Add a new function
to clamp values to the maximum allowed.

Change-Id: Ie47cb80ef2d54292e6b8db9f699c57214a915bc4
2012-11-27 16:38:31 -08:00
John Koleszar
1760c39bce Revert "make: flatten object file directories"
This reverts commit b72373de79.

Change-Id: Ic1601160e11df1a018ef12da25967cfb5eebd5ba
2012-11-27 16:36:39 -08:00
John Koleszar
fcccbcbb39 Add vp9_ prefix to all vp9 files
Support for gyp which doesn't support multiple objects in the same
static library having the same basename.

Change-Id: Ib947eefbaf68f8b177a796d23f875ccdfa6bc9dc
2012-11-27 14:12:30 -08:00
Yunqing Wang
3bf7b131c8 Merge "Improve sad3x16 SSE2 function" into experimental 2012-11-26 10:15:35 -08:00
Paul Wilkins
fbc8e8f9ae Merge "Modified mv prediction." into experimental 2012-11-26 09:59:24 -08:00
Paul Wilkins
d22f3d9f42 Modified mv prediction.
Modified the  mv_pred() fuunction that chooses a centre
point from which to start step searches to use the top
candidate vectors chosen previously.

Some gains (mainly on HD and tested with SB off).
Std_hd 0.874%, YT-hd 0.174%, YT 0.05%, Derf 0.036%

Change-Id: Ie232284f561838b8ecee0e28dcbb07a9cd46cf56
2012-11-26 17:55:19 +00:00
Yunqing Wang
e7cd80718b Improve sad3x16 SSE2 function
Vp9_sad3x16_sse2() is heavily called in decoder, in which the
unaligned reads consume lots of cpu cycles. When CONFIG_SUBPELREFMV
is off, the unaligned offset is 1. In this situation,
we can adjust the src_ptr to be 4-byte aligned, and then do the
aligned reads. This reduced the reading time significantly. Tests
on 1080p clip showed over 2% decoder performance gain with
CONFIG_SUBPELREFM off.

Change-Id: I953afe3ac5406107933ef49d0b695eafba9a6507
2012-11-26 09:53:50 -08:00
Yaowu Xu
89d62e3b04 remove the dependency on idct.h
Change-Id: Idcf827d8ae6429ee5b673c3398f838dbeacb4e74
2012-11-26 09:12:04 -08:00
Jim Bankoski
f42e41f2ef Merge "removed the idct rtcd idct calls" into experimental 2012-11-24 21:38:36 -08:00
Ronald S. Bultje
25b609b62b Move switch(tx_size) around txsize to detokenize.c.
Add a new function vp9_decode_mb_tokens() that handles the switch
between different per-tx-size detokenize functions. Make actual
implementations (vp9_decode_mb_tokens_NxN()) static.

Change-Id: I9e0c4ef410bfa90128a02b472c079a955776816d
2012-11-24 21:22:42 -08:00
Ronald S. Bultje
9dc7d4fb97 Fix crash in pick_inter_mode_sb().
It didn't handle rd_thresh == INT_MAX, which means the reference is
unavailable.

Change-Id: Ie6fa8b2577437411db81a8c24e8dcdfd856a0e8d
2012-11-24 21:20:32 -08:00
Jim Bankoski
510557e2eb removed the idct rtcd idct calls
More cleanup to do after this,  but this is a good chunk of removing rtcd.

Change-Id: I551db75e341a0a85c3ad650df1e9a60dc305681a
2012-11-24 19:33:58 -08:00
Ronald S. Bultje
9970d8b662 Restructure vp9_decode_mb_tokens_8x8() a bit.
Don't declare variables if they only ever have a single value and are
used only as argument to another function call; instead, just hardcode
the value in the function call directly. Split out UV and Y coefficient
loops for clarity. Use xd->block[].qcoeff instead of xd->qcoeff + magic
to remove use of magic offset variables.

Change-Id: I5b17eda1bb666c69c2b7ea957d5525cd78192e33
2012-11-23 09:43:13 -08:00
Ronald S. Bultje
f090b6b47b Restructure vp9_decode_mb_tokens_16x16() a bit.
Don't declare variables if they only ever have a single value and are
used only as argument to another function call; instead, just hardcode
the value in the function call directly. Also remove unneeded brackets
around a code block, and remove the magic offsets 64 and 256 for chroma
values in the coefficient memory block.

Change-Id: I14fc14120a81ea1d6fb862674e8bf8cf6ba3d114
2012-11-23 09:11:12 -08:00
Ronald S. Bultje
0312c3d6d9 Make get_eob() function static.
Change-Id: Idde3ab97960eda7022367c1f91a873a479bc9d7b
2012-11-23 08:17:06 -08:00
Ronald S. Bultje
4422847143 Rename "block_type" function argument to "txfm_size".
Also fix the type (TX_SIZE instead of int).

Change-Id: Ib9b3f33835e58a6e758ed5f37bb64543e62b6a86
2012-11-23 08:15:00 -08:00
Jim Bankoski
91d703b2b2 Merge "remove subpixel invoke functions" into experimental 2012-11-21 19:55:16 -08:00
Ronald S. Bultje
a5e542e74b Fix enc/dec mismatch with b_context_pred experiment enabled.
Change-Id: I1272ae3f0fdfb7ed8eb364ef0c6dd1818d3179d7
2012-11-21 12:39:55 -08:00
Jim Bankoski
3338af4109 remove subpixel invoke functions
Removed the rtcd subpixel invoke functions.

Change-Id: I8b7618bd5813333fac66b2817bdf807616e0fb33
2012-11-21 09:16:30 -08:00
Jim Bankoski
e25bd474ad fixed const problem
NEEDED FOR BUILD

Change-Id: I56a3e68f15dff480b34de048e30231ba821b1ee2
2012-11-21 06:46:25 -08:00
Jim Bankoski
4ad2f08c72 Merge "clean out some of the rtcd code." into experimental 2012-11-21 06:41:37 -08:00
John Koleszar
414f68d266 Merge "Pack invisible frames without lengths" into experimental 2012-11-20 17:22:50 -08:00
John Koleszar
b551d82d92 Merge "make: fix dependency generation for flat build tree" into experimental 2012-11-20 17:22:37 -08:00
Yunqing Wang
bbe5e032a4 Fix ref_stride in sad function
Used ref_stride.

Change-Id: I31f0a3bb935520f54d11a1d87315627f162ae845
2012-11-20 10:01:20 -08:00
John Koleszar
2978bb8762 make: fix dependency generation for flat build tree
Update the fmt_deps function to use a new sed expression to convert the
object file name generated by the compiler into the path-transformed
name of the .o and .d files.

Prior to this patch, changing a header file would not trigger an
incremental build.

Change-Id: I07f498a1d134577b89a72e3f1143c737b31a0636
2012-11-20 07:36:35 -08:00
Jim Bankoski
f4871b6a3f clean out some of the rtcd code.
This removes functions that are no longer needed and cleans up some warnings.

Change-Id: I292a4c3694e9c1d68ce99cea390905b198434719
2012-11-18 12:33:18 -08:00
Ronald S. Bultje
4db08237e0 Merge "Assign above/left context in decode_coefs() instead of in caller." into experimental 2012-11-17 14:41:15 -08:00
Ronald S. Bultje
18e42dddf2 Merge "Remove unused argument from decode_coefs() function prototype." into experimental 2012-11-17 14:41:07 -08:00
Ronald S. Bultje
d0b525656b Merge "Remove coef_bands_x[] array and related machinery in decode_coefs()." into experimental 2012-11-17 14:40:56 -08:00
Ronald S. Bultje
825b20b0ae Merge "Inline count_tokens() in decode_coefs()." into experimental 2012-11-17 14:40:48 -08:00
Ronald S. Bultje
4db4f98b52 Merge "Merge various count_token() functions into a single one." into experimental 2012-11-17 14:40:41 -08:00
Ronald S. Bultje
5d7cb59035 Assign above/left context in decode_coefs() instead of in caller.
this prevents duplicating the same line of code in each caller of
decode_coefs().

Change-Id: Id7996ad394828bf77ef3d5e03002f577c9f79609
2012-11-17 11:22:38 -08:00
Ronald S. Bultje
3bdf302ce7 Remove unused argument from decode_coefs() function prototype.
Change-Id: I8d2539ba1046012c948520ac23a1f1978be921c5
2012-11-17 11:11:06 -08:00
Ronald S. Bultje
a253b3791b Remove coef_bands_x[] array and related machinery in decode_coefs().
Change-Id: I0a36d1efb3bb81a54005b10316550ec67100559e
2012-11-17 11:07:23 -08:00
Ronald S. Bultje
511ef2072c Inline count_tokens() in decode_coefs().
This prevents the relatively expensive token-from-coefficient lookup
function get_token(), plus a duplicate loop..

Change-Id: Ibecd407b2a91d3593d439ec4646e43fa26d2ff91
2012-11-17 10:35:47 -08:00
Ronald S. Bultje
56352f189d Merge various count_token() functions into a single one.
Change-Id: I1970f43e2cb5f7d9744c7249099eed226f16f162
2012-11-17 10:18:41 -08:00
Jim Bankoski
b38b6abccc Merge "removal of temporal invoke" into experimental 2012-11-17 09:53:02 -08:00
Ronald S. Bultje
166d24d07e Remove unused function count_tokens() in detokenize.c.
Change-Id: I178f250b1a4d41d5a9c1619091f5ae51cebffb10
2012-11-17 07:45:46 -08:00
Jim Bankoski
cb98b83239 removal of temporal invoke
Change-Id: I18ca713b02a5241bdb20dddcde0216467b55b596
2012-11-17 06:11:01 -08:00
Ronald S. Bultje
f19a1cafed Remove special-case inline detokenization in b_pred reconstruction.
Just like for all other block modes, b_pred tokens can be read together
before starting macroblock reconstruction. This removes special cases
for b_pred in decode_macroblock() and allows to make decode_coefs_4x4()
static in detokenize.c.

While at it, remove the redundant handling and checking of plane_type
and block_index (i) in decode_coefs_4x4(). Since the function is static,
and is called only from decode_mb_tokens_4x4(), we don't need to worry
that the arguments ever go out of sync.

Change-Id: I2d415da0b51b89d0490a6b9e24cc86363c2090f7
2012-11-16 22:26:12 -08:00
Yunqing Wang
0eb5590425 Merge "Add const before the dequant(dq)" into experimental 2012-11-16 12:35:17 -08:00
Yunqing Wang
4c7c15ee69 Merge "Optimize 8x8 dequant and idct" into experimental 2012-11-16 12:23:06 -08:00
Yunqing Wang
47d9d48fa4 Add const before the dequant(dq)
Modified code to use const before dq.

Change-Id: I6fa59c2ed9743ded33ad08df70e15c2fe1ae7b99
2012-11-16 12:13:13 -08:00
Yaowu Xu
7bb2afa1da Merge "remove yasm.rules" into experimental 2012-11-16 11:46:58 -08:00
Yaowu Xu
9152f4851d remove yasm.rules
As we changed the scripts to compile asm files using customized command
for each file.

Change-Id: I975713f3d0cce2238de3ee3fe44e3227385f0c64
2012-11-16 11:09:26 -08:00
Ronald S. Bultje
5b11052ac1 Support 32x32 intra modes in non-keyframe superblocks.
Change-Id: Icf8ad313c543462e523bff89690e5daa8d49bcc0
2012-11-16 09:54:43 -08:00
Paul Wilkins
a57dbd957b Further experimentation with the mode context
Experiments with a larger set of contexts and some
clean up to replace magic numbers regarding the
number of contexts.

The starting values and rate of backwards adaption
are still suspect and based on a small set of tests.
Added forwards adjustment of probabilities.

The net result of adding the new context and forward
update is small compared to the old context from the
legacy find_near function.  (down a little on derf but
up by a similar amount for HD)

HOWEVER.... with the new context and forward update
the impact of disabling the reverse update (which may be
necessary in some use cases to facilitate parallel decoding)
is hugely reduced.

For the old context without forward update, the impact of
turning off reverse update (Experiment was with SB off) was
Derf - 0.9, Yt -1.89, ythd -2.75 and sthd -8.35. The impact was
mainly at low data rates.

With the new context and forward update enabled the impact
for all the test sets was no more than 0.5-1% (again most at
the low end).

Change-Id: Ic751b414c8ce7f7f3ebc6f19a741d774d2b4b556
2012-11-16 16:58:00 +00:00
John Koleszar
6bca6decbf Merge "Don't write recon.yuv by default" into experimental 2012-11-16 08:41:40 -08:00
Deb Mukherjee
cb2d06ceac Merge "Compound inter-intra experiment" into experimental 2012-11-16 08:30:34 -08:00
Yaowu Xu
170305dcd3 Merge "changed mv candidate search for superblocks" into experimental 2012-11-16 07:21:55 -08:00
Yaowu Xu
415e6bff4d changed mv candidate search for superblocks
added additional motion vectors at close neighborhood of a superblock
to the list of candiate motion vectors, and removed a couple that are
further away.

The change helped std-hd set about .8% (all metrics) and smaller gain
for derf set.

Change-Id: Iaa69b98614db43420ed3fd4738d0ca5587b90045
2012-11-16 07:01:13 -08:00
Deb Mukherjee
0c917fc975 Compound inter-intra experiment
A patch on compound inter-intra prediction.

In compound inter-intra prediction, a new predictor for
16x16 inter coded MBs are obtained by combining a single
inter predictor with a 16x16 intra predictor, in a manner
that the weight varies with distance from the top/left
boundary. The current search strategy is to combine the best
inter mode with the best intra mode obtained independently.

Results so far:

derf +0.31%
yt +0.32%
std-hd +0.35%
hd +0.42%

It is conceivable that the results would improve somewhat
with a more thorough search strategy where all intra modes
are searched given the best mv, or even a joint search for
the best mv and the best intra mode.

Change-Id: I7951f1ed0d6eb31ca32ac24d120f1585bcd8d79b
2012-11-16 06:56:29 -08:00
Yaowu Xu
1c56946ec1 Merge "subpelrefmv for superblocks" into experimental 2012-11-16 05:49:32 -08:00
John Koleszar
64bcffc1ec Pack invisible frames without lengths
Modify the decoder to return the ending position of the bool decoder and
use that as the starting position for the next frame.

The constant-space algorithm for parsing the appended frame lengths is
O(n^2), which is a potential DoS concern if n is unbounded. Revisit
the appended lengths for use as partition lengths when multipartition
support is added.

In addition, this allows decoding of raw streams outside of a container
without additional framing information, though it's insufficient to
be able to remux said stream into a container.

Change-Id: I71e801a9c3e37abe559a56a597635b0cbae1934b
2012-11-15 15:48:07 -08:00
John Koleszar
08b43fef3a webm: add support for V_VP9
Tags VP9 tracks with the V_VP9 video type when writing to .webm files,
and supports decoding both from vpxdec without specifying --codec.

Change-Id: I0ef61dee06f4db2a74032b142a4b4976c51faf6e
2012-11-15 15:07:27 -08:00
Yaowu Xu
61416aedc2 subpelrefmv for superblocks
duplicate code clean-up and variable name corrections

Change-Id: Ibc4703228e652ec425125de5e7bc038fa46595c5
2012-11-15 13:46:52 -08:00
Yaowu Xu
a3384f00a3 changed asm obj output filenames in MSVC build
this commit changed the asm file compiling in MSVC to use individually
customized build command line with object filename specified for each
input file. This allows object filenames prefixed with path name, and
avoid name collision in link time

Change-Id: I996098643dcadc393af57035a04bef3877f45424
2012-11-15 10:46:38 -08:00
John Koleszar
a9c7597adc support building vp8 and vp9 into a single lib
Change-Id: Ib8f8a66c9fd31e508cdc9caa662192f38433aa3d
2012-11-15 10:46:17 -08:00
John Koleszar
b72373de79 make: flatten object file directories
Rather than building an object file directory heirarchy matching the
source tree's layout, rename the object files so that the object
file name contains the path in the source file tree. The intent here
is to allow two files in different parts of the source tree to have
the same name and still not collide when put into an ar archive.

Change-Id: Id627737dc95ffc65b738501215f34a995148c5a2
2012-11-15 10:44:58 -08:00
John Koleszar
6becad426c detokenize: use SEG_LVL_EOB feature consistently
Update decode_coefs() to break when c >= eob, since it's possible that
c starts the loop from 1 and eob is 0. The loop won't terminate in that
case.

Add new get_eob() function to consistently clamp the eob based on the
segment level EOB and the block size. It's possible to code a segment
level EOB that's greater than the block size, and that leads to an
out of bounds access.

Change-Id: I859563b30414615cf1b30dcc2aef8a1de358c42d
2012-11-15 11:44:29 +00:00
pascal massimino
5a955973d9 Merge changes I63348ae3,I658ea409 into experimental
* changes:
  Segment mode coding bug.
  Silenced a few warnings.
2012-11-15 00:24:57 -08:00
Ronald S. Bultje
120690989b Merge "fix costing bug in pick_uv_sb_mode." into experimental 2012-11-14 17:05:46 -08:00
Ronald S. Bultje
d7290d4974 Merge "Merge a few mostly-duplicate code fragments in SB/MB encoding." into experimental 2012-11-14 17:05:40 -08:00
Ronald S. Bultje
a77df0c473 Merge "Prevent overflow in variance32x32." into experimental 2012-11-14 15:43:19 -08:00
Ronald S. Bultje
a653c9d286 fix costing bug in pick_uv_sb_mode.
Change-Id: Ia24e0fddcca9125f8e41e95dbb22444dc51767c7
2012-11-14 15:19:45 -08:00
Ronald S. Bultje
fa1b356e4e Merge a few mostly-duplicate code fragments in SB/MB encoding.
Change-Id: I8e12fbab7ec4732b6400ae3a6964749d818c90c9
2012-11-14 15:19:45 -08:00
Ronald S. Bultje
a099370370 Prevent overflow in variance32x32.
Change-Id: I478878c78ef8a770186622d987d318176827ef5f
2012-11-14 15:18:21 -08:00
John Koleszar
16e2686682 Merge "SEG_LVL_MODE: don't code ref_frame if it's implicit" into experimental 2012-11-14 09:39:25 -08:00
Ronald S. Bultje
127836d11f Merge "Don't use hybrid transform (ADST) for superblocks." into experimental 2012-11-14 09:18:34 -08:00
Ronald S. Bultje
1e3dd49fe3 Don't use hybrid transform (ADST) for superblocks.
This is in line with other cases where we disable ADST if prediction
size and transform size don't match. Before this patch, the RD loop
will use ADST for superblocks, but frame encoding/decoding won't.

Change-Id: I700368c632eb72b5e089c22ef25649d99d7697d0
2012-11-14 08:58:24 -08:00
Paul Wilkins
b527c4dbb7 Segment mode coding bug.
There are now more than 16 possible modes so 5
bits required for segment mode feature.

Note that it is likely that the mode feature and how it is
coded will change but for now the 4 bits was a bug.

Change-Id: I63348ae3a9cc31566a656c2dc78f09f5e1a9dcc9
2012-11-14 14:38:03 +00:00
Paul Wilkins
19a1ba1e91 Silenced a few warnings.
Silenced a few VS compiler warnings.

Change-Id: I658ea409c36c05cd11042675e2e42ccde0ef2420
2012-11-14 14:27:37 +00:00
John Koleszar
854e41f057 Don't write recon.yuv by default
CONFIG_DEBUG was turning on some code to dump the reconstructed frame
to a buffer from within the decoder. Move this code to a more specific
debugging define.

Change-Id: I3ca9ea634bdbd186f2470bd644d3695ee0ab3037
2012-11-13 15:22:35 -08:00
John Koleszar
6d482706ef SEG_LVL_MODE: don't code ref_frame if it's implicit
If the SEG_LVL_MODE is an intra mode, then the reference frame must be
INTRA_FRAME.

Change-Id: I2cdeeac3780c077c74b39ce89a528bc280674231
2012-11-13 15:22:09 -08:00
Yaowu Xu
3fa1348d5f fix a few typos
Change-Id: I7b6f27826052eb706fc6080d4e3a940dff7d3a58
2012-11-13 14:45:53 -08:00
Ronald S. Bultje
1761a6b55a Merge "Use full 32-pixel edge for superblock bestrefmv motion vector ordering." into experimental 2012-11-13 14:12:58 -08:00
Ronald S. Bultje
b147c64c16 Merge "Fix edge MV handling in SBs." into experimental 2012-11-13 14:12:48 -08:00
Deb Mukherjee
7de64f35d3 A fix in MV_REF experiment
This fix ensures that the forward prob update is not turned off for
motion vectors.

Change-Id: I0b63c9401155926763c6294df6cca68b32bac340
2012-11-13 08:27:04 -08:00
Yunqing Wang
e60478d46d Optimize 8x8 dequant and idct
Similar to 16x16 dequant and idct, based on the value of eobs, the
8x8 dequant and idct calculation was simplified to improve decorder
performance.

Combined vp9_dequant_idct_add_8x8 and vp9_dequant_dc_idct_add_8x8
to eliminate duplicate code.

Change-Id: Ia58e50ab27f7012b7379c495837c9c0b5ba9cf7f
2012-11-12 17:41:53 -08:00
Ronald S. Bultje
c79ae1713c Use full 32-pixel edge for superblock bestrefmv motion vector ordering.
Change-Id: I417e39867c020a17d85370972446a8ce2bbe9a6d
2012-11-12 17:06:56 -08:00
Ronald S. Bultje
722972454c Fix edge MV handling in SBs.
Change-Id: Ia1eddb108ec463835e9de8769572d698e21bca49
2012-11-12 17:06:52 -08:00
Paul Wilkins
5d65614fdd Merge "New inter mode context" into experimental 2012-11-12 09:24:14 -08:00
Ronald S. Bultje
3ec56639bc Merge "Fix frame number on which the mismatch is reported in vpxenc." into experimental 2012-11-12 08:35:14 -08:00
Paul Wilkins
2669f42b0d New inter mode context
This change is a fix / extension of the newbestrefmv
experiment. As such it is presented without IFDEF.

The change creates a new context for coding inter modes
in vp9_find_mv_refs(). This replaces the context that
was previously calculated in vp9_find_near_mvs().
The new context is unoptimized and not necessarily
any better at this stage (results pending), but eliminates
the need for a legacy call to vp9_find_near_mvs().
Based on numbers from Scott, this could help decode
speed by several %.

In a later patch I will add support for forward update of
context (assuming this helps) and refine the context as
necessary.

Change-Id: I1cd991b82c8df86cc02237a34185e6d67510698a
2012-11-12 15:50:02 +00:00
Ronald S. Bultje
3a08b033b0 Merge "Fix data type for eobs[] array in SB 4x4 IDCT code." into experimental 2012-11-12 07:40:54 -08:00
Ronald S. Bultje
11fec1863d Merge "Remove 'thismb' data pointer when superblock experiment is on." into experimental 2012-11-12 07:22:22 -08:00
Paul Wilkins
6fb8953c19 Restrict ref mv search range.
Experiment to test speed trade off of reducing the
extent of the ref mv search.

Reducing the maximum number of tested candidates to 9 had
minimal net effect on quality in any of the tests sets.

Reduction to 7 has a small negative impact (worst was STD-HD
at about -0.2%).

This change is in response to the apparently high number of
decode cycles reported in regard to mv-ref selection.

Change-Id: I0e92e92e324337689358495a1ec9ccdeb23dc774
2012-11-12 11:31:12 +00:00
Ronald S. Bultje
195172cf87 Fix frame number on which the mismatch is reported in vpxenc.
Change-Id: I962be949845f881df551d101708e6ba9d8a3d6a2
2012-11-10 16:22:49 -08:00
Ronald S. Bultje
dd9d4f9e1a Fix data type for eobs[] array in SB 4x4 IDCT code.
This fixes encoder/decoder mismatches with the superblock experiment
turned on whenever a superblock is encoded using the 4x4 transform.

Change-Id: Iefec7055e8d25f8efdbba66c4261bbd322d335a3
2012-11-10 12:08:27 -08:00
Ronald S. Bultje
73987d140a Remove 'thismb' data pointer when superblock experiment is on.
This should prevent inconsistent results between identical encodes with
the superblock experiment turned on.

Change-Id: I41a005fae53f2eb59736cc70041185fb7d63cfca
2012-11-10 08:39:51 -08:00
Deb Mukherjee
d01357bbad New b-intra mode where direction is contextual
Preliminary patch on a new 4x4 intra mode B_CONTEXT_PRED where the
dominant direction from the context is used to encode. Various decoder
changes are needed to support decoding of B_CONTEXT_PRED in conjunction
with hybrid transforms since the scan order and tokenization depends on
the actual direction of prediction obtained from the context. Currently
the traditional directional modes are used in conjunction with the
B_CONTEXT_PRED, which also seems to provide the best results.

The gains are small - in the 0.1% range.

Change-Id: I5a7ea80b5218f42a9c0dfb42d3f79a68c7f0cdc2
2012-11-10 07:12:30 -08:00
Deb Mukherjee
3f7182cb0d Build fix in decoder/decodframe.c
Missing eobs agrument in vp9_dequant_idct_add_16x16_c

Change-Id: I826b1afa0a4ee6398f7373325aa0c75e6a866937
2012-11-09 12:48:35 -08:00
John Koleszar
3a0cfb3617 Merge "Packing Altref along with succeeding frame and length encoding frames" into experimental 2012-11-09 12:31:37 -08:00
Vignesh Venkatasubramanian
bc9670eee0 Packing Altref along with succeeding frame and length encoding frames
The altref frame is packed along with the next P frame. So that
outside of the codec there are now only two types of frames P and I.
Also, now it is one frame in and one frame out with respect to the
codec. Apart from that, all the frames are length encoded with the
length of each frame appended to the frame itself. There are
two categories of frames and each of them will look as follows:

  - Packed frames (an altref along with the succeeding p frame)
    - altref_frame_data | altref_lenngth | frame_data | length
  - Unpacked frames (all frames other than the above)
    - frame_data | length

Change-Id: If1eabf5c473f7d46b3f2d026bd30c803588c5330
2012-11-09 12:04:53 -08:00
Ronald S. Bultje
9f53661e8b Merge "Fix another crash in vpxenc with --pass=1 and --test-decode." into experimental 2012-11-09 09:14:06 -08:00
Ronald S. Bultje
88d703cd4d Fix another crash in vpxenc with --pass=1 and --test-decode.
Change-Id: Id23917ce2555519d2e9172dd6ce3a283f2235d26
2012-11-09 09:07:50 -08:00
Yunqing Wang
71b1885403 Merge "Optimize 16x16 dequant and idct" into experimental 2012-11-09 08:30:53 -08:00
Yaowu Xu
7ab951d8cc Merge changes I18407622,I34057b87 into experimental
* changes:
  fix a crash in 2-pass encoding with test-decode on
  enable build on windows with msvc
2012-11-08 16:30:53 -08:00
Yaowu Xu
606c6479c5 fix a crash in 2-pass encoding with test-decode on
only call decoding when encoder produce compressed data

Change-Id: I1840762246afaaad76db6c6d29032ad15aa38afd
2012-11-08 16:22:54 -08:00
Yaowu Xu
7798aef50b enable build on windows with msvc
Change-Id: I34057b87d9713dc819b8c69990dd1408b8c79342
2012-11-08 15:56:27 -08:00
Jim Bankoski
a186eb7f1b Merge "remove macros obfuscating mv costing" into experimental 2012-11-08 15:51:21 -08:00
Jim Bankoski
c72be96b0a remove macros obfuscating mv costing
cleanup

Change-Id: I565eee40d900e0441ad211b65ac829fc5b93d94a
2012-11-08 15:44:39 -08:00
Ronald S. Bultje
1d4fbeb32a Implement tx_select for superblock encoding.
Also split superblock handling code out of decode_macroblock() into
a new function decode_superblock(), for easier readability.

Derf +0.05%, HD +0.2%, STDHD +0.1%. We can likely get further gains
by allowing to select mb_skip_coeff for a subset of the complete SB
or something along those lines, because although this change allows
coding smaller transforms for bigger predictors, it increases the
overhead of coding EOBs to skip the parts where the residual is
near-zero, and thus the overall gain is not as high as we'd expect.

Change-Id: I552ce1286487267f504e3090b683e15515791efa
2012-11-08 11:03:00 -08:00
Yunqing Wang
6c17c9fae0 Optimize 16x16 dequant and idct
As suggested by Yaowu, simplified 16x16 dequant and idct. In decoder,
after detoken step, we know the number of non-zero dct coefficients
(eobs) in a macroblock. Idct calculation can be skipped or simplified
based on eobs, which improves the decoder performance.

Change-Id: I9ffa1cb134bcb5a7d64fcf90c81871a96d1b4018
2012-11-07 20:04:09 -08:00
John Koleszar
8959c8b11d Merge with upstream experimental changes (2)
Include upstream changes (variance fixes) into the merged code base.

Change-Id: I4182654c1411c1b15cd23235d3822702613abce1
2012-11-07 14:32:26 -08:00
James Zern
5338d983d6 Merge "Fix variance (signed integer) overflow" into experimental 2012-11-07 12:49:36 -08:00
John Koleszar
2c08c28191 Merge with upstream experimental changes
Include upstream changes (unit test fixes, in particular) into the
merged code base.

Change-Id: I096f8a9d09e2532fbec0c95d7a995ab22fa54b29
2012-11-07 11:46:23 -08:00
John Koleszar
7b8dfcb5a2 Rough merge of master into experimental
Creates a merge between the master and experimental branches. Fixes a
number of conflicts in the build system to allow *either* VP8 or VP9
to be built. Specifically either:

  $ configure --disable-vp9 $ configure --disable-vp8
  --disable-unit-tests

VP9 still exports its symbols and files as VP8, so that will be
resolved in the next commit.

Unit tests are broken in VP9, but this isn't a new issue. They are
fixed upstream on origin/experimental as of this writing, but rebasing
this merge proved difficult, so will tackle that in a second merge
commit.

Change-Id: I2b7d852c18efd58d1ebc621b8041fe0260442c21
2012-11-07 11:30:16 -08:00
Yaowu Xu
0cedaa3631 merge full pixel refmv experiment
Change-Id: Ib39ad47a7d188f3b45416937b7eeb28c3e79b74c
2012-11-07 10:52:45 -08:00
James Zern
984734436d Fix variance (signed integer) overflow
In the variance calculations the difference is summed and later squared.
When the sum exceeds sqrt(2^31) the value is treated as a negative when
it is shifted which gives incorrect results.

To fix this we force the multiplication to be unsigned.

The alternative fix is to shift sum down by 4 before multiplying.
However that will reduce precision.

For 16x16 blocks the maximum sum is 65280 and sqrt(2^31) is 46340 (and
change).

This change is based on:
1698234 Missed some variance casts
fea3556 Fix variance overflow

Change-Id: I2c61856cca9db54b9b81de83b4505ea81a050a0f
2012-11-06 23:06:44 -08:00
Yaowu Xu
a879b4e6d4 fixed function prototype
so they are consistent with actual definitions of the functions

Change-Id: Ie4b4e81b3da3e288fc2edbbd2b393a5c54d2556b
2012-11-06 15:55:11 -08:00
Yaowu Xu
acadcec5c5 group refmv experiment related functions
Change-Id: Iedaa108ddb65f54d768424f9c47ad4d069b656fd
2012-11-06 15:54:47 -08:00
James Zern
182f99f0c6 Merge "fix test builds" into experimental 2012-11-06 12:18:01 -08:00
James Zern
2e3e685799 fix test builds
s/([vV][pP])8/$19/
additionally dct.h was removed; declare the _c functions that are used
in the tests. the TODO for conversion to parameterized tests still
remains.

Change-Id: I73db9425a57075bbb78a92693ba6b320578981cd
2012-11-06 12:12:58 -08:00
John Koleszar
82b1a3433d Merge other top-level C code
Change-Id: I0ff77f51595599cc3de5183c6c655fd261e3d925
2012-11-06 12:08:05 -08:00
John Koleszar
6ad3b74a58 vpxenc: merge with master
Change-Id: Ic3e3559384a0e72abdc9b66a19865474c2a41b38
2012-11-06 12:04:53 -08:00
John Koleszar
3707c34807 vpxdec: merge with master
Change-Id: I69fd876dd51eb2b4a4a449faa5922225e9508b42
2012-11-06 12:04:53 -08:00
John Koleszar
83b1d907da vpx: merge with master
Change-Id: I44b3ad780cef6f448fa17ff8e28fea87ef9cd518
2012-11-06 12:04:53 -08:00
Yunqing Wang
4626faf1e7 Convert 16x16 dct/idct to integer forms
Converted vp9_short_fdct16x16_c and vp9_short_idct16x16_c to
integer versions.

Change-Id: Ie3ec985a890ac0f4f4f5818e6f0122e00c8af69f
2012-11-06 11:25:25 -08:00
James Zern
0078d2f3dc vp9/encoder/bitstream.c: fix unused variable warnings
Change-Id: Ibfac7e000509d2017eac9a108060e534a19fec33
2012-11-06 11:08:34 -08:00
Yaowu Xu
55f2f14f10 Merge "silent a lot of MSVC compiler warnings" into experimental 2012-11-06 09:39:47 -08:00
Yaowu Xu
8a336b0d0d silent a lot of MSVC compiler warnings
there are still a couple type of warning left, which are related to
double constants assigned to float type. As those would be addressed
by the conversion of transforms into integer version. This commit
has left those un-dealt with.

Change-Id: I48fd9b489c0c27ad6b543f4177423419f929f2bb
2012-11-06 09:09:25 -08:00
Johann
8ca1ed2348 Add option to disable documentation
Documentation is typically auto-detected by checking for php and
doxygen. Add an option to explicitly disable it.

Remove toggle keywords from libraries, examples, documentation and
unit tests. They were not consistent with the default status.

Change-Id: I21049675ccfd8e58ac612cd058641b197db5c0eb
2012-11-06 07:24:04 -08:00
Jim Bankoski
8ce914f5fd Merge "remove invoke_search macro" into experimental 2012-11-06 06:31:52 -08:00
James Zern
e47d9f1d07 rd_pick_inter_mode: prevent signed integer overflow
calculate the txfm_cache difference first as both values may be
INT64_MAX with the intent that they cancel each other out.

Change-Id: I214d072458e1b24f60289974e6302af1aff7b66c
2012-11-05 17:14:32 -08:00
Jim Bankoski
7849aa20ed remove invoke_search macro
Removed invoke search from encoder

Change-Id: I3d809b795abe6df0e71366edfe94026aaede14fb
2012-11-05 16:58:03 -08:00
James Zern
f2541f8a4a rdopt: fix use of uninitialized value in addition
rd_pick_intra4x4mby_modes / rd_pick_intra8x8mby_modes would both use the
input value of 'rate_y' in the return calculation. In many places this
value is uninitialized. Remove the unneeded sum.

Change-Id: Icbd3df685303000301e69291c0ebc06f74bd548d
2012-11-05 12:50:16 -08:00
John Koleszar
807acf17ba vpx_ports: merge with master
Change-Id: I25c067326153455abe1a79f8f44f70b87350e655
2012-11-05 12:39:42 -08:00
John Koleszar
1d0dc7c9f5 build: merge with master
Change-Id: I8ea836ce92c1c96f1e2bdf45e704d36ec9dbc401
2012-11-05 12:39:39 -08:00
Yaowu Xu
a721e5cb0f Merge "Build / make problem" into experimental 2012-11-05 11:55:44 -08:00
Ronald S. Bultje
849c9540d5 Merge "Don't generate residual 3x when doing a macroblock luma RD estimate." into experimental 2012-11-05 06:21:03 -08:00
Paul Wilkins
b90df36d79 Build / make problem
yv12extend_generic.h target not found.

Change-Id: I8b5c9280c92573e5c1917ba4e18a99a6ce7dcb65
2012-11-05 11:32:15 +00:00
James Zern
ee38c4184b loopfilter: prevent signed integer overflow
use unsigned ints to extended filter values in
vp9_mbloop_filter_horizontal_edge_c_sse2

Change-Id: I55ec3ac2bcb9baf55626b0384d151b07fc8e087d
2012-11-03 09:45:21 -07:00
Yunqing Wang
28826a913c Merge "Fix eobs data type" into experimental 2012-11-02 16:00:56 -07:00
Yunqing Wang
d41b0e6498 Fix eobs data type
The block sizes for decoding tokens are up to 16x16, which means
eobs is within [0, 256]. Using (signed) char is not enough. Changed
eobs data type to unsigned short to fix the problem.

Change-Id: I88a7d3098e1f1604c336d6adb88ffec971fb03a6
2012-11-02 13:22:29 -07:00
Ronald S. Bultje
6cd2541379 Don't generate residual 3x when doing a macroblock luma RD estimate.
Change-Id: Ia601e96fcb4fc547884b6ab894f9f2ad22a98078
2012-11-02 11:46:57 -07:00
Ronald S. Bultje
3c4f47e843 Place non-static function prototypes in a header file.
Change-Id: I7cd21b9f1e69f4e0b3338bfe27b3c67e4b47de58
2012-11-02 11:22:57 -07:00
John Koleszar
06f3e51da6 vpx_scale: sync from master
Update vpx_scale from current code in master, run style transform, fix
lint warnings.

Change-Id: I47eadeb5b6881d448ea3728537f9b8a5b5aac78e
2012-11-02 08:44:54 -07:00
Ronald S. Bultje
4b2c2b9aa4 Rename vp8/ codec directory to vp9/.
Change-Id: Ic084c475844b24092a433ab88138cf58af3abbe4
2012-11-01 16:31:22 -07:00
Ronald S. Bultje
6c280c2299 Adjust style to match Google Coding Style a little more closely.
Most of these were picked up by jenkins in the commit that changed
the vp8 namespace to vp9 in common/.

Change-Id: I5cbd56ffc753b92ef805133cda6acc1713a13878
2012-11-01 10:03:48 -07:00
Ronald S. Bultje
6a4b1e5958 Remove vp8 in local symbols.
For non-static functions, change the prefix to vp9_. For static functions,
remove the prefix. Also fix some comments, remove unused code or unused
function prototypes.

Change-Id: I1f8be05362f66060fe421c3d4c9a906fdf835de5
2012-11-01 10:03:43 -07:00
Ronald S. Bultje
982deebb5e Change name of common top-level structures from VP8 to VP9.
This change encompasses VP8_PTR, VP8_COMP, VP8D_COMP, VP8_COMMON,
VP8Decompressor and VP8Common.

Change-Id: I514ef4ad4e682370f36d656af1c09ee20da216ad
2012-10-31 10:15:08 -07:00
Ronald S. Bultje
43da8f147c Change non-function symbol vp8_ prefixes to vp9_.
For local symbols, make them static instead.

Change-Id: I13d60947a46f711bc8991e16100cea2a13e3a22e
2012-10-31 10:15:08 -07:00
Ronald S. Bultje
fbbd3e1832 Merge "Change common vp8_ public symbol prefixes to vp9_." into experimental 2012-10-31 10:04:03 -07:00
Ronald S. Bultje
9bc5f3e3af Change common vp8_ public symbol prefixes to vp9_.
Change-Id: Ic5a5f60e1ff9d9ccae4174160d36529466eeb509
2012-10-31 09:47:32 -07:00
Yunqing Wang
b8e9617ee8 Add forward transform function to rtcd
Added vp8_fht to rtcd_defs.sh

Change-Id: I929b0bf878185a2f0e031dc8c70a418286d509aa
2012-10-31 09:42:51 -07:00
Ronald S. Bultje
5ddcbeeb7d Adjust style to match Google Coding Style a little more closely.
Most of these were picked up in the previous commit (prefix change from
vp8_ to vp9_), but I'm pushing this separately so that it's easier to
review.

Change-Id: Ifce2cdd6f008f4b1fbc2d89b5196d75e35fe115d
2012-10-30 22:07:14 -07:00
Ronald S. Bultje
0d53fc262c Change decoder vp8_ and vp8dx_ public symbol prefixes to vp9_.
Change-Id: Iedb4c3b4171d8640cc525727b4c3658e2bb400db
2012-10-30 22:07:14 -07:00
Ronald S. Bultje
d115dbc24c Adjust style to match Google Coding Style a little more closely.
Most of these were picked up in the previous commit (prefix change from
vp8_ to vp9_), but I'm pushing this separately so that it's easier to
review.

Change-Id: I91e959895778b8632d7d33375523df8a7568a490
2012-10-30 22:07:13 -07:00
Ronald S. Bultje
f88558fb1d Change encoder vp8_ and vp8cx_ public symbol prefixes to vp9_.
Change-Id: Ie2e3652591b010ded10c216501ce24fd95d0aec5
2012-10-30 22:07:07 -07:00
Yunqing Wang
fe1788500c Fixed style warnings
Fixed some style warnings.

Change-Id: I9eb77c3bf6d63628feef1b0c936e905bf4f2089d
2012-10-30 17:54:22 -07:00
Yunqing Wang
8a9e4e8a61 Convert the transforms to integer forms.
Converted the forward and inverse transforms to integer forms.

Modify #define TEST_INT 1/0
in the code to call integer/float version of transforms.

The tests showed that average OVERALL PSNR loss was less than 0.1%.

Change-Id: I1dfa4eeab6412597e3b970ce299cf0e116a917e6
2012-10-30 15:56:20 -07:00
Scott LaVarnway
fc6fdf984b Merge "dequant invoke macro removal" into experimental 2012-10-30 12:49:40 -07:00
Scott LaVarnway
df1b8f2f23 dequant invoke macro removal
Change-Id: Ifa17e698149adc063476e7d16eb727f01e88b447
2012-10-30 12:09:49 -07:00
Paul Wilkins
80674b4330 Merge "Separated experiment for subpel refmv selection" into experimental 2012-10-30 11:00:30 -07:00
Paul Wilkins
e05e6e107e Remove old experiment.
Delete code relating to featureupdates experiment.

Change-Id: If218762c658bb8cbb3007cf2069123b3e05adcbc
2012-10-30 17:36:09 +00:00
Yaowu Xu
24265e884e Separated experiment for subpel refmv selection
As suggested by Paul, this commit separate the subpel refmv selection
into a separate experiment. It also changed a couple variable names
to better reflect the nature of the variables.

Change-Id: Id951c3cadc61a982dd15afe641000f60213b8995
2012-10-30 10:06:59 -07:00
Paul Wilkins
43c1bb967b Merge "Remove "switchable_interp" from experiment list" into experimental 2012-10-30 09:51:37 -07:00
Paul Wilkins
747fbd1b7b Merge "seg_common: give all exported symbols a vp9_ prefix." into experimental 2012-10-30 08:54:00 -07:00
Yaowu Xu
db54baf9aa Remove "switchable_interp" from experiment list
Now this experiment has been merged.

Change-Id: I6c93784df89434c52a4eb8f977cd3745e269abf9
2012-10-30 08:53:47 -07:00
Paul Wilkins
655eb16627 Merge "boolhuff/dboolhuff: give exported symbols a vp9_ prefix." into experimental 2012-10-30 08:53:03 -07:00
Paul Wilkins
a4d308a468 Merge "segmentation: make local symbols static." into experimental 2012-10-30 08:52:59 -07:00
Paul Wilkins
dd2e43c32b Merge "encodeframe: make local symbols static." into experimental 2012-10-30 08:52:52 -07:00
Paul Wilkins
411f9e2b7f Merge "entropymode: put print_mode_contexts under #ifdef MODE_STATS." into experimental 2012-10-30 08:52:40 -07:00
Paul Wilkins
5f0ea6cc5b Merge changes I5898f64d,Ie80d13ce into experimental
* changes:
  ssim: remove unused function dssim().
  detokenize: make local symbols static.
2012-10-30 08:52:28 -07:00
Paul Wilkins
5acb622f42 Merge "firstpass: make local symbols static." into experimental 2012-10-30 08:18:39 -07:00
Paul Wilkins
42d5e31ef3 Merge "bitstream: give exported symbols a vp9_ prefix; make local symbols static." into experimental 2012-10-30 08:18:28 -07:00
Paul Wilkins
976d0450ac Merge "alloccommon: give exported symbols a vp9_ prefix." into experimental 2012-10-30 08:18:16 -07:00
Paul Wilkins
10afa9e229 Merge "Make implicit_segmentation-related code an experiment." into experimental 2012-10-30 08:18:10 -07:00
Paul Wilkins
edd66a996c Merge "decodframe: make local symbol static." into experimental 2012-10-30 08:18:01 -07:00
Paul Wilkins
5091302722 Merge changes I23aa5547,I8341a19c into experimental
* changes:
  tokenize: make local symbols static; give exported symbols a vp9_ prefix.
  encodemb: make locally used functions static.
2012-10-30 07:24:53 -07:00
Paul Wilkins
c87bf0df91 Merge "onyx_if: remove unused function, and make locally used functions static." into experimental 2012-10-30 07:24:11 -07:00
Paul Wilkins
6104f2cc13 Merge "reconintra: make locally used symbols static." into experimental 2012-10-30 07:24:06 -07:00
Paul Wilkins
4247de33fa Merge "rdopt: make locally used symbols static." into experimental 2012-10-30 07:24:00 -07:00
Paul Wilkins
bbc6057687 Merge "ratectrl: make locally used symbol static." into experimental 2012-10-30 07:23:41 -07:00
Paul Wilkins
ac220b8d22 Merge "mbgraph: remove unused function, and make local function static." into experimental 2012-10-30 07:23:33 -07:00
Paul Wilkins
fe6eff7c55 Merge "Fix superblock experiment." into experimental 2012-10-30 06:52:50 -07:00
Paul Wilkins
412c5983e7 Merge "More MSVC build fixes" into experimental 2012-10-30 05:31:12 -07:00
Paul Wilkins
50f1eae5be Merge "Improves subpixel reference mv evaluation" into experimental 2012-10-30 03:48:48 -07:00
Ronald S. Bultje
b066bb4306 seg_common: give all exported symbols a vp9_ prefix.
Change-Id: Ie8ba934a757acec1c80ac37ab9307c9a2783254e
2012-10-29 22:15:27 -07:00
Ronald S. Bultje
d36cc98ee3 boolhuff/dboolhuff: give exported symbols a vp9_ prefix.
Change-Id: I2f1781c70b14bf1d7b6da75d1501718445552af0
2012-10-29 21:42:10 -07:00
Ronald S. Bultje
7f6f07035e segmentation: make local symbols static.
Change-Id: Ia30924dc095663b04794902522308d822c1a5ad0
2012-10-29 21:39:44 -07:00
Ronald S. Bultje
68d07ba116 encodeframe: make local symbols static.
Change-Id: I77bc38b53428ff3e6456b5bc3516418892a58c1e
2012-10-29 21:38:07 -07:00
Ronald S. Bultje
9fb4c9a47d entropymode: put print_mode_contexts under #ifdef MODE_STATS.
This is the condition under which it is called in onyx_if.c. Also remove
the unused function print_mv_ref_cts().

Change-Id: I51ea3720d46f86d136e2215e01cf9d6c7dfc41ea
2012-10-29 21:35:35 -07:00
Ronald S. Bultje
f0dfdfe30d ssim: remove unused function dssim().
Change-Id: I5898f64da77e43a3860a77f3bc49d64b725c278c
2012-10-29 21:30:09 -07:00
Ronald S. Bultje
418d6b317d detokenize: make local symbols static.
Change-Id: Ie80d13ce095faa8bca21bcdca3ca8249d9abc398
2012-10-29 21:28:08 -07:00
Ronald S. Bultje
4c6a2d2221 firstpass: make local symbols static.
Change-Id: Iee0f707abbfe427b10058f6cf3be21b89d6a6e65
2012-10-29 21:26:53 -07:00
Ronald S. Bultje
8ce9fb8d21 bitstream: give exported symbols a vp9_ prefix; make local symbols static.
Change-Id: I3aa5b515c1eae19ae40ba9808d133590c95f7d13
2012-10-29 21:25:22 -07:00
Ronald S. Bultje
7228a38aef alloccommon: give exported symbols a vp9_ prefix.
Also include the correct header in ratectrl.c so it picks up these
function prototypes.

Change-Id: Ic51b13119f1625f0691917f2713b23d0249dece7
2012-10-29 21:24:12 -07:00
Ronald S. Bultje
8166657109 Make implicit_segmentation-related code an experiment.
This way, the code is not compiled in by default, thus decreasing
overall binary size.

Change-Id: I85cac8f5a22a51a7d99c820ef6d6ed179d4106a0
2012-10-29 21:15:42 -07:00
Ronald S. Bultje
8ff22bde68 decodframe: make local symbol static.
Change-Id: Id55f3cd3c2f5857dbfd78703452740dfd63cdf41
2012-10-29 21:08:59 -07:00
Ronald S. Bultje
adb8a160f9 tokenize: make local symbols static; give exported symbols a vp9_ prefix.
Change-Id: I23aa5547b1e74f31327258dda0e330aae7ca1d35
2012-10-29 21:07:40 -07:00
Ronald S. Bultje
1e596da848 encodemb: make locally used functions static.
Change-Id: I8341a19cb4f2234841a40fcbf560315f079b0108
2012-10-29 21:02:36 -07:00
Ronald S. Bultje
8044c6a44b onyx_if: remove unused function, and make locally used functions static.
Change-Id: Ica08c2c9cda9623389dde3f276dfed77c36e3a11
2012-10-29 18:20:32 -07:00
Ronald S. Bultje
ef28aacd4a reconintra: make locally used symbols static.
Also remove them from the header file.

Change-Id: I38182f70268fd47985fb1d8d87cdeb207f67e475
2012-10-29 18:15:04 -07:00
Ronald S. Bultje
7bf461666a rdopt: make locally used symbols static.
Change-Id: Id33c448084ca5c1c0525a05c3c4f35d6b0805fbe
2012-10-29 18:04:33 -07:00
Ronald S. Bultje
1a02ea98af ratectrl: make locally used symbol static.
Change-Id: I4f317f413fbbcc59f84ff77899ea208fb0dccb2a
2012-10-29 18:02:04 -07:00
Ronald S. Bultje
07b8707532 mbgraph: remove unused function, and make local function static.
Change-Id: I295c7bcf13b630cb9395585ede7311d85d785f25
2012-10-29 17:59:45 -07:00
Ronald S. Bultje
7944b4f239 Fix superblock experiment.
Also merge some duplicate code related to the superblock experiment
in the RD loop.

Change-Id: Ic93f1d4d1ed81220fd7ecf6e65da2821a215b2de
2012-10-29 17:58:18 -07:00
Yaowu Xu
00c79553fe More MSVC build fixes
Change-Id: I3b7bae440bba7ffb401c94fc7e338dbe75daa980
2012-10-29 17:42:47 -07:00
Yaowu Xu
d8bd0246dd fixed a build issue
Two head files dct.h and dct_x86.h were removed in a previous commit,
this commit removed the build's dependency on the two files.

Change-Id: Idd33712470912d39d42f133dc30b710cab6fa832
2012-10-29 16:54:13 -07:00
Ronald S. Bultje
1758dc03d4 Merge "Name space clean up." into experimental 2012-10-29 14:41:47 -07:00
Ronald S. Bultje
86728ce109 Merge "A clean up of the down_copy function" into experimental 2012-10-29 14:41:39 -07:00
Jim Bankoski
818ee904a9 remove fdct invoke macros
Remove the fdct invoke macro calls

Change-Id: Ica2431c655819fa012133ee7abc75a16761e5fd6
2012-10-29 11:25:56 -07:00
Jim Bankoski
ee6421a201 Fixes invoke macro commit...
Change-Id: Ic186269b51ffb3c344635bfa9825bed25be2c5ae
2012-10-29 08:58:05 -07:00
Paul Wilkins
a99a2c3667 Name space clean up.
Preparation for project restructuring.
Added vp9_ prefix on some function names that have global scope.
Added static declaration on some that dont.

Change-Id: If072f78b4300e8c17cfeed82c5d17b59946dcc5e
2012-10-29 14:44:10 +00:00
Yaowu Xu
cc9c637d07 Improves subpixel reference mv evaluation
Previously, in evaluating reference motion vectors, MVs are always
rounded to integer pixel position and SADs are calculated.  This
commit takes into account the subpixel portion of the mvs, and uses
bilinear interpolation to produce reference pixel values in subpixel
postions. In addition, SSE is used in place of SAD. Pixels used are
16x2 above and 2x16 to the left.

This commmit intends to test the potential of this line of work in
term of compression improvement, obviously, the change would increase
decoder complexity significantly.

Test results
std-hd: 1.738%(avg) 1.779%(glb), 1.663%(ssim)
derf: 0.472%(avg) 0.477%(glb), 0.418%(ssim)

Change-Id: I3ae1b098f6289df78891134d9a5e4bb2fde87a0b
2012-10-29 07:06:10 -07:00
Paul Wilkins
d638056952 Inconsistent reference to MacroblockD data structure.
Cleaned up some inconsistent references using both xd-> and
x->e_mbd. to access the same data structure in the same function.

Change-Id: Ieb496fa22bf1feec6aa7bc70b941ea4f16e0f8b5
2012-10-29 12:58:49 +00:00
Paul Wilkins
f9d9b2b7f6 Merge "invoke macro removal encodemb" into experimental 2012-10-29 05:42:58 -07:00
Jim Bankoski
1838d87771 invoke macro removal encodemb
Change-Id: I321280abcf48f3dc16e194d29bde2bd3baec6006
2012-10-29 12:36:50 +00:00
Deb Mukherjee
d269de5fba A clean up of the down_copy function
Change-Id: I0c689fb44e9e91539c450d26672d7a1d92e92900
2012-10-26 15:54:37 -07:00
Scott LaVarnway
23f038a13f Merge "Faster 8t filtering" into experimental 2012-10-26 14:53:50 -07:00
Ronald S. Bultje
37ba4cfc7e Merge "Extend edges correctly during actual frame encoding also." into experimental 2012-10-26 11:05:51 -07:00
Paul Wilkins
7d921524d6 Merge "Explicit MV reference experiment." into experimental 2012-10-26 09:42:37 -07:00
Paul Wilkins
ba30e7746e Explicit MV reference experiment.
Coding and costing of mv reference signal.

Issues in updating MV ref with COMPANDED_MVREF_THRESH
to be resolved. Ideally the MV precision should be defined based
on absolute MV magnitude not as now the MV ref magnitude.

Update to mv counts moved into bitstream.c because otherwise
if the motion reference is changed at the last minute the encoder
and decoder get out of step in terms of the counts used to update
entropy probs.

Code working on a few test clips but no results yet re benefit vs
signaling cost and no tuning of red loop to test lower cost alternatives
based on the available reference values.

Patch 3. Added check to make sure we don't pick a reference
that would give rise to an uncodeable / out of range residual.

Patch 6-7: Attempt to rebase. OK to submit but best to leave flag off for now.

Patch 9. Remove print no longer needed.

Change-Id: I1938c2ffe41afe6d3cf6ccc0cb2c5d404809a712
2012-10-26 13:35:02 +01:00
Ronald S. Bultje
6d465faa34 Extend edges correctly during actual frame encoding also.
Should fix B_PRED-related encoder/decoder mismatches.

Change-Id: I16f808dffd19094e02e8562ba58cc1016155ce93
2012-10-25 18:09:02 -07:00
Scott LaVarnway
ce811f87c4 Faster 8t filtering
Quickly modified the ssse3 sixtap filters to support eight taps.  For the test
clip used, a 23+% boost in decoder performance was seen.  We can
revisit later and improve further.

Change-Id: I5f59860459e80d6fa23e6cc0fd91296a969f5240
2012-10-25 17:24:50 -07:00
Debargha Mukherjee
47fb14743d Merge "Always extend macroblock edges in the decoder." into experimental 2012-10-25 13:52:29 -07:00
Ronald S. Bultje
403f6b5846 Always extend macroblock edges in the decoder.
This fixes edge extension if SB [0,1] doesn't use B_PRED but [1,1] does.

Change-Id: I48354a9dba0de16472938824f5e6db87ce61979f
2012-10-25 12:46:39 -07:00
Scott LaVarnway
d3465a5352 Added sse2 instrinsic version of vp8_sad3x16
1.6% boost in decoder performance for the clip used.

Change-Id: I91f3c4573fd3d10afbf18930f279af7ae2223e3a
2012-10-25 12:19:41 -07:00
Scott LaVarnway
be4e7c5f77 Merge "Added sse2 instrinsic version of vp8_sad16x3" into experimental 2012-10-25 12:19:26 -07:00
Scott LaVarnway
9ba2efd034 Added sse2 instrinsic version of vp8_sad16x3
3.7% boost in decoder performance for the clip used.

Change-Id: I74f28486a9352b472b36e21b5eaf30eff35e9199
2012-10-25 12:16:08 -07:00
Ronald S. Bultje
fbf2ac111e Fix 4x4 intra prediction on the edge of SB rows.
Change-Id: I87d571008c73f0a8514e0a864405aadb82fd1bc0
2012-10-25 12:05:58 -07:00
Ronald S. Bultje
2c4f616a61 Fix yet another typo in splitmv/tx_select code.
Change-Id: I6a28cc87af275fc267b3cc8d90d642dcc870c249
2012-10-25 09:17:47 -07:00
Ronald S. Bultje
b4cdcd6ea6 Generalize coefficient tokenizing.
Change-Id: Ie33f7d0f90d0e5862be975d676a700d06f79eec6
2012-10-25 09:14:21 -07:00
Ronald S. Bultje
cb9e6abf80 Generalize EOB token stuffing.
Change-Id: Ibb51f3f8c3575d4621890220b20887a13a46a04e
2012-10-24 16:59:00 -07:00
Ronald S. Bultje
ce9f61ec50 Merge "Fix typo in splitmv/tx_select code." into experimental 2012-10-24 15:21:05 -07:00
Ronald S. Bultje
29b6a45b88 Fix typo in splitmv/tx_select code.
Change-Id: I2823043634b0fa617c2715d63ff18595b7209287
2012-10-24 13:04:09 -07:00
John Koleszar
45b4832ffd Fix bad merge of coef_probs update
Stray CONFIG_HYBRIDTRANSFORM caused decode mismatch.

Change-Id: I1d77bad9b366f7a6ceb3cb45269ed5badb5c4c53
2012-10-24 12:59:22 -07:00
John Koleszar
226e55c17d coef_probs: remove duplicate read/update code
Refactor per-transform copy & paste into a common function
update_coef_probs_common() and read_coef_probs_common(). The dry-run and
bit-writing loops in the encoder are still obvious candidates to be made
common, but they start to diverge a bit in the next commit, so are left
as-is for now.

Change-Id: I896bd3f4a073a6296eab7e92463fef79d8c6c08c
2012-10-24 09:41:04 -07:00
John Koleszar
6baa2b47eb Merge "Fix "_FORTIFY_SOURCE" redefined warning" into experimental 2012-10-24 09:36:40 -07:00
Yunqing Wang
bc1d3cb90b Fix "_FORTIFY_SOURCE" redefined warning
On Ubuntu 12.04, we got the following warning message:
<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined
 [enabled by default]
<built-in>:0:0: note: this is the location of the previous definition

This was already fixed in VP8 configure file. Did the same change in
experimental branch to stop this warning.

Change-Id: Id162e5fd8841585ae806df6560b2f7536ea307c0
2012-10-24 09:22:10 -07:00
Yaowu Xu
f75448ed73 Merge "Fixed the MSVC compiling error with correct cast" into experimental 2012-10-23 14:31:38 -07:00
Scott LaVarnway
f8e9d0104b Fixed the MSVC compiling error with correct cast
Change-Id: Ia904f4ec72500d29f1361ce305d8f3231e592f47
2012-10-23 14:25:01 -07:00
pascal massimino
73d387dcd2 Merge "Change eob[] array type in splitmv RD loop to a regular integer." into experimental 2012-10-23 14:00:01 -07:00
Yaowu Xu
d3b7c850a4 Revert "make the instrinsic code build with MS compilers"
This reverts commit b0e3ca1261.

Change-Id: I9c5aa463461b187160ad01fbc1795ae4f5263b2c
2012-10-23 13:03:35 -07:00
Yaowu Xu
bf284cee80 Merge "changed to avoid code confusion" into experimental 2012-10-23 11:54:25 -07:00
Yaowu Xu
5d739f507e Merge "make the instrinsic code build with MS compilers" into experimental 2012-10-23 11:54:07 -07:00
Scott LaVarnway
b0e3ca1261 make the instrinsic code build with MS compilers
to enable build under windows/MSVC

Change-Id: Ida41cc5b3c8d0fec9512c2f5c5feb64e07b44805
2012-10-23 10:52:11 -07:00
Ronald S. Bultje
6498516bb6 Change eob[] array type in splitmv RD loop to a regular integer.
Change-Id: I240d6b50069fd3f35cc4fed2f4507796f0ef25e9
2012-10-23 09:23:23 -07:00
Deb Mukherjee
5373119713 Merging in the Switchable interp experiment
There is a macro DEFAULT_INTERP_FILTER defined in encoder/onyx_if.c that
is set as EIGHTTAP for now - so SWITCHABLE is not really used. Ideally,
this should be SWITCHABLE but that would make the encoder quite a bit slower.
We will change the default filter to SWITCHABLE once we find a faster way to
search for switchable filters.

Change-Id: Iee91832cdc07e6e14108d9b543130fdd12fc9874
2012-10-23 08:50:52 -07:00
Ronald S. Bultje
f93d316e0c Merge "Change entropy context assignment style from *(x + y) = z to x[y] = z." into experimental 2012-10-22 22:04:28 -07:00
Deb Mukherjee
04d62a989b Merging in the TX_SELECT experiment
Change-Id: I0d306b0062be59bc785b65882691c956c8b5e7c8
2012-10-22 16:58:57 -07:00
Deb Mukherjee
78808ad9fb Merge of the newmventropy experiment
Removes the old mv encoding code.

Change-Id: I1026d48cc5ac15ccb776f98463e929254c3dc7da
2012-10-22 15:23:41 -07:00
Ronald S. Bultje
95dcfb9dd6 Change entropy context assignment style from *(x + y) = z to x[y] = z.
Change-Id: Ibc4425bb6e01606751021e57c93106c365a2da21
2012-10-22 14:06:52 -07:00
Yaowu Xu
906c1b4bd9 changed to avoid code confusion
The previous double if and else code snippets were rather confusing.

Change-Id: Id1b6152fa0e471beb9b20407aa406e109c1471e3
2012-10-22 13:58:26 -07:00
Scott LaVarnway
12c1b180f8 Merge "Added rtcd support vp8_sad16x3 and vp8_sad3x16" into experimental 2012-10-22 13:57:03 -07:00
Scott LaVarnway
d36ecb42da Added rtcd support vp8_sad16x3 and vp8_sad3x16
Change-Id: I5bca7b7a4b230082d36ac6fb84db84137ad177d7
2012-10-22 13:45:42 -07:00
Ronald S. Bultje
97096f5fa3 Merge changes I02e7f64a,Ide954b00,Idc8b5977 into experimental
* changes:
  Fix another typo in 4x4-transform-for-i8x8-intra-pred coeff contexts.
  8x8 transform support in splitmv.
  Use SPLITMV_PARTITIONING instead of a plain integer type.
2012-10-22 12:54:39 -07:00
Deb Mukherjee
7906ed091a Merge "Merging the hybrid transform experiments" into experimental 2012-10-22 12:18:46 -07:00
Deb Mukherjee
f10465634b Merging the hybrid transform experiments
Change-Id: I99f1982b30a630a9a070a8326d83b34a33cba14c
2012-10-22 11:55:29 -07:00
Ronald S. Bultje
f72fdf1c7f Fix another typo in 4x4-transform-for-i8x8-intra-pred coeff contexts.
Change-Id: I02e7f64a7c99f6c222b9ef21341b0e801d646810
2012-10-22 11:55:06 -07:00
Ronald S. Bultje
84ea002eb1 8x8 transform support in splitmv.
For splitmv, where partitioning is 8x16, 16x8 or 8x8, this patch
uses the 8x8 transform (instead of the 4x4) if txfm_mode is
ALLOW_8X8 or ALLOW_16X16. For TX_MODE_SELECT, splitmv can indicate
which of the 2 transform sizes (4x4 or 8x8) it wants to use.

Gains (with hybridtx4x4/8x8/16x16 and tx_select experiments
enabled) on derf: +0.9%, HD: +0.4%, STD/HD: +0.8% (SSIM or overall
PSNR, both metrics show similar improvements).

Change-Id: Ide954b000b415548ed92a7ac78e24f36e60fcf06
2012-10-22 11:49:00 -07:00
Scott LaVarnway
372e001d68 Merge "Re-enable specialized sse2 block loop filter functions" into experimental 2012-10-22 11:39:08 -07:00
Scott LaVarnway
e095785820 Merge "sse2 intrinsic version of vp8_mbloop_filter_vertical_edge()" into experimental 2012-10-22 11:38:37 -07:00
Scott LaVarnway
bb550d90f7 Merge "sse2 intrinsic version of vp8_mbloop_filter_horizontal_edge()" into experimental 2012-10-22 11:38:21 -07:00
Ronald S. Bultje
5a80e7a292 Use SPLITMV_PARTITIONING instead of a plain integer type.
This can be used to distinguish between 16x8, 8x16, 8x8 and 4x4
partitioning modes when choosing splitmv as a MB mode.

Change-Id: Idc8b59772e1a80ccc4ad44d63c5c2ec3fc061a3c
2012-10-22 11:25:48 -07:00
Ronald S. Bultje
09fb253b39 Merge "Invert SB probability." into experimental 2012-10-22 11:18:01 -07:00
Jim Bankoski
8fc5774f8b Merge "Remove variance vtable from rtcd" into experimental 2012-10-22 11:12:07 -07:00
Ronald S. Bultje
ef50e48323 Invert SB probability.
It currently counts the probability that the branch is true, but it
should count the probability that the branch is false.

Change-Id: I963825da2e7a7ed3a613eb23ffd085e427dc36e5
2012-10-22 11:05:56 -07:00
Ronald S. Bultje
6e5cb12886 Merge "Fix use of wrong context in i8x8 coefficient cost calculation." into experimental 2012-10-22 11:03:26 -07:00
Jim Bankoski
118b2fe962 Remove variance vtable from rtcd
Change-Id: Idd2722a538423b451e1e3495f89a7141480493d6
2012-10-21 20:47:57 -07:00
Deb Mukherjee
788d7f10d4 Merge "Allow B_VL_PRED & B_LD_PRED modes with Superblocks" into experimental 2012-10-21 15:35:24 -07:00
Deb Mukherjee
57679badf2 Allow B_VL_PRED & B_LD_PRED modes with Superblocks
Allows B_VL_PRED & B_LD_PRED modes to be used for all blocks
within a MB in B_PRED mode. These modes were temporarily
disabled with super-block coding.

Change-Id: I973b9bdb82c3da5f12d7cc963162a28805f25303
2012-10-20 21:28:38 -07:00
Ronald S. Bultje
0d4e82aa4e Fix use of wrong context in i8x8 coefficient cost calculation.
Change-Id: Ica58d0c7d8addb5ddd5d6e1fdea8f0f96e110862
2012-10-19 22:05:50 -07:00
Scott LaVarnway
a1571b8c11 Re-enable specialized sse2 block loop filter functions
vp8_loop_filter_bh and vp8_loop_filter_bv

Change-Id: I0a77d38c701a6cce96cb8371c7f3ab7e2e7f878c
2012-10-19 16:02:50 -07:00
Scott LaVarnway
085433c2d0 sse2 intrinsic version of vp8_mbloop_filter_vertical_edge()
First sse2 version of vp8_mbloop_filter_vertical_edge().  For now,
intrinsics are being used until the bitstream is finalized.  This function
will be revisited later for further performance improvements.

For the test clip used, a 34+% decoder performance improvement
was seen.  This will vary depending on material.

Change-Id: I455b438bc8d8af76cf7533ac42eda5f689b21f7c
2012-10-19 15:52:12 -07:00
John Koleszar
91dc8ce70d calculate probs consistently
There were several different methods for calculating bitstream
probabilities in use. Consolodate these into a pair of functions,
get_prob() and get_binary_prob().

Change-Id: I5534f517f74027fee16d89c9baefaafea8156b2f
2012-10-19 12:31:16 -07:00
John Koleszar
6e364a57c0 lint-hunks: better support for working tree
When run with no arguments, report warnings in the diff between the
working tree and HEAD. With arguments, report warnings in the diff
between the named commit and its parents.

Change-Id: Ie10dcdecb303edf8af51bad645cc11206a1fc26b
2012-10-19 12:31:16 -07:00
John Koleszar
e9fd1eace1 Remove bc, bc2 from pbi,cpi,xd
Pass the bool coder to be used explicitly. This avoids cases where two
different bool coders can be addressed from the same function. Also be
more consistent with bool coder variable naming, start to standardize
on 'bc'.

Change-Id: I1c95e2fdbe24ebe8c0f84924daa1728e3b054a31
2012-10-19 12:31:15 -07:00
Deb Mukherjee
f3208f362b Some cleanups and fixes.
Separates the logic on transform type selection previously spread out
over a number of files into a separate function. Currently the tx_type
field in b_mode_info is not used, but still left in there to eventually
use for signaling the transform type in the bitstream.

Also, now for tx_type = DCT_DCT, the regular integer DCT is used, as
opposed to the floating point DCT used in conjuction with hybrid
transform.

Results change somewhat due to the transform change, but are within
reasonable limits. The hd/std-hd sets are slightly up, while derf/yt
are slightly down.

Change-Id: I5776840c2239ca2da31ca6cfd7fd1148dc5f9e0f
2012-10-19 06:58:15 -07:00
Ronald S. Bultje
b44397ebcd Merge "Fix encode breakout skip handling." into experimental 2012-10-18 15:21:30 -07:00
Ronald S. Bultje
1f11d13e5e Merge "Detect skippable blocks in splitmv RD loop case." into experimental 2012-10-18 15:21:14 -07:00
Scott LaVarnway
992b5e2d95 sse2 intrinsic version of vp8_mbloop_filter_horizontal_edge()
First sse2 version of vp8_mbloop_filter_horizontal_edge().  For now,
intrinsics are being used until the bitstream is finalized.  This function
will be revisited later for further performance improvements.
For the test clip used, a 31+% decoder performance improvement
was seen.  This will vary depending on material.

Change-Id: I03ed3a7182478bdd1f094644ff3e0442625600e7
2012-10-18 14:29:26 -07:00
Ronald S. Bultje
637c4d2ec8 Merge "Use correct context for optimize_b() in vp8_optimize_mby_8x8()." into experimental 2012-10-18 12:39:10 -07:00
Deb Mukherjee
96276f97ec A fix for crashes when #macroblock rows is odd.
Change-Id: If9fc2df4051ccfb8d804dae9d1be08d12d0f81ce
2012-10-18 12:00:23 -07:00
John Koleszar
13d69d40da lint-hunks: exit status for only affected lines
Prior to this patch, if there were any lint errors, this script would
exit with an error, even if those errors were not in the hunks being
tested by this script. This change makes it so that if any lint lines
are printed, an error is returned.

Change-Id: I69c8bef4367ccf25d287508f29e587b1f4426143
2012-10-17 21:43:29 -07:00
Ronald S. Bultje
87d2b2549c Fix encode breakout skip handling.
Change-Id: Ib42a5dbded27abf2a01fd656a47a1e96b1fe2912
2012-10-17 18:00:56 -07:00
John Koleszar
2b6fd28dfe Merge "lint-hunks: support operating on arbirary revs" into experimental 2012-10-17 16:44:46 -07:00
Ronald S. Bultje
b276efd002 Detect skippable blocks in splitmv RD loop case.
Change-Id: Id8a7265dc721e5cdcaa144e0041beeb32a98f51c
2012-10-17 15:45:00 -07:00
pascal massimino
07c03b3f23 Merge "cosmetic: fix '= & ' construct" into experimental 2012-10-17 15:17:21 -07:00
John Koleszar
e17bb9e39b Merge "rtcd: merge rtcd.c from master" into experimental 2012-10-17 15:16:20 -07:00
John Koleszar
cdd0ed1352 Merge "consolidate update_mb_segmentation_map data" into experimental 2012-10-17 15:15:59 -07:00
John Koleszar
c6f13f3278 Merge changes Ic711a378,I43a46c36,If19ee74a into experimental
* changes:
  Move remaining per-frame data into partition 0
  Interleave modes/residual per macroblock
  Force interleaved decoding
2012-10-17 15:15:10 -07:00
John Koleszar
3883dab0a2 cosmetic: fix '= & ' construct
remove useless space after address-of operator.

Change-Id: I1fb9e82e8d6cf87558fbd454fb5c0f87599ca2ab
2012-10-17 14:51:27 -07:00
John Koleszar
47a2154c0e Move remaining per-frame data into partition 0
This commit moves a bit of data that ended up packed with the
modes/mv/residual partition during the change to interleaved encoding
into partition 0 where it belongs.

Change-Id: Ic711a378c58d9d6a17254384f492c213a15bad92
2012-10-17 14:48:13 -07:00
John Koleszar
b1cb0077f2 lint-hunks: support operating on arbirary revs
Rather than diffing only the index, support checking arbitrary commits.

Change-Id: Ia135a487990d8293d1e0799dc062b9f49e020b25
2012-10-17 14:23:08 -07:00
Ronald S. Bultje
3182ab619d Use correct context for optimize_b() in vp8_optimize_mby_8x8().
Change-Id: Ic975ab85a9924adc7b3d421f64155cc79f40ffd0
2012-10-17 14:12:59 -07:00
John Koleszar
6ef5a00538 Interleave modes/residual per macroblock
Packs the bitstream with each mb's residual following its mode/mv
information.

TODO: There are still a few fields that should be packed into partition
0 but are included in partition 1, due to them being serialized from
write_kfmodes/pack_inter_mode_mvs, which execute after the first
partition is finalized. These need to be separated out into a separate
function, similar to mb_mode_mv_init() in decodemv.c.

Change-Id: I43a46c363601ab36954d07ebe498760e1e2e3af4
2012-10-17 13:19:41 -07:00
Ronald S. Bultje
eab804558b Use 8x8 block bases for non-4x4 splitmv RD.
Change-Id: I76095d5a02edcc5d404ea830157780b24fd509d7
2012-10-17 11:40:00 -07:00
Scott LaVarnway
edf099d272 Merge "Removed the loopfilter rtcd invoke macro code" into experimental 2012-10-17 09:57:23 -07:00
Jim Bankoski
ffff213463 removed obselete build dependency
this commit fixes the build on windows with visual studio 2008.

Change-Id: I0baa4044e9e54237da29f2e17332ea6f766dbbec
2012-10-17 09:22:05 -07:00
Scott LaVarnway
15ce6bd62e Removed the loopfilter rtcd invoke macro code
Change-Id: I446b2ffcbe732ffb112dbd97a4799272d4c01a84
2012-10-16 16:19:35 -07:00
John Koleszar
c073e5ca96 Force interleaved decoding
Rather than decoding all modes/mvs separately, decode them per MB. This
forces the mode which was already used form the CONFIG_NEWBESTREFMV and
CONFIG_SUPERBLOCKS experiments, and is a precursor to changing to
interleaved encoding.

Change-Id: If19ee74ac8a987846d1cd0cf2b2e02a82f1a43ad
2012-10-16 14:08:40 -07:00
Jim Bankoski
9a1962210d Merge "removed the recon rtcd invoke macro code (unrevert)" into experimental 2012-10-16 13:49:22 -07:00
Ronald S. Bultje
9443f05e6b Fix a mismatch if a keyframe contains skip-blocks.
Change-Id: I0681d3183f51627be8c2bb76f343b7270f9116d8
2012-10-16 12:41:56 -07:00
Jim Bankoski
7c15c18c5e removed the recon rtcd invoke macro code (unrevert)
This reinstates reverted commit 2113a83157

Change-Id: I9a9af13497d1e58d4f467e3e083fddf06b1b786c
2012-10-16 12:02:31 -07:00
Ronald S. Bultje
d5955a4231 Merge "Remove test from B_MODE_INFO." into experimental 2012-10-15 19:50:20 -07:00
Ronald S. Bultje
dd3646466e Merge "Remove mode_rdopt from MB_MODE_INFO." into experimental 2012-10-15 19:50:06 -07:00
Ronald S. Bultje
bcaba2e5cb Merge "Properly use chroma block object for chroma coefficient costing." into experimental 2012-10-15 19:49:37 -07:00
Yaowu Xu
4dfa758991 Merge "Changed to use real pixels only for evaluating MVs" into experimental 2012-10-15 15:02:36 -07:00
Yaowu Xu
b2f4257c39 Changed to use real pixels only for evaluating MVs
The commit changed to avoid using pixels from extended border in
in evaluating and select best reference motion vector.

Change-Id: I39b758889373e42ed2889d59744388e5b9c1a20a
2012-10-15 14:51:14 -07:00
Ronald S. Bultje
23a64c890e Remove test from B_MODE_INFO.
It is essentially a duplicate of mode for RD-only purposes. Removing it
saves us 4 bytes per B_MODE_INFO, or ~0.5MB for a 1080p video encode.

Change-Id: I0a54db5f51658b3946d7efb1ca6e8cfbda0cdf88
2012-10-15 13:54:05 -07:00
Ronald S. Bultje
66180f228c Remove mode_rdopt from MB_MODE_INFO.
The variable is essentially a duplicate of mode for RD-only purposes.
Removing it gives identical results, and saves 4 bytes per macroblock
(i.e. 32.5kB for a 1080p HD video encode).

Change-Id: I22d5058fdb80ab0b69862caee825e9d86bb148b3
2012-10-15 13:49:45 -07:00
Ronald S. Bultje
1d87f9c142 Properly use chroma block object for chroma coefficient costing.
Change-Id: Ieb38c7aae91dbaca4a8add204fa84e1cfc459933
2012-10-15 13:36:00 -07:00
Ronald S. Bultje
e788146247 Add a new token stuffing function vp8_stuff_mb().
This way a caller doesn't need to implement the logic for which (and how
many) tokens to write out to stuff one macroblock worth of EOBs. Make
the actual function implementations static, since they are now only used
in tokenize.c; also do some minor stylistic changes so it follows the
style guide a little more closely; use PLANE_TYPE where appropriate,
remove old (stale) frame_type function arguments; hardcode plane type
where only a single one is possible (2nd order DC or U/V EOB stuffing);
support stuffing 8x8/4x4 transform EOBs with no 2nd order DC.

Change-Id: Ia448e251d19a4e3182eddeb9edd034bd7dc16fa3
2012-10-15 10:56:39 -07:00
Ronald S. Bultje
41e3a9ef14 Add and consistently use PLANE_TYPE.
Change the macros PLANE_TYPE_{Y_NO_DC,Y2,UV,Y_WITH_DC} to a typed enum,
and use this typed enum consistently across all places where relevant.
In places where the type is implied (e.g. in functions that only handle
second order planes or chroma planes), remove it as a function argument
and instead hardcode the proper enum in the code directly.

Change-Id: I93652b4a36aa43163d49c732b0bf5c4442738c47
2012-10-15 07:57:16 -07:00
Ronald S. Bultje
5cfff7ce88 Merge duplicate loops in tokenization code.
Also merge the three occurrences of 4x4 chroma block writing into a
single function, and call that function instead of duplicating the
4x4 chroma tokenization code in 3 places.

Change-Id: I7913538d1029f709b0e3ae49fff1148d3be9eeb9
2012-10-15 07:55:27 -07:00
Ronald S. Bultje
a0ad521caf Minor refactoring in encodeintra.c.
Merge code blocks for different transform sizes; use MACROBLOCKD as a
temp variable where that leads to smaller overall source code; remove
duplicate code under #if CONFIG_HYBRIDTRANSFORM/#else blocks. Some style
changes to make it follow the style guide a little better.

Change-Id: I1870a06dae298243db46e14c6729c96c66196525
2012-10-14 17:09:08 -07:00
Ronald S. Bultje
e7a4bccaee Make optimize_mb_16x16() static.
It is not used outside this file.

Change-Id: Id0947180edab4c5f1f50589863350b21e97c25f1
2012-10-14 17:09:08 -07:00
Ronald S. Bultje
781f6ad7c6 Remove assignment in vp8_optimize_mby_16x16().
The result of the assignment is unused.

Change-Id: Id94b790baa6451f24e9aeda6f036390388d93921
2012-10-14 17:09:07 -07:00
Ronald S. Bultje
11e42d46aa Remove duplicate code in optimize_mb_NxN vs. vp8_optimize_mby/uv_NxN().
Instead, just call vp8_optimize_mby/uv_NxN() inside optimize_mb_NxN().

Change-Id: Ief941064d86db4277ba02e990a26819144b55f7c
2012-10-14 17:09:07 -07:00
Ronald S. Bultje
238ed517fd Remove duplicate or unused code in encoder/encodemb.c.
Also make some minor stylistic changes to bring the code closer to
the style guide. Remove distinction between inter and intra transform
functions, since both do exactly the same thing except for the check
against SPLITMV for the second-order transform. Remove some commented
out debug code. Remove 8x8/16x16 transform code in encode_inter16x16y(),
since the first-pass only uses 4x4 anyway.

Change-Id: Ife54816ff759825b9141f95dc2ba43c253c14dba
2012-10-14 17:09:02 -07:00
Ronald S. Bultje
f41adbb468 Remove duplicate or unused code in encoder/quantize.c.
Also make some minor stylistic changes to bring the code closer to
the style guide. Remove checks against i8x8/bpred in the mb-codepath,
since these do individual block reconstruction and thus don't go through
this codepath.

Change-Id: I4dfcf8f78746f4647a206475acf731837aa4fd47
2012-10-14 08:04:06 -07:00
Ronald S. Bultje
78bf1029f1 Remove duplicate or unused code in common/invtrans.c.
Also make some minor stylistic changes to bring the code closer to
the style guide.

Change-Id: Idafa280724f49868ed6b7d65b7fd9227d781994b
2012-10-14 08:04:05 -07:00
Ronald S. Bultje
f1e629320b Add a _4x4 sufix to all 4x4-transform-related functions.
This includes trellis optimization, forward/inverse transform,
quantization, tokenization and stuffing functions.

Change-Id: Ibd34132e1bf0cd667671a57b3f25b3d361b9bf8a
2012-10-14 08:04:05 -07:00
Ronald S. Bultje
e03715fe6c Replace vp8_inverse_htransform_b() by direct call to vp8_ihtllm_c().
Change-Id: I55ee7566341b04d7e7340fdab95189f82231a792
2012-10-14 08:04:05 -07:00
Jim Bankoski
f9d5f86643 Revert "removed the recon. rtcd invoke macro code"
This reverts commit 2113a83157
2012-10-13 20:29:04 -07:00
Jim Bankoski
2113a83157 removed the recon. rtcd invoke macro code
Code clean up - removed rtcd

Change-Id: Id963ecf53c370b1d99484ef18d6befeed7e0c748
2012-10-13 18:49:44 -07:00
Adrian Grange
6e3c7849f7 Merge "Remove reverting of tx-select if only a single txfm-size is used." into experimental 2012-10-12 15:08:24 -07:00
Yaowu Xu
707e6c301e removed the dependency cross key frame boundary
This allowed decoding from any key frame after skipping the frames
prior.

Change-Id: I096fccad5346d75ae50a017c94eb8d772a7e8b00
2012-10-12 12:25:21 -07:00
Yaowu Xu
f6022327f1 Merge "added the ablility to skip first n frames for vpxdec" into experimental 2012-10-12 12:23:18 -07:00
Ronald S. Bultje
5a4ea8bea6 Remove reverting of tx-select if only a single txfm-size is used.
Entropy coding takes care of this anyway, and this causes changes to
the txfm size assigned to skip blocks, which can affect the loopfilter
output, thus causing encoder/decoding mismatches.

Change-Id: I591a8d8a4758a507986b751a9f83e6d76e406998
2012-10-12 11:44:15 -07:00
Ronald S. Bultje
0dac290106 Remove CONFIG_TX16X16, since the experiment was merged.
Change-Id: Ib74824c824f7ebb279e7df8eb32440d4d65fbd79
2012-10-12 11:06:55 -07:00
John Koleszar
17fd972aea consolidate update_mb_segmentation_map data
The update_mb_segmentation_map flag was being signalled earlier than
other data dependent on that flag. Consolidate this data so it's
parsed within the same if-scope as the flag is originally parsed in.

Change-Id: I10e90b4f511856445ef75a85a44ff441e1e5e672
2012-10-12 07:12:59 -07:00
Yaowu Xu
c394ffc603 added the ablility to skip first n frames for vpxdec
Change-Id: Id7d1f25078be92dd6cda246738ad6fb50579f555
2012-10-11 15:18:30 -07:00
Ronald S. Bultje
3121497041 Add encoder/decoder mismatch information to internal stats file.
Change-Id: Ibb6ba26e8718d3af27553ca59443a8c6aec7749d
2012-10-11 10:13:48 -07:00
Ronald S. Bultje
f39b0f192f Use transform-size selection for i8x8_pred also.
Change-Id: Iecb282fc89f9b5145ef31c5eda294ad42bc32a5d
2012-10-11 09:26:00 -07:00
Deb Mukherjee
a7333b0a5b Merge of the TX_16X16 experiment
Change-Id: I22aa803ffff330622cdb77277e7b196a9766f882
2012-10-10 17:05:54 -07:00
John Koleszar
47dcdf11b9 rtcd: merge rtcd.c from master
Pick up changes to multithreading and once() implementations.

Change-Id: I4a98df6b714f3208643798e0e7f74e373a7931e3
2012-10-10 12:30:16 -07:00
Scott LaVarnway
239b6a8f30 Merge "Removing dr[16] from VP8D_COMP" into experimental 2012-10-10 09:08:03 -07:00
John Koleszar
9581bf46dc Merge "write_kfmodes: use update_skip_probs()" into experimental 2012-10-10 08:49:50 -07:00
Paul Wilkins
a2b4a560b4 Merge "convert copy16x16 to rtcd" into experimental 2012-10-10 05:45:19 -07:00
Jim Bankoski
89f060e88a convert copy16x16 to rtcd
Convert copy16x16 from invoke to rtcd.  The first in a long
string of converts.

Change-Id: I296b0aa32f40e9fb649f7a3cb914a4e5300cad63
2012-10-09 17:09:08 -07:00
Scott LaVarnway
f56d0679f3 Removing dr[16] from VP8D_COMP
Currently not used.  Also using this as a test commit into the
experimental branch.

Change-Id: I68c479461ae02f1c7a7f75fa02d1fc0db84bf198
2012-10-09 15:54:32 -07:00
John Koleszar
d94d2b75ea write_kfmodes: use update_skip_probs()
Use the common update_skip_probs() function rather than duplicating its
logic in write_kf_modes().

Change-Id: I2890a28f6907cb79ffe0fb21d20f0ef98b85cdd9
2012-10-09 15:36:00 -07:00
Ronald S. Bultje
9ca3c8b2c4 Selectable transform size try 2.
Results: derf (vanilla or +hybridtx) +0.2% and (+hybrid16x16
or +tx16x16) +0.7%-0.8%; HD (vanilla or +hybridtx) +0.1-0.2%
and (+hybrid16x16 or +tx16x16) +1.4%, STD/HD (vanilla or +hybridtx)
about even, and (+hybrid16x16 or +tx16x16) +0.8-1.0%.

Change-Id: I03899e2f7a64e725a863f32e55366035ba77aa62
2012-10-09 09:18:21 -07:00
Deb Mukherjee
54434bdba2 Merge "Mismatch bug-fix when transform expts are off" into experimental 2012-10-05 06:49:08 -07:00
Deb Mukherjee
105746c8fe Mismatch bug-fix when transform expts are off
A variety of issues related to tangling of various hybrid transform
experiments.

Change-Id: I84dac65ff513f8b024407760df55fffa95e198de
2012-10-05 05:30:00 -07:00
Paul Wilkins
81c6041922 Fix SIMD unsafe use of floating point.
This commit fixes unsafe simd / floating point interactions arising
from the current hybrid and 16x16 transform implementation.
These led to a raft of bugs and issues when the project was
built using VS2008 for Win32 though they did not show up with
the unix builds.

Gerrit makes a meal out of presenting the fix but all I have actually
done is indent the body of each function that uses floating point by
one level and bracket with emms instructions using  the function
vp8_clear_system_state(). See below.

function () {
  vp8_clear_system_state();
  {
  ... function body
  }
  vp8_clear_system_state();
}

This is almost certainly over the top in terms of number of emms
instructions but is a temporary measure pending implementation of
integer variants of each function to replace the floating point.

Limited testing suggests that this fixes the problems that arose for
Win32 VS2008 when the hybrid or 16x16 transforms were enabled.

Change-Id: I7c9a72bd79315246ed880578dec51e2b7c178442
2012-10-05 11:16:46 +01:00
John Koleszar
d6290c3b07 Merge "all_builds.py: add ability to pass extra configure flags" into experimental 2012-10-03 08:28:51 -07:00
Deb Mukherjee
3f5d60b384 Entropy coding for hybrid transform
Separates the entropy coding context models for 4x4, 8x8 and 16x16
ADST variants.

There is a small improvement for HD (hd/std-hd) by about 0.1-0.2%.
Results on derf/yt are about the same, probably because there is not
enough statistics.

Results may improve somewhat once the initial probability tables are
updated for the hybrid transforms which is coming soon.

Change-Id: Ic7c0c62dacc68ef551054fdb575be8b8507d32a8
2012-09-27 11:21:39 -07:00
Deb Mukherjee
70e21afb3f Separating 8x8DCT use from hybridtransform8x8
With this change, even if hybridtransform8x8 experiment is off,
8x8 dct is used for the I8x8 mode. However note that the gains
observed with the hybridtransform8x8 experiment will now be less,
since part of the gain is now merged in.

Change-Id: I9afb3880906fd0a1368a374041fc08efcf060c54
2012-09-21 16:39:23 -07:00
Yaowu Xu
fff019cea4 fixed inconsistency of transform size decision
for MBs using i8x8 prediciton mode when hybridtransform8x8 is not
enabled in configure.

Change-Id: I3e3c8bb1c0261108c1c71213ca9557b0ce558036
2012-09-20 16:31:30 -07:00
Adrian Grange
5e4d5e1877 Added default return value to transform selector
The non-void function didn't return a value in the default case.

Change-Id: Ie4c965315bedc189d2080dd65cf29d3347661946
2012-09-17 15:44:32 -07:00
Yaowu Xu
d482fbff53 removed redundant initialization
Change-Id: I34569375e520759860504c3dfb17a2c27ceb9aed
2012-09-14 09:53:11 -07:00
Yaowu Xu
6d8538e508 Use 3 rows and cols of pixels for ref_mv scoring
The commit changed to use 3 rows above and 3 cols from left for SAD
scoring for selecting the best reference motion vector. The change
helped std-hd set by >.2% on psnr/ssim metrics.

Change-Id: Ifad3b528d0b4b6e3c22518af789d76eff23c1520
2012-09-14 09:47:43 -07:00
Adrian Grange
e1210c6aed Removed redundant line.
Removed spurious line that has no effect.

Change-Id: I9dc90babbbfcaca049d4a40dc996edc7de123e01
2012-09-13 11:37:55 -07:00
Deb Mukherjee
2b26cf1786 Adds feature for companded MV encoding
The high-precision (1/8) pel bit is turned off if the reference
MV is larger than a threshold. The motivation for this patch is
the intuition that if motion is likely large (as indicated by
the reference), there is likley to be more motion blur, and as
a result 1/8 pel precision would be wasteful both in rd sense
as well as computationally.

The feature is incorporated as part of the newmventropy experiment.
There is a modest RD improvement with the patch. Overall the
results with the newmventropy experiment with the threshold being
16 integer pels are:

derf: +0.279%
std-hd: +0.617%
hd: +1.299%
yt: +0.822%

With threshold 8 integer pels are:

derf: +0.295%
std-hd: +0.623%
hd: +1.365%
yt: +0.847%

Patch: rebased
Patch: rebase fixes

Change-Id: I4ed14600df3c457944e6541ed407cb6e91fe428b
2012-09-12 11:51:10 -07:00
Deb Mukherjee
d406334f27 Cleanups for hybrid transform
Some cleanups on the transform size and type selection logic.

Change-Id: If2e9675459482242cf83b4f7de7634505e3f6dac
2012-09-11 20:53:13 -07:00
Yaowu Xu
d4c329c4da Merge "Revert "Hybrid transform cleanups"" into experimental 2012-09-11 15:00:51 -07:00
Debargha Mukherjee
aac982e89c Revert "Hybrid transform cleanups"
This reverts commit c5af82b7ed

There was a mismatch bug introduced by this patch. Hence reverting until it is fixed.
2012-09-11 14:52:20 -07:00
Deb Mukherjee
44d27c7b2c Merge "Hybrid transform cleanups" into experimental 2012-09-10 15:39:37 -07:00
Deb Mukherjee
c5af82b7ed Hybrid transform cleanups
Some cleanups that will make it easier to maintain the code
and incorporate upcoming changes on  entropy coding for the
hybrid transforms.

Change-Id: I44bdba368f7b8bf203161d7a6d3b1fc2c9e21a8f
2012-09-10 15:27:56 -07:00
Paul Wilkins
778ec421e7 Partial merge of NEWBESTREFMV and NEW_MVREF.
This commit merges those parts of the CONFIG_NEW_MVREF
that specifically relate to choosing a better set of candidate
MV references into the NEWBESTREFMV experiment.

CONFIG_NEW_MVREF will then be used for changes relating
to the explicit coding of a cost optimized MV reference in the
bitstream as part of MV coding.

Change-Id: Ied982c0ad72093eab29e38b8cd74d5c3d7458b10
2012-09-07 14:21:22 +01:00
Paul Wilkins
38e1c79185 MV reference changes
Extend experiment to use both vectors from MBs
coded using compound prediction as candidates.

In final sort only consider best 4 candidates
for now but make sure 0,0 is always one of them.

Other minor changes to new MV reference code.
Pass in Mv list to vp8_find_best_ref_mvs().

Change-Id: Ib96220c33c6b80bd1d5e0fbe8b68121be7997095
2012-09-07 12:46:41 +01:00
Deb Mukherjee
00f9eb6590 New motion vector entropy coding
Adds a new experiment with redesigned/refactored motion vector entropy
coding. The patch also takes a first step towards separating the
integer and fractional pel components of a MV. However the fractional
pel encoding still depends on the integer pel part and so they are
not fully independent. Further experiments are in progress to see
how much they can be decoupled without affecting performance.
All components including entropy coding/decoding, costing for MV
search, forward updates and backward updates to probability tables,
have been implemented.

Results so far:
derf: +0.19%
std-hd: +0.28%
yt: +0.80%
hd: +1.15%

Patch: Simplifies the fractional pel models:
derf: +0.284%
std-hd: +0.289%
yt: +0.849%
hd: +1.254%

Patch: Some changes in the models, rebased.
derf: +0.330%
std-hd: +0.306%
yt: +0.816%
hd: +1.225%

Change-Id: I646b3c48f3587f4cc909639b78c3798da6402678
2012-09-06 08:28:21 -07:00
Jingning Han
de6dfa6bb0 hybrid transform of 16x16 dimension
Enable ADST/DCT of dimension 16x16 for I16X16 modes. This change provides
benefits mostly for hd sequences.

Set up the framework for selectable transform dimension.

Also allowing quantization parameter threshold to control the use
of hybrid transform (This is currently disabled by setting threshold
always above the quantization parameter. Adaptive thresholding can
be built upon this, which will further improve the coding performance.)

The coding performance gains (with respect to the codec that has all
other configuration settings turned on) are

derf:   0.013
yt:     0.086
hd:     0.198
std-hd: 0.501

Change-Id: Ibb4263a61fc74e0b3c345f54d73e8c73552bf926
2012-08-30 16:52:25 -07:00
Ronald S. Bultje
c59e36fc76 Merge "Add proper skip support to intra frames." into experimental 2012-08-30 09:11:41 -07:00
Ronald S. Bultje
4f36b7c6b9 Add proper skip support to intra frames.
Change-Id: I7524883fb29f42303fb46a5bc6772fbcf8781d1d
2012-08-29 10:43:20 -07:00
Ronald S. Bultje
7a18c81663 Remove some disabled code from pick_inter_mode_sb().
Change-Id: I323c429b453eec8c3b76c37f7e2a52da9dfe8d77
2012-08-28 09:51:52 -07:00
Ronald S. Bultje
8e8fb27694 Disable 16x16 temp buffer for superblocks.
Change-Id: I3d585bae446c16fcf7a39d72c1bcd6468a7bb1a1
2012-08-28 09:18:24 -07:00
John Koleszar
307541d9a9 all_builds.py: add ability to pass extra configure flags
Useful to pass --target etc to this script on Jenkins.

Change-Id: I9b22339a211df543077bcc84bdef4460f3ca5c9c
2012-08-27 10:30:14 -07:00
John Koleszar
0256398cb7 Merge "Fix file permissions" into experimental 2012-08-24 15:21:49 -07:00
Ronald S. Bultje
6db4d93a27 Merge "change to properly account for coef scaling in unit tests" into experimental 2012-08-24 12:10:04 -07:00
Yaowu Xu
95ee7f1131 change to properly account for coef scaling in unit tests
The transform functions in experimental branch absorbed a scaling
factor of 4 to allow quantization steps closer to unit quantizer.
This commit added scaling code in between forward and inverse
transform to properly account for the scaling factor.

Change-Id: I9a573ddc1ffa74973b34800a5da1a56dbabe0949
2012-08-24 10:11:15 -07:00
Paul Wilkins
2d60bee1fb New Motion Reference Search
Alternative strategy for finding a list of candidate motion
vectors to use as reference values in mv coding and as
nearest and near.

Sort by sad in vp8_find_best_ref_mvs() rather than just
pick the best. Allow 0,0 as a best ref option but not a
nearest or near unless there are no alternatives.

Encode/Decode verified on at least some clips.

Some commented out experimental and stats code still in place.

Gain over existing code averages about 1% on derf (alll metrics)
with improvement on all clips. Other test results pending.

The entropy coding of the mode (nearest/near etc) still
depends upon and requires the old "findnear" code so
this needs looking at and may provide room for further gains.

Change-Id: I871d7cba1d1c379c4bad9bcccce1fb19c46b8247
2012-08-24 18:08:21 +01:00
Ronald S. Bultje
3777125ba6 Remove duplicate code in C intra prediction.
Change-Id: If4eb0fd60cc5bc2f32254e82e8d6cfa4120cb558
2012-08-22 16:05:21 -07:00
John Koleszar
07083903b6 Fix file permissions
Change-Id: I8d1a2c664cbeb939cf23bcd414b23e19da760a14
2012-08-22 10:17:18 -07:00
John Koleszar
0b184efbbf Merge "all_builds.py: move to tools/" into experimental 2012-08-22 10:03:06 -07:00
John Koleszar
a8f9842dd4 Merge "all_builds.py: support for sharding builds" into experimental 2012-08-22 10:02:45 -07:00
John Koleszar
b43ed7a5b1 Merge "remove rotation experiment" into experimental 2012-08-22 10:01:39 -07:00
Christian Duvivier
4580f3371b Merge "SSE2 version of vectorized 8-tap filtering." into experimental 2012-08-21 17:17:42 -07:00
Ronald S. Bultje
1b5e5e9279 Merge "Fix mismatch caused by a rebase failure." into experimental 2012-08-21 17:12:41 -07:00
Ronald S. Bultje
94465c1937 Fix mismatch caused by a rebase failure.
Change-Id: Ifff660de60fb12d745092eafc17f6a49f6e1fb53
2012-08-21 16:45:51 -07:00
Christian Duvivier
63ef9c40a4 SSE2 version of vectorized 8-tap filtering.
About 20% overall encoder speedup (vs. about 30% for sse4 version).

Change-Id: Ibf608a6a1bc94b14ec47e8046d3206b275b5a8bd
2012-08-21 15:26:14 -07:00
Daniel Kang
8c2a6cac41 Fix compiler warnings
Change-Id: I887cdcf90b87736f2a3805420aa41eed93324bee
2012-08-21 15:09:42 -07:00
Christian Duvivier
2a050620e5 Fix warning.
Change-Id: I99311811820169d62fda3febac4bafacfc7a538b
2012-08-21 14:58:36 -07:00
John Koleszar
b878b5567b all_builds.py: move to tools/
Change-Id: I64c470fb5a4f32a862cfb5424fb95baac47fcc24
2012-08-21 11:18:58 -07:00
John Koleszar
778393cfd2 all_builds.py: support for sharding builds
Allow sharding of the builds with the --shard= and --shards= options.

Change-Id: I9d5552ad2edc0b1210e96f0e94ce7dfd645c45f8
2012-08-21 11:18:38 -07:00
John Koleszar
6612a43ce2 Merge changes I96cd08c9,If8eeb8ff into experimental
* changes:
  hybridtransform8x8: fix compilation
  comp_intra_pred: fix compilation
2012-08-21 10:10:43 -07:00
John Koleszar
5055a1610d remove rotation experiment
This is being reimplemented more generically in terms of affine
transforms.

Change-Id: I9300bfde5f8b93c708c64f59427087720f8ed782
2012-08-21 10:09:56 -07:00
John Koleszar
fb44d3e1da hybridtransform8x8: fix compilation
corrected ifdefs to include CONFIG_HYBRIDTRANSFORM8X8 for missing
definitions

Change-Id: I96cd08c98d74b5ba10866f3fa30252073ce92fa5
2012-08-21 09:31:31 -07:00
Ronald S. Bultje
978e4d0445 Fix some compiler warnings.
Change-Id: Iccb56e3b966d1519ba49dfe4e1396479c6b54a6f
2012-08-20 17:45:36 -07:00
John Koleszar
04ca655829 comp_intra_pred: fix compilation
Added missing parameters to calls to:
  vp8_build_intra_predictors_internal
  vp8_build_intra_predictors_mbuv_internal

Change-Id: If8eeb8ff23eff4572397b404fe61be5d0c950bbe
2012-08-20 17:38:50 -07:00
John Koleszar
cbc66fa83b Merge "Fix typo." into experimental 2012-08-20 17:09:30 -07:00
Ronald S. Bultje
2f743143bb Fix typo.
Change-Id: I95217ce52675ad00637fc8f60d4d0dd054efd512
2012-08-20 17:07:24 -07:00
Ronald S. Bultje
4396441b8b Merge "Superblock coding." into experimental 2012-08-20 17:04:23 -07:00
Ronald S. Bultje
5d4cffb35f Superblock coding.
This commit adds a pick_sb_mode() function which selects the best 32x32
superblock coding mode. Then it selects the best per-MB modes, compares
the two and encodes that in the bitstream.

The bitstream coding is rather simplistic right now. At the SB level,
we code a bit to indicate whether this block uses SB-coding (32x32
prediction) or MB-coding (anything else), and then we follow with the
actual modes. This could and should be modified in the future, but is
omitted from this commit because it will likely involve reorganizing
much more code rather than just adding SB coding, so it's better to let
that be judged on its own merits.

Gains on derf: about even, YT/HD: +0.75%, STD/HD: +1.5%.

Change-Id: Iae313a7cbd8f75b3c66d04a68b991cb096eaaba6
2012-08-20 14:43:34 -07:00
Christian Duvivier
fc892cc54d Fix warnings.
Change-Id: I01dd96da18fe22450bb372b10ba90eab52e29bdf
2012-08-17 16:35:48 -07:00
Christian Duvivier
ee59dd7e15 Merge "A few more optimizations, about 1% overall speedup." into experimental 2012-08-16 17:03:08 -07:00
Christian Duvivier
525b183910 A few more optimizations, about 1% overall speedup.
Unroll horizontal pass, no more intermediate buffer, faster special transpose.

Change-Id: I05df75be4e5f01420066cdf3c61a2edf35bedb64
2012-08-16 15:03:29 -07:00
Jingning Han
60ed954535 Fixed decoder mismatch issue
Resolved the decoder mismatch issue due to quantization parameter
threshold for hybrid transform coding. The macroblock dequantizer
initialization is moved to be performed before coefficient
detokenization, since the (de)tokenization is now dependent on the
macroblock level quantization parameter.

Change-Id: I443da4992ebb70ae4114750b2f1363c0c628580e
2012-08-16 14:24:32 -07:00
Ronald S. Bultje
45ddaab89b Merge "Set a default mv entropy if no tokens are coded." into experimental 2012-08-16 11:33:10 -07:00
Ronald S. Bultje
319dd1c0f5 Set a default mv entropy if no tokens are coded.
This doesn't affect the result, since there are no MVs coded using this
entropy. It does, however, silence valgrind warnings about uninitialized
variables.

Change-Id: I6e21ba92df6ce5381bf58b8c349ef4373294a0b6
2012-08-16 11:12:50 -07:00
Daniel Kang
e5cc24cc2e Fix valgrind error which causes non-deterministic results.
Error was introduced in bf474e170f

Change-Id: I55bf114a1938c3a8869d8ff49cbe076eb9e83ea0
2012-08-16 11:04:34 -07:00
Ronald S. Bultje
0393e558a4 Fix stack overrun in calculating segmentation map coding method.
This caused spurious crashes on encodes, frustratingly often only on
high-definition material.

Change-Id: Ia8c1dfc420d598ca92108bd9cc2df7450e8d10a2
2012-08-15 22:31:49 -07:00
Christian Duvivier
9471bc2e9e Merge "First partial snapshot of vectorized 8-tap filtering." into experimental 2012-08-15 18:01:18 -07:00
Christian Duvivier
5a34e0eb89 First partial snapshot of vectorized 8-tap filtering.
About 3.5x faster, 30% overall encoder speedup. Rest of optimizations
will come soon (see TODO section in filter_sse4.c).

Change-Id: If18108048bfd5345fc942e8574e4c7f58e0e86e0
2012-08-15 17:55:06 -07:00
Daniel Kang
26a55baed2 Fix build with TX_16X16
Change-Id: I1ccb2546e29803d0e9d69282409d549a28201967
2012-08-15 09:43:54 -07:00
Paul Wilkins
77dc5c65f2 Code clean up.
Further cases of inconsistent naming convention.

Change-Id: Id3411ecec6f01a4c889268a00f0c9fd5a92ea143
2012-08-15 11:00:53 +01:00
Christian Duvivier
a1168155a7 Fix warnings.
Change-Id: I4b911e4173da30c164bde7ea50bc80a70fbbb745
2012-08-14 16:23:32 -07:00
Christian Duvivier
73089031f0 Fix build.
Change-Id: I27729a8631cffd54dfbae3ec0f07df7c883f7510
2012-08-14 13:44:14 -07:00
Daniel Kang
fd084b2489 Shut up warnings added by -Wundef
Change-Id: I9c7ef4a75c37aa0e10df75e165e3066614c955ef
2012-08-14 09:33:22 -07:00
John Koleszar
8fb9f083f2 Merge changes I0b51674f,I1ea6ebf9,I89076d93 into experimental
* changes:
  lint_hunks: show style violations in the index
  intersect_diffs: split out diff classes
  ftfy: update to match current astyle rule
2012-08-14 09:26:16 -07:00
Deb Mukherjee
eaadefdfdc Merge "Some build fixes" into experimental 2012-08-14 09:21:40 -07:00
Yaowu Xu
3fda7a665d Merge "Changed to use reference mv as nearest mv" into experimental 2012-08-14 09:12:31 -07:00
Yaowu Xu
e52e8b7025 Changed to use reference mv as nearest mv
The reference motion vector selected by surrounding pixels that has
the best matching score is used as nearest motion vector.

The change has shown consistent gain on all test sets, compression
gains range from .2% to .6%. The variation is largely dependent on
various other experiments on or off.

Change-Id: I5552e1c2f6fc57c3e8818a5ee41ffda89af05e75
2012-08-14 09:12:15 -07:00
Deb Mukherjee
32fe72eb3c Some build fixes
Fixes two typos that breaks the build introduced in recent check-ins.

Change-Id: I3f15f3c088c48a63fede8941c9a4ba05dd0403c2
2012-08-14 07:28:43 -07:00
Paul Wilkins
39892ccead Code clean up.
References to MACROBLOCKD that use "x" changed to "xd"
to comply with convention elsewhere that x = MACROBLOCK
and xd = MACROBLOCKD.

Simplify some repeat references using local variables.

Change-Id: I0ba2e79536add08140a6c8b19698fcf5077246bc
2012-08-14 11:32:29 +01:00
Daniel Kang
2f963917a6 Fix typo, which adds skip testing for 16x16
Also add warnings for undefined macros in the C pre-processor

Change-Id: I1ec30e57c5a49fb72151a4cf140d7eeb0fb1d779
2012-08-13 16:28:11 -07:00
Daniel Kang
d4762ce327 Shut up some compiler warnings on gcc
Change-Id: I8548aebd3c39797b253eef472bfe1c40f2f7ec59
2012-08-13 16:24:28 -07:00
Christian Duvivier
dbce3b7706 Fix warning/bug introduced in 4d5b81a80f.
Change-Id: I082d2517022cbf2f472c143fe7772719d8295498
2012-08-13 15:51:12 -07:00
Daniel Kang
fcb59ba084 Cosmetics to rdopt.c
Change-Id: Icc276609e409e4e234d240e5c12e137600e178ed
2012-08-13 09:55:49 -07:00
Daniel Kang
1b8169bb54 Combine optimize_b and optimize_b_8x8
The 16x16 has not been done yet for speed reasons.

Change-Id: I066e369a065674d58986e937344c9303fed19450
2012-08-13 09:55:30 -07:00
Yaowu Xu
b91219e29e extend the range of encoding time
The commit also corrects unit of encoding from microsecond to
milisecond.

Change-Id: I030108e90f89f33dfad2d092dc8991db81979715
2012-08-10 17:26:54 -07:00
Yaowu Xu
1bbde82c28 fix build problem for newbestrefmv experiment
Change-Id: I7f531d55f076254c84402fed34af93fe3685fbdf
2012-08-10 17:15:23 -07:00
Daniel Kang
e902f66e42 Fix some tabbing in rdopt.c
Change-Id: Ie7e7727512cc1333bd16e7688cd1d8764371dde3
2012-08-10 10:00:18 -07:00
John Koleszar
6c776b2b23 lint_hunks: show style violations in the index
Shows the subset of style violations that intersect with lines modified
in the current index.

Change-Id: I0b51674fd43df118e8bbf55b684a1ca0bd0e1d40
2012-08-10 09:42:43 -07:00
Daniel Kang
f13517e6aa Refactor to remove some arguments from vp8_rd_pick_inter_mode
Change-Id: I8e72279cc68f34d269705f06cdaf8f3d06eed635
2012-08-10 09:42:36 -07:00
Daniel Kang
4d5b81a80f Refactor RD to take same codepath for single and comp pred
Change-Id: Id38baf1b89648ef534e28be72f583137871f920c
2012-08-10 09:40:10 -07:00
Paul Wilkins
bd9e5eceb8 Code cleanup.
Add local variable in several places to reference the MB mode
info structure. Currently this is usually accessed in the code as
x->e_mbd.mode_info_context->mbmi.* or in some places
xd->mode_info_context->mbmi.*

Resolved some uses of x-> for the MACROBLOCKD structure.

Rebased without dependency on motion reference experiment.

Change-Id: If6718276ee4f2ef131825d1524dfdb02a3793aed
2012-08-10 14:12:43 +01:00
John Koleszar
a7be7c87e0 intersect_diffs: split out diff classes
Seperate parsing functions so they can be reused for other diff
utilities

Change-Id: I1ea6ebf90ded128eec116cc1f326a28bdda2fb77
2012-08-09 16:55:42 -07:00
John Koleszar
84b1fbfde1 ftfy: update to match current astyle rule
Change-Id: I89076d93968a5817d6d0330ec7fd6a6c73fe397f
2012-08-09 16:54:41 -07:00
Daniel Kang
bf474e170f Refactor vp8_build_inter16x16_predictor functions
Change-Id: I4fceefe76b14bd38a358dc4356708f7981bab339
2012-08-09 09:48:36 -07:00
Daniel Kang
d4a4c3c06f More refactoring of diamond search.
This should make merging inter code paths easier.

Change-Id: I5cb81f25d56fa4790b4e9cfa4bc32b9062c2cfdf
2012-08-09 09:48:36 -07:00
Daniel Kang
6d0097737d Refactor SPLITMV in RD to a special case.
SPLITMV shares very little code with the other inter modes.

Change-Id: I0beee95de1fbedeea1f71650951ffc7db3a118eb
2012-08-09 09:48:36 -07:00
Daniel Kang
b0a46b6b17 Begin refactoring to help merge parts of rd inter.
Also refactor some RD code, remove some comments, and cosmetic changes.

Change-Id: I43806ae573ab5a5036602ac4425d750bbfa1e812
2012-08-09 09:48:36 -07:00
Deb Mukherjee
97280c1a23 Merge "Merging in the sixteenth subpel uv experiment" into experimental 2012-08-09 09:36:18 -07:00
John Koleszar
be9b5fa062 Merge "Import tools/ from master branch" into experimental 2012-08-09 09:12:17 -07:00
Christian Duvivier
26c4130b23 Newline got lost in submission of "Partial import of "New RTCD implementation" from master branch."
Change-Id: I3841eca46e29a108a79fe47af0cfa97f0bc80a2a
2012-08-08 17:20:33 -07:00
Deb Mukherjee
7d0656537b Merging in the sixteenth subpel uv experiment
Merges this experiment in to make it easier to run tests on
filter precision, vectorized implementation etc.

Also removes an experimental filter.

Change-Id: I1e8706bb6d4fc469815123939e9c6e0b5ae945cd
2012-08-08 16:57:43 -07:00
Christian Duvivier
c75057e380 Merge "Partial import of "New RTCD implementation" from master branch." into experimental 2012-08-08 16:49:03 -07:00
Christian Duvivier
707b65bd16 Partial import of "New RTCD implementation" from master branch.
Latest version of all scripts/makefile but rtcd_defs.sh is empty, all
existing functions are still selected using the old/current way.

Change-Id: Ib92946a48a31d6c8d1d7359eca524bc1d3e66174
2012-08-08 16:43:48 -07:00
Debargha Mukherjee
b04e87c6ab Merge "a tiny fix for MSVC build" into experimental 2012-08-08 16:12:23 -07:00
Daniel Kang
c30838b383 Merge "Refactor setting up MVs and buffers in rdopt.c" into experimental 2012-08-08 14:58:24 -07:00
Yaowu Xu
e590446555 a tiny fix for MSVC build
Change-Id: Ib23b0711a4690e1edff3131ce48527b6805877fb
2012-08-08 14:41:37 -07:00
Christian Duvivier
2056f7e0d8 Merge "Cleanup and commenting of the sub-pixel interpolation functions. Mostly as a preparation for the upcoming vectorized implementation." into experimental 2012-08-08 12:45:46 -07:00
Christian Duvivier
f1db4d1bae Cleanup and commenting of the sub-pixel interpolation functions. Mostly
as a preparation for the upcoming vectorized implementation.

Change-Id: I0d1629943cee68fcb0ea8b6dd8aef265d050cc7a
2012-08-08 12:39:21 -07:00
John Koleszar
a3ff625967 Import tools/ from master branch
Change-Id: I476f43ea513e7c140f4e4f14df73dd3131cb2692
2012-08-08 09:28:01 -07:00
Daniel Kang
5da687b5a5 Refactor setting up MVs and buffers in rdopt.c
Change-Id: I94f08f2cfb37d11d71050dca3200f1d391269a6a
2012-08-07 18:57:10 -07:00
Daniel Kang
d432f7e3cb Some refactoring of mcomp functions.
Change-Id: Ic7a7cb1199b085e98ede0e634619b3077c348d57
2012-08-07 18:57:10 -07:00
Daniel Kang
dce0896249 Change the RD cost functions to take into account the seg_eob.
Change-Id: I2f96e5b205f70fdb559f01637c4b5730246c38a8
2012-08-07 16:56:48 -07:00
Daniel Kang
1099f368e3 clamp_mv_min_max -> vp8_clamp_mv_min_max
It's now used in more places

Change-Id: I63f8e1d827404e0b4f203bdb1df361e565d0779d
2012-08-07 16:41:58 -07:00
Daniel Kang
a513af4baa More refactoring and cosmetics to rdopt.c
Change-Id: I7803d719ead238189e75c52701c3bb6c1552f4b5
2012-08-07 16:41:55 -07:00
Daniel Kang
342040a6a6 Reorganiziation of the RD loop to make more sense.
Change-Id: Ia1e3b0ff9b70747b3725391de59f230edab767d7
2012-08-07 16:41:51 -07:00
Daniel Kang
4e7ce15351 Minor cosmetic changes to rdopt.c.
Change-Id: Ib7b972486ccbbcb82fa4c05a5f6d7f8aaec32155
2012-08-07 16:41:14 -07:00
Daniel Kang
78d33cad9a Combine vp8_block_error_c and vp8_submb_error_c.
Change-Id: I58792bac6c7e5a524a6dcdb5241ef18bcc0c3a45
2012-08-07 15:38:12 -07:00
Yaowu Xu
0b17ea6f68 A bit of temporary relief on encoder slowness
The commit replaces run-time initialization of cosine constants with
static constant values, which provides ~30% relief on slow speed. The
real solution, however will be to implement integer versions of those
functions that current use float/double.

Change-Id: Ie3ff1793509653d78dd1aeaf88cc6737da1bc55f
2012-08-07 14:06:11 -07:00
Yaowu Xu
8b2f57d0b8 a new way of determining reference motion vector
Using surrounding reconstructed pixels from left and above to select
best matching mv to use as reference motion vector for mv encoding.

Test results:
       AVGPSNR  GLBPSNR VPXSSIM
Derf:  1.107%   1.062%  0.992%
Std-hd:1.209%   1.176%  1.029%

Change-Id: I8f10e09ee6538c05df2fb9f069abcaf1edb3fca6
2012-08-07 11:25:57 -07:00
Jingning Han
66f440f1ee Refactoring hybrid transform coding
The forward and inverse hybrid transforms are now performed using
single function modules, where the dimension is sent as argument.

Added an inline function clip8b to clip the reconstruction pixels
into range of 0-255.

Change-Id: Id7d870b3e1aefc092721c80c0af6f641eb5f3747
2012-08-06 17:26:21 -07:00
Daniel Kang
106815f830 Remove code to set transform size.
It's reset in calling functions.

Change-Id: Ia5df086de615aac6feb3c911fe298626a002b850
2012-08-06 16:39:05 -07:00
Daniel Kang
6630895daf Combine cost_coeffs functions.
Change-Id: I3421d07fdcf2148d75c8dbfc8c44bc2d96a3a8f6
2012-08-06 16:22:15 -07:00
Daniel Kang
9921b55b22 Merge token_costs into a single table.
Change-Id: Id1ea2d543f12d4589df7038d5fb7bac1fee4da11
2012-08-06 15:55:54 -07:00
Daniel Kang
680af9acd5 More refactoring of RD cost to make later changes easier.
Change-Id: Ia6a290a6a53fdb88c971bea2de47ac73dcb7a364
2012-08-06 15:55:54 -07:00
Daniel Kang
02f3aaf76c Minor refactoring of RD cost functions.
Change-Id: I876955b1d577321b5cd3f71e3fb2c4083ad5111b
2012-08-06 15:55:54 -07:00
Christian Duvivier
82edabce75 Add x86_64-darwin11-gcc target.
This allows building on MountainLion as the 10.6 SDK has been
removed from the latest Xcode version (4.4 4F250). Also fix
all warnings for that build.

Change-Id: Ib70bca4a25295f13595f0d10ea9f0229631de5a4
2012-08-06 15:26:58 -07:00
Yaowu Xu
fcbb884e45 Merge "enable interleaved decoding of mode and mv" into experimental 2012-08-06 07:06:15 -07:00
Yaowu Xu
0b693c7755 Merge "fix msvc build" into experimental 2012-08-06 07:05:56 -07:00
Deb Mukherjee
2af5473a90 Merging in high_precision_mv experiment
Merged in the high_precision_mv experiment to make it easier
to work on new mv encoding strategies. Also removed
coef_update_probs3().

Change-Id: I82d3b0bb642419fe05dba82528bc9ba010e90924
2012-08-03 13:38:49 -07:00
Yaowu Xu
2e73f901d5 enable interleaved decoding of mode and mv
Previouly, the decoding of mode and motion vector are done a per frame
basis followed by residue decoding and reconstuction. The commit added
the option to allow decoder to interleave the decoding of mode and mvs
with the residue decoding on a per MB basis.

Change-Id: Ia5316f4a7af9ba7f155c92b5a6fc97201b653571
2012-08-03 12:34:48 -07:00
Jingning Han
fcbff9ee04 Replacing the 8x8 DCT with 8x8 ADST/DCT for I8x8
Fixed the code review comments.

Under the htrans8x8 experiment the 8X8 DCT in the
I8X8 mode is replaced with a combination of 8X8 ADST and
DCT.

Overall coding gains with the htrans8x8 experiment are:
derf:   0.486
std-hd: 1.040
hd:     1.063
yt:     0.506

Note that part of the gain comes from bigger transforms
(8x8 instead of 4x4) and part comes from replacing the DCT
wth the ADST.

Change-Id: I92ca6bbfce11b4165d612b81d9adfad4d010c775
2012-08-03 12:02:07 -07:00
Yaowu Xu
236597fd56 fix msvc build
Change-Id: I377d50cb347f50341ab6f5f456a6a64438bcb667
2012-08-03 11:28:12 -07:00
Daniel Kang
e6de9c2e5d Merge "16x16 DCT blocks." into experimental 2012-08-03 10:22:04 -07:00
Deb Mukherjee
4aabfaa5d0 Merge "Merging and bug-fix in enhanced_interp experiment" into experimental 2012-08-03 10:18:25 -07:00
Daniel Kang
fed8a1837f 16x16 DCT blocks.
Set on all 16x16 intra/inter modes

Features:
- Butterfly fDCT/iDCT
- Loop filter does not filter internal edges with 16x16
- Optimize coefficient function
- Update coefficient probability function
- RD
- Entropy stats
- 16x16 is a config option

Have not tested with experiments.

hd:     2.60%
std-hd: 2.43%
yt:     1.32%
derf:   0.60%

Change-Id: I96fb090517c30c5da84bad4fae602c3ec0c58b1c
2012-08-02 17:33:10 -07:00
Ronald S. Bultje
2914ab2e8b Merge "A few more conversions from 32-bit to 64-bit RD calculations." into experimental 2012-08-02 15:43:41 -07:00
Yaowu Xu
f05a51475d Define INT64_MAX for msvc to build
Change-Id: I6cb88d87b7549ded1de6ff9ef65ff958ad448999
2012-08-02 11:36:55 -07:00
Ronald S. Bultje
d15b07d8c6 A few more conversions from 32-bit to 64-bit RD calculations.
Change-Id: Ida01bb8f4b35fde24b0f096329d326833f1fdc7e
2012-08-02 11:01:48 -07:00
Ronald S. Bultje
a4ad3809e2 Make RDCOST() results 64-bit.
This prevents various integer overflows that several of us have been
seeing in the past few days.

Change-Id: If0020613a608e13d311b7838796c7ad53cb97255
2012-08-02 10:26:11 -07:00
Jingning Han
c7846ebc34 Use 8x8 DCT transform for I8X8 prediction mode
Apply 2D-DCT transform of dimension 8x8 to encode prediction
residuals of I8X8 mode.
Brought back block type 3 probability context model for 8x8 tokens,
which is used for the coefficients of Y blocks in I8x8 modes. The
coefficient costs estimate of I8X8 mode in rate-distortion is also
changed appropriately.
Performance results:
derf:   0.246
yt:     0.114
std-hd: 0.730
hd:     0.670

Change-Id: If1d970eeb4e1827c9f0d2c5b27d33089b347ea27
2012-08-02 09:09:17 -07:00
Adrian Grange
171b4ae157 Removed macros for merged experiments
Removed two macros corresponding to experiments that were
merged into the main code.

Change-Id: I894e8b509a2bb88557f9aba6f226ed7807745065
2012-07-31 12:07:26 -07:00
Deb Mukherjee
0ebf548c75 Merging and bug-fix in enhanced_interp experiment
Merged the enhanced_interp experiment.
Found and fixed a bug in the include files framework, whereby
certain encoder files were still using the old INTERP_EXTEND
value of 3 instead of 4. The thresholds for mv range mcomp.c
need a small adjustment to prevent crashes.

The results are more or less unchanged.

Change-Id: Iac5008390f1efc97ce1102fbb5f8989c847fb579
2012-07-31 11:45:31 -07:00
Deb Mukherjee
5259744145 Adds support for switchable interpolation filters.
Allows for swtiching/setting interpolation filters at the MB
level. A frame level flag indicates whether to use a specifc
filter for the entire frame or to signal the interpolation
filter for each MB. When switchable filters are used, the
encoder chooses between 8-tap and 8-tap sharp filters. The
code currently has options to explore other variations as well,
which will be cleaned up subsequently.

One issue with the framework is that encoding is slow. I
tried to do some tricks to speed things up but it is still slow.
Decoding speed should not be affected since the number of
filter taps remain unchanged.

With the current version, we are up 0.5% on derf on average but
some videos city/mobile improve by close to 4 and 2% respectively.
If we did a full-search by turning the SEARCH_BEST_FILTER flag
on, the results are somewhat better.

The framework can be combined with filtered prediction, and I
seek feedback regarding that.

Rebased.

Change-Id: I8f632cb2c111e76284140a2bd480945d6d42b77a
2012-07-30 11:33:43 -07:00
Deb Mukherjee
96f9473866 Merge "Merges several experiments" into experimental 2012-07-27 12:22:55 -07:00
Deb Mukherjee
9984a155d6 Merges several experiments
The following five experiments are merged:

newentropy
newupdate
adaptive_entropy (also includes a couple of parameter changes
                  that improves results a little
                  in common/entropymode.c and encoder/modecosts.c
                  that were not merged from the internal branch)
newintramodes
expanded_coef_context

Change-Id: I8a142a831786ee9dc936f22be1d42a8bced7d270
2012-07-27 12:12:39 -07:00
John Koleszar
16945391c3 Merge "shared object on mac osx" into experimental 2012-07-26 17:09:48 -07:00
jimbankoski
45e551b28f shared object on mac osx
Change-Id: Ibf357eb492e7d5883fbdf1ddf455e28767c1d65d
2012-07-25 19:39:33 -07:00
Adrian Grange
10a492847f Merge "Added const specifier to remove warning" into experimental 2012-07-25 07:53:39 -07:00
Adrian Grange
505784eecd Merge "Use macro for filter extension length" into experimental 2012-07-25 07:53:08 -07:00
John Koleszar
dcb52c0f68 makefile: fix .so build rule
Use $^ vs $? to capture all prerequisites, rather than only newer ones.

Change-Id: I464ffb2913cf60f5ca5e07518ad4bf7da10baf87
2012-07-24 16:18:38 -07:00
Adrian Grange
c9d343f3e5 Added const specifier to remove warning
The "codecs" array is defined as const so too
should the local variable that points too it.

Change-Id: I536a9ced52257dc44a04fc1a3cad94c1e86f69aa
2012-07-24 12:50:03 -07:00
Adrian Grange
b278a93546 Use macro for filter extension length
Replaced local definitions of the extension required
by the filters with the globally defined value.

Change-Id: If9e590a1f2e5b0bdc2d3e3c3f04aacbd3b09bfee
2012-07-24 12:44:46 -07:00
Daniel Kang
3053b4b030 Merge "Update 8x8 tokenizer to not encode an EOB if seg_eob is active." into experimental 2012-07-24 12:33:26 -07:00
Jim Bankoski
e4c52b5eef remove extra end of line
This commit fixes up shared lib builds on linux.

Change-Id: Ib109dc5a226dc5d7874d2e5b333466cbfd4f4661
2012-07-24 09:33:47 -07:00
Daniel Kang
bd3a9f1346 Update 8x8 tokenizer to not encode an EOB if seg_eob is active.
Change-Id: Id2bac0597b6dd1ce41bd78cbd9e9d876b71cd8a2
2012-07-23 16:46:44 -07:00
Jim Bankoski
1b16e74813 Dll build of libvpx
Change-Id: I74e50b4dfbe73eb98e1dce1695a9973f637220c0
2012-07-23 14:51:21 -07:00
Yaowu Xu
6f6856839b fixed a compiling issue
Change-Id: I9ccbea76eaeb81ce7b833dd92216734725796e84
2012-07-19 14:52:04 -07:00
Jingning Han
9824230fe3 Adds hybrid transform
Adds ADST/DCT hybrid transform coding for Intra4x4 mode.
The ADST is applied to directions in which the boundary
pixels are used for prediction, while DCT applied to
directions without corresponding boundary prediction.

Adds enum TX_TYPE in b_mode_infor to indicate the transform
type used.

Make coding style consistent with google style.
Fixed the commented issues.

Experimental results in terms of bit-rate reduction:
derf:   0.731%
yt:     0.982%
std-hd: 0.459%
hd:     0.725%

Will be looking at 8x8 transforms next.

Change-Id: I46dbd7b80dbb3e8856e9c34fbc58cb3764a12fcf
2012-07-19 13:02:57 -07:00
Yaowu Xu
6fd0929fb5 Merge "removed floating point version 8x8 fdct" into experimental 2012-07-18 10:53:57 -07:00
Yaowu Xu
df35f6b3f0 Merge "cleanup experiments in configure" into experimental 2012-07-18 10:53:46 -07:00
Ronald S. Bultje
84d2298828 Don't auto-default to comp-pred unless content is static.
Although it can be useful, in some cases it causes artifacts in motion-
based content.

Change-Id: I27bb80901020c40636e2018a8217759175a23f5b
2012-07-18 09:39:52 -07:00
Yaowu Xu
d632bf8cf5 removed floating point version 8x8 fdct
the integer version has very good precision, the float version is no
longer useful. this commit also removes the experiment option from
configure script.

Change-Id: Ibb92e63c9f5083357cdf89c559d584a7deb3353f
2012-07-17 22:50:47 -07:00
Yaowu Xu
11e23e673d cleanup experiments in configure
this commit removes a number of experiment options from configure
script. the associated experiments are already fully merged, the
options in configure script have no effect at all.

Change-Id: I8054ccaee0a04610162ed76ac9e59c4538217113
2012-07-17 22:34:07 -07:00
John Koleszar
c6b9039fd9 Restyle code
Approximate the Google style guide[1] so that that there's a written
document to follow and tools to check compliance[2].

[1]: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
[2]: http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py

Change-Id: Idf40e3d8dddcc72150f6af127b13e5dab838685f
2012-07-17 11:46:03 -07:00
Ronald S. Bultje
8697c6e454 Merge "Fix bug in reference frame counting." into experimental 2012-07-17 10:37:06 -07:00
Tim Terriberry
821307a57b Merge "Add missing mv_{col,row}_{min,max}_sb variables to MACROBLOCK struct." into experimental 2012-07-16 18:47:05 -07:00
Ronald S. Bultje
cb1e60fb28 Fix bug in reference frame counting.
vp8_encode_inter_macroblock() is called in both pick_mb_modes() as
well as encode_sb(), thus the number of macroblocks in the counter
were twice as big as actual numbers. This doesn't affect output.

Change-Id: I6de8a996ee44d2f7f2080d8d2177dd7bc6207c93
2012-07-16 17:49:59 -07:00
Daniel Kang
e65f5987f6 Simplify vp8_decode_mb_tokens_8x8.
Change-Id: Icac5b18e5c832681cea866679796a1dd4278cfb8
2012-07-16 15:57:21 -07:00
Daniel Kang
6a92df2f37 Simplify vp8_decode_mb_tokens.
Change-Id: Ib6866e491994f6c7eeb6c2e5ecd1ff54cc187610
2012-07-16 15:57:14 -07:00
Ronald S. Bultje
da8159a479 Add missing mv_{col,row}_{min,max}_sb variables to MACROBLOCK struct.
This allows CONFIG_SUPERBLOCKS experiment to almost compile succesfully,
except for the missing pick_sb_modes() function.

Change-Id: Ib2322f2aacdc371e8066f2eb4a8d761c40490b4d
2012-07-16 15:25:59 -07:00
Ronald S. Bultje
6c0b21c075 Use 8x8 transform for all 16x16 intra prediction modes in keyframes.
Also use the 8x8 transform in the RD loop.

Change-Id: If1a25aa15d3f64e05c9a31875e309d8cd5bc812d
2012-07-16 12:22:36 -07:00
Ronald S. Bultje
1f889ad63f Keep statistics for chosen intra modes in keyframes also.
Change-Id: Ibfecf1fb0fcf51fb349746fec015b1a3e44a4530
2012-07-16 11:32:44 -07:00
John Koleszar
896b6a9b57 Merge snapshot 2 development history
Create a merge between the experimental development history and the
previously published snapshot.

Change-Id: If320df72a6bbefec53833626d08dbc9678be2d2d
2012-07-12 09:31:36 -07:00
John Koleszar
51dba57cab Merge snapshot 1 development history
Merge in the git history leading up to the first experimental
snapshot.

Change-Id: Ifbdbd5bdb585864b3f996c562ef38b6306731251
2012-07-12 09:22:01 -07:00
Yaowu Xu
a81baae7c7 change to enable encoder to clamp UV motion vector
This is to avoid a rare encoder/decoder mismatch for MB using SPLITMV
mode. In decoder, the UV mv can be determined to need clamp, but the
flag is never set in encoder motion vector selection process, and the
clamp is not done in encoding in encoder.

Change-Id: I60520d3f790354c7855dadf03f0978ea9b77e2c0
2012-07-09 15:04:07 -07:00
Daniel Kang
c498aaca2e Merge "Add 8x8 fDCT unit test." into experimental 2012-06-30 00:33:36 +00:00
Christian Duvivier
5a5ced3e79 Get rid of some cast.
Change-Id: Iff5ccf2400bcb7b78c7b70f289ea65c982efddd5
2012-06-29 15:15:00 -07:00
Christian Duvivier
c5b70370dc Fix warnings.
Change-Id: I6dd27a0ea661e6f10a55d7841021b66ae4fc72ae
2012-06-29 14:46:11 -07:00
Daniel Kang
26641c74d7 Add 8x8 fDCT unit test.
Also factorize ACMRandom to acm_random.h.

Change-Id: I3b6eeb36fcbf7ae6dd3d2892bc40348f5c17982b
2012-06-29 12:07:18 -07:00
Hui Su
e44ee38aef Add lossless compression mode.
This commit adds lossless compression capability to the experimental
branch. The lossless experiment can be enabled using --enable-lossless
in configure. When the experiment is enabled, the encoder will use
lossless compression mode by command line option --lossless, and the
decoder automatically recognizes a losslessly encoded clip and decodes
accordingly.

To achieve the lossless coding, this commit has changed the following:
    1. To encode at lossless mode, encoder forces the use of unit
quantizer, i.e, Q 0, where effective quantization is 1. Encoder also
disables the usage of 8x8 transform and allows only 4x4 transform;
    2. At Q 0, the first order 4x4  DCT/IDCT have been switched over
to a pair of forward and inverse Walsh-Hadamard Transform
(http://goo.gl/EIsfy),  with proper scaling applied to match the range
of the original 4x4 DCT/IDCT pair;
    3. At Q 0, the second order remains to use the previous
walsh-hadamard transform pair. However, to maintain the reversibility
in second order transform at Q 0, scaling down is applied to first
order DC coefficients prior to forward transform, and scaling up is
applied to the second order output prior to quantization. Symmetric
upscaling and downscaling are added around inverse second order
transform;
    4. At lossless mode, encoder also disables a number of minor
features to ensure no loss is introduced, these features includes:
        a. Trellis quantization optimization
        b. Loop filtering
        c. Aggressive zero-binning, rounding and zero-bin boosting
        d. Mode based zero-bin boosting

Lossless coding test was performed on all clips within the derf set,
to verify that the commit has achieved lossless compression for all
clips. The average compression ratio is around 2.57 to 1.
(http://goo.gl/dEShs)

Change-Id: Ia3aba7dd09df40dd590f93b9aba134defbc64e34
2012-06-28 17:09:47 -07:00
Daniel Kang
0e734a63e8 Merge "Port Yaowu's 4x4 fDCT test." into experimental 2012-06-28 23:16:00 +00:00
Daniel Kang
58156f1826 Port Yaowu's 4x4 fDCT test.
Also fix unit testing.

Change-Id: Iacdc6f1ec53388e093cda1c13e4379e83d4a6535
2012-06-28 15:48:46 -07:00
Yaowu Xu
ff8b630cc9 Merge "Added Prediction Filter to Mode Selection" into experimental 2012-06-27 23:37:49 +00:00
Adrian Grange
bbc926dca2 Added Prediction Filter to Mode Selection
Added the ability to optionally filter the prediction data
when inter modes are selected (excludes SPLITMV, for now).

The mode selection loop considers both the filtered and
non-filtered prediction data when choosing mode. The filter
can be turned on/off at the frame-level, or signaled for
each MB.

Change-Id: I1b783c71d95a361ab36c761b07e8a6b06bc36822
2012-06-27 14:51:41 -07:00
Yaowu Xu
cb231c8840 Merge "Enable unit test framework in experimental branch." into experimental 2012-06-26 21:15:53 +00:00
Ronald S. Bultje
a742a73655 Enable unit test framework in experimental branch.
Change-Id: I27c98025b2857e2911005a52dd57c46e2524e815
2012-06-26 09:50:20 -07:00
Deb Mukherjee
f3dff40255 Continued adaptive entropy coding
Incorporates mv_ref, mbsplit and second_mv into the adaptive
entropy framework. The mv_ref framework has been modified from
before.

Adds some clean-ups and fixes.

Results with the adaptive entropy experiment are currently up by
+1.93% on derf; +2.33% std-hd and +1.87% yt-hd.

Fixed a nasty intermittent bug.

Change-Id: I4b1ac9f9483b48432597595195bfec05f31d1e39
2012-06-25 18:09:54 -07:00
Ronald S. Bultje
9c9d6743d4 Sign-extend input argument so it can be used in pointer arithmetic.
Change-Id: I6cbd4de96f9dcc783cef170bfd7652f6cbee36a2
2012-06-25 14:16:39 -07:00
Ronald S. Bultje
9a6972c892 Merge "x86inc: add some more format identifiers for elf file format recognition." into experimental 2012-06-20 18:26:33 +00:00
Ronald S. Bultje
4f89522647 Merge "Reset executable flags for configure." into experimental 2012-06-20 18:00:27 +00:00
Ronald S. Bultje
5ea9e2a608 x86inc: add some more format identifiers for elf file format recognition.
Change-Id: I3582c64200eed3606a4b57a9f78624ec46041461
2012-06-20 09:49:15 -07:00
Ronald S. Bultje
42a7f68d2e libs.mk: add x86inc.asm to the CODEC_SRCS.
Change-Id: I45ea0369ad489080c2505269855a46ca1d3624f7
2012-06-19 15:34:49 -07:00
Ronald S. Bultje
2936a1415b Merge "Add comments to intra prediction probability tables." into experimental 2012-06-19 15:43:41 +00:00
Christian Duvivier
e0a338c428 Fix a bunch of warnings.
Change-Id: I883b4f63559c1cf66a25016e946b1b1ae98a20da
2012-06-18 17:30:36 -07:00
Ronald S. Bultje
8a1c01d3e6 Reset executable flags for configure.
This was accidently disabled in 1fe85a35e0.

Change-Id: I09dbfecfe45b28dec75b27a627e3065f9c7dc8b2
2012-06-18 14:21:30 -07:00
Daniel Kang
31fd84d80b x86inc: Move x86inc to the correct location.
Change-Id: I6802731a4d15feef5ce62993dc505ded55c40f7e
2012-06-18 13:36:41 -07:00
Ronald S. Bultje
65a32cbbb1 Add comments to intra prediction probability tables.
Change-Id: Iec81423e8e6c50acd9e10f69bc99ad0e9058517d
2012-06-18 12:42:14 -07:00
Ronald S. Bultje
1f9943ab1a x86inc.asm: fix symbol mangling and PIC handling on Win64/Mac64.
Change-Id: I97aa175346683184f9430d880593b291a563e04f
2012-06-18 12:34:51 -07:00
Deb Mukherjee
1fe85a35e0 Adaptive entropy coding of coefficients, modes, mv.
This patch incorporates adaptive entropy coding of coefficient tokens,
and mode/mv information based on distributions encountered in a frame.
Specifically, there is an initial forward update to the probabilities
in the bitstream as before for coding the symbols in the frame, however
at the end of decoding each frame, the forward update to the
probabilities is reverted and instead the probabilities are updated
towards the actual distributions encountered within the frame.
The amount of update is weighted by the number of hits within each
context.

Results on derf/hd/std-hd are all up by 1.6%.

On derf, the most of the gains come from coefficients, however for the
hd and std-hd sets, the most of the gains come from the mode/mv
information updates.

Change-Id: I708c0e11fdacafee04940fe7ae159ba6844005fd
2012-06-15 10:35:23 -07:00
Daniel Kang
378ba61139 Merge "Adds x86inc.asm and update idct/dequant mmx" into experimental 2012-06-15 17:13:08 +00:00
Daniel Kang
7a00071576 Adds x86inc.asm and update idct/dequant mmx
Updates idct/dequant mmx assembly to work with vpnext instead of vp8.

Also adds x86inc.asm

Change-Id: I6e147d5e89177ae449271e97e50d082eb11b078e
2012-06-12 15:04:03 -07:00
Yaowu Xu
074a38b1fd changed to use a fixed number for update probabity
This commit is to remove two arrays, which contain the probabilities
of how likely each probability in coef_probs table is updated. The
commit changed to use a fixed number "252".

Surprisedly, the overall impact on quality is close to zero, which
basically says the two big static arrays are not helpful at all.
derf: -0.016%, -0.020%
std-hd: 0.000%, -0.013%
yt: -0.022%, +0.007%
yt-hd: -0.038%, +0.034%

Change-Id: Ifee94d28a37dcab4f1d2b994bd5b07575be42b72
2012-06-12 14:57:54 -07:00
Yaowu Xu
bb25083d65 Added the ability to accumulate coef stats across encodings
This commit added the ability to accumulate the coef stats across
different encodings using an intermediate binary stats files. The
accumulation happens only the binary stats file exists in current
directory. The encoder needs to be built with "ENTROPY_STATS" to
allow the output. The commit also fixed a few formating issues in
output stats file.

Change-Id: Ib1a41180aa554845cf51e4421a230b128a3a82b4
2012-06-12 14:41:51 -07:00
Paul Wilkins
36fe9735a9 Merge "Merge of further two pass rc clean up and adjustments." into experimental 2012-06-12 16:29:46 +00:00
Paul Wilkins
9b2c63e982 Merge "Key frame and GF sizing changes." into experimental 2012-06-12 16:19:13 +00:00
Paul Wilkins
7eb66d82ca Merge of further two pass rc clean up and adjustments.
Changes to calculation of  sr_coded_error to include 0,0 case.

Experimental use of sr_coded_error in calculating correction factor
for estimating the allowable Q range.

Reinstated some code needed for calculating section_intra_rating.

Add flash detection in calculation of KF boost

Increased tolerance in testing candidate key frames (needed with
longer motion search as this tends to slightly increase inter %.

Zbin changes for 8x8.

Other minor adjustments, refactoring and bug fixes.

Reinstated some motion break out clauses in boost loop
as their removal hurt a few 50fps  clips badly in the std set.
It may be possible to remove them again later if a better way
can be found of preventing overly long gf intervals.

Change-Id: Iee686d0c31072828bb1ccd2bc63f5f1c7c548ea2
2012-06-12 17:15:29 +01:00
Paul Wilkins
0cb4985b51 Key frame and GF sizing changes.
Changes to the equations for kf and gf minQ and to
the boost calculations for kg and gf

Change-Id: I312031c910e6a575334f49075c32f49a8dfff239
2012-06-08 10:49:22 +01:00
Adrian Grange
04fa2ecdf2 Fixed bug where invalid pointer is dereferenced
Variables m & mi were being dereferenced when they might
hold invalid values.

The fix is simply to move these dereferences to after the
point at which mb_row and mb_col are tested for validity.

Change-Id: Ib16561efa9792dc469759936189ea379d374ad20
2012-05-31 11:07:17 -07:00
Paul Wilkins
b8c369053b Rate control fix.
This fix addresses some problems with very complex clips like
handling of flashes on clips like crew (which was made worse
by an earlier patch (derf and std-hd)).

Most clips a small effect but some between 1 & 2%

Derf +0.039, +0.211%
YT +0.042, +0.083%

Change-Id: I65fc7c13afc31482040068544dd65b8808f5cb4a
2012-05-30 09:53:52 -07:00
Paul Wilkins
09a9701272 Merge "fixed one more compiling issue with VC" into experimental 2012-05-29 10:06:49 +00:00
Paul Wilkins
f66747fe38 Remove "est_max_qcorrection_factor"
Removed the local scaling factor est_max_qcorrection_factor
and related code to simplify estimateq calculation (little effect
anyway)

Cap range of total correction factor.

Slight change to break out case to turn off arf.

Change-Id: I748187737ba93cfadf016f3dfdf8d2741934067f
2012-05-29 09:55:04 +01:00
Yaowu Xu
2722cfb4b8 fixed one more compiling issue with VC
One more compiling issue, only happened in Visual C under a specific
combination of experiments.

Change-Id: Iba0775dc0ea7342b556348a9cdf60a05a59e0241
2012-05-25 21:52:09 -07:00
Yaowu Xu
ea0e4f1743 fixed a number of compiling issues
the commit fixed a number of compiling issues when some epxeriments
are turned on at the same time.

Change-Id: Idb15b215e2d2a7d25f2707f99ef55a34e7301ce7
2012-05-25 10:55:47 -07:00
Paul Wilkins
289be52117 Merge "Experimental change to two pass prediction decay calculation." into experimental 2012-05-25 09:15:27 +00:00
Yaowu Xu
e9818bb697 changed the way that default probs for 8x8 is set.
The commit changed how baseline 8x8 coefficient probabilities are
initialized, to be consistent with the initialization of baseline
4x4 coefficient probabilities.

The commit does not have any effect on compression.

Change-Id: Ifb3902b5dc0b0c2e6dc3aa5d4a6589d528e58355
2012-05-23 10:09:41 -07:00
Paul Wilkins
6c8fb82c14 Merge "Further firstpass.c changes." into experimental 2012-05-18 15:43:58 +00:00
Paul Wilkins
f63894f691 Experimental change to two pass prediction decay calculation.
Remove dependency on amount and speed of motion as this
may not behave well across different image sizes.

Tweak impact of % inter.

Add in experimental adjustment based on relative quality of an
older second reference frame.

Cap range of decay values allowed.

Some small + effect on derf but -ve on yt & hd at this stage.

Change-Id: I390d6f6ebe67a2eb0b834980d0d4650124980d3e
2012-05-17 09:40:34 +01:00
Paul Wilkins
a29a4e2414 Merge "Move / re-factor some of boost calculation code." into experimental 2012-05-17 08:37:30 +00:00
Ronald S. Bultje
0b8a95a0b2 Rewrite reference frame costing in the RD loop.
I now see I didn't write a very long description, so let's do it
here then. We took a pretty big quality hit (0.1-0.2%) from my
recent fix of the inversion of arguments to vp8_cost_bit() in the
RD reference frame costing. I looked into it and basically the
costing prevented us from switching reference frames. This is of
course silly, since each frame codes its own prob_intra_coded, so
using last frame cost indications as a limiting factor can never
be right.

Here, I've rewritten that code to estimate costings based partially
on statistics from progress on current frame encoding. Overall,
this gives us a ~0.2%-0.3% improvement over what we had previously
before my argument-inversion-fix, and thus about ~0.4% over current
git (on derf-set), and a little more (0.5-1.0%) on HD/STD-HD/YT.

Change-Id: I79ebd4ccec4d6edbf0e152d9590d103ba2747775
2012-05-15 15:32:44 -07:00
Paul Wilkins
acf3c729d8 Further firstpass.c changes.
base the static image test off a measure of 0,0 motion
instead of the decay accumulator value.

Change "transition to still detection" to compare the
decay rate from successive frames.

Minor tweak to the arf extra boost given based on the
number of frames affected.

Removed unused variable mod_err_per_mb_accumulator.

Change-Id: Idd8360083ad409e45f133ce97dd2488259003e64
2012-05-15 18:01:44 +01:00
Deb Mukherjee
c5ddb7f016 Adds new Directional Intra prediction modes.
Adds 6 directional intra predictiom modes for 16x16 and 8x8 blocks.

Change-Id: I25eccc0836f28d8d74922e4e9231568a648b47d1
2012-05-15 08:54:50 -07:00
Paul Wilkins
520a7a2598 Merge "Firstpass.c refactoring" into experimental 2012-05-15 15:04:48 +00:00
Paul Wilkins
545bc721f3 Merge "Two pass refactoring continued." into experimental 2012-05-15 15:04:14 +00:00
Paul Wilkins
a1680ad324 Merge "Two pass rc refactoring." into experimental 2012-05-15 14:44:34 +00:00
Yaowu Xu
b22cc559b6 Changed to use integer 8x8 dct
The commit added an integer version of 8x8 forward DCT, based on the
orginal forward DCT from VP6. The constants, roundings, and shifts
were adjusted to improve the accuracy. The latest patch has a very
similar accuracy in term of round trip error against the floating
point version.

It should be noted here that the purpose of the patch is to help
encoding speed and facilitate all other experiments. There will be
futher review in combination with inverse DCT before finalization.

configure with "--enable--int_8x8fdct" to use the integer version

Change-Id: I5a4f80507429f0e07cf02a13768ec81cbfddc5bc
2012-05-15 07:28:26 -07:00
Paul Wilkins
ae989ae864 Move / re-factor some of boost calculation code.
Some marginal impact due to the fact that it makes use of
arf more likely / stable even in hard sections.

Change-Id: Ic72fda0f63eefc9433914b5d9cd374d515810129
2012-05-15 15:28:02 +01:00
Paul Wilkins
0529320a9e Firstpass.c refactoring
Removed unused function.

Added tentative code to take error score of an older frame
into account when calculating Q range. However, for now
it is disabled pending merging other changes and testing.

Change-Id: Ie89955e70319dac31b79e3b833e3352712a061ec
2012-05-15 14:58:13 +01:00
Paul Wilkins
3536ad5bb9 Merge "First pass overhaul preparatory change." into experimental 2012-05-15 10:05:16 +00:00
Yaowu Xu
023304e4fe Merge "Reversible WHT pair" into experimental 2012-05-14 19:28:21 +00:00
Ronald S. Bultje
5cf8a3272b Merge "Don't use compound prediction for golden frames based on alt-ref frames." into experimental 2012-05-14 19:25:09 +00:00
Paul Wilkins
e237fd7c5a Two pass refactoring continued.
Remove testing of whether we estimate that it will be possible
to code an arf at a lower Q than the ambient Q.  This adds quite
a bit of extra code and complexity for marginal gain.

Factored out some code relating to ARNR selection to a separate
function as this is likely to be changed / simplified soon.

Change-Id: Ia1cf060405637ef5bbf7018355437be21d12375f
2012-05-14 18:54:05 +01:00
Paul Wilkins
59a5c7d550 Two pass rc refactoring.
Removed odd *100 >> 4 factor from boost calculations. Not all the
calculations exactly match what was there before so there may be
some minor impact on results.

Some other minor tidying up in regard to coding conventions.

The specific values of factors and thresholds will likely change as
part of subsequent patches.

Change-Id: Id976321484ac02ba50294cf54fafbc17dda85686
2012-05-14 18:53:14 +01:00
Ronald S. Bultje
959b296a40 Don't use compound prediction for golden frames based on alt-ref frames.
These frames can force reference frame (arf), mode (zeromv) and skip,
which means that if we use compound prediction (i.e. arf+last), we
might use a blend of a perfect (arf) and an imperfect (last) predictor,
leading to semi-garbage display and thus a huge drop in SSIM/PSNR (up
to 10dB for some frames I analyzed).

Gives a +0.2% gain on YT.

Change-Id: If1f2b7899ad165684af3808fd379295e82558cbb
2012-05-11 17:48:20 -07:00
Deb Mukherjee
f7c0b315d4 Merge "Improved index remapping for prob updates." into experimental 2012-05-11 17:10:30 +00:00
Paul Wilkins
35358320e3 First pass overhaul preparatory change.
This is the first patch in a series of changes to the first
pass code. (Broken down for ease of testing/merging/review).

This patch introduces a new stats element "sr_coded_error".
This is the coded error recorded vs the second reference
frame (which is updated such that it lags by at least one frame).
No use is made of the new structure in this change so this patch
should have no material effect.

Removed some ifdefs and deprecated code (#if NEW_BOOST).
Removed twopass.gf_decay_rate (not used any more)

Change-Id: I1be672a73017f7c13fd50fb4f99236aa2ed30916
2012-05-11 18:07:33 +01:00
Jim Bankoski
a5d11f298f Fix configure issue with unit test add.
Change-Id: I960c6eb81f8d76c958e8af989700447f581a8812
2012-05-11 08:08:12 -07:00
James Berry
a0769f70f5 add unit test support via google test
adds unit testing via google test

Change-Id: I144b50a976d79251fc5135186a4e0a5051ed0e8c
2012-05-11 06:19:52 -07:00
Yaowu Xu
7968d29fed Reversible WHT pair
This commit changed the forward and the inverse 4x4 Walsh Hadamard
transform to a new pair, where the inverse transform can pefectly
reconstuct the input to forward transform. It also does so without
changing the input and output value range. Even more, it does not
change the complexity of the transforms.

While it was not expected to improve the results of our current test,
it does improve std-hd set by 0.2% on all metrics. No change on derf.

Change-Id: Ie4f23ddd3a0f3c5fbe97fb58399f860031f99337
2012-05-10 16:32:47 -07:00
Deb Mukherjee
5f320d010f Improved index remapping for prob updates.
Also includes some clean ups and refactoring.

Rebased.

Change-Id: I268c97fe325b4881103fe19f41ae818569e7ccf7
2012-05-09 11:21:43 -07:00
Yaowu Xu
54cf1d9ad3 a number of fixes to entropy stats collection
1. block types
There are only three types of blocks for 8x8 transformed MBs, i.e. Y
block with DC does not exist for 8x8 transformed MBs as all MB using
8x8 transform have 2nd order haar transform. This commit introduced
a new macro BLOCK_TYPES_8X8 to reflect such fact.

2. context counters
This commit also fixed the mixed of context_counters between 4x4 and
8x8 transformed MBs. The mixed use of the counters leads me to think
the existing the context probabilities were not properly generated
from 8x8 transformed MBs.

3. redundant collecting in recoding
The commit also corrected the code that accumulates entropy stats by
making sure stats only collected for final packing, not during the
recode loop

Change-Id: I029f09f8f60bd0c3240cc392ff5c6d05435e322c
2012-05-08 14:13:22 -07:00
Deb Mukherjee
813c6c3925 Expanding the coefficient encoding contexts
This patch expands the set of prev contexts used for video coding
from 3 to 4.

There is a small improvement of the order of 0.08% for derf and
0.15% on the HD set. The tests were rerun after the various merges
last week. There are two columns in each test - the first are the
results with the mbskip change, and the second with expanded contexts
added on top of that.

Derf:
http://www.corp.google.com/~debargha/vp8_results/explibvpx_newentropy_expcontext.html

HD:
http://www.corp.google.com/~debargha/vp8_results/explibvpx_hd_newentropy_expcontext.html

Rebased.

Broke up 80 char lines.

Change-Id: I82d2e72d054e530cbf5ce9aa0e6d85c582965675
2012-05-04 07:11:38 -07:00
Yaowu Xu
3b909a6f03 chagned the decoder band to match the encoder
missed the decoder side in last commit

Change-Id: Ie97f35189e93f78783e3d8072a36eea768beed27
2012-05-02 11:10:25 -07:00
Yaowu Xu
bd69b7d459 slight adjustment to coef band definition
This commit adjusted slightly the 4x4 coefficents band definition to
better classify coefficients with similar distributions and usages.
It helps derf set about .1%, it is alos slightly positive for std-hd
set, where 4x4 blocks are used less frequently.

The commit also removed a const array not in use.

Change-Id: I78d16905d4036641ec905b0c32c190c1def5b249
2012-05-01 19:54:19 -07:00
Yaowu Xu
4d6de817b4 Added usage info on command line options
This commit added usage information that was missed in usage output.

Change-Id: If1a85bcc20131314f5d047c6db4e76a40d945e66
2012-05-01 12:25:56 -07:00
Ronald S. Bultje
0f68789c24 Fix inversion of probability and value in calls to vp8_cost_bit().
Change-Id: I9f1686249ac812f7b9b872eabe3970d1dfb25e56
2012-04-30 16:33:07 -07:00
Deb Mukherjee
c0d595134e Turning off filter search for now to improve encode speed.
Change-Id: I87291fb40c745f34c36b067f47abdf69774a812f
2012-04-30 12:24:22 -07:00
Deb Mukherjee
fc1a7bd81e Minor cleanup in tokenize.h
Removes a set of spurious declarations that were inadvertently checked
in.

Change-Id: I2f80b6b66d2ec9ea667c810eaf1a6e7d52478c67
2012-04-30 11:06:04 -07:00
Adrian Grange
87b6f21317 Merge "Removed MV costing from ARNR filtering" into experimental 2012-04-27 22:09:57 +00:00
Adrian Grange
393440db89 Removed MV costing from ARNR filtering
The ARNR filter uses a motion compensated temporal filter,
but the motion estimation implementation accounts for the
cost of the mv in its decision making process. The ARNR
filter uses a dummy cost table initialized to 0 as a way
to ignore the mv costs (which are irrelevant to the filter).

This CL modifies the ARNR filter implementation to so that
the mv costing is ignored without the requirement for
dummy tables.

Change-Id: I0dd9620c3b70682f938b2a70912c11d4d7c9284c
2012-04-27 10:00:20 -07:00
Deb Mukherjee
acdda50a0d Adds search option for best interpolation filter.
Adds a speed feature to conduct a brute force search among a set of
available interpolation filters for the best one in an RD sense.

There is a gain of 0.4% on derf, 1.0% on Std-HD.

Patch 2: A macro added to determine if the encoder state is reset
for each new filter tried.

Patch 3: rebase, also fixes a bug (decodframe.c) introduced by a
couple of missing function pointer assignements.

Patch 4: rebase.

Change-Id: Ic9ccca9d8c35c6af557449ae867391a2f996cc29
2012-04-25 22:37:50 -07:00
Yaowu Xu
a16608aba0 Merge QIMODE experiment
This commit merge the QI mode experiment. As the experiment affects
the encoding of intra coding modes on key frame only, the overall
effect of the experiment on encoding tests is insignificant.

Change-Id: I9e4e3933adface88867ad429cee3986e529c511d
2012-04-25 14:18:25 -07:00
Yaowu Xu
c1814d267a Merge UVINTRA experiment
The commit merges the UVINTRA experiment and removed the related
macros. The overall effect of the experiment is a small gain (.1%
on derf)

Change-Id: Ia34b3312fb9b5b34c9ba111bf0fa78c6f78ac80b
2012-04-25 13:47:32 -07:00
Deb Mukherjee
ad06c9f051 Merge "Differential encoding of probability updates" into experimental 2012-04-24 23:07:18 +00:00
Ronald S. Bultje
29f8cbc285 Remove unused header files.
Change-Id: I8708358bb37edabcbe5dfc755ed18791d9e143c4
2012-04-24 11:07:27 -07:00
Deb Mukherjee
c6f1bf4321 Differential encoding of probability updates
Adds differential encoding of prob updates using a subexponential
code centered around the previous probability value.
Also searches for the most cost-effective update, and breaks
up the coefficient updates into smaller groups.

Small gain on Derf: 0.2%

Change-Id: Ie0071e3dc113e3d0d7ab95b6442bb07a89970030
2012-04-23 23:02:52 -07:00
Ronald S. Bultje
2210767c3f Hide some code behind CONFIG_COMP_INTRA_PRED.
Change-Id: I7c0597dede20cc71145c053f76bd99aaf759d144
2012-04-20 15:27:47 -07:00
Yaowu Xu
ade43d9125 change to allow 8x8 transform always
This commit changed to enable the usage 8x8 transform for all frame
type, all resolution and all quantizer range. This has an overall
benefit .2% to .3% in term of compression, but more importantly,
the difficult clips benefits much more, up to 2% to 3% on clips
like football, harbour and so on.

We observed some weird humps on very high end on a couple of youtube
clips, but have determined the underly cause was the aggressive zbin
having an effect of lowering rate with lower quality, which have
an impact on slide show clips around 60DB.

The commit does not change the association between prediction mode
and transform size.

Change-Id: I33043bdce6207528ae00b4a4b26d8ff63cfea1f4
2012-04-20 09:17:59 -07:00
Yaowu Xu
ecc28cdaa3 added reset of rate estimates for each mode
This is to prevent the evaluation of a mode from using values left
over from a mode evaluated prior in the loop.

Change-Id: Ife2c6ceb76d2f7365fd262515d3ae48229033c2d
2012-04-20 09:17:58 -07:00
Ronald S. Bultje
1259b0b22e Fix splitmv/compound prediction when eightpel is enabled.
Change-Id: I9d6083d54e3d478ec20dc6dc48d3f45eb5c7e16b
2012-04-19 10:07:14 -07:00
Ronald S. Bultje
18433aef17 Compound prediction for splitmv macroblocks.
Change-Id: I0af3395500b1cb0ed629249eb6636a0c9322cb18
2012-04-18 14:05:39 -07:00
Adrian Grange
1cc406ab4a Added update of mode context pointers in decoder
With the NEWENTROPY experiment enabled encoding certain clips
produced invlid bitstreams, or files that had a high degree
of artefacts.

This was the results of pointers in MACROBLOCKD not being
setup correctly (mode_info_context and prev_mode_info_context).

Change-Id: Ice13e1efa8bd122997d2f8f3f1e761c6c16e0403
2012-04-18 13:48:06 -07:00
Adrian Grange
1ea2ad1e86 Merge "Added save coding context & modified MV bounds" into experimental 2012-04-18 16:21:16 +00:00
Yaowu Xu
bd49603be4 Merge "Added intra mode probabilites into coding_context" into experimental 2012-04-17 18:37:23 +00:00
Yaowu Xu
31afc77063 Added intra mode probabilites into coding_context
These contexts need to be saved and restored for recode, otherwise
encoder/decoder mismatch happens for some clips (eg._mobcal 720p)

Change-Id: Ic65cfa0bf56ed0472ecab962ce31394d59d344bf
2012-04-17 09:29:27 -07:00
Deb Mukherjee
bb4ed8d8a3 Bug fix introduced from a recent refactoring of skip coding.
Change-Id: Iccd0f09a4db02a2bad644deb3c76189c5f5612a3
2012-04-16 11:38:15 -07:00
Adrian Grange
fa589adc5f Added save coding context & modified MV bounds
Added code to save the coding context in vp8_rd_pick_inter_mode
when the coding mode is forced to ARF(0,0).

Also, modified the MV bounds computation to comply with the
change in MV border from 32 to 64 pixels.

Change-Id: I96963a6f5f4d04ce84c807ae11e0635177c3ad6c
2012-04-13 10:26:49 -07:00
Deb Mukherjee
237718dcbd Turning off interpolation filter selection
Turning off the interpolation filter selection based on edge
proportion. This heuristics has not been working as well as
expected and I have started a more rigorous investigation into
this. We can turn this off for now since it is unnecessarily
slowing things down.

Rebase.

Change-Id: Ic5958b2b3a35ec2d8eb73b6d81617ca8fbe07e74
2012-04-12 09:27:25 -07:00
Yaowu Xu
636b2f385e a set of minor fixes
This commit tries to address an issue related to the oddity shown on
HD _mobcal clip, where some rather ugly blocks shown in the second
frame at low-mid bit rates if the third frame is not made a key frame
by he encoder. The fixes include: 1)  made calls to sad_16x16 to be
consistent with function prototype. 2) remove the error bias to intra
and golden in mbgraph search. 3) changed the error accumulation on
inter_segment encoding to avoid potential out-of-range. 1) has no
effect on encoding results.

Encoding test show that the overall effect of the commit helps about
.2%(HD) to .3%(cif)

Change-Id: I930975a2d0c06252f01c39e0a02351529774e30b
2012-04-12 13:41:54 +01:00
Yaowu Xu
d6f4b71d9f Adjust the key frame placement condition
The commit removed a limit on key frame detection, which caused a big
drop in all metric measurements for standard HD clip such as _mobcal.

This single change helps two standard HD clips by a huge amount, which
help the overall std-hd set by 2.4% (glb psnr), 0.9% (avg_psnr), 2.1%
(vpxssim).

In the result page:
http://pafr9.prod.google.com:26163/?/cns/rc-d/home/on2-prod/sunkaras/borg-test/yaowu

2012_04_02_1649_yaowu_bugfix_std-hd
2012_04_03_1452_yaowu_hump_std-hd
represent the encoding test results and std-hd set prior and after this
commit respectively.

Change-Id: Ie4313e317c737ea0e699c3a7919c1376744baa1a
2012-04-12 11:46:24 +01:00
Yaowu Xu
d56acae660 changed function prototype for macro_block_yrd
This commit has made macro_block_yrd_8x8 and macro_block_yrd_8x8 to
take same parameters. It also removed a few unnecessary shifts that
has the potential to create out-of-range distortion values.

Change-Id: I4ec5afb307c3685c2a67a07c2850f0927d214455
2012-04-12 11:40:18 +01:00
Paul Wilkins
d6ac213ce6 Delete unused function.
Deleted check_gf_quality().

Change-Id: If75fbd84accb1f6471ad6ea6ff2b65ae99976f5d
2012-04-11 17:14:46 +01:00
Paul Wilkins
13c6d1a8c8 Refactoring of encode loop and bitstream packing
Some code re-factored / moved to allow the main
pack operation inside the recode loop so  that the
size estimate is accurate.

Deletion of some redundant code relating to one pass.

Aproximate improvement over March 27 code base:
Derf 0.0%, YT 0.5%, YThd 0.3% Std_hd 0.25%

Change-Id: Id2d071794ab44f0b52935f6fcdb5733d09a6bb86
2012-04-11 15:44:14 +01:00
Paul Wilkins
f2ec452fbc Changes to costing of skip.
Update the costing of skip in the recode loop and rd code.

Change-Id: I2e5ebbd7ddf201212b32441321e12626cd0423e9
2012-04-11 14:37:48 +01:00
Paul Wilkins
a3392d5718 T8x8 zbin and rate control changes.
Some adjustments to zbin for t8x8.
Changes to rules for sizing forced key frames.
Some extra stats output in tmp.stt.

Approximate  gain on YT-hd set 0.5%

There are still issues in sizing key frames and gf/arf frames
when the image is largely static. These in part relate to
problems with cost estimates in the recode loop.

Change-Id: I6f0159dc8a8faeab4115a19c668d442491619a68
2012-04-11 13:13:28 +01:00
Adrian Grange
9daf3154db Superblock encoding order
This is the first patch to add superblock (32x32) coding
order capabilities. It does not yet do any mode selection
at the SB level, that will follow in a further patch.

This patch encodes rows of SBs rather than
MBs, each SB contains 2x2 MBs.

Two intra prediction modes have been disabled since they
require reconstructed data for the above-right MB which
may not have been encoded yet (e.g. for the bottom right
MB in each SB).

Results on the one test clip I have tried (720p GIPS clip)
suggest that it is somewhere around 0.2dB worse than the
baseline version, so there may be bugs.

It has been tested with no experiments enabled and with
the following 3 experiments enabled:
  --enable-enhanced_interp
  --enable-high_precision_mv
  --enable-sixteenth_subpel_uv
in each case the decode buffer matches the recon buffer
(using "cmp" to compare the dumped/decoded frames).
Note: Testing these experiments individually created
errors.

Some problems were found with other experiments but it
is unclear what state these experiments are in:
  --enable-comp_intra_pred
  --enable-newentropy
  --enable-uvintra

This code has not been extensively tested yet, so there
is every likelihood that further bugs remain. I also
intend to do some code cleanup & refactoring in tandem
with the next patch that adds the 32x32 modes.

Change-Id: I1eba7f740a70b3510df58db53464535ef881b4d9
2012-04-11 10:40:57 +01:00
Deb Mukherjee
78ecbc98e4 Bug fix in probability update savings computation
Found this bug while tracking down some anomalies in my experiments.
Since vp8_cost_one and vp8_cost_zero return unsigned int, the
bit shift by 8 will be incorrect if the value is negative.
I am cautiously optimistic that this fix will make the prob
updates more correct and somewhat improve results across the board.
But the update probabilities will need to be retuned I think.

Patch 2: Adding more of the same fixes using a macro.

Change-Id: I1a168f040e74e8c67e7225103b1c2af9a611da49
2012-03-29 08:39:02 -07:00
Ronald S. Bultje
9f900a1c64 Only enable compound prediction if multiple reference frames are present.
Change-Id: Ia52ac825400eb83ff663e3a05a3fe0b3526bac9a
2012-03-22 10:20:17 -07:00
Yaowu Xu
2823173ee0 enable 8x8 transform for MBs in intra frames
When ac_yquant>171, a key frame is enabled to use 8x8 transform. In
such case, MBs with DC_PRED or TM_PRED are selected to use T8x8. This
change helped the full STD-HD set by ~.1% or so, which is reasonable
considering how often key frame occurs in these encodings.

Change-Id: Id17009ef6327252177b19e6bf0d6628827febaf1
2012-03-21 12:25:44 -07:00
Paul Wilkins
c88d335f7d Only support improved quant
Deprecate fast quant and strict_quant code.
Small effect on quality as fast was used in first pass but the
effect is basically neutral across the derf set.

The rationale here is to reduce the number of code paths for
now to make experimentation easier. Optimized and fast code
options can be re-introduced later along with other  encode
speed options.

Change-Id: Ia30c5daf3dbc52e72c83b277a1d281e3c934cdad
2012-03-21 18:22:33 +00:00
Paul Wilkins
36af2035c8 Merge Exact Quant
Change-Id: Id2412a7f24a7c1016ec9fc3b9b0fbd16871f374a
2012-03-21 17:57:09 +00:00
Deb Mukherjee
475d5d5664 Making subpel filters switchable at frame level
Various refactoring to make the subpel motion compensation
filters switchable by a frame level field.
Two types of 8-tap filters are supported in addition to the existing
bilinar and sixtap filters. One is the default 8-tap and the
other has a sharper cut-off for use with frames with substantial
edge content.

Patch 2: Added a preliminary strategy for filter selection based on
edginess detecton. Also includes some filter changes.

Change-Id: I866085bda5ae143cfdf2ec88157feaabdf7bd63a
2012-03-21 09:17:22 -07:00
Deb Mukherjee
57d953479b Adding contextual coding of mb_skip_coeff flag.
Using contextual coding of the mkb_skip_coeff flag using the
values of this flag from the left and above. There is a small
improvement of about 0.15% on Derf:
http://www.corp.google.com/~debargha/vp8_results/mbskipcontext.html

Refactored to use pred_common.c by adding a new context type.

Results on HD set (about 0.66% improvement):
http://www.corp.google.com/~debargha/vp8_results/mbskipcontext_hd.html

Incliding missing refactoring to use the pred_common utilities.

Change-Id: I95373382d429b5a59610d77f69a0fea2be628278
2012-03-21 03:55:44 -07:00
Yaowu Xu
8055ccf906 added clamp for 2nd motion vector
The commit added a clamp to the 2nd motion vector used in compound
prediction to insure mv within UMV borders. The clamp is similar to
that of the first motion vector except that No SPLITMV is ever used
for the 2nd motion vector.

Change-Id: I26dd63c304bd66b2e03a083749cc98c641667116
2012-03-15 07:49:52 -07:00
Yaowu Xu
f85084a977 Added encode/decode recon buffer match test to vpxenc
The commit added a new command line option --test-decode to vpxenc.
The option enables encoder to decode compressed frames and test recon
buffers from the decode against those from encode for mismatch.

There are a few limitations on this option currently, one of them
being the match test is not done on a number of lagged frames at
the end of an encoding.

Change-Id: I80c29b46dcdcea9f48107a506b235743068862fe
2012-03-15 07:49:51 -07:00
Yaowu Xu
6b7ec50812 fixed a bug of context overwritten by key frame recoding
The recoding loop save and restore frame coding context for recodes.
However in recoding of key frames, some of the coding context saved
was stale from last encoded inter frame. The save/restore sometimes
overwrites the re-inintialized coding context with saved context
from last frame, resulting in encoder/decoder mismatch

Change-Id: I354ae2f71074d142602d51d06544c05a2462caaf
2012-03-15 07:49:50 -07:00
Yaowu Xu
44f5f33baf Added option to skip first n frame to vpxenc
this commit added a command line option to skip first n frames from
input file to facilitate debugging and testing.

Change-Id: I4ffc5f85fa7e193ea4bdee08cb236717de8beef1
2012-03-15 07:49:49 -07:00
Yaowu Xu
6035da5448 WebM Experimental Codec Branch Snapshot
This is a code snapshot of experimental work currently ongoing for a
next-generation codec.

The codebase has been cut down considerably from the libvpx baseline.
For example, we are currently only supporting VBR 2-pass rate control
and have removed most of the code relating to coding speed, threading,
error resilience, partitions and various other features.  This is in
part to make the codebase easier to work on and experiment with, but
also because we want to have an open discussion about how the bitstream
will be structured and partitioned and not have that conversation
constrained by past work.

Our basic working pattern has been to initially encapsulate experiments
using configure options linked to #IF CONFIG_XXX statements in the
code. Once experiments have matured and we are reasonably happy that
they give benefit and can be merged without breaking other experiments,
we remove the conditional compile statements and merge them in.

Current changes include:
* Temporal coding experiment for segments (though still only 4 max, it
  will likely be increased).
* Segment feature experiment - to allow various bits of information to
  be coded at the segment level. Features tested so far include mode
  and reference frame information, limiting end of block offset and
  transform size, alongside Q and loop filter parameters, but this set
  is very fluid.
* Support for 8x8 transform - 8x8 dct with 2nd order 2x2 haar is used
  in MBs using 16x16 prediction modes within inter frames.
* Compound prediction (combination of signals from existing predictors
  to create a new predictor).
* 8 tap interpolation filters and 1/8th pel motion vectors.
* Loop filter modifications.
* Various entropy modifications and changes to how entropy contexts and
  updates are handled.
* Extended quantizer range matched to transform precision improvements.

There are also ongoing further experiments that we hope to merge in the
near future: For example, coding of motion and other aspects of the
prediction signal to better support larger image formats, use of larger
block sizes (e.g. 32x32 and up) and lossless non-transform based coding
options (especially for key frames). It is our hope that we will be
able to make regular updates and we will warmly welcome community
contributions.

Please be warned that, at this stage, the codebase is currently slower
than VP8 stable branch as most new code has not been optimized, and
even the 'C' has been deliberately written to be simple and obvious,
not fast.

The following graphs have the initial test results, numbers in the
tables measure the compression improvement in terms of percentage. The
build has  the following optional experiments configured:
--enable-experimental --enable-enhanced_interp --enable-uvintra
--enable-high_precision_mv --enable-sixteenth_subpel_uv

CIF Size clips:
http://getwebm.org/tmp/cif/
HD size clips:
http://getwebm.org/tmp/hd/
(stable_20120309 represents encoding results of WebM master branch
build as of commit#7a15907)

They were encoded using the following encode parameters:
--good --cpu-used=0 -t 0 --lag-in-frames=25 --min-q=0 --max-q=63
--end-usage=0 --auto-alt-ref=1 -p 2 --pass=2 --kf-max-dist=9999
--kf-min-dist=0 --drop-frame=0 --static-thresh=0 --bias-pct=50
--minsection-pct=0 --maxsection-pct=800 --sharpness=0
--arnr-maxframes=7 --arnr-strength=3(for HD,6 for CIF)
--arnr-type=3

Change-Id: I5c62ed09cfff5815a2bb34e7820d6a810c23183c
2012-03-15 07:36:47 -07:00
Yaowu Xu
21d3612a2f added clamp for 2nd motion vector
The commit added a clamp to the 2nd motion vector used in compound
prediction to insure mv within UMV borders. The clamp is similar to
that of the first motion vector except that No SPLITMV is ever used
for the 2nd motion vector.

Change-Id: I26dd63c304bd66b2e03a083749cc98c641667116
2012-03-14 18:53:26 -07:00
Yaowu Xu
f798f9e465 Added encode/decode recon buffer match test to vpxenc
The commit added a new command line option --test-decode to vpxenc.
The option enables encoder to decode compressed frames and test recon
buffers from the decode against those from encode for mismatch.

There are a few limitations on this option currently, one of them
being the match test is not done on a number of lagged frames at
the end of an encoding.

Change-Id: I80c29b46dcdcea9f48107a506b235743068862fe
2012-03-14 18:46:12 -07:00
Yaowu Xu
ea43ba4aee fixed a bug of context overwritten by key frame recoding
The recoding loop save and restore frame coding context for recodes.
However in recoding of key frames, some of the coding context saved
was stale from last encoded inter frame. The save/restore sometimes
overwrites the re-inintialized coding context with saved context
from last frame, resulting in encoder/decoder mismatch

Change-Id: I354ae2f71074d142602d51d06544c05a2462caaf
2012-03-14 17:29:39 -07:00
Yaowu Xu
03d5d69368 Added option to skip first n frame to vpxenc
this commit added a command line option to skip first n frames from
input file to facilitate debugging and testing.

Change-Id: I4ffc5f85fa7e193ea4bdee08cb236717de8beef1
2012-03-14 07:54:12 -07:00
Yaowu Xu
3f5feb7d13 fixed .mk files to reflect add/remove of a header file
In a previous commit, the duplicate of headerfile defaultcoefcounts.h
was identified. This commit updates the .mk file to ensure configure
and make works properly for all platforms.

Change-Id: I31a39c809a734ba438ee53db700f252e9a03eddd
2012-03-12 14:51:54 -07:00
Yaowu Xu
8cf28d346d Changed MAX_PSNR to be consistent with internal stats
The maximum psnr has a marginal impact on the overall output in high
quality encodings, the change will make sure the psnr output to be
consistent with encoder internal stats.

Change-Id: I35cf2f85008ec127a7d91c9eb69fa7811798ae32
2012-03-07 16:14:54 -08:00
Yaowu Xu
64439c2b77 removed duplicate a head file
Removed the copy in encoder and changed to use the one in common

Change-Id: Ief0985a50ffd6053a269638fd4816b055ca273ec
2012-03-07 07:21:46 -08:00
Paul Wilkins
68033ca472 Snapshot candidate
Pulled out super block code for the snapshot as this
is not quite ready and will need an extensive re-merge.

Change-Id: I436369b511257447a7b0ea064016cb63f5011849
2012-03-07 11:24:33 +00:00
Jim Bankoski
157f15e1d3 Imported a change from stable branch
https://gerrit.chromium.org/gerrit/#change,17319 fixes cost estimating
to take skip_eob into account. No quality difference seen on derf set
tests, but about .4% gain on STD_HD set.

Change-Id: Ic5fe6d35ee021e664a6fcd28037b8432a0e470ca
2012-03-06 12:20:34 -08:00
Yaowu Xu
98bf413b4b fix a compiling error when CONFIG_COMP_INTRA_PRED not defined
Change-Id: I4159ff365953598d9c9bc3ecacfb5c5f4a315b45
2012-03-06 09:52:15 -08:00
Ronald S. Bultje
c3f5b2931b Use per-MB compound intra prediction.
This gives a modest gain on derf overall, although at low bitrates the
cost is still too high, so this can be improved further.

Patch 2. Re-base and fix 80 column issues

Change-Id: Ida2f9fa3fe75370669f6a27b37108dc602231c63
2012-03-05 15:23:10 +00:00
Yaowu Xu
6898e8b7ab Changed how UV r/d estimates are done for Intra Modes
The commit changed to compute UV intra RD estimates for 4x4 and 8x8
separately to be used in mode decision for MB modes associated with
the appropriate transform size respectively. Now finally after many
other changes related 8x8 quantizer zbin boost and zbin_mode_boost,
this change overall helps the HD(with 8x8) by around ~.13%.
(avg .13%  glb .13% ssim .17%)

The commit also has a few changes for eliminating compiler warnings.

Change-Id: Ibab35dad44820c87e6b44799c66f8d519cc37344
2012-03-05 13:16:41 +00:00
Yaowu Xu
eaa955ba98 Fixed zbin_mode_boost initialization
The commit added the correct Zbin_mode_boost initialization based on
Intra Mode before using rate distortion to pick UV intra mode.

Change-Id: I8e57878ff356a06672f6fa2431be860bf9b9a5c7
2012-03-05 13:10:49 +00:00
Yaowu Xu
848bccabd5 refactored code that checks if a macroblock is skippable
Change-Id: I4ea6d819bbbde312792c4f813ab63ea50cf0cd1d
2012-03-05 11:30:43 +00:00
Paul Wilkins
a0be3faa6e Allow for frame overheads in min frame bandwidth.
Change-Id: I6ade229ff400fe492709010ac5bada37f8afa73e
2012-03-05 11:25:44 +00:00
Yaowu Xu
89ee68b1f7 Merge t8x8 experiments
Change-Id: I8e9b6b154e1a0d0cb42d596366380d69c00ac15f
2012-03-01 12:59:11 -08:00
Yaowu Xu
3ceb43104f disable usage of 8x8 for resolution below 360p
need further investigation on some odd behavior on one  youtube clip

Change-Id: Iec477986a86b54ef26df2ef69d2f9484e2d1a043
2012-03-01 11:30:49 -08:00
Deb Mukherjee
e41e5ce5ad Various bug fixes related to high precision mv
Change-Id: Ie5a7c87d71bd4a541463b68704620d89cec142cf
2012-03-01 03:10:21 -08:00
Paul Wilkins
2ad7a4a271 Bug fix in vp8_estimate_entropy_savings()
Incorrect scaling of savings for t8x8.

Change-Id: If01e08f8c73faa73afc3c70e501e6acc54d7e26f
2012-03-01 01:42:02 +00:00
Yaowu Xu
d8670b3c2e Fix compiling issue when CONFIG_HIGH_PRECISION_MV is defined
Change-Id: I3b8a230d5b119910e6a6767331a4d97768089355
2012-02-28 17:45:46 -08:00
Ronald S. Bultje
921b1c3c94 Rename "dual" prediction to "compound" prediction.
Change-Id: Ibcd2b9b247ff9f83331dac47f91ec285e8955ff1
2012-02-28 17:43:46 -08:00
Ronald S. Bultje
d476165107 Compound intra prediction (b_pred/4x4 only, for now),
Also remove duplicate build_intra_predictors_mby/uv().

Change-Id: I78607e7304952a9b962a5b25af9bb9c48692187b
2012-02-28 17:41:03 -08:00
Yaowu Xu
af5c774b5c Correct zbinboost lookup for 8x8 quantizer
The commit fixed a problem where 8x8 regular quantizer was using the
4x4 zbinboost lookup table that only has 16 entries at each Q. The
commit assigned a uniform zbin boost value for all cases that there
are more than 16 consective zeros. The change only affects MBs using
8x8 transform. The fix has a slightly positive impact on quality.

Test results:
http://www.corp.google.com/~yaowu/no_crawl/hd_fixzbinb.html
(avg psnr: .26% glb psnr: .21% ssim: .28%)

Results on cif size clip are also positive even though gain is smaller
http://www.corp.google.com/~yaowu/no_crawl/derf_fixzbinb.html

Change-Id: Ibe8f6da181d1fb377fbd0d3b5feb15be0cfa2017
2012-02-28 17:17:47 -08:00
Paul Wilkins
dc825f1e2b Merge "Merge new loop filter." into experimental 2012-02-28 23:28:04 +00:00
Deb Mukherjee
3e1cad9c69 Initial refactoring of high_precision mv code.
This is the first patch for refactoring of the code related to
high-precision mv, so that 1/4 and 1/8 pel motion vectors can
co-exist in the same bit-stream by use of a frame level flag.
The current patch works fine for only use of 1/4th and
only use of 1/8th pel mv, but there are some issues with the
mode switching in between. Subsequent patches on this change Id
will fix the remaining issues.

Patch 2: Adds fixes to make sure that multiple mv precisions can
co-exist in the bit-stream. Frame level switching has been tested
to work correctly.

Patch 3: Fixes lines exceeding 80 char

Patch 4:
http://www.corp.google.com/~debargha/vp8_results/enhinterp.html

Results on derf after ssse3 bugfix, compared to everything
enabled but the 8-tap, 1/8-subpel and 1/16-subpel uv. Overall the
gains are about 3% now. Hopefully there are no more bugs lingering.
Apparently the sse3 bug affected the quartel subpel results more than
the eighth pel ones (which is understandabale because one bad predictor
due to the bug, matters less if there are a lot more subpel options
available as in the 1/8 subpel case).
The results in the 4th column correspond to the current settings.
The first two columns correspond to two settings of adaptive switching
of the 1/4 or 1/8 subpel mode based on initial Q estimate. These
do not work as good as just using 1/8 all the time yet.

Change-Id: I3ef392ad338329f4d68a85257a49f2b14f3af472
2012-02-28 15:09:20 -08:00
Yaowu Xu
3d93ae521c Merge "Try to enable 8x8 tranform for smaller resolution" into experimental 2012-02-28 22:31:03 +00:00
Paul Wilkins
19b9d28f70 Merge new loop filter.
Merge of the NEWLPF configuration experiment so it is always on.

Change-Id: I7054772b6eab28bad1ff807bfa54d98f83de9308
2012-02-28 20:58:52 +00:00
Yaowu Xu
42891098f3 Try to enable 8x8 tranform for smaller resolution
The commit overall on derf test is break even to very slightly positive
comparing to all 4x4 transform.

Change-Id: I2a7c19599aa54c2d3a5b35db0dc891ba8a6a2b26
2012-02-28 11:49:12 -08:00
Paul Wilkins
25c127f5f0 Experimental branch code clean up.
Removal of some further code relating to partitions
and error resilience.

Spelling correction.

Change-Id: I36067aae67a4a23bec359541dda3400b0bbf26d0
2012-02-28 17:59:21 +00:00
Paul Wilkins
b6f02c8592 Code Simplification
Removal of code relating to token partitioning

Change-Id: Iaf3c88d6758639a55bd92c3be5c51e6bed407a3c
2012-02-28 17:55:42 +00:00
Yaowu Xu
eb87b56eab fixed a wrong intialization value
The "update" variable was used as a flag in coef_prob update dry run
that tests if a frame should encodes update at all. The wrong init
value forced the update happening always. fixing this has a minor
improvement in low bit rate situation when 8x8 transform is allowed.

Change-Id: Icb498e8d6a62fd074dcbc2065b797cba9237cb51
2012-02-28 09:10:34 -08:00
Paul Wilkins
3cdd0a8e75 Merge "Corrected spelling" into experimental 2012-02-28 02:07:49 +00:00
Paul Wilkins
b00ed02a16 Corrected spelling
Apparently the correct spelling of segement is segment !

Change-Id: I88593ee0523f251b3a96794c6166ef8c7898a029
2012-02-27 21:42:36 +00:00
Paul Wilkins
88a867c6dd Merge "Code Cleanup." into experimental 2012-02-27 20:50:21 +00:00
Paul Wilkins
2e9d7d647a Merge "Removal of temporal re sampling code." into experimental 2012-02-27 20:50:01 +00:00
Paul Wilkins
46ab54abf8 Merge "Code Simplification." into experimental 2012-02-27 17:58:57 +00:00
Paul Wilkins
d90b1ee16c Merge "Further code simplification and clean up." into experimental 2012-02-27 17:58:12 +00:00
Deb Mukherjee
063d68b7ea Merge "Changing default 8-tap filter to Langrangian interpolator." into experimental 2012-02-26 06:06:07 +00:00
Paul Wilkins
646e62211e Code Cleanup.
Removal of error_resilient_mode features.
The interface has been left in place but does nothing.

Change-Id: I2407863bd0d3c98407354507423ca48d29f63b17
2012-02-26 01:15:47 +00:00
Paul Wilkins
80b873e318 Removal of temporal re sampling code.
For now the interface elements have been left in place
to make sure existing parameter files work but parameters
relating to drop frame wont do anything.

Change-Id: I579ee614726387381c546845dac4bc03c74c6a07
2012-02-25 18:13:57 +00:00
Deb Mukherjee
88b36eb0d9 Bug fix in ssse3 variance computation.
Fixes a bug that was introduced in the high precision mv patch.

Change-Id: Ieadb433ebe4c3ef3e0e63944dab11528bf8bd73a
2012-02-24 20:24:54 -08:00
Paul Wilkins
69e80a028c Code Simplification.
Removal of code relating to spatial re sampling

Change-Id: Iff1bc651c62cd528f960c4b27f9673b172e68835
2012-02-24 23:58:24 +00:00
Paul Wilkins
3cc5b92c65 Further code simplification and clean up.
Change-Id: Ifdb17b56090a317b2aa82cf125d57934902c5298
2012-02-24 23:38:36 +00:00
Deb Mukherjee
c64a27801c Changing default 8-tap filter to Langrangian interpolator.
The Lagrangian interpolation filter is maximally flat in the
passband. There is non-trivial improvement with the hd set, while
for derf the results are virtually unchanged.
See:
http://www.corp.google.com/~debargha/vp8_results/enhinterpn.html (derf)
http://www.corp.google.com/~debargha/vp8_results/enhinterpn_hd.html (HD)

Patch 2: Updated the results for derf in the html above to use the
new baseline. There is still about 4% improvement. Will update the
hd baseline later (since it takes 9 hours to run on my machine)

Patch 3: By mistake the default filter was left at 60 - should be 0
to use the new interpolation filter.

Change-Id: If5f64444976562415d68a2aeabb94fdfa0d47890
2012-02-24 11:13:36 -08:00
Paul Wilkins
583f2d8fc7 Deleted code.
Removed redundant code for ref frame cost.
2012-02-24 02:16:53 +00:00
Deb Mukherjee
fb472c5b64 Clean ups and minor changes in high precision mv with 8-tap interpolation
* Removes EDGE_PIXEL_FILTER for external sanpshot
* changes the default 8-tap filter based on high precision results
in http://www.corp.google.com/~debargha/vp8_results/enhinterpn.html
* changes the default prob tables for high-precision mv encoding to
favor zeros in the last bit (i.e. quarter pel). This is only important
for short clips.

Change-Id: I02bb0de8679d9eec06cdbcc8160dbf073cd847a4
2012-02-23 11:47:18 -08:00
Deb Mukherjee
18e90d744e Supporting high precision 1/8-pel motion vectors
This is the initial patch for supporting 1/8th pel
motion. Currently if we configure with enable-high-precision-mv,
all motion vectors would default to 1/8 pel. Encode and
decode syncs fine with the current code. In the next phase
the code will be refactored so that we can choose the 1/8
pel mode adaptively at a frame/segment/mb level.

Derf results:
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hpmv.html
(about 0.83% better than 8-tap interpoaltion)

Patch 3: Rebased. Also adding 1/16th pel interpolation for U and V

Patch 4: HD results.
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hd_hpmv.html
Seems impressive (unless I am doing something wrong).

Patch 5: Added mmx/sse for bilateral filtering, as well as enforced
use of c-versions of subpel filters with 8-taps and 1/16th pel;
Also redesigned the 8-tap filters to reduce the cut-off in order to
introduce a denoising effect. There is a new configure option
sixteenth-subpel-uv which will use 1/16 th pel interpolation for
uv, if the motion vectors have 1/8 pel accuracy.

With the fixes the results are promising on the derf set. The enhanced
interpolation option with 8-taps alone gives 3% improvement over thei
derf set:
http://www.corp.google.com/~debargha/vp8_results/enhinterpn.html

Results on high precision mv and on the hd set are to follow.

Patch 6: Adding a missing condition for CONFIG_SIXTEENTH_SUBPEL_UV in
vp8/common/x86/x86_systemdependent.c

Patch 7: Cleaning up various debug messages.

Patch 8: Merge conflict

Change-Id: I5b1d844457aefd7414a9e4e0e06c6ed38fd8cc04
2012-02-23 09:25:21 -08:00
Yaowu Xu
3c872b6c27 Merge "Fixed skippable evaluation in mode decision" into experimental 2012-02-22 17:13:04 +00:00
Yaowu Xu
0f430084e0 Merge "Reduced bias in picking loop filter level" into experimental 2012-02-22 17:12:52 +00:00
Yaowu Xu
7670933386 Merge "a bit code clean-up" into experimental 2012-02-22 15:55:53 +00:00
Yaowu Xu
c54bfcb6f0 Merge "Reworked context conversion between 8x8 and 4x4" into experimental 2012-02-22 15:55:37 +00:00
Yaowu Xu
2b4cd4cc01 Fixed skippable evaluation in mode decision
Yunqing fixed an oddity in UVIntra skippable evaluation for stable
branch, which brought up the fact that the evaluation is broken.
The issue was that for MBs with 2nd order block, the eob for 1st
order blocks is set at 1. The previous evaluation did not take that
into account. This commit intend to fix the problem. The commit also
absorbed Yunqing's fix for UVIntra skippable evalution.

Test on hd showed some good gains in combination with LPF bias fix:
http://www.corp.google.com/~yaowu/no_crawl/LPFBias_FixSkip.html
(avg psnr: .34%, glb psnr: .32%, ssim: .22%)

Change-Id: I36af11c8ef7f643e8ff46da7bf3a167b437039d4
2012-02-22 06:49:13 -08:00
Yaowu Xu
737179f275 Reduced bias in picking loop filter level
The bias in picklpf intended to bias toward less greedy in getting
best frame level psnr while maximize overall quality for a clip.
This commit reduced the bias for frames using 8x8 transform to
achieve better compression overall.

The change improve compression by ~.15% consistently on most of the
HD clips tested.

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

Change-Id: Ic30932d2b8eaebd52339b0195f569edc48eed7bc
2012-02-17 16:44:08 -08:00
Paul Wilkins
4cfb8ed4c9 Code base simplification.
Removal of most code to do with 1 pass.
Removal of cyclic refresh code.

Change-Id: I74971082bc19dd76e795d4d2e781a0424cec5c8c
2012-02-17 16:29:03 +00:00
Paul Wilkins
5e1b5bff7d Merge "Code simplification" into experimental 2012-02-17 11:04:32 +00:00
Yaowu Xu
47d545f166 a bit code clean-up
Removed some transform code that is not in use.

Change-Id: I9489af7e23d9d7fe052feb6c8bbafa62ebbda39c
2012-02-16 15:15:06 -08:00
Yaowu Xu
b92a96d8ad Reworked context conversion between 8x8 and 4x4
The commit rationized and simplified the entropy context conversion
betwen MB using 8x8 transform and MB using 4x4 transform. The old version
had a number of weirdness in how 4x4 transform MB's context is used for
8x8 blocks other than the first 8x8 within a MB.

Test showed the change has a gain ~.1% for avg psnr, glb psnr and ssim on
the limited HD set.

Change-Id: I774536c416baa6845aa741f956d8a69fa40e5d47
2012-02-16 15:00:10 -08:00
Deb Mukherjee
6b86208dae Removing a stray CONFIG_DUALPRED, and a INTERP_EXTEND fix.
Change-Id: I7549e424ca6846b07a796f2b9cd4e9d4e550ca9b
2012-02-16 10:40:39 -08:00
Paul Wilkins
79d330d7d5 Code simplification
Removal of the pickinter.c and .h files and calls to this
code.

Removal of some code relating to real time and one pass
settings  though there is more to be done in this regard.

However,  vp8_set_speed_features() now
only supports modes 0 and 1 and speeds up to 3
so rd should always be set.

Change-Id: I62c0c1b6154ab499785baef310536080e87bc4d8
2012-02-16 17:21:20 +00:00
Deb Mukherjee
9493595533 Merge "Adjusting 8-tap filter + prelim edge pixel filter code." into experimental 2012-02-16 16:32:38 +00:00
Yaowu Xu
f90983e167 revised the rate distortion computation for UV
this commit changed the UV r/d calculation in the mode decision process to
properly account for the rate of 8x8 transform coefficients.

Change-Id: I485f8f35f2b61db0b6539beb32e83481b1cf083b
2012-02-16 07:34:46 -08:00
Yaowu Xu
8b71f3e059 Merge "revised the rate distortion computation for UV" into experimental 2012-02-16 15:34:38 +00:00
Yaowu Xu
bc3dd313ef Merge "optmized rounding for transforms" into experimental 2012-02-16 15:33:01 +00:00
Yaowu Xu
a96bf2038c Merge "re-scaled 2nd order haar transform" into experimental 2012-02-16 15:32:33 +00:00
Yaowu Xu
a78a4b4551 Merge "moved scaling from dequantization to inverse transform for T8x8" into experimental 2012-02-16 15:32:17 +00:00
Yaowu Xu
efa9abd028 optmized rounding for transforms
the changes are still temporary, the final transforms, especially
inverse ones should take in account both accuracy, complexity, and
sign-bias, which should be decided at a later time.

Change-Id: I116b0c70b25f5ee324ae5713d4564f5d0aa27151
2012-02-16 07:03:57 -08:00
Yaowu Xu
62a78f0342 re-scaled 2nd order haar transform
During the work of extend_qrange, we have rolled a factor of 2 from
quantization/dequatnization into 2nd order walsh-hadamard transform.
This commit does the same for the 2nd order haar transform. so they
can share the same quantizaiton process as the 2nd order WHT.

Change-Id: I734af4a20ea8149a01b5b1971a065092977dfe33
2012-02-16 07:03:56 -08:00
Yaowu Xu
454c7abc1a moved scaling from dequantization to inverse transform for T8x8
Previously, the scaling related to extended quantize range happens in
dequantization stage, which implies the coefficients form forward
transform are in different scale(4x) from dequantization coefficients
This worked fine when there was not distortion computation done based
on 8x8 transform, but it completely wracked the distortion estimation
based on transform coefficients and dequantized transform coefficients
introduced in commit f64725a00 for macroblocks using 8x8 transform.
This commit fixed the issue by moving the scaling into the stage of
inverse 8x8 transform.

TODO: Test&Verify the transform/quantization pipeline accuracy.

Change-Id: Iff77b36a965c2a6b247e59b9c59df93eba5d60e2
2012-02-16 07:03:55 -08:00
Deb Mukherjee
ef8ade138d Adjusting 8-tap filter + prelim edge pixel filter code.
Results with the new filter coefficients compared with the previous
versions are here:
http://www.corp.google.com/~debargha/vp8_results/enhinterp.html (derf)
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hd.html (HD)
Overall, the derf set improves by 0.94% with 8-tap filters while
the HD set improves by 0.58%.

Patch 1: resolving merge conflict

Change-Id: I09db0abdab7b08bb19f86d911de23d2123309748
2012-02-15 16:50:18 -08:00
Ronald S. Bultje
721711fb51 Remove dual prediction frame re-encoding loop.
I'm basically not convinced that the concept works at all, let alone
that this is the right place to do it. I think if we want something
like this at all, I should integrate it with the main encoding loop
and re-encode checks in onyx_if.c, and show that it has a significant
benefit (which right now, it doesn't; removing this re-encode check
actually increases all metrics by ~0.15%).

Change-Id: I1b597385dc17f468384a994484fb24813389411f
2012-02-15 16:38:04 -08:00
Ronald S. Bultje
0930dde249 Fix overflows in dual prediction mode selection.
Change-Id: I265ad46e01a307bca21e6223725e4055f5e08648
2012-02-15 15:57:49 -08:00
Paul Wilkins
46f9ad2ca5 Experimental code base simplification.
Remove error concealment code.

Change-Id: I882705174fbfea212e96f7f684e47a671dbe5c67
2012-02-15 16:08:47 +00:00
Yaowu Xu
d327dcf3aa moved segment based LPF level selection under CONFIG_FEATUREUPDATES
This commit moved segment based loop filter level selection into
the experiment of CONFIG_FEATUREUPDATES. As previous commit noted,
the segment based loop filter selection helps the compression by
~0.1% on cif set, the ongoing experiment CONFIG_FEATUREUPDATES
made encoding updates of the segment based LPF level more efficient,
hence, another .04% gain on cif set. The commit also fixed an issue
previously where encoder/decoder may use different loop filter level
for one of the segments.

Change-Id: Ia978b14aae95bb107d561ba53a7a2bb6ff01faf3
2012-02-15 07:18:05 -08:00
Yaowu Xu
9b68ad0f30 added 8x8 based Rate estimation for dualpred case
This commmit added logic for MB using dual-pred to compute rate
estimation based on correct transform size. The section of code
was previously located under #if CONFIG_DUALPRED, that was made
to be working with T8x8 experiment at the same time.

Change-Id: Iebc2518c03f11378b9c2e72905520f088b54d5c0
2012-02-14 09:23:21 +00:00
Paul Wilkins
9a8204d6ee Simplification of experimental code base.
Removed ~CONFIG_REALTIME_ONLY code.

Change-Id: I5fafff29a08acd8928699f9ddce8744787024d8c
2012-02-14 09:03:56 +00:00
Jim Bankoski
af8f1928d1 vp8 - config_featureupdates
Added a bit to signify that the feature changed since
the last time we sent it, or not so that we don't need
to send all the databits for every feature change.

added config

Change-Id: I8d3064ce90d4500bf0d5c6b87c664e46138dfcac
2012-02-13 12:31:12 -08:00
Yaowu Xu
2d1ead342c Changed how coefficient probability table is updated
Added a frame level flag to indicate if coef probabilities are updated
at all for the frame.

During the experimental work with 8x8 transform, it is discovered that
even in the case of no probability is ever update, cost of transmitting
"no update" for each of probabilities can run up to become a significant
overhead cost. A single bit to indicate no-update for all coef probs
is therefore helpful, which is also demonstrated by the test results:

1. On Cif set:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/cif_t8x8_updprob.html
(avg psnr: .14%, glb psnr: .14% SSIM: .13%)

2. On HD set:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/HD_t8x8_updprob.html
(avg psnr: .02%  glb psnr: .01% SSIM: .02%)
It should be noted that the gain on HD is smaller because the average bit
rate is much higher in contrast to the overhead bit cost.

Change-Id: I46db270e693ee8799fef34a14d8260868ce4cd16
2012-02-13 13:20:02 +00:00
Paul Wilkins
21108d800c Fixed typo on #define name
SE_LVL_EOB => SEG_LVL_EOB

Change-Id: I6d10169878a709bc9b82f03e5d5903c629fa7679
2012-02-13 12:06:18 +00:00
Yaowu Xu
9ded6e375a fixed an issue related to 2nd order size due to merge artifacts.
For 8x8 transformed macroblock, the 2nd order transform is a 2x2 haar
transform, here there is only 4 coefficients total. A previous merge
changed these to 64, causing crashes when encoding with 8x8 transform
enabled. (i.e. when input video image size > 640x360 ) This commit
reverts them back to 4 and fixes the crashes.

Change-Id: I3290b81f8c0d32c7efec03093a61ea57736c0550
2012-02-10 11:49:22 -08:00
Paul Wilkins
2615ca5d41 Removal of threading code.
For the experimental branch we are trying to slim the codebase
down removing features such as threading for now which complicate
the process of development and testing.

Change-Id: I657c0246aef4d1fa8c8ffc6a1adfeee45bce8e24
2012-02-10 16:23:59 +00:00
Ronald S. Bultje
f64725a009 Improved coding using 8x8 transform
In summary, this commit encompasses a series of changes in attempt to
improve the 8x8 transform based coding to help overall compression
quality, please refer to the detailed commit history below for what
are the rationale underly the series of changes:

a. A frame level flag to indicate if 8x8 transform is used at all.
b. 8x8 transform is not used for key frames and small image size.
c. On inter coded frame, macroblocks using modes B_PRED, SPLIT_MV
and I8X8_PRED are forced to using 4x4 transform based coding, the
rest uses 8x8 transform based coding.
d. Encoder and decoder has the same assumption on the relationship
between prediction modes and transform size, therefore no signaling
is encoded in bitstream.
e. Mode decision process now calculate the rate and distortion scores
using their respective transforms.

Overall test results:
1. HD set
http://www.corp.google.com/~yaowu/no_crawl/t8x8/HD_t8x8_20120206.html
(avg psnr: 3.09% glb psnr: 3.22%, ssim: 3.90%)
2. Cif set:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/cif_t8x8_20120206.html
(avg psnr: -0.03%, glb psnr: -0.02%, ssim: -0.04%)
It should be noted here, as 8x8 transform coding itself is disabled
for cif size clips, the 0.03% loss is purely from the 1 bit/frame
flag overhead on if 8x8 transform is used or not for the frame.

---patch history for future reference---
Patch 1:
this commit tries to select transform size based on macroblock
prediction mode. If the size of a prediction mode is 16x16, then
the macroblock is forced to use 8x8 transform. If the prediction
mode is B_PRED, SPLITMV or I8X8_PRED, then the macroblock is forced
to use 4x4 transform. Tests on the following HD clips showed mixed
results: (all hd clips only used first 100 frames in the test)

http://www.corp.google.com/~yaowu/no_crawl/t8x8/hdmodebased8x8.html
http://www.corp.google.com/~yaowu/no_crawl/t8x8/hdmodebased8x8_log.html

while the results are mixed and overall negative, it is interesting to
see 8x8 helped a few of the clips.

Patch 2:
this patch tries to hard-wire selection of transform size based on
prediction modes without using segmentation to signal the transform size.
encoder and decoder both takes the same assumption that all macroblocks
use 8x8 transform except when prediciton mode is B_PRED, I8X8_PRED or
SPLITMV. Test results are as follows:

http://www.corp.google.com/~yaowu/no_crawl/t8x8/cifmodebase8x8_0125.html
http://www.corp.google.com/~yaowu/no_crawl/t8x8/hdmodebased8x8_0125log.html

Interestingly, by removing the overhead or coding the segmentation, the
results on this limited HD set have turn positive on average.

Patch 3:
this patch disabled the usage of 8x8 transform on key frames, and kept the
logic from patch 2 for inter frames only. test results on HD set turned
decidedly positive with 8x8 transform enabled on inter frame with 16x16
prediction modes: (avg psnr: .81% glb psnr: .82 ssim: .55%)

http://www.corp.google.com/~yaowu/no_crawl/t8x8/hdintermode8x8_0125.html
results on cif set still negative overall

Patch 4:
continued from last patch, but now in mode decision process, the rate and
distortion estimates are computed based on 8x8 transform results for MBs
with modes associated with 8x8 transform. This patch also fixed a problem
related to segment based eob coding when 8x8 transform is used. The patch
significantly improved the results on HD clips:

http://www.corp.google.com/~yaowu/no_crawl/t8x8/hd8x8RDintermode.html
(avg psnr: 2.70% glb psnr: 2.76% ssim: 3.34%)
results on cif also improved, though they are still negative compared to
baseline that uses 4x4 transform only:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/cif8x8RDintermode.html
(avg psnr: -.78% glb psnr: -.86% ssim: -.19%)

Patch 5:
This patch does 3 things:
a. a bunch of decoder bug fixes, encodings and decodings were verified
to have matched recon buffer on a number of encodes on cif size mobile and
hd version of _pedestrian.
b. the patch further improved the rate distortion calculation of MBS that
use 8x8 transform. This provided some further gain on compression.
c. the patch also got the experimental work SEG_LVL_EOB to work with 8x8
transformed macroblock, test results indicates it improves the cif set
but hurt the HD set slightly.

Tests results on HD clips:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/HD_t8x8_20120201.html
(avg psnr: 3.19% glb psnr: 3.30% ssim: 3.93%)

Test results on cif clips:
http://www.corp.google.com/~yaowu/no_crawl/t8x8/cif_t8x8_20120201.html
(avg psnr: -.47% glb psnr: -.51% ssim: +.28%)

Patch 6:
Added a frame level flag to indicate if 8x8 transform is allowed at all.
temporarily the decision is based on frame size, can be optimized later
one. This get the cif results to basically unchanged, with one bit per
frame overhead on both cif and hd clips.

Patch 8:
Rebase and Merge to head by PGW.
Fixed some suspect 4s that look like hey should be 64s in regard
to segmented EOB. Perhaps #defines would be bette.
Bulit and tested without T8x8 enabled and produces unchanged
output.

Patch 9:
Corrected misalligned code/decode of "txfm_mode" bit.
Limited testing for correct encode and decode with
T8x8 configured on derf clips.

Change-Id: I156e1405d25f81579d579dff8ab9af53944ec49c
2012-02-10 14:23:27 +00:00
Ronald S. Bultje
e3ca23a361 Reindent some code after merging the dualpred experiment.
Change-Id: Idb328dd29ebcd360e39886abe48694f90f2e1140
2012-02-09 16:29:22 -08:00
Ronald S. Bultje
29e4d7e861 Merge dualpred (compound prediction) experiment.
Change-Id: Ieaaa07c50eae41118596197f6a4d848135946e41
2012-02-09 16:29:18 -08:00
Paul Wilkins
d90f0eb4c5 Removal of SEGFEATURES placeholder comments
This commit only involves the removal of placeholder comments
//#if CONFIG_SEGFEATURES.

Change-Id: I94b350daaf998ee0cfdde5aa25b1d3b0522ab816
2012-02-09 17:25:05 +00:00
Paul Wilkins
3e9890a394 Merge Extended Q experiment.
Merge the extended Q experiment as indicated by the

Change-Id: I02d9e654fff9998cc7e9e2f1f5cd838dad8fb431
2012-02-09 17:22:34 +00:00
Paul Wilkins
cf8af867dd Merge COMPRED
Merged in most of the current common prediction changes
that were under the #if CONFIG_COMPRED option.

Change-Id: If4e6f61dbe7b86dd449f6effbe93b5eb7e893885
2012-02-09 16:10:46 +00:00
Paul Wilkins
8266abfe96 Dual pred flag
Further changes to make experiments with the context
used for coding the dual pred flag easier.

Current best performing method tested on derf is a two
element context based on reference frame. I also tried
various combinations of mode and reference frame as
shown in commented out case using up to 6 contexts.

Derf +0.26 overall psnr +0.15% ssim vs original method.

Change-Id: I64c21ddec0abbb27feaaeaa1da2e9f164ebaca03
2012-02-09 15:44:18 +00:00
Paul Wilkins
59a200f1ea Changes to coding of dual_pred flag.
Further use of common prediction functions and experiments
with alternate contexts based on mode and reference frame.

For the Derf set using reference frame as basis of context
gives +0.18% Overall Psnr and +0.08 SSIM

Change-Id: Ie7eb76f329f74c9c698614f01ece31de0b6bfc9e
2012-02-09 15:27:20 +00:00
Ronald S. Bultje
915f13bd59 Fix dual prediction recode loop.
We should only change the dual prediction mode if we actually entered
the recode branch. Else, it may potentially undo beneficial changes
to the dual prediction mode in the first encode iteration.

Change-Id: I79fc53e5fd0bb551092ed422c797619f1566f002
2012-02-08 14:55:46 -08:00
Ronald S. Bultje
3adcbe2f15 Remove write-only variable "mbs_dual_count".
Change-Id: Icf7a6749ca2f8ad6a032f86c34540d1c5880cf68
2012-02-08 14:18:02 -08:00
Ronald S. Bultje
c8ec59d858 Fix dual prediction recode loop.
Some conditions were conditional under a threshold, whereas they should
always execute. Also, some conditions were testing an array instead of
the values within it.

Change-Id: Ia6892945cfbbe07322e6af6be42cd864bf9479c1
2012-02-08 10:09:02 +00:00
Paul Wilkins
e1050bd3dc Move update of ref frame probabilities in encode loop.
The existing code updated the reference frame probabilities before
the test to evaluate the impact of using updated probabilities
in vp8_estimate_entropy_savings().

The estimate of cost and savings is still basic and does not reflect
the new prediction code but this would require per MB costings
and the benefit is probably marginal, as this is really just used for
rate estimation in the loop.

Change-Id: Id6ba88ae6e11c273b3159deff70980363ccd8ea1
2012-02-06 16:42:00 +00:00
Paul Wilkins
9c9300f56f Merged NEWNEAR experiment
This commit merges the NEWNEAR experiment such that it
is effectively always on.

The fact that there were changes in the threading code again
highlights the need to strip out such features during the
bitstream development phase as trying to maintain this code
(especially as it is not being tested) slows the development cycle.

Change-Id: I8b34950a1333231ced9928aa11cd6d6459984b65
2012-02-06 16:40:57 +00:00
Paul Wilkins
82b865da94 Coding the hybrid dual prediction signal.
Initial modifications to make limited use of common prediction
functions.

The only functional change thus far is that updates to the probabilities are
no longer "damped". This was a testing convenience but in fact seems to
help by a little over 0.1% over the derf set.

Change-Id: I8b82907d9d6b6a4a075728b60b31ce93392a5f2e
2012-02-06 16:38:41 +00:00
Paul Wilkins
c98e9d2882 Moved prob_dualpred to common.
Moved the prob_dualpred[] sturcture to common.
Created common prediction entry for Dual flag.

Change-Id: I9ac3d128bae6114f09e5c18216d4b95cf36453d5
2012-02-06 16:37:11 +00:00
Paul Wilkins
58ec6fe8c3 Modified prediction behavior for reference frame.
Trial of a modified prediction function that ranks each possible
reference frame based on a combination of local usage and
frame level probability. The code is a bit cleaner and simpler.

In direct comparison with old unpredicted method with segment level
coding turned off for mode,ref & EOB the prediction gives a gain on derf
of around 0.4%. There is some further gain from bug fixes over earlier code.

With segment coding on the prediction method is slightly -ve on some very
easy clips (at low rates) due to slightly higher overheads, but better on harder
clips. Overall neutral on derf in direct comparison on latest code base, but
compared to earlier code without bug fixes about +0.7% overall psnr
+0.3% SSIM.

Change-Id: I5b8474658b208134d352d24f6517f25795490789
2012-02-06 16:34:41 +00:00
Paul Wilkins
f0459549a6 Reference frame prediction:
Extended prediction and coding of reference frame where
a subset of options are flagged as available at the segment level.

Updated copyright notices.

Switch to SAD in mbgraph code as SATD problematic for the
foreground and background separation as it can ignore large DC shifts.

Change-Id: I661dbbb2f94f3ec0f96bb928c1655e5e415a7de1
2012-02-03 12:44:45 +00:00
Adrian Grange
5d0b5a17d9 Added encoding in Superblock Order
As a precursor to encoding 32x32 blocks this cl adds the
ability to encode the frame superblock (=32x32 block) at
a time. Within a SB the 4 indiviual MBs are encoded in
raster-order (NW,NE,SW,SE).

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

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

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

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

This replaces the abandoned change:
Iebebe0d1a50ce8c15c79862c537b765a2f67e162

Change-Id: I1bc1a00f236abc1a373c7210d756e25f970fcad8
2012-02-02 10:30:57 -08:00
Paul Wilkins
92ffb17cc1 Comment out segref segmentation filter changes.
Commented out changes from earlier checking:

"Change Iab7f1eff: vpnext use segref segmentation filter"

Which in its current state breaks the decoder.

Change-Id: I9185098aeda8ce65310f338c4c9375f4a39005d3
2012-02-02 12:43:53 +00:00
Yaowu Xu
27cca3dd94 Fixes a decoder bug
The bug was introduced by the commit that added I8X8 intra prediction
mode for inter frames, the decoder was not update to accept the additional
probability update from encoder. This causes the decoder typicall to crash
when encoder sends intra mode probability update.

Change-Id: Ib7dc42dc77a51178aa9ece41e081829818a25016
2012-02-01 14:56:14 -08:00
Author: John Koleszar
d24de592a6 Import another decoder bug fix from public stable branch
Please see the following for details:
https://gerrit.chromium.org/gerrit/#change,10925

Change-Id: Ie692261c255c58d7762df22eeca566a7d13adcba
2012-02-01 14:56:12 -08:00
Scott LaVarnway
caed92d0e5 Import a decoder bug fix from public stable branch
Please see the following public commit for details:
https://gerrit.chromium.org/gerrit/#change,7608

Change-Id: I589eed0b6078e2c5c9c74e942886e503bd02b273
2012-02-01 14:56:11 -08:00
Adrian Grange
3ff8c7d968 Correctly capped minqtarget to maxq
This line of code incorrectly set maxq = maxq rather than
capping minqtarget.

Change-Id: Ifbc86df8b0ff2779e7b2a5f7349724d04a18bd62
2012-01-31 12:58:34 -08:00
Deb Mukherjee
b72ab88d75 Merge "Refining the 8-tap interpolation filters." into experimental 2012-01-31 16:40:41 +00:00
Paul Wilkins
1335ac3071 Implementation of new prediction model for reference frame coding.
This check in uses the common prediction interface functions
to code reference frame.

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

Change-Id: I9da3ed5dfdaa489e0903ab33258b0767a585567f
2012-01-31 12:54:05 +00:00
Paul Wilkins
56904be19d Use common prediction interface for segment coding.
This does not change any functionality just modifies the code to
use the common prediction module interface for coding
the segment data.

Change-Id: Ifd43e9153573365619774a4f5572215e44fb5aa3
2012-01-31 12:53:49 +00:00
Paul Wilkins
b2f64dff7d Added common prediction modules.
This function adds the common prediction modules,  some data structures
and a config option but does not use them.

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

Change-Id: Ib69eec0876173ebe9d1de9df9537d0b2447702e0
2012-01-31 12:53:36 +00:00
Paul Wilkins
048e4fd524 Moved some reference frame data structures into common.
Encoder side changes

Change-Id: I8921800e4fccec5e5a9e4755b80cbd472623107b
2012-01-31 12:52:51 +00:00
Paul Wilkins
5f0f260f0c Moved some reference frame data structures into common.
In this commit only the decoder side was updated.

Change-Id: Ia9bd58da07d1a943f028e330f0489344e62b0d02
2012-01-31 12:52:33 +00:00
Paul Wilkins
fe96afa705 Moved some segmentation data structures.
Moved some segmentation data structures into VP8_COMMON

Change-Id: I59c6e2edf7a0176e35319936eea450027aeb3b39
2012-01-31 12:51:57 +00:00
Deb Mukherjee
57d521a095 Refining the 8-tap interpolation filters.
Fixes a rounding issue with the 8-tap filters, which allows us to
use sharper filters that before with a little better performance.
Results on derf (0verall gain 0.76):
http://www.corp.google.com/~debargha/vp8_results/enhinterp.html
Results on a 720P set (Overall gain 0.61):
http://www.corp.google.com/~debargha/vp8_results/enhinterp_hd.html

Change-Id: I4cd7bdf3583db974dc5589fa64857bc31ac861fa
2012-01-30 09:41:26 -08:00
Jim Bankoski
a127c940c0 vpnext use segref segmentation filter
Goes through set of ref frames used by each macroblock and
sets seg_lvl_ref_frame flags accordingly..

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

Change-Id: Iab7f1effd75a839b34eb310d7168692c8f105411
2012-01-27 07:53:15 -08:00
Jim Bankoski
1a9fd54ecd vpnext: pick loop filter segment by segment
Picks a per segment loopfilter.  Adapts the algorithm to search for
a loopfilter value for each separate segment.  Further todo fix the
bias

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

Change-Id: Ic6a571c16fcd6ec0139f4de1f8061f87c6515a10
2012-01-27 07:48:10 -08:00
Yaowu Xu
9a4dde1b36 Merge "fixed an issue with 8x8 token cost in trellisquant" into experimental 2012-01-27 15:11:18 +00:00
Yaowu Xu
81d16e3f53 fixed an issue with 8x8 token cost in trellisquant
changed the token cost for 8x8 transformed macroblock used in trellisquant
from those derived from 4x4 transform coefficient distribution to those
derived from 8x8 transform coefficient distribution. Test results show
this fix help 8x8 transform based compression consistently on cif and hd
sets:

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

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

Change-Id: If9b7868b75357c66541f511e5ee78e4d2d4929a4
2012-01-26 14:50:11 -08:00
Deb Mukherjee
6fa47a5f16 Adds support for enhanced interpolation for subpel motion
using an 8-tap filter.

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

Change-Id: I919e28ae245c0493147fa0864f8c9d048a9dd530
2012-01-26 10:24:47 -08:00
Yaowu Xu
5a5d24eed6 Merge "changed loop filter for MBs using 8x8 transform" into experimental 2012-01-24 21:45:16 +00:00
Jim Bankoski
91325b8fe7 vpn common -> implicit segmentation
This introduces base functions for introducing implicit segmentation.
The code that actually stores the results to the segment map isn't
here yet.   This just prints out the segmentation map results
if you call it.

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

vp8next - plumbing for rotation

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

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

Fixed copyright notice

Change-Id: I450c13cfa41ab2fcb699f3897760370b4935fdf8
2012-01-24 11:20:13 -08:00
Yaowu Xu
aebb16bfa8 changed loop filter for MBs using 8x8 transform
This commit added a set of loop filter functions for macroblocks
using 8x8 transform. First we turned off the regular loop filtering
on 4x4 block boundaries that do not exist in macroblocks using 8x8
transform. Second, we change to use the same loop filter(mask and
7 tap filter) that used for macroblock edge filtering.

Change-Id: I3a00460b7674ced116917d86812ffc32578c1d3a
2012-01-20 10:09:24 -08:00
Yaowu Xu
5aab0c3fb7 Added code to prevent I8X8_PRED mode for MBs using 8x8 transform
This fixed a conflict introduced by the change of adding 8x8 intra
prediction modes. The 8x8 intra prediction mode code assumed the
use of 4x4 transform, and causes encoder crashes when the codec is
configured with --enable-t8x8.

Change-Id: I00cc94df63e9725377ffba9eb51be6b77fe3fcf9
2012-01-19 17:09:40 -08:00
Yaowu Xu
be9af16e16 reverted an accidental code deleting
commit cf561bad accidentally deleted a line of code that sets the
base_qindex for each frame, which leads to every frame is encoded
at Q of 0.

Change-Id: Ib5f8022e856bf3b3bd0d4147405e46241e3dcf2d
2012-01-19 16:56:46 -08:00
Yaowu Xu
df91ab7b0d Merge "new loop filter functions for macroblock boundaries" into experimental 2012-01-18 17:54:19 +00:00
Yaowu Xu
5e7d7d3d95 new loop filter functions for macroblock boundaries
The commit adds a new set of loop filter for macroblock edge filtering.
The new loop filter has a mask to detect so-called "flat" regions. The
detection checks 5 pixels of each side of an edge. If the all pixels
have value with +/-1 from the edge pixel on the same side, the region
is treated as a "flat" region. For such case, a 7 tap filter is used
to change 3 pixel values on each side. The 7 taps are:
               [1, 1, 1, 2, 1, 1, 1]/8
The furthest away pixels used as input are +/-5 away from edge. For
non-flat region, we fall back to old filtering. It should be noted
here that the thresholds and filter taps may require more optimization
for best possible results.

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

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

Change-Id: I0855b1ff48e79e1175c20b81967137e18b2af352
2012-01-18 09:51:29 -08:00
Paul Wilkins
bd5f384bef Possible divide by 0 error.
Put traps to prevent two possible divide by 0 errors.

Change-Id: Ia415b945244253dcdd12f54f1f157f9ca8c94d6b
2012-01-18 11:10:51 +00:00
Paul Wilkins
cf561bad1d Rate control on static scenes plus Y2dc delta Q fix.
A problem can arise on static clips with force key frames where
attempts to avoid popping lead to a progressive reduction in key
frame Q that ultimately may lead to unexpected overspend against
the  rate target.

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

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

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

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

Change-Id: Ia1feeb79ed8ed014e4239994fcf5e58e68fd9459
2012-01-17 17:42:46 +00:00
Yaowu Xu
483b262bab Merge "Added an emms to prevent invalid stats output" into experimental 2012-01-11 23:07:54 +00:00
Yaowu Xu
a5ea68447f Added an emms to prevent invalid stats output
In certain hardware configuration, where mmx code is enabled and
other simd (sse2/sse3) disabled, lacking of this emms caused invalid
internal stats outputs.

Change-Id: I77c61cf6e0448d3f3b8c11781aa9e42f31d231c9
2012-01-05 13:25:41 -08:00
Christian Duvivier
e4ca542a3b Fix more warnings.
Change-Id: Ifadf65026a11bdb5d39840748613880bcfb364bb
2011-12-22 16:33:06 -08:00
Christian Duvivier
3a82bf4d05 Add script to test all builds.
Change-Id: I6bbed8bcb2dfa3458ffc59179dfba66c92e18125
2011-12-22 16:05:23 -08:00
Christian Duvivier
a7eb21760f Fix a couple of warnings. 2011-12-21 15:58:14 -08:00
Yaowu Xu
4e9b4a1570 changed mode_context update strategy
Previously, the mode context is always udpated based on stats of current
frame, when there is no count, 50% is used for both left and right branch.
However, it is observed that with such strategy, a small count or no count
at all can skew the probability distribution significantly. This commmit
changed the mode_context update strategy to prevent small counts from
skewing the probability distributions.

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

Change-Id: Ic812e64ae5f70251c170b0717f7b7fa587055488
2011-12-21 12:05:10 -08:00
Paul Wilkins
5920b520a0 Merge "Extended Q:" into experimental 2011-12-20 11:12:28 +00:00
Paul Wilkins
0d203eff8e Merge "Extend to 256 Q steps." into experimental 2011-12-20 11:12:08 +00:00
Paul Wilkins
df5a1fca8c Merge "QRange experiements." into experimental 2011-12-20 11:11:50 +00:00
Paul Wilkins
e92c8ccd92 Merge "Further QIndex realted Fixes:" into experimental 2011-12-20 11:11:09 +00:00
Paul Wilkins
7187c462d8 Extended Q:
Cleanup and switch to Q extended at low end too.

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

Change-Id: I2aaa6874fa10ce05c958dd182947ce39f6f1eecb
2011-12-19 09:36:19 +00:00
Paul Wilkins
ec670bc558 QRange experiements.
High Q end extended a little.
Some clean up.

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

Change-Id: I3dceea8a39e11c26e1a389a40e40b86efc76d28c
2011-12-19 09:35:10 +00:00
Paul Wilkins
fb807776a2 Further QIndex realted Fixes:
Added code to support 256 index steps instead of 128 but disabled for now.
Replace hard wired table vp8cx_base_skip_false_prob[128]
Observed Qindex problem with setting minimum loop filter value.
(Experiment code using real Q in place but for now just returning 0. This has a big
beneficial effect on some clips, particularly waterfall which shows 5% ssim gain)

Change-Id: I2f7117de8adc1797164c106aa13effc900a1467e
2011-12-19 09:27:19 +00:00
Adrian Grange
0fafd0543f Reset segment_id to 0 when segmentation is disabled
Whilst the encoder explicitly set the segment_id to 0
when segmentation is diabled, the decoder would allow
the segment_id to persist from the previous frame.

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

Change-Id: I65c3a05247550edb10706eb5d54d306dfb792309
2011-12-16 14:00:36 -08:00
Adrian Grange
b3ade15a26 Fixed stride bug in segmentation code
mode_info_context is padded with an additional column of data, so
mode_info_stride should be used to move between rows rather than
mb_cols.

Change-Id: I598559a2cd9df1c486d64aaeccf76b76a7ecf21c
2011-12-15 12:27:38 -08:00
Adrian Grange
ae63ce248a Fixed bug to use mode_info_stride rather than mb_cols
Both encoder & decoder were using mb_cols to
offset from one row of MODE_INFO structures to the next
when they should have been using mode_info_stride.

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

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

Change-Id: I413bea802b142886bfcf8d8aa7f5a2f0c524fd4b
2011-12-15 10:00:46 -08:00
Paul Wilkins
ae9023a3c9 QINDEX_RANGE fixed tables.
Removed a couple more fixed tables for the extended quantizer experiment
that depend on QINDEX_RANGE.

Change-Id: I2c15ffc7488c2a2b8d6504e2c4b6b2339799d117
2011-12-12 11:18:57 +00:00
Yaowu Xu
be360d47f4 Enabled adaptive UV intra coding for inter frames
Previously, Y-adaptive UV intra coding only enabled on key frames in
UVINTRA experiment. This commit enabled the same coding for inter
frames, so the encoding of UV intra modes are consistent cross all
frame types. Tests on derf set showed a very small overall gain around
.04%:

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

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

Change-Id: Ic6fc261923f2c253f4a0c9f8bccf4797557b9e16
2011-12-09 14:44:13 -08:00
Adrian Grange
43a059de71 Merge "Fix out of bounds read in update_mbgraph_frame_stats" into experimental 2011-12-09 21:05:00 +00:00
Adrian Grange
95b4cf059c Fix out of bounds read in update_mbgraph_frame_stats
update_mbgraph_frame_stats used xd->mode_info_context
before it had been setup, resulting in potentially
random accesses of uninitialized memory.

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

Change-Id: Ic9e75610008ce0e2d690e8e583c21582fee6fc45
2011-12-09 12:47:57 -08:00
Yaowu Xu
ba1a6619b3 Revised coding using adaptive mode context to depend on frame type
A previous commit 76feb965 made the vp8_mode_context adaptive on a frame
frame basis, this commit further made the coding context adaptive to two
frame types separately. Tests on derf set showed a further small gain on
all metrics: avg psnr 0.10%, glb psnr: 0.11%, ssim: 0.08%

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

Change-Id: I7b3e32ec8729de1903d14a3f1213f1624b78cdee
2011-12-09 12:13:42 -08:00
Paul Wilkins
7748d833e8 Experiment with old Q range:
Experiment with old Q range but new higher precision quantizer
and transform code.

Change-Id: Id1ff4cb433e5775d709d0133e2aec0322975c292
2011-12-09 16:19:08 +00:00
Yaowu Xu
ebcc6605c1 fixed a crash caused invalid Q choice
The commit fixed a problem by capping cpi->active_best_quality to be
smaller than cpi->worst_quality.  Also fixed a few line of code that
was misplaced.

Change-Id: Ie908264b72140c669122a0afde5d886619c33474
2011-12-08 07:04:23 -08:00
Yaowu Xu
b70f23caec Removed #if CONFIG_MULCONTEXT
This commit removed the macro CONFIG_MULCONTEXT, which was used to
indicate the experiment code for using separate context for altref
and normal frames. This commit made the change fully merged in.

Change-Id: I525f927f68e2365d37b340ef23b836a136a4f70b
2011-12-07 14:01:07 -08:00
Yaowu Xu
d37cd97682 Removed #if CONFIG_I8X8
This commit removed the macro CONFIG_I8X8, which was used to indicate
the 8x8 intra prediction experiment, made the change fully merged in.

Change-Id: Iafa4443781ce6e83f5591c12ba615a0e92ce0ea0
2011-12-07 13:48:53 -08:00
Yaowu Xu
76feb965d3 made vp8_mode_context adaptive
vp8_mode_contexts[] is an entropy table used to code inter mode
choices. It was a fixed constant table. This commit made the entropy
context adaptive. Tests on derf set showed very good consistent gains
on all metrics: avg psnr .47%, overall psnr .46% and ssim .40%.

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

Change-Id: Ia62b14485c948e2b74586118619c5eb2068b43b2
2011-12-07 11:01:59 -08:00
Yaowu Xu
b1823a7dd2 fixed a crash when MODE_STATS is enabled
The MODE_STATS macro was used to #ifdef around code for mode entropy
stats collection, this commit fixed a crash when MODE_STATS is on.
The commit also changed a number of array definitions to use defined
macros instead of hard-coded numbers.

Change-Id: I114592f53a1e44e31e455f5725f036ae6168735a
2011-12-07 10:56:39 -08:00
Yaowu Xu
d0e3acf98c Merge "Minor fixes:" into experimental 2011-12-07 18:52:51 +00:00
Paul Wilkins
79774d108f Minor fixes:
fixed issues caused by conflicts between two experiments.

Change-Id: I56a9bd69493e4850c121ea057a6233c55777c2a5
2011-12-07 09:55:27 -08:00
Ronald S. Bultje
73bbdfe506 Rename use_dc_pred to use_16x16_pred.
Because the variable doesn't distinguish between DC and non-DC
prediction, but rather between 16x16 or 4x4 prediction.

Change-ID: Ia4e7dda2bd6230c91515072e3277be2d64e42629
2011-12-07 09:10:26 -08:00
Yaowu Xu
b1781b48db Merge "corrected an enum name" into experimental 2011-12-07 03:25:08 +00:00
Ronald S. Bultje
0072b8bc73 Fix for RD thresholds if both I8X8 and DUALPRED are enabled.
Change-Id: I5f9fc894e6a332d9be6d7336c7c5fe11e65b8498
2011-12-06 15:13:11 -08:00
Ronald S. Bultje
60cb39da86 Dual 16x16 inter prediction.
This patch introduces the concept of dual inter16x16 prediction. A
16x16 inter-predicted macroblock can use 2 references instead of 1,
where both references use the same mvmode (new, near/est, zero). In the
case of newmv, this means that two MVs are coded instead of one. The
frame can be encoded in 3 ways: all MBs single-prediction, all MBs dual
prediction, or per-MB single/dual prediction selection ("hybrid"), in
which case a single bit is coded per-MB to indicate whether the MB uses
single or dual inter prediction.

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

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

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

Change-ID: I59dc84b07cbb3ccf073ac0f756d03d294cb19281
2011-12-06 11:53:02 -08:00
Paul Wilkins
b4ad9b5d50 Some further QIndex issues with extended Q
Resolved or factored out some further issues with Q index.
Put in a 3rd order polynomial instead of less accurate power function
as the best fit on gf and kf boost adjustment.
Added avg_q value to use instead of ni_av_qi.
Compute segment delta Q values based on avg_q.
Fixed bug in adjust_maxq_qrange().

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

Change-Id: Icfd49b9f401906ba487ef1bef7d397048295d959
2011-12-06 15:43:17 +00:00
Yaowu Xu
0404a5a7e1 corrected an enum name
CNT_INTRA has been used for counting (0,0) motion vectos, this commit
renames it to CNT_ZEROMV

Change-Id: I8f67c5468370090525faf84ba5b3f780d302443f
2011-12-06 07:09:08 -08:00
Yaowu Xu
82d99257f2 removed leftover code from a couple merge problems.
Change-Id: I17d9c1246d69e102297ec1c3efb359691b3da313
2011-12-05 11:22:35 -08:00
Yaowu Xu
8a40d2f5e6 changed configure script to enable new experimental options
Added two experimental options to the configure script:
1. newnear:
   new scheme of doing mv encoding that include a motion vector from
   last frame in nearest and near mv search
2. mulcontext:
   tracks entropy context separately for regular frames and alt ref
   frames.

Change-Id: If6e0d5d593351707b497a26eb6a763e080f77e6f
2011-12-02 15:32:46 -08:00
Yaowu Xu
acf5d20ce5 added separate entropy context for alt_ref
This commit added code to keep track of separate entropy contexts for
normal frames and alt ref frames. The underly assumption was that the
two type of frames have different entropy characteristics given they
typically have quite different quantization levels. By keeping entropy
contexts separate, it helps the entropy context distribution to be more
closely adapted to each frame type.

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

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

Change-Id: I15bc9697f6ff7829042911fe0c62930585d7e65d
2011-12-02 14:43:33 -08:00
Yaowu Xu
a8fbab8697 enabled 8x8 intra prediction modes on inter frames
This commit enabled the usage of 8x8 intra prediction modes on inter
frames. There are a few TODO items related to this: 1)baseline entropy
need be calibrated; 2)cost of UV need to be done more properly rather
than using decision only relying on Y; 3)Threshold for allowing picking
8x8 intra prediction should be lowered to lower than the B_PRED.

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

Change-Id: I398ada49dfc32575cfab962a569c2885111ae3ba
2011-12-02 13:44:47 -08:00
Paul Wilkins
8487a68baf Further work on extended Q range.
Fixed some further QIndex related issues and replaced some tables
(eg zbin and rounding)

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

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

Slight experimental adjustment to static segment Q offset.

Change-Id: I36186267d55dfc2a3d565d0cff7218ef300d1cd5
2011-12-02 15:30:01 +00:00
Paul Wilkins
2b307b38e3 CR/LF issue.
Change-Id: I95fab6f51967008acf1bc9e98fdb7bb56974807f
2011-12-02 15:06:15 +00:00
Yaowu Xu
bba710fcbd added transform type to MB_MODE_INFO
this commit is to add an variable in the macroblock level mode
info structure to track the transform size used in each MB, so
the information can be used later in the loop filter to change
how loop filter works on MBs with different transform sizes.

Change-Id: Id0eeaba6cc854c6d1be00ed8d237b3d9e250e447
2011-12-01 07:34:27 -08:00
Paul Wilkins
a917afabbb MinQ equations.
Slight tweaks to the new minq equations to bring results more into line with
original lookup tables.

Change-Id: I969fc87d95912df549b6775e83ee2345e84d4da0
2011-11-29 18:03:57 +00:00
Paul Wilkins
b9ce9bcbc5 Extended Q Range:
Addressed a couple of other QIndex dependencies.

Change-Id: I15b224bffd0210d3c7065cb6905156f2ca8e9ea9
2011-11-29 18:02:56 +00:00
Paul Wilkins
99df6bb629 Further work on extended Q range.
Fixed bug in firspass.c call to vp8_initialize_rd_consts()

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

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

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

Change-Id: Iddf6cf5ea8467c44b7c133f38e629f6ba6f2581e
2011-11-29 17:59:23 +00:00
Ronald S. Bultje
82733643ca mbgraph: fix invalid memory access if motion vectors are too big. 2011-11-28 12:39:38 -08:00
Yaowu Xu
643238a3e0 changed find_near_mvs search to include a mb from last frame
This is an experiment to include a mv contribution from last frame to
nearest and near mv definition. Initial test showed some small though
consistent gain.

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

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

Change-Id: Ief1e284a36d8aa56b49ae5b360c91419ec494fa4
2011-11-28 08:52:08 -08:00
Paul Wilkins
ee2051f650 Two pass rate control code changes.
This comitt brings accross changes from the public branch
commit number Icf74d13af77437c08602571dc7a97e747cce5066.

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

Change-Id: I278e989436a928fc1fe7761068960048f9d7a376
2011-11-23 17:18:31 +00:00
Paul Wilkins
a0b7db22e6 Further resolution of QIndex LUTS;
This commit resolves further QIndex look up tables to facilitate
experimentation with the quantizer range.

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

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

Change-Id: I8baa61c97ce87dc09a6340d56fdeb681b9345793
2011-11-23 11:32:20 +00:00
Adrian Grange
08491b8665 Remove redundant code (lf_or_gf and frame_lf_or_gf)
Removed unused variables lf_or_gf and frame_lf_or_gf.

Change-Id: I88692cd7d53e532d303c4525ee4667c1ecea3026
2011-11-22 08:47:08 +00:00
Paul Wilkins
d39b5d0546 Removal of Qindex LUTS.
One of the problems arising when tweaking or adjusting the quantizer
tables is that there are a lot of look up tables that depend on the QINDEX.
Any adjustment to the link between QINDEX and real quantizer therefore tends
to break aspects of for example the rate control.

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

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

Change-Id: Ic80db2212d2fd01e08e8cb5c7dca1fda1102be57
2011-11-22 08:42:33 +00:00
Paul Wilkins
9bac509ac5 Extended Q range Experiment.
Corrected dc lookup table to maintain ac/dc balance
close to what it was previously.

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

Change-Id: Ic0200dabda445fea03bf81067999cb2670e99b77
2011-11-21 15:53:40 +00:00
Paul Wilkins
54f090b119 Cosmetic clean up.
Clean up of vp8_kfread_modes().
Remove unnecessary indentation and enforce line length.

Change-Id: I0864d1aff55368126db01bb23efa815786b5245d
2011-11-21 15:51:21 +00:00
Paul Wilkins
19d87e8ed7 Decoder segmentation bug.
Fix decoder segmentation bug for temporal coding where the segment map
was first initialized on a key frame.

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

Change-Id: I1489305efc376564e734a216f69c2844646ee3d3
2011-11-21 15:49:47 +00:00
Paul Wilkins
4f792921e7 CONFIG_T8X8 experiment.:
Block the selection of 4x4 modes in key frames if 8x8 is selected.

Change-Id: Ie5729ec22a999d9a1996f020bd4b941e29514992
2011-11-21 15:46:32 +00:00
Adrian Grange
eb15fe85e0 Clip buffer level to the maximum buffer size in CBR
The buffer level was able to increase indefinitely rather than
being clipped to the maximum buffer size specified by the user.

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

Change-Id: Ifff55f79d3c018e4d3d77e554b11ada543cc1654
2011-11-17 15:57:37 -08:00
Yaowu Xu
6dddcbc57d Merge "fixed the scaling in 8x8 trellis quant" into experimental 2011-11-17 14:55:43 +00:00
Yaowu Xu
7f33be9e96 fixed the scaling in 8x8 trellis quant
This commit has a few minor fixes to the 8x8 trellis quant, so to
make it work regardless if extend_qrange is enabled or not. It also
borrowed adaptive RDMULT constants from 4x4 trellis that was missed
in the 8x8 trellis quant.

Change-Id: I60d7769071f102c699b5084597e62bca87a1f759
2011-11-16 14:29:02 -08:00
Paul Wilkins
cee3d2223a Header inclusion for Unix build
Explicit inclusion of limits.h to satisfy unix build for definition of INT_MAX.
Some commented out code removed.

Change-Id: I5b5980dfaa9b4d2d12bfd729cfd35bd982106908
2011-11-16 10:34:47 +00:00
Adrian Grange
2b1c2990a9 Added clipping of the buffer level to maximum_buffer_size
The buffer level was not being capped at the maximum decode
buffer size specified by the user.

In CBR mode this resulted in large files being generated
immediately after a dramatic reduction in the data rate
target. This fix should prevent this from happening.

Change-Id: Iaf01c9fb037cf51515217a5834d6ee4fbb0cb853
2011-11-15 16:39:53 -08:00
Paul Wilkins
3cdfdb55e4 Merge CONFIGURE_SEGMENTATION experiment.
Removal of CONFIGURE_SEGMENTATION ifdefs.

Removal of legacy support code fo the old coding mechanism.

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

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

Change-Id: I85bc8fd63440e7176c73d26cb742698f9b70cade
2011-11-15 16:15:23 +00:00
Paul Wilkins
6394ef28d7 Further clean up of Segmentation experiment code
Changed name and sense of segment_flag to "seg_id_predicted"
Added some additional comments and retested.

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

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

Change-Id: I3b382b65ed2a57bd7775ac0f3a01a9508a209cbc
2011-11-15 15:22:26 +00:00
Paul Wilkins
661b2c2dcf Further work on Segmentation Experiment:
This check in includes quite a lot of clean up and refactoring.

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

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

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

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

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

Change-Id: I3d4aba2a2826ec21f367678d5b07c1d1c36db168
2011-11-15 11:13:33 +00:00
Paul Wilkins
c9130bdbbc Segmentation experiment:
Added last_segmentation_map[] structure
to keep track of what we had before when
doing temporal prediction. With this change
the existing code does once again appear to
be giving a decodable bitstream for both
temporal and standard prediction modes.
However, it is still somewhat messy and
confused and there is no option to take
advantage of spatial prediction so it could
do with further work.

Some housekeeping / clean out.

Change-Id: I368258243f82127b81d8dffa7ada615208513b47
2011-11-11 18:33:25 +00:00
Paul Wilkins
bf25d4ad7f SEGMENTATION experiment:
Some initial cleanup to aid testing and debug.

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

For now disable broken temporal mode.

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

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

Change-Id: Ib75118520b1144c24d35fdfc6ce46106803cabcf
2011-11-11 18:31:21 +00:00
Yaowu Xu
e01b39254b changed function name for clarity
The dequantizer functions for 2nd order haar block had confusing 8x8
in their names. this commit fixed their name to avoid confusion.

Change-Id: I6ae4e7888330865f831436313637d4395b1fc273
2011-11-11 09:01:16 -08:00
Yaowu Xu
0c846f6602 Merge "fixed the decoder when using 8x8 transform" into experimental 2011-11-11 15:38:42 +00:00
Yaowu Xu
982b061dc2 Make 8x8 and extend_qrange to work together
This commit added scaling factors to 8x8 transform, quant, dequant and
inverse transform pipeline to make 8x8 transform to work when configed
with enable-extend_qrange. This commit also disabled the trellis-quant
when extend_qrange is configured.

Change-Id: Icfb3192e4746f70a4bb35ad18b7b47705b657e52
2011-11-11 07:31:00 -08:00
Yaowu Xu
7189198d53 fixed the decoder when using 8x8 transform
updated the decode_macroblock logic to reflect that 8x8 transform is
not used for "SPLITMV". Also fixed an issue where 2nd order haar block
has wrong dequant/idct process.

Change-Id: I1e373f6535c009dfec503b6362c8a5cfc196e1da
2011-11-10 17:15:06 -08:00
Yaowu Xu
a0ed4e6380 Merge "scaled the threshold for 2nd order coefficient reset" into experimental 2011-11-10 16:34:36 +00:00
Yaowu Xu
cbcba9e7c0 scaled the threshold for 2nd order coefficient reset
extend_qrange introduces a different scaling factor, this commit takes
the scaling difference into account for reset 2nd order coefficients.

Change-Id: Ie58bca9f52698fa759e3f88da2aa4d82630fa91a
2011-11-10 08:31:13 -08:00
Paul Wilkins
151b7f25db Merge "T8x8 experiment merge." into experimental 2011-11-10 09:37:26 +00:00
Yaowu Xu
842dc7ca60 Merge "fixed an encoder bug" into experimental 2011-11-10 00:43:12 +00:00
Yaowu Xu
8974daea11 fixed an encoder bug
the bug caused the encoder to produce invalid bitstream when configured
with enable_extend_qrange.

Change-Id: I1e81c48b13359d0043cbbd480e679380a2da117c
2011-11-09 16:03:23 -08:00
Yaowu Xu
5825f942bc fixed an encoder bug in experimental branch
the bug causes experimental branch to produce invalid bitstream when
extend_qrange option is on.

Change-Id: Iba294980759f13e4ae071f29fb44e292533f0d7e
2011-11-09 15:26:41 -08:00
Yaowu Xu
fa454ade93 Fixed building issues
Change-Id: I027f41db4bd46e2350fd0e4b8e6e9239f897b256
2011-11-09 09:14:43 -08:00
Paul Wilkins
0789253125 T8x8 experiment merge.
For ease of testing and merging experiments I have
removed in line code in encode_frame() that assigns
MBs to be t8x8 or t4x4 coded segments and have
moved the decision point and segment setup to
the init_seg_features0 test function.

Keeping everything in one place helps make sure
for now that experiments using segmentation are
not fighting each other.

Also made sure mode selection code can't choose 4x4
modes if t8x8 is selected.

Patch2: In init_seg_features() add checks
for SEG_LVL_TRANSFORM active.

Change-Id: Ia1767edd99b78510011d4251539f9bc325842e3a
2011-11-09 15:46:05 +00:00
Paul Wilkins
b0f9f15dbd Merging and testing of SEGMENTATION experiment.
Removed code in #if CONFIG_SEGMENTATION that
enables segmentation and creates a test segmentation
map, to avoid conflicts with the other segmentation test
code,

Change-Id: I7a21a44ed188b814cd80b30dd628c62474eba730
2011-11-09 11:59:20 +00:00
Paul Wilkins
ac2ab02dcf Segmentation feature logic fix.
Bug fix to logic in vp8_pick_inter_mode() and
vp8_rd_pick_inter_mode().

The block on the use of segment features
for the cm->refresh_alt_ref_frame case
was just for testing and is not correct.

The special case code for alt ref can
be re-enabled as an else clause.

Change-Id: Ic9b57cdb5f04ea7737032b8fb953d84d7717b3ce
2011-11-09 11:53:26 +00:00
Yaowu Xu
5883246d01 make debug match release build on win32 with 8x8 transform enabled
The 8x8 forward transform makes use of floating operations, therefore
requires emms call to reset mmx registers to correct state. Without
the resets, the 8x8 forward transform results are indefinite on win32
platform.

Change-Id: Ib5b71c3213e10b8a04fe776adf885f3714e7deb1
2011-11-08 20:36:54 -08:00
Yaowu Xu
6e165e86a7 Attempt to fix an issue related to 8x8 transform and segfeature
logically this commit should NOT change anything, but seems to help
revert the 3DB loss on bowing in the following commit:

https://on2-git.corp.google.com/g/#change,6193

This is still debugging in progress. Need further investigation to
understand the root cause of the issue.

Change-Id: I0b49d1ef3a311dfff58c6acd3eaebdb3bda6257c
2011-11-08 16:15:41 +00:00
Paul Wilkins
a9df4183a6 Segment signaling of TX size
Initial attempt at using new segment feature signaling
to indicate 4x4 or 8x8 transform.

needs --enable-experimental --enable-t8x8

Note this is work in progress.

Change-Id: Ib160d46a5d810307bfcbc79853ce1a65b5b870b7
2011-11-08 12:21:08 +00:00
Yaowu Xu
f82d601f94 Merge "Added context reset when 2nd order coefficients are cleared" into experimental 2011-11-04 16:25:15 +00:00
Paul Wilkins
fe38082f44 Segment Features with 8x8DCT.
Temporary check in to turn off other segment features
tests when #if CONFIG_T8X8 is set as the assignment of
MBs to differnt segments in each case  will conflict.

The 8x8 code will be modified to use the new segment
feature method properly in a later check in.

Increase bits allowed for EOB end stop marker to 6 ready
for 8x8.

Change-Id: I4835bc8d3bf98e1775c3d247d778639c90b01f7f
2011-11-04 11:06:24 +00:00
Paul Wilkins
a258bba1fb Segment Feature Data Access
No change to functionality or output.

Updates to the segment feature data structure now all done
through functions such as set_segdata() and get_segdata()
in seg_common.c.

The reason for this is to make changing the structures (if needed)
and debug easier.

In addition it provides a single location for subsequent addition
of range and validity checks. For  example valid combination of
mode and reference frame.

Change-Id: I2e866505562db4e4cb6f17a472b25b4465f01add
2011-11-04 10:42:12 +00:00
Yaowu Xu
2bbde25003 make uv intra mode coding adaptive to Y mode
This commit tries to do UV intra mode coding adaptive to Y intra mode.
Entropy context is defined as conditional PDF of uv intra mode given
the Y mode. All constants are normalized with 256 to be fit in 8 bits.

This provides further coding efficiency beyond the quantizer adaptive
y intra mode coding. Consistent gains were observed on all clips and
all bit rates for HD all key encoding tests.

To test, configure with
--enable-experimental --enable-uvintra

Change-Id: I2d78d73f143127f063e19bd0bac3b68c418d756a
2011-11-03 21:48:08 -07:00
Yaowu Xu
d8afecef71 Added context reset when 2nd order coefficients are cleared
As discovered in path 10 of Change Ia12acd2f, reset 2nd order coeffs
without reset of above and left coding context may have introduced
problem that causes encoder/decoder mismatching. This commit added
update to coding context when the 2nd coefficients are cleared.

In addition, this commit also introduced early breakout in the checks
to speed up when coefficients are too significant to be cleared.

Change-Id: I85322a432b11e8af85001525d1e9dc218f9a0bd6
2011-11-03 16:05:29 -07:00
Paul Wilkins
a10a268e58 Segment Features. Removal of #ifdefs
Removal of configure #ifdefs so that segment features
always available. Removal of code supporting old
segment feature method.

Still a good deal of tidying up to do.

Change-Id: I397855f086f8c09ab1fae0a5f65d9e06d2e3e39f
2011-11-03 17:14:26 +00:00
Paul Wilkins
2370d440bd Merge "Segmentation: Reference frames" into experimental 2011-11-03 12:58:43 +00:00
Paul Wilkins
ab9a4ce065 Merge "Change to prevent encoding of effect-less 2nd order coefficients" into experimental 2011-11-02 14:48:17 +00:00
Paul Wilkins
87ff8620b2 Segmentation: Reference frames
Modify reference frame segmentation so that ONE or MORE
reference frames may be marked as a available for a given
segment.

Fixed bugs relating to segment coding of INTRA and some
INTER modes at the segment level.

Modified Q boost for static areas based on ambient average Q.

Strong results now on clips with significant static areas.
(some data points in derf set as high as 9% and some static &
slide show type content in YT set > 20%)

Change-Id: Ia79f912efa84b977f35a23683ae3643251e24f0c
2011-11-02 13:31:54 +00:00
Adrian Grange
2b450a460f Deleted repeated code block
The block of code skipped testing the current mode if the
reference frame is AltRef, the mv is not (0,0) and
ARNR filtering is disabled.

This block of code has already been tested above if the
macro CONFIG_SEGFEATURES is set to 0.

Change-Id: I3f5710bb8270caad06c9a0eee59fa0daf1f70776
2011-11-01 08:41:43 -07:00
Adrian Grange
71fb1f8eab Fixed this_mode used before set in vp8_pick_inter_mode
The variable this_mode was being used before it had been
initialized.

Moved the line that sets-up this_mode toward the top of the
enclosing loop, prior to its first use. The bug would result in
tests in the loop lagging the mode that was expected to be
tested.

Change-Id: If4e51600449ce6b4285f112da17a44c24b4a19fb
2011-10-31 12:42:00 -07:00
Paul Wilkins
795c6dd2c9 Segmentation Entropy and tweaks.
Some correction for entropy impact of segment signaled (EOB and ref frame)

Other slight tweaks.

Derf VBR average gain now over 1% (best over 7%)
One YT test clip has gains of circa 30% (VBR)

There is still an issue with noisy clips where making the background static
and coded with 0,0 can have a negative effect, especially at low Q.
This is probably because of the loss of smoothing by fractional pixel filters.

Change-Id: I7a225613c98067b96f8fc7a7e36f95d465b2b834
2011-10-31 10:59:25 +00:00
Paul Wilkins
afb52f65f2 Resolve build problem
Resolved experimental branch build problem when seg_features not configured.

Change-Id: Ia0f9b460a26dc3eac9844ee595a7b196e9faf6a5
2011-10-27 12:35:36 +01:00
Yaowu Xu
c8ef79d22e Change to prevent encoding of effect-less 2nd order coefficients
similar logic to http://gerrit.chromium.org/gerrit/#change,10359

Change-Id: Ia12acd2f2b3b92ef2a601da43c2497034ef62174
2011-10-25 10:25:02 -07:00
Yaowu Xu
4081e5b3fe Merge "added a last stage rounding for 8x8 inverse dct" into experimental 2011-10-25 16:08:51 +00:00
Yaowu Xu
a66c945c59 added a last stage rounding for 8x8 inverse dct
Prior to the added rounding, tests on randomly generated data showed
that forward-inverse transform round trip errors are about 3.02/block
for input range [-10,10] and 2.68/block for input range [-256, 255].
The added rounding reduced the errors to 0.031/block for input range
[-10,10] and 0.037/block for input range [-256, 255].

Maximum round trip error on for any pixel position is 1.

The average errors are calculated based on 100,000 blocks of randomly
with the specified ranges.

Paul mentioned in discussion that the change was not clear on why we
need change the rounding, so Patch 2 intends to make the rationale
obvious in code, it merged the two separate shifts into one, and the
two separate rounding factors into one. Patch 1 and 2 have same
numerical test results.

Change-Id: Ic5e2f5463de17253084d8b2398c4a210194b20de
2011-10-24 11:56:47 -07:00
Paul Wilkins
23701f4f87 Segmentation Features;
Only encode sign bit for feature data that can have a sign.

Tweaks to the test segmentation rules so that it now actually gives
a net benefit on the derf set of about 0.4% though much higher
on some clips at the low end.

Change-Id: I8e61f1aebf41c9037db7e67e2f8975aa18a0c986
2011-10-24 17:06:29 +01:00
Paul Wilkins
01ce04bc06 Further segment feature extensions.
This quite large check in includes the following:

Merge in some code from Ronald (mbgraph.c) that scans a Gf/arf group.
This is used as a basis for a simple segmentation for the normal frames
in a gf/arf group. This code also uses satd functions from Yaowu.

Adds functionality for coding the latest possible position of an EOB for
blocks in the segment. (Currently 0-15 only, hence just for 4x4 dct).
Where the EOB position is 0 this acts like "skip" and the normal coding
of skip at the per mb level is disabled.

Added functions (seg_common.c) for setting and reading segment feature
elements. These may want to be optimized away at some point but while the
mecahnism is in a state of flux they provide a single location for making
changes and keep things a bit cleaner.

This is still proof of concept code. Currently the tested feature set:-

Quantizer,
Loop Filter level,
Reference frame,
Prediction Mode,
EOB end stop.

TBD:-

Add functions for setting and reading the feature data with range
and validity checking.

Handling of signed and unsigned feature data. At the moment all is assumed
to be signed and a sign bit is coded but many cannot be negative.

Correct handling of EOB feature with intra coded blocks.

Testing/trapping of legal/illegal ref frame and mode combinations.

Transform size switch plus merge and test with 8c8 DCT work

Merge and test with Sumans Segmenation coding optimizations

Change-Id: Iee12e83661c7abbd1e0ce6810915eb4ec35e2d8e
2011-10-24 15:52:18 +01:00
Yaowu Xu
152ce6b2b9 fixed the wrong rounding in inverse haar transform
Given the current forward haar transform:
 f0 = I0 + I1 + I2 + I3
 f1 = I0 + I1 - I2 - I3
 f2 = I0 - I1 + I2 - I3
 f3 = I0 - I1 - I2 + I3
the output of the inverse haar prior rounding:
 i0 = f0 + f1 + f2 + f3 = I0 * 4;
 i1 = f0 + f1 - f2 - f3 = I1 * 4;
 i2 = f0 - f1 + f2 - f3 = I2 * 4;
 i3 = f0 - f1 - f2 + f3 = I3 * 4;
As all the numbers are 4 multiples, simply >>2 always produces prefect
results in term of forward-inverse transform round trip error.

Change-Id: Id6658b00ea819ee61cfeef8c5985d4cd3e77f44e
2011-10-14 09:33:54 -07:00
Yaowu Xu
3ca849691c fixed a decoder bug
When 8x8 transform is enabled, the decoder does an extra reconstruct
on MBs that are coded using 8x8. This commit fixed the logic around
the decoding of mb encoded with 8x8 transform.

Change-Id: I6926557c9ef00eecb375f62946f7e140c660bf6f
2011-10-08 15:48:53 -07:00
Paul Wilkins
156b221a7f Segment coding of mode and reference frame.
Proof of concept test code that encodes mode and reference
frame data at the segment level.

Decode-able bit stream but some issues not yet resolved.
As it this helps a little on a couple of clips but hurts on most as
the basis for segmentation is unsound.

To build and test, configure with
--enable-experimental --enable-segfeatures

Change-Id: I22a60774f69273523fb152db8c31f4b10b07c7f4
2011-09-30 16:45:16 +01:00
Paul Wilkins
45e49e6e19 Experimental: segfeature added.
New setting added to configure script
2011-09-30 16:08:37 +01:00
John Koleszar
4d1c5aa413 Merge remote branch 'origin/master' into experimental
Change-Id: I44db27204081ef238cefb521f3ae728091c5c71b
2011-09-23 00:05:09 -04:00
John Koleszar
ee03ce909b Merge remote branch 'internal/upstream-experimental' into HEAD 2011-09-22 00:05:08 -04:00
John Koleszar
b02fdf098a Merge remote branch 'origin/master' into experimental
Change-Id: I4e515276d197e1dfb1f3e75edfa9823d08c9b366
2011-09-21 00:05:04 -04:00
John Koleszar
305084d5fa Merge remote branch 'internal/upstream' into HEAD 2011-09-21 00:05:04 -04:00
John Koleszar
b4c03a8b72 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-09-21 00:05:04 -04:00
John Koleszar
cc63deba31 Merge remote branch 'origin/master' into experimental
Change-Id: I717768a6b248bd4ae3a96f711287758ba78a384a
2011-09-20 00:05:04 -04:00
John Koleszar
feea724296 Merge remote branch 'internal/upstream' into HEAD 2011-09-20 00:05:04 -04:00
John Koleszar
64677e2722 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-09-18 00:05:06 -04:00
John Koleszar
c555891249 Merge remote branch 'origin/master' into experimental
Change-Id: I83fd03ca0970314c81e834857cbd911dffa9a9de
2011-09-17 00:05:04 -04:00
John Koleszar
f3fce80954 Merge remote branch 'internal/upstream' into HEAD 2011-09-17 00:05:04 -04:00
John Koleszar
edfb6dc7c3 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-09-17 00:05:04 -04:00
Yaowu Xu
1d44e7ce1f enable selecting&transmitting to for intra mode entropy
This commit added a 3 bit index to the bitstream, the index is used to
look into the intra mode coding entropy context table. The commit uses
the mode stats to calculate the cost of transmitting modes using 8
possible entropy distributions, and selects the distribution that
provides the lowest cost to do the actual mode coding.

Initial test show this provides additional .2%~.3% gain over quantizer
adaptive intra mode coding. So the adaptive intra mode coding provides
a total of .5%(psnr) to .6% gain(ssim) combined for all-key-encoding

To build and test, configure with
--enable-experimental --enable-qimode

Change-Id: I7c41cd8bfb352bc1fe7c5da1848a58faea5ed74a
2011-09-16 16:33:19 -07:00
Yaowu Xu
aac2c12663 add quantizer adaptive intra mb mode encoding
make intra mode coding entropy distribution adaptive to baseQindex, an
encoding test on hd clips with all key frame shows universal gain on
all clips in both .2%(psnr) and (ssim).3%.

To build and test, configure with
--enable-experimental --enable-qimode

Change-Id: Iaa69241b984d4fdd8baa6d77ee78c0140f5ac00a
2011-09-16 16:26:35 -07:00
Yaowu Xu
ca6b85aa4e add 8x8 intra prediction modes
Patch 1 to Patch 3 is an initial implementation of 8x8 intra prediction
modes, here are with the following assumptions:
a. 8x8 has 4 prediction modes DC, H, V and TM
b. UV 4x4 block use the same mode as corresponding 8x8 area
c. i8x8 modes are enabled for key frame only for now
Patch 4:
d. removed debug code from previous patches
Patch 5:
e. added stats code to collect entropy stats and further cleaned up
Patch 6:
f. changed mode stats code to collect finer stats of modes
Patch 7:
g. normalized i8x8 modes distribution to total at 256 (8bits).
Patch 8:
h. fixed a bug in decoder and removed debug printf output.
Patch 9:
i. more cleanups to address paul's comment
Patch 10:
j. messy rebase/merges to bring the commit up to date.

Tests on HD clips encoded with all key frame showing consistent gain
on all clips and all metrics:~0.5%(psnr) and 0.6%(ssim):
http://www.corp.google.com/~yaowu/no_crawl/i8x8hd_allkey_fixedq.html

To build and test, configure with:
--enable-experimental --enable-i8x8

Change-Id: I9813fe07ae48cab5fdb5d904bca022514ad01e7f
2011-09-16 15:55:19 -07:00
John Koleszar
62371d382a Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/decoder/decodframe.c
	vp8/encoder/encodeframe.c
	vp8/encoder/encodemb.c

Change-Id: I6e0d1669e4409a2dfd73ba2c7038d730842d3953
2011-09-16 09:22:29 -04:00
John Koleszar
3b5f8adcc0 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-09-16 08:54:15 -04:00
John Koleszar
1158bcd813 Merge remote branch 'origin/master' into experimental
Change-Id: I20df6781013786cbf56ded31e1c726de6c34bc42
2011-09-16 08:53:06 -04:00
Paul Wilkins
ceb5174205 Segment Feature Signaling
Plumbing for tuning new segment features on and off.

Change-Id: If86cd6f103296b73030e8af7cf85c5b9bbffdbaf
2011-09-15 10:19:09 +01:00
Paul Wilkins
1741cc7ab9 Reverse coding order for segment features:
Code all the features for one segment (grouped together)
then all for the next etc. etc. rather than grouping the
data by feature.

Change-Id: I2a65193b3a70aca78f92e855e35d8969d857b6dd
2011-09-13 16:57:17 +01:00
Paul Wilkins
1c24442a07 Change to segment_feature_data[][] structure.
This data structure is  now [Segment ID][Features]
rather than [Features][Segment_ID]

I propose as a separate modification to make the experimental
bit stream reflect this such that all the features for a segment
are coded together.

Change-Id: I581e4e3ca2033bdbdef3d9300977a8202f55b4fb
2011-09-13 12:58:04 +01:00
Paul Wilkins
dfbc61f3ab Segment Features:
Some basic plumbing added for a range of segment level features.
MB_LVL_* changed to SEG_LVL_* to better reflect meaning.

Change-Id: Iac96da36990aa0e40afc0d86e990df337fd0c50b
2011-09-13 11:26:39 +01:00
Yaowu Xu
1fa77e28a1 fixed a decoder bug
the bug appears to be introduced from a merge at Commit:62400028..

Change-Id: I332d78b673f12e5ef2b0cdd6bab57dc2c8af7a72
2011-09-03 13:12:13 -07:00
John Koleszar
f7084f35da Merge remote branch 'origin/master' into experimental
Change-Id: I0aaefeafeb6b2b07ec792024edf4751f2860aa23
2011-08-31 00:05:09 -04:00
John Koleszar
4551743ceb Merge remote branch 'internal/upstream' into HEAD 2011-08-31 00:05:05 -04:00
John Koleszar
525dba8f7b Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-28 00:05:08 -04:00
John Koleszar
06f30739a5 Merge remote branch 'origin/master' into experimental
Change-Id: I3137fae1f61400f142d58f18663624b62aa0533c
2011-08-27 00:05:10 -04:00
John Koleszar
ce59a150a6 Merge remote branch 'internal/upstream' into HEAD 2011-08-27 00:05:05 -04:00
John Koleszar
a358375c6d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-27 00:05:05 -04:00
John Koleszar
9deb8459f6 Merge remote branch 'origin/master' into experimental
Change-Id: If27b6e914cccc1dc23408ee7117b405e1364e779
2011-08-26 00:05:11 -04:00
John Koleszar
4a28115464 Merge remote branch 'internal/upstream' into HEAD 2011-08-26 00:05:06 -04:00
John Koleszar
bf9f23be45 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-26 00:05:05 -04:00
John Koleszar
180b0306cc Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/common/defaultcoefcounts.h
	vp8/common/entropy.c
	vp8/encoder/bitstream.c

Change-Id: Idd4990c80d5b5494ac036254694015fab449bc08
2011-08-25 08:36:19 -04:00
John Koleszar
1765040a26 Merge remote branch 'origin/master' into experimental
Change-Id: Ic9131382306cc18a915f8854ddba33025123968d
2011-08-25 00:05:11 -04:00
John Koleszar
d26fafd4e5 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-25 00:05:05 -04:00
John Koleszar
d2a2d5a6d5 Merge remote branch 'origin/master' into experimental
Change-Id: If53ec5c1219b31e5ef9ae552d9cc79432ebda267
2011-08-24 00:05:11 -04:00
John Koleszar
67864c5f97 Merge remote branch 'internal/upstream' into HEAD 2011-08-24 00:05:05 -04:00
John Koleszar
4de8c78236 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-24 00:05:05 -04:00
John Koleszar
7cb25d9c56 Merge remote branch 'origin/master' into experimental
Change-Id: I84dfc81eb14caae02011be2b9fef18a8d7f803f4
2011-08-23 00:05:10 -04:00
John Koleszar
91a96ccc87 Merge remote branch 'internal/upstream' into HEAD 2011-08-23 00:05:05 -04:00
John Koleszar
fbc78c2428 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-21 00:05:12 -04:00
John Koleszar
c08e65a671 Merge remote branch 'origin/master' into experimental
Change-Id: Iefa9c3e87ff25d92093eb949e23d5a85f1b7de09
2011-08-20 00:05:14 -04:00
John Koleszar
efe35fa63f Merge remote branch 'internal/upstream' into HEAD 2011-08-20 00:05:04 -04:00
John Koleszar
9443cd9c54 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-19 00:05:11 -04:00
John Koleszar
7cb5a75031 Merge remote branch 'origin/master' into experimental
Change-Id: I3a4ec6e9fa7059cac52cfdcf9dfe6ef123629db4
2011-08-18 00:05:13 -04:00
John Koleszar
3743fd0cc7 Merge remote branch 'internal/upstream' into HEAD 2011-08-18 00:05:09 -04:00
John Koleszar
85c57d9ed2 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-17 00:05:12 -04:00
John Koleszar
79d8ffd213 Merge remote branch 'origin/master' into experimental
Change-Id: I215466afda88def40f4a5d81f5b58ec383471346
2011-08-16 00:05:11 -04:00
John Koleszar
f54d561fa8 Merge remote branch 'internal/upstream' into HEAD 2011-08-16 00:05:05 -04:00
John Koleszar
f783b6eba7 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-08-14 00:05:11 -04:00
John Koleszar
3d1f3fc6c9 Merge remote branch 'origin/master' into experimental
Change-Id: Ie6bc53eb61dc772f308abce9bf93bcc67b38f670
2011-08-13 00:05:11 -04:00
John Koleszar
8f60186502 Merge remote branch 'internal/upstream' into HEAD 2011-08-13 00:05:06 -04:00
John Koleszar
a16cd74ba1 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/decoder/detokenize.c
	vp8/decoder/onyxd_if.c
	vp8/vp8_common.mk

Change-Id: Ifca1108186a8bc715da86a44021ee2fa5550b5b8
2011-08-11 13:01:45 -04:00
John Koleszar
939f64f68e Merge remote branch 'origin/master' into experimental
Change-Id: I9c479c9b6e72aa78b412d25c00b8075eaca5229d
2011-08-06 00:05:15 -04:00
John Koleszar
712762b508 Merge remote branch 'origin/master' into experimental
Change-Id: Ic698ea5f5b31a5faf467eb0da4b762f9586df938
2011-08-05 00:05:05 -04:00
John Koleszar
87e570e6be Merge remote branch 'origin/master' into experimental
Change-Id: I473166452c0ed5a4219b5e7d96a91a6641b11b9d
2011-07-30 00:05:09 -04:00
John Koleszar
c521abeb49 Merge remote branch 'origin/master' into experimental
Change-Id: I690f30f8f9b9fd369f08c35c4dccdd15eed18cd0
2011-07-29 00:05:12 -04:00
John Koleszar
728886fae9 Merge remote branch 'origin/master' into experimental
Change-Id: Iaca87acc9726b5173d638528684d154538ec01e6
2011-07-28 00:05:12 -04:00
John Koleszar
9fbb1d4350 Merge remote branch 'origin/master' into experimental
Change-Id: I1ae82458536ba2f0969e1bea78f41cd16fe96b79
2011-07-27 00:05:06 -04:00
John Koleszar
eccfca5165 Make cat6 probs properly dependent on CONFIG_EXTEND_QRANGE
Change-Id: I2ac5d8818acb50f9db38de8cb562f337e51006b2
2011-07-26 10:30:33 -04:00
John Koleszar
62400028e2 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/decoder/detokenize.c
	vp8/decoder/onyxd_int.h

Change-Id: Ib9b516b939358ac8bf694200a8425fdd62c8d149
2011-07-26 10:22:42 -04:00
John Koleszar
3c4a39e71c Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/decoder/detokenize.c
	vp8/decoder/onyxd_int.h

Change-Id: Idc301ae630dc1aedeb85674ecfdcf1eb28420f81
2011-07-26 10:04:36 -04:00
John Koleszar
96513c42b2 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-24 00:05:15 -04:00
John Koleszar
664cd5ac91 Merge remote branch 'internal/upstream' into HEAD 2011-07-23 00:05:14 -04:00
John Koleszar
058566797a Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-23 00:05:14 -04:00
John Koleszar
e14ad46efa Merge remote branch 'origin/master' into experimental
Change-Id: I0a24d6762598e5fee30f264de1dcd10331c01eac
2011-07-23 00:05:13 -04:00
John Koleszar
dc9e1b7683 Merge remote branch 'origin/master' into experimental
Change-Id: I8b0a76b3232c8cff15c0ca5289e18af6889e5095
2011-07-22 00:05:11 -04:00
John Koleszar
7d44c805cf Merge remote branch 'internal/upstream' into HEAD 2011-07-22 00:05:06 -04:00
John Koleszar
06e9386422 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-22 00:05:06 -04:00
Yaowu Xu
f614661242 Merge "fix more merge issues" into experimental 2011-07-21 16:05:24 +00:00
Yaowu Xu
8c31484ea1 fix more merge issues
With this fix, the experimental branch now builds and encodes correctly
with the following two configure options respectively:
--enable-experimental --enable-t8x8
--enable-experimental

Change-Id: I3147c33c503fe713a85fd371e4f1a974805778bf
2011-07-21 09:01:53 -07:00
John Koleszar
ca60e0c2f9 Merge remote branch 'origin/master' into experimental
Change-Id: I9761428209518b7fcbde60e884c06754664c0c36
2011-07-21 00:05:10 -04:00
John Koleszar
a53586d9d1 Merge remote branch 'internal/upstream' into HEAD 2011-07-21 00:05:05 -04:00
John Koleszar
8f01c2d784 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-21 00:05:05 -04:00
Yaowu Xu
1c24eb2b7b fixed a number of problems caused by auto merges
The auto merge process pull and merge commits from public git or master
branch. These automerges while worked well most time, but has created
a few problems. This commit fixed several issues existed long before
the latest 8x8 transform commit.

Change-Id: I895ca99713231b1aec521d57db5d9839f74aacfa
2011-07-20 12:45:35 -07:00
Deb Mukherjee
08f6471890 Add 8x8 transform to experimental branch
Please refer to previous commit messages for detailed info:
https://on2-git.corp.google.com/g/#change,5940
https://on2-git.corp.google.com/g/#change,6045

Change-Id: I8b16992f2f69c5a808ad40a3e32ef589cce7c59d
2011-07-20 09:49:22 -07:00
John Koleszar
6907117175 Merge remote branch 'origin/master' into experimental
Change-Id: I956822324c046c254806dd712a2d3be4dcf8564b
2011-07-20 00:05:17 -04:00
John Koleszar
8e464cc4c2 Merge remote branch 'internal/upstream' into HEAD 2011-07-20 00:05:09 -04:00
John Koleszar
bf53e74b7f Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-20 00:05:08 -04:00
John Koleszar
2614b77fcb Merge remote branch 'origin/master' into experimental
Change-Id: Ida9204624fe3fb99fed1b149d1f88159480fdd83
2011-07-19 00:05:11 -04:00
John Koleszar
b3b34b0bc7 Merge remote branch 'internal/upstream' into HEAD 2011-07-19 00:05:05 -04:00
John Koleszar
85278f8c1d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-17 00:05:04 -04:00
John Koleszar
8bf2cbce98 Merge remote branch 'origin/master' into experimental
Change-Id: Ic623c335cd4991c9d80f675f390e81282b18c137
2011-07-16 00:05:08 -04:00
John Koleszar
dc1c3f9024 Merge remote branch 'internal/upstream' into HEAD 2011-07-16 00:05:05 -04:00
John Koleszar
0bc919b038 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-16 00:05:04 -04:00
John Koleszar
f1fcd74e3e Merge remote branch 'origin/master' into experimental
Change-Id: Icbeb14d64ed3d9337606b591dde4e0669540a10d
2011-07-15 00:05:06 -04:00
John Koleszar
087b338d9e Merge remote branch 'internal/upstream' into HEAD 2011-07-15 00:05:04 -04:00
John Koleszar
d0079ef946 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-15 00:05:04 -04:00
John Koleszar
86edcb0cc7 Merge remote branch 'origin/master' into experimental
Change-Id: I3f64e220b78738e5261a9fda3c270d51613f4faa
2011-07-14 00:05:12 -04:00
John Koleszar
6901105e99 Merge remote branch 'internal/upstream' into HEAD 2011-07-14 00:05:04 -04:00
John Koleszar
338d0728f6 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-14 00:05:04 -04:00
John Koleszar
ffc4587a47 Merge remote branch 'origin/master' into experimental
Change-Id: I9dab62c24d71f71cdc36732ed8ed469bee67d7e1
2011-07-13 00:05:04 -04:00
John Koleszar
791ad1bb37 Merge remote branch 'internal/upstream' into HEAD 2011-07-13 00:05:03 -04:00
John Koleszar
03ee491d51 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-10 00:05:08 -04:00
John Koleszar
6058c9ce0c Merge remote branch 'origin/master' into experimental
Change-Id: Ica63d16cb39e2d65a3414f0b9f86c8a64112dfa3
2011-07-09 00:05:09 -04:00
John Koleszar
c24479e870 Merge remote branch 'internal/upstream' into HEAD 2011-07-09 00:05:04 -04:00
John Koleszar
ef7f489dc3 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-08 08:57:03 -04:00
John Koleszar
2c3c54f747 Merge remote branch 'origin/master' into experimental
Change-Id: I9cead934ebea85d81aceaaec4674efc74367f984
2011-07-08 00:05:05 -04:00
John Koleszar
573a3f35ea Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-03 00:05:05 -04:00
John Koleszar
61d9d595d5 Merge remote branch 'origin/master' into experimental
Change-Id: I009c7e3043ad1eb1ce95c69132a4727073b86757
2011-07-02 00:05:12 -04:00
John Koleszar
5380a2215e Merge remote branch 'internal/upstream' into HEAD 2011-07-02 00:05:10 -04:00
John Koleszar
9b8f82779d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-07-02 00:05:10 -04:00
John Koleszar
54c3637828 Merge remote branch 'origin/master' into experimental
Change-Id: Iaf6e9e14d0cfe5cef3895cfb68524d51139a6d23
2011-07-01 00:05:12 -04:00
John Koleszar
766fce16c4 Merge remote branch 'internal/upstream' into HEAD 2011-07-01 00:05:11 -04:00
John Koleszar
9dfd006017 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/encoder/bitstream.c

Change-Id: I44c00f98dcb99eb728ce4f5256aefb135a711a74
2011-06-30 08:46:49 -04:00
John Koleszar
6251e9e5ce Merge remote branch 'origin/master' into experimental
Change-Id: I35c9ca116aecd0d03e762942d9cf1289edb4f23d
2011-06-30 00:05:10 -04:00
John Koleszar
fe5765a5f3 Merge remote branch 'origin/master' into experimental
Change-Id: I68e604e4a731f6703fdec7eff2c2c9b9e36879ea
2011-06-29 00:05:10 -04:00
John Koleszar
f86e14d8dc Merge remote branch 'internal/upstream' into HEAD 2011-06-28 00:05:04 -04:00
John Koleszar
d83b68c622 Merge remote branch 'origin/master' into experimental
Change-Id: Ia944723797d67abef24312cf928cf6fd64cd9766
2011-06-28 00:05:04 -04:00
John Koleszar
d7c6c9472f Merge remote branch 'internal/upstream-experimental' into HEAD 2011-06-28 00:05:04 -04:00
John Koleszar
7985e023eb Merge "fix build issues for experimental branch" into experimental 2011-06-27 11:55:15 -07:00
John Koleszar
1ec4e27095 Merge remote branch 'origin/master' into experimental
Change-Id: I689f4624a53184a72258df575305eb1aa97e61ca
2011-06-27 09:39:56 -04:00
John Koleszar
3ce5adb154 Merge remote branch 'internal/upstream' into HEAD 2011-06-25 00:05:03 -04:00
Yaowu Xu
7793b386a7 fix build issues for experimental branch
experimental branch build was broken from some merge artifacts, this
commit fixes those issues to enable the experimental branch to build.

Change-Id: Ic52b2d2f1d1b80abb7ecaa4c0927bcf887ac0c2a
2011-06-23 09:19:44 -07:00
John Koleszar
7467f6d04a Merge remote branch 'internal/upstream' into HEAD 2011-06-23 11:55:51 -04:00
John Koleszar
8a7ca2b635 Merge remote branch 'internal/upstream' into HEAD 2011-06-23 00:05:04 -04:00
John Koleszar
4ec081a7de Merge remote branch 'internal/upstream-experimental' into HEAD 2011-06-23 00:05:04 -04:00
Johann
786246ebf1 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/rdopt.c
Use new constant (110) from 10ed60dc7

Change-Id: Ic7d8a45ccc8deeeb94a0ab1c58d5d052ef3c27e4
2011-06-22 07:45:17 -04:00
John Koleszar
ae74199ecf Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/rdopt.c

Change-Id: I6ff3d92aa400bef10f6cc87f9da7ebaf6db8cc88
2011-06-20 09:07:43 -04:00
John Koleszar
deb2e9cf62 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/rdopt.c

Change-Id: I183fd3ce9e94617ec888c9f891055b9f1f8ca6c5
2011-06-17 15:36:43 -04:00
John Koleszar
cefb915ab6 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-06-17 15:34:39 -04:00
Johann
e18d7bc230 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/rdopt.c

Change-Id: I8bab720889ac652361abdedfe2cc91a89742cb30
2011-06-17 14:56:27 -04:00
John Koleszar
6c8205d37e Merge remote branch 'origin/master' into experimental
Change-Id: I67cc3b490266f958a1b3a935ec08ee19d7b4f6a0
2011-06-07 00:05:07 -04:00
John Koleszar
d13cfba344 Merge remote branch 'internal/upstream' into HEAD 2011-06-07 00:05:04 -04:00
John Koleszar
84f5b14b0e Merge remote branch 'internal/upstream' into HEAD 2011-06-06 15:51:23 -04:00
John Koleszar
be15a09980 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c

Change-Id: Ibb5a3894ede08ed401ec6e974a8902d7393c9978
2011-06-06 15:50:48 -04:00
John Koleszar
2c308f36fc Merge remote branch 'origin/master' into experimental
Change-Id: I81ac427cbaf3d0865df4acef3e0bfc2e95556c4b
2011-06-04 00:05:13 -04:00
John Koleszar
480f025754 Merge remote branch 'origin/master' into experimental
Change-Id: I7395011ef6c1783110ebd06305ca3d908d2457bb
2011-06-03 00:05:21 -04:00
John Koleszar
90e84704ae Merge remote branch 'internal/upstream' into HEAD 2011-06-03 00:05:17 -04:00
John Koleszar
e96c1e8dfb Merge remote branch 'internal/upstream-experimental' into HEAD 2011-06-03 00:05:17 -04:00
John Koleszar
32817d6fbe Merge remote branch 'origin/master' into experimental
Change-Id: I993dbef81ca3d1638e16c4134aa8dc177e57875c
2011-06-02 00:05:13 -04:00
John Koleszar
319404f4f1 Merge remote branch 'internal/upstream' into HEAD 2011-06-02 00:05:07 -04:00
John Koleszar
3137d6f9c8 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-06-02 00:05:07 -04:00
John Koleszar
2289ba4b9c Merge remote branch 'origin/master' into experimental
Change-Id: I1e7ce466bc01e380eb392b964ba677f0bb8cd13b
2011-06-01 00:05:13 -04:00
John Koleszar
f07dec70cd Merge remote branch 'internal/upstream' into HEAD 2011-06-01 00:05:11 -04:00
John Koleszar
b4159af439 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-29 00:05:10 -04:00
John Koleszar
d63ce5db34 Merge remote branch 'origin/master' into experimental
Change-Id: Ie2a4927754a9c220b30a84fc7e1372e565fe9eec
2011-05-28 00:05:12 -04:00
John Koleszar
4070c93bfa Merge remote branch 'internal/upstream' into HEAD 2011-05-28 00:05:09 -04:00
John Koleszar
255c63b864 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-28 00:05:08 -04:00
John Koleszar
2fa7fe66c4 Merge remote branch 'origin/master' into experimental
Change-Id: I6d6692418eecf54e23e00a08394b0b37d6e7682b
2011-05-27 00:05:12 -04:00
John Koleszar
fb50cad10f Merge remote branch 'internal/upstream' into HEAD 2011-05-27 00:05:09 -04:00
John Koleszar
d1910cc484 Merge remote branch 'internal/upstream' into HEAD 2011-05-26 11:45:14 -04:00
John Koleszar
9b2565cd84 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-26 11:45:14 -04:00
John Koleszar
4c7fdd1800 Merge remote branch 'internal/upstream' into HEAD 2011-05-26 11:44:58 -04:00
John Koleszar
9dccdc1f08 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/ethreading.c

Change-Id: I4becf6f101756923de6b98ca6a2132c3605c6ea5
2011-05-26 11:44:36 -04:00
John Koleszar
26fd970b15 Merge remote branch 'origin/master' into experimental
Change-Id: Ica721b36ffaa6c4c02e1cf82850496c7063ce577
2011-05-26 00:05:13 -04:00
John Koleszar
117fcb207e Merge remote branch 'origin/master' into experimental
Change-Id: I9e5c28f898d92091e39f62193f6329b593968819
2011-05-25 00:05:14 -04:00
John Koleszar
b9f98a52c8 Merge remote branch 'origin/master' into experimental
Change-Id: I56a5665a5d4e2ed590d75a5ad49e8feb54393f6e
2011-05-24 00:05:10 -04:00
John Koleszar
f7044d4058 Merge remote branch 'internal/upstream' into HEAD 2011-05-24 00:05:09 -04:00
John Koleszar
f7a8e66fad Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-22 00:05:35 -04:00
John Koleszar
4d240d1eae Merge remote branch 'origin/master' into experimental
Change-Id: I90a1d0095712e0474b0c03773b57376911027fc6
2011-05-21 00:05:14 -04:00
John Koleszar
e4be958e08 Merge remote branch 'internal/upstream' into HEAD 2011-05-21 00:05:14 -04:00
John Koleszar
c949076369 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-21 00:05:13 -04:00
John Koleszar
54bc4fde77 Merge remote branch 'origin/master' into experimental
Conflicts:
	configure

Change-Id: I91b9059e5b724a96368c7765c147fdf5a5ce03f2
2011-05-20 08:33:51 -04:00
John Koleszar
27331e1377 Merge remote branch 'internal/upstream' into HEAD 2011-05-20 00:05:16 -04:00
John Koleszar
e05fd0fc36 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-20 00:05:15 -04:00
John Koleszar
a741e0e3cb Merge remote branch 'origin/master' into experimental
Change-Id: I2f9fd68d7fd52e0aebc57e561c77ebe99e9c33e4
2011-05-19 00:05:12 -04:00
John Koleszar
23d525a503 Merge remote branch 'internal/upstream' into HEAD 2011-05-19 00:05:12 -04:00
John Koleszar
790801a6d5 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-17 00:05:11 -04:00
John Koleszar
11b9b14691 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/rdopt.c

Change-Id: I85275aab07625bd30bbef16a752b08b18f4451ab
2011-05-16 09:11:37 -04:00
John Koleszar
a5074a8b8b Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/rdopt.c

Change-Id: I3c66714e704b22569aff701cc5b9b2a5b70989f3
2011-05-16 09:09:36 -04:00
John Koleszar
d75c175def Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-16 09:08:56 -04:00
John Koleszar
72913435cb Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/common/blockd.h
	vp8/decoder/decodemv.c

Change-Id: Ib97c226d5b33b1ac1675d9c96eac1986af4dd579
2011-05-13 10:16:37 -04:00
John Koleszar
71a0eaf33c Merge remote branch 'origin/master' into experimental
Change-Id: Idf2dead51d2936984eb9827dd6d2cb704817f4c8
2011-05-13 00:05:14 -04:00
John Koleszar
25f10257f2 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-12 00:05:11 -04:00
John Koleszar
5c849a64d9 Merge remote branch 'origin/master' into experimental
Change-Id: I3149502b80e7c30decc125a2ddc5ad12b12b3667
2011-05-11 00:05:10 -04:00
John Koleszar
65b1648f35 Merge remote branch 'internal/upstream' into HEAD 2011-05-11 00:05:07 -04:00
John Koleszar
6edd07d656 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-11 00:05:07 -04:00
John Koleszar
b08c6fa699 Merge remote branch 'origin/master' into experimental
Change-Id: I24a548e3ce7794409b6731829f83befc0d465800
2011-05-10 00:05:10 -04:00
John Koleszar
7f7c13838c Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-08 00:05:10 -04:00
John Koleszar
cadb2d6651 Merge remote branch 'origin/master' into experimental
Change-Id: I22f61430b52348b32078253d5ef38e68e7f91939
2011-05-07 00:05:11 -04:00
John Koleszar
017e85cf58 Merge remote branch 'internal/upstream' into HEAD 2011-05-07 00:05:11 -04:00
John Koleszar
3a0f8e0783 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-07 00:05:11 -04:00
John Koleszar
e965d8f6f3 Merge remote branch 'origin/master' into experimental
Change-Id: Ib6c8596030140ed2b5e1dea76de024d27ad8ed86
2011-05-06 00:05:11 -04:00
John Koleszar
39e36f8604 Merge remote branch 'internal/upstream' into HEAD 2011-05-06 00:05:10 -04:00
John Koleszar
56f8277d54 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-05 00:05:06 -04:00
John Koleszar
7f1c9c6a13 Merge remote branch 'origin/master' into experimental
Change-Id: I6db2326eb0eca9d8d5941dab1bd8577c7a545825
2011-05-04 00:05:09 -04:00
John Koleszar
848c18e9be Merge remote branch 'internal/upstream' into HEAD 2011-05-04 00:05:08 -04:00
John Koleszar
cd4f02baa8 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-04 00:05:07 -04:00
John Koleszar
b336dc6bff Merge remote branch 'origin/master' into experimental
Change-Id: Ibcddf16cdbfde86d2e3fc0adb7b727072a3d12e9
2011-05-03 00:05:09 -04:00
John Koleszar
e2990fcc48 Merge remote branch 'internal/upstream' into HEAD 2011-05-03 00:05:05 -04:00
John Koleszar
1d14478b5a Merge remote branch 'internal/upstream-experimental' into HEAD 2011-05-01 00:05:05 -04:00
John Koleszar
518c551903 Merge remote branch 'origin/master' into experimental
Change-Id: I9c995f1fdb46c098b0c519bf333318dff651cb40
2011-04-30 00:05:06 -04:00
John Koleszar
8398449cbf Merge remote branch 'internal/upstream' into HEAD 2011-04-30 00:05:05 -04:00
John Koleszar
dba6c71004 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-30 00:05:04 -04:00
John Koleszar
89c3269636 Merge remote branch 'origin/master' into experimental
Change-Id: I993021d0b2d7fbe44d6371464f2686eed3ccfaae
2011-04-29 00:05:07 -04:00
John Koleszar
57afffbcbb Merge remote branch 'internal/upstream' into HEAD 2011-04-29 00:05:07 -04:00
John Koleszar
3dfafccac8 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-29 00:05:06 -04:00
John Koleszar
c26bb0fe8f Merge remote branch 'origin/master' into experimental
Change-Id: I7d91efbc3662c86d6efa2d7495eb4689ccdb0ced
2011-04-28 00:05:07 -04:00
John Koleszar
e1b90ce862 Merge remote branch 'internal/upstream' into HEAD 2011-04-28 00:05:07 -04:00
John Koleszar
9d325df746 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-28 00:05:06 -04:00
John Koleszar
b93faff5a0 Merge remote branch 'origin/master' into experimental
Change-Id: I76db6b5bd9f3817d5a3e32cad5891154ff9c9b18
2011-04-27 00:05:07 -04:00
John Koleszar
5944829d6d Merge remote branch 'internal/upstream' into HEAD 2011-04-27 00:05:07 -04:00
John Koleszar
d7d9236e30 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-27 00:05:07 -04:00
John Koleszar
0a77e59847 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/common/alloccommon.c
	vp8/encoder/rdopt.c

Change-Id: I142167d31d1b9cffe143774f6915bca463df67f0
2011-04-26 08:28:51 -04:00
John Koleszar
bbc24a65c4 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/common/alloccommon.c
	vp8/encoder/rdopt.c

Change-Id: Ic34b33577423031e277235ffa6bcaff7b252e5cb
2011-04-26 08:27:39 -04:00
John Koleszar
308e31a3ef Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/decoder/onyxd_int.h

Change-Id: Icf445b589c2bc61d93d8c977379bbd84387d0488
2011-04-25 09:13:41 -04:00
John Koleszar
5227798c57 Merge remote branch 'origin/master' into experimental
Change-Id: Iaaa51ec66768fe7cf4de0035602165efcc5fc5e4
2011-04-23 00:05:08 -04:00
John Koleszar
5dfd6f51cb Merge remote branch 'origin/master' into experimental
Change-Id: I6f77e7c10a54c54b26126b8acd5edd0a03358a41
2011-04-22 00:05:08 -04:00
John Koleszar
b59bd22cc0 Merge remote branch 'origin/master' into experimental
Change-Id: I78a30fb4438ddd0730262691d7c120d67cbcaaa9
2011-04-21 00:05:08 -04:00
John Koleszar
65b44c2911 Merge remote branch 'origin/master' into experimental
Change-Id: I9e9ece0424b2f4b6861e9c7c0986f6eccc9159d6
2011-04-20 00:05:12 -04:00
John Koleszar
a5d3febc13 Merge remote branch 'origin/master' into experimental
Change-Id: I920c3ed6af244ef9032b744675d9f664e5878d0e
2011-04-19 00:05:09 -04:00
John Koleszar
1cf1ea9470 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-17 00:05:06 -04:00
John Koleszar
0ba3fffc3a Merge remote branch 'origin/master' into experimental
Change-Id: I6ee7c49138576326887b32316cffe8d3e48aa044
2011-04-16 00:05:08 -04:00
John Koleszar
9d75a502c4 Merge remote branch 'internal/upstream' into HEAD 2011-04-16 00:05:07 -04:00
John Koleszar
e8608c6c10 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-16 00:05:06 -04:00
John Koleszar
b4bb910b57 Merge remote branch 'origin/master' into experimental
Change-Id: Iacd40d38693f433cd25b071fc8420f563b242696
2011-04-15 00:05:09 -04:00
John Koleszar
b709794929 Merge remote branch 'internal/upstream' into HEAD 2011-04-15 00:05:08 -04:00
John Koleszar
b59958f5f4 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-14 00:05:06 -04:00
John Koleszar
cb3e0aaba3 Merge remote branch 'origin/master' into experimental
Change-Id: I231e4dd65adcf4f5c158e3749880a18b8c36cbe4
2011-04-13 00:05:09 -04:00
John Koleszar
8b20b578bf Merge remote branch 'internal/upstream' into HEAD 2011-04-13 00:05:07 -04:00
John Koleszar
e7a42e675a Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-13 00:05:07 -04:00
John Koleszar
7ff5084f33 Merge remote branch 'origin/master' into experimental
Change-Id: Ib42656b05f2b099f17fd6c2033bbc3445421150c
2011-04-12 00:05:09 -04:00
John Koleszar
f809f4f93c Merge remote branch 'internal/upstream' into HEAD 2011-04-12 00:05:08 -04:00
John Koleszar
e8901972de Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-12 00:05:08 -04:00
Ralph Giles
c9f8aefe26 Remove duplicate ';;' from the configure script.
This gave a syntax error, preventing configure from completing.

Change-Id: I3df765f93c26e5bb3b2aab939d1cd01d6c57d450
2011-04-10 09:30:36 -07:00
John Koleszar
91e3339b7d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-10 00:05:06 -04:00
John Koleszar
e33241bb13 Merge remote branch 'origin/master' into experimental
Change-Id: I1a58ce4643377bae4cc6bf9c89320251f724ca66
2011-04-09 00:05:08 -04:00
John Koleszar
f6360955f4 Merge remote branch 'internal/upstream' into HEAD 2011-04-09 00:05:08 -04:00
John Koleszar
ffdfbe2bba Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-09 00:05:08 -04:00
John Koleszar
be3dee8903 Merge remote branch 'origin/master' into experimental
Change-Id: Ib70851b1d801d719edb8f5cd48d2f8fb210d3867
2011-04-08 00:05:08 -04:00
John Koleszar
fd599efb25 Merge remote branch 'internal/upstream' into HEAD 2011-04-08 00:05:07 -04:00
John Koleszar
13d2b1a750 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-08 00:05:07 -04:00
John Koleszar
6e4f6c96b3 Merge remote branch 'origin/master' into experimental
Change-Id: Icee86a4b25e53dc04b508179101b1a782b688f61
2011-04-07 00:05:11 -04:00
John Koleszar
1805223162 Merge remote branch 'internal/upstream' into HEAD 2011-04-07 00:05:06 -04:00
John Koleszar
a4a554e0ca Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-07 00:05:06 -04:00
John Koleszar
d64aa018be Merge remote branch 'origin/master' into experimental
Change-Id: Ied0fedb05342dead6d34740209cf75997f155e72
2011-04-06 00:05:10 -04:00
John Koleszar
77058ad62b Merge remote branch 'internal/upstream' into HEAD 2011-04-06 00:05:09 -04:00
John Koleszar
3328ab382c Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-06 00:05:08 -04:00
John Koleszar
a6be45c9ca Merge remote branch 'origin/master' into experimental
Change-Id: I53be500dad1a98e21d0a28f9e07761d8d03fdcf6
2011-04-05 00:05:10 -04:00
John Koleszar
89bdcc211e Merge remote branch 'internal/upstream' into HEAD 2011-04-05 00:05:07 -04:00
John Koleszar
50643fcfd1 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-03 00:05:08 -04:00
John Koleszar
b3b2657f21 Merge remote branch 'internal/upstream' into HEAD 2011-04-02 00:05:11 -04:00
John Koleszar
0e2f2f92aa Merge remote branch 'internal/upstream-experimental' into HEAD 2011-04-02 00:05:11 -04:00
John Koleszar
2588b8fe05 Merge remote branch 'origin/master' into experimental
Change-Id: I1cd5ad3df61463ca7d946857a548d7611d65c593
2011-04-02 00:05:10 -04:00
John Koleszar
305c9b57b2 Merge remote branch 'internal/upstream' into HEAD 2011-04-01 00:05:12 -04:00
John Koleszar
88ed17298f Merge remote branch 'origin/master' into experimental
Change-Id: Ie59ab2f2e93464df0f484bd73d2394d05640536d
2011-04-01 00:05:12 -04:00
John Koleszar
eb615e53e1 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-31 00:05:05 -04:00
John Koleszar
23afb5810e Merge remote branch 'origin/master' into experimental
Change-Id: Ie86a006320f3cea6a068a6b235267e19c3a19c4e
2011-03-30 00:05:07 -04:00
John Koleszar
9a82cc7455 Merge remote branch 'internal/upstream' into HEAD 2011-03-30 00:05:06 -04:00
John Koleszar
e84545efa9 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-30 00:05:06 -04:00
John Koleszar
b9f2356182 Merge remote branch 'origin/master' into experimental
Change-Id: Iae24496ca5ceb4446211c1e27351434c16b09dd1
2011-03-29 00:05:07 -04:00
John Koleszar
057ace0d92 Merge remote branch 'internal/upstream' into HEAD 2011-03-29 00:05:04 -04:00
John Koleszar
d66da5bcd7 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-26 00:05:04 -04:00
John Koleszar
b8a78cfa49 Merge remote branch 'origin/master' into experimental
Change-Id: Ibffdedc3bd2e1ec349e79ba038b065c98db77d06
2011-03-25 00:05:04 -04:00
John Koleszar
cdada23377 Merge remote branch 'internal/upstream' into HEAD 2011-03-25 00:05:04 -04:00
John Koleszar
6deaad296a Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-25 00:05:04 -04:00
John Koleszar
3f4291e6e0 Merge remote branch 'origin/master' into experimental
Change-Id: I2e36f806ae5551c5015243de697aac3e9e29334d
2011-03-24 00:05:06 -04:00
John Koleszar
1f1526f8b8 Merge remote branch 'internal/upstream' into HEAD 2011-03-24 00:05:05 -04:00
John Koleszar
bf12748be3 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-24 00:05:05 -04:00
John Koleszar
51bcf621c1 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/decoder/decodemv.c
	vp8/decoder/onyxd_if.c
	vp8/encoder/ratectrl.c
	vp8/encoder/rdopt.c

Change-Id: Ia1c1c5e589f4200822d12378c7749ba62bd17ae2
2011-03-23 00:27:52 -04:00
John Koleszar
5f6db3591c Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/ratectrl.c
	vp8/encoder/rdopt.c

Change-Id: I4cc58acb432662d2c47aceda1680e52982adbc06
2011-03-23 00:24:25 -04:00
John Koleszar
9f00822968 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-19 00:05:05 -04:00
John Koleszar
4a1c3cf7d8 Merge remote branch 'origin/master' into experimental
Change-Id: If77de7e96a971edd8666ea0b1bd5eac6b09c6912
2011-03-18 00:05:07 -04:00
John Koleszar
cba980e3eb Merge remote branch 'internal/upstream' into HEAD 2011-03-18 00:05:06 -04:00
John Koleszar
df3296c8a1 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-18 00:05:06 -04:00
John Koleszar
53d11fa6ad Merge remote branch 'origin/master' into experimental
Change-Id: I3f6c1e297fc0d33dc239bb4dd41d5afbcd91de19
2011-03-17 00:05:08 -04:00
John Koleszar
42f9104d5c Merge remote branch 'internal/upstream' into HEAD 2011-03-17 00:05:07 -04:00
John Koleszar
ff7783a670 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-17 00:05:07 -04:00
John Koleszar
386ceca8d2 Merge remote branch 'origin/master' into experimental
Change-Id: If09b27454f82265fd5e3b25c85c1eea70c6c637f
2011-03-16 00:05:07 -04:00
John Koleszar
dc3451b086 Merge remote branch 'internal/upstream' into HEAD 2011-03-16 00:05:06 -04:00
John Koleszar
efa631f14d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-16 00:05:06 -04:00
John Koleszar
54c59a03f3 Merge remote branch 'origin/master' into experimental
Change-Id: Ice13978071e98a88cf8ae5c069c6423d74425dea
2011-03-15 00:05:07 -04:00
John Koleszar
b210797a6a Merge remote branch 'internal/upstream' into HEAD 2011-03-15 00:05:07 -04:00
John Koleszar
23c4cbdfba Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-15 00:05:06 -04:00
John Koleszar
ba83622a00 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/encoder/onyx_if.c

Change-Id: Ieef9a58a2effdc68cf52bc5f14d90c31a1dbc13a
2011-03-14 08:53:02 -04:00
John Koleszar
6017811382 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-14 08:50:06 -04:00
John Koleszar
eeb8c8004e Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/onyx_if.c

Change-Id: I230b63cef209cd1ac98357729a91ec07597756bd
2011-03-14 08:48:44 -04:00
John Koleszar
314631ca61 Merge remote branch 'origin/master' into experimental
Change-Id: Ibc4a75dbbc8b35ce298477e055e5a88df080d4b3
2011-03-11 00:05:09 -05:00
John Koleszar
31ce8f419c Merge remote branch 'internal/upstream' into HEAD 2011-03-11 00:05:07 -05:00
John Koleszar
34a04b08db Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-11 00:05:07 -05:00
John Koleszar
dc29ed27bd Merge remote branch 'origin/master' into experimental
Change-Id: Icb795cef47a205f33f180f3852d88c36113b673e
2011-03-10 00:05:06 -05:00
John Koleszar
820b2b927f Merge remote branch 'internal/upstream' into HEAD 2011-03-10 00:05:04 -05:00
John Koleszar
0c8bb2f168 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-10 00:05:04 -05:00
John Koleszar
016fb2b554 Merge remote branch 'origin/master' into experimental
Change-Id: Ie52ff118b00ce462bb110ae349108e55d3d8ff3b
2011-03-09 00:05:07 -05:00
John Koleszar
96208f2e45 Merge remote branch 'internal/upstream' into HEAD 2011-03-09 00:05:06 -05:00
John Koleszar
b7ec812e2d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-09 00:05:05 -05:00
John Koleszar
ecea7c2d1d Merge remote branch 'origin/master' into experimental
Change-Id: I1f3b99569a3578a7ad71767bf74b6961cf0e8555
2011-03-08 00:05:06 -05:00
John Koleszar
5e9e17dff7 Merge remote branch 'internal/upstream' into HEAD 2011-03-08 00:05:05 -05:00
John Koleszar
13a8a070ae Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-06 00:05:06 -05:00
John Koleszar
01eb7c2874 Merge remote branch 'origin/master' into experimental
Change-Id: I70ac5a4f8388a7bfa058178c0ae53f6bdb0bb6e5
2011-03-05 00:05:07 -05:00
John Koleszar
89d66cbb20 Merge remote branch 'internal/upstream' into HEAD 2011-03-05 00:05:05 -05:00
John Koleszar
153805ffab Merge remote branch 'internal/upstream-experimental' into HEAD 2011-03-04 00:05:04 -05:00
John Koleszar
2c5638334e Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/vp8_cx_iface.c

Change-Id: Ib30d0cfbdaeb605ee4b846f683d204cd07e0c028
2011-03-03 09:01:10 -05:00
John Koleszar
ca29f6a7c4 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/vp8_cx_iface.c

Change-Id: Iecfd4532ab1c722d10ecce8a5ec473e96093cf3b
2011-03-03 08:59:34 -05:00
John Koleszar
738a791917 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/common/blockd.h

Change-Id: Ica2bd1c3da614eab5ce23acfb597e777d16b3983
2011-03-03 08:58:57 -05:00
John Koleszar
1a7ce50a6c Merge remote branch 'origin/master' into experimental
Change-Id: I52f21ff6f9a1dca7099a8459657f6f288c5bfe40
2011-02-25 00:05:08 -05:00
John Koleszar
f8d4a81af2 Merge remote branch 'origin/master' into experimental
Change-Id: I6db3ac0d75a7d5077f14c759591b9e514279a548
2011-02-24 00:05:11 -05:00
John Koleszar
c23096e4a5 Merge remote branch 'internal/upstream' into HEAD 2011-02-24 00:05:08 -05:00
John Koleszar
4832de492c Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-20 00:05:06 -05:00
John Koleszar
b21fe3b278 Merge remote branch 'internal/upstream' into HEAD 2011-02-19 00:05:44 -05:00
John Koleszar
0c5a048fa6 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-19 00:05:44 -05:00
John Koleszar
bbfca323fb Merge remote branch 'origin/master' into experimental
Change-Id: Ia3197f432b424213a34b20071e5171a413ba1aaf
2011-02-19 00:05:11 -05:00
John Koleszar
f13212b728 Merge remote branch 'internal/upstream' into HEAD 2011-02-18 00:05:13 -05:00
John Koleszar
95a86dd007 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-18 00:05:13 -05:00
John Koleszar
4fafc4d985 Merge remote branch 'origin/master' into experimental
Change-Id: I8999a33db82d38eb85482f3c423db238d6ee3ed9
2011-02-18 00:05:11 -05:00
John Koleszar
c88dbb2dce Merge remote branch 'internal/upstream' into HEAD 2011-02-17 00:05:14 -05:00
John Koleszar
eb6d3a1ead Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-17 00:05:14 -05:00
John Koleszar
1293116895 Merge remote branch 'origin/master' into experimental
Change-Id: I3efb725e4da4e7c75b2512b80db6af51dec51f79
2011-02-17 00:05:13 -05:00
John Koleszar
e786bd3a01 Merge remote branch 'internal/upstream' into HEAD 2011-02-16 00:05:13 -05:00
John Koleszar
46fa176b8d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-16 00:05:13 -05:00
John Koleszar
9e95a1a0cd Merge remote branch 'origin/master' into experimental
Change-Id: If846b0e4ec862b54b98d08608f4b5f9a7b7f94ef
2011-02-16 00:05:10 -05:00
John Koleszar
c6ea558c05 Merge remote branch 'internal/upstream' into HEAD 2011-02-15 00:05:39 -05:00
John Koleszar
cf8aa08348 Merge remote branch 'origin/master' into experimental
Change-Id: I4b1a7a2ad0d62bdcabfed66c9dfdbe9b6bfa8b5e
2011-02-15 00:05:29 -05:00
John Koleszar
e15004f32e Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-13 00:05:14 -05:00
John Koleszar
1f8e42e7b8 Merge remote branch 'internal/upstream' into HEAD 2011-02-12 00:05:14 -05:00
John Koleszar
a99e5dccaa Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-12 00:05:14 -05:00
John Koleszar
70dc0ed003 Merge remote branch 'origin/master' into experimental
Change-Id: I1cd33708d12bd51dfd1e78db4a7500653abc53c9
2011-02-12 00:05:11 -05:00
John Koleszar
64aebb6c7a Merge remote branch 'internal/upstream' into HEAD 2011-02-11 00:05:19 -05:00
John Koleszar
b25ebeabeb Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-11 00:05:18 -05:00
John Koleszar
809dae2458 Merge remote branch 'origin/master' into experimental
Change-Id: Icf1a7c61a3b07da2ccfd94bca9e8810c01e46b2c
2011-02-11 00:05:14 -05:00
John Koleszar
ec3b8f1f32 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/decoder/onyxd_int.h

Change-Id: Id9aa577f03e37b4f406ba3b593c3c4330812a49e
2011-02-10 14:26:40 -05:00
John Koleszar
dc0aca14b5 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-10 00:05:13 -05:00
John Koleszar
96ddc5c26e Merge remote branch 'origin/master' into experimental
Change-Id: Ie85d40c44bb23d56a519010356b2856c02fb4c05
2011-02-10 00:05:10 -05:00
John Koleszar
b2ad177942 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/vp8_common.mk

Change-Id: I2094ddf20834c0b7dfe912feac6a79500bb8cce2
2011-02-09 08:34:48 -05:00
John Koleszar
a4975c629d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-09 00:05:15 -05:00
John Koleszar
6e6b46d972 Merge remote branch 'origin/master' into experimental
Change-Id: Ibc762883a5e117f5db64dc01a46a9c78438e6c33
2011-02-09 00:05:12 -05:00
John Koleszar
9683198e7b Merge remote branch 'origin/master' into experimental
Change-Id: I7897261eb2956f778f9f9885ce2005b1e134b28f
2011-02-08 00:05:11 -05:00
John Koleszar
c540bbc367 Merge remote branch 'internal/upstream' into HEAD 2011-02-07 14:16:24 -05:00
John Koleszar
2bb322380d Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	vp8/encoder/encodeframe.c
	vp8/encoder/ethreading.c
	vp8/encoder/onyx_int.h

Change-Id: I1c562d2fe6e42c0d1d86f68c77c0e899066e02bd
2011-02-07 14:16:09 -05:00
John Koleszar
318a14c637 Merge remote branch 'origin/master' into experimental
Change-Id: Ib487cbd7b214a6e3f13180bc0e5dcb792d8a406e
2011-02-05 00:05:11 -05:00
John Koleszar
16bbf27fa9 Merge remote branch 'origin/master' into experimental
Change-Id: I242ca4854cb21f3d63efb979bd6ecc9f06f67f33
2011-02-04 00:05:13 -05:00
John Koleszar
9e36d44232 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-03 00:05:11 -05:00
John Koleszar
2d9a394503 Merge remote branch 'internal/upstream' into HEAD 2011-02-02 00:05:14 -05:00
John Koleszar
779d3c54df Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-02 00:05:14 -05:00
John Koleszar
9aeb6ac4ea Merge remote branch 'origin/master' into experimental
Change-Id: I585615400697b77c50dd05480616f868f2637aa7
2011-02-02 00:05:11 -05:00
John Koleszar
a2bca1a52d Merge remote branch 'internal/upstream' into HEAD 2011-02-01 00:05:13 -05:00
John Koleszar
d5a43ea16c Merge remote branch 'internal/upstream-experimental' into HEAD 2011-02-01 00:05:13 -05:00
John Koleszar
76878a0354 Merge remote branch 'origin/master' into experimental
Change-Id: Id1d4bbe257cd126bb5f44347b896ddb659724f0b
2011-02-01 00:05:10 -05:00
John Koleszar
de4b3352b8 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	configure

Change-Id: I74063d859de31a62285c8908bcb1821e050b9f3c
2011-01-31 09:11:52 -05:00
John Koleszar
933dfe0a94 Merge remote branch 'origin/master' into experimental
Conflicts:
	configure

Change-Id: I18c2292256d2387ff09da209aa9cf6891e1864a0
2011-01-31 09:10:35 -05:00
John Koleszar
7488245b8b Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-31 00:05:11 -05:00
John Koleszar
f1db3e8358 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/encoder/rdopt.c

Change-Id: I68d04397a12f565b9f1bd35d4e50f1cc9afb76ff
2011-01-28 08:37:44 -05:00
John Koleszar
fa09d278f4 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-28 08:37:23 -05:00
John Koleszar
a4c887da63 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/encoder/rdopt.c

Change-Id: Ic17907df70fff45c9e766b5d0cbab0c5f1a1095f
2011-01-28 08:33:52 -05:00
John Koleszar
794ff6843f Merge remote branch 'internal/upstream' into HEAD 2011-01-26 00:05:16 -05:00
John Koleszar
b80fc07568 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-26 00:05:15 -05:00
John Koleszar
6c61e28e7a Merge remote branch 'origin/master' into experimental
Change-Id: I35581d7fd525fe972e750899e35de93867595e83
2011-01-26 00:05:13 -05:00
John Koleszar
caa9da9f1d Merge remote branch 'internal/upstream' into HEAD 2011-01-25 00:05:13 -05:00
John Koleszar
e547ded617 Merge remote branch 'origin/master' into experimental
Change-Id: I3dd6219db4126c1ad526c7877ad1ce49c496155f
2011-01-25 00:05:10 -05:00
John Koleszar
93ed3e5315 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-23 00:05:24 -05:00
John Koleszar
d4797aa8fd Merge remote branch 'origin/master' into experimental
Change-Id: I2c3326f7e4d9e901f098e499973586e973e1b8fb
2011-01-22 00:05:13 -05:00
John Koleszar
727476adfe Merge remote branch 'internal/upstream' into HEAD 2011-01-22 00:05:13 -05:00
John Koleszar
18ef62d40c Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-22 00:05:13 -05:00
John Koleszar
b6aee6ffab Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	configure

Change-Id: I0bc38a6558d0d7f62cd2c551e75c3a59e39008bd
2011-01-21 10:14:46 -05:00
John Koleszar
46d9ff1b97 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	configure

Change-Id: I2ce6b0a0507f9aa4e3fed8ea1cb69779db5f4566
2011-01-21 10:13:48 -05:00
John Koleszar
cbe07a7491 Merge remote branch 'origin/master' into experimental
Conflicts:
	configure

Change-Id: I87cdc3faac79e683038fa4a45c3ac542b8e931a5
2011-01-21 10:11:51 -05:00
John Koleszar
3ac80a74f8 Merge remote branch 'origin/master' into experimental
Change-Id: Ia0840303fe1dc8c12f3389e7a1fe20b6d3c6b9c5
2011-01-20 00:05:28 -05:00
Yaowu Xu
5b42ae09ae experiment extending the quantizer range
Prior to this change, VP8 min quantizer is 4, which caps the
highest quality around 51DB. This experimental change extends
the min quantizer to 1, removes the cap and allows the highest
quality to be around ~73DB, consistent with the fdct/idct round trip
error. To test this change, at configure time use options:

--enable-experimental --enable-extend_qrange

The following is a brief log of changes in each of the patch sets

patch set 1:
In this commit, the quantization/dequantization constants are kept
unchanged, instead scaling factor 4 is rolled into fdct/idct.
Fixed Q0 encoding tests on mobile:
  Before:    9560.567kbps Overall PSNR:50.255DB VPXSSIM:98.288
  Now:   18035.774kbps Overall PSNR:73.022DB VPXSSIM:99.991

patch set 2:
regenerated dc/ac quantizer lookup tables based on the scaling
factor rolled in the fdct/idct. Also slightly extended the range
towards the high quantizer end.

patch set 3:
slightly tweaked the quantizer tables and generated bits_per_mb
table based on Paul's suggestions.

patch set 4:
fix a typo in idct, re-calculated tables relating active max Q
to active min Q

patch set 5:
added rdmult lookup table based on Q

patch set 6:
fix rdmult scale: dct coefficient has scaled up by 4

patch set 7:
make transform coefficients to be within 16bits

patch set 8:
normalize 2nd order quantizers

patch set 9:
fix mis-spellings

patch set 10:
change the configure script and macros to allow experimental code
to be enabled at configure time with --enable-extend_qrange

patch set 11:
rebase for merge

Change-Id: Ib50641ddd44aba2a52ed890222c309faa31cc59c
2011-01-19 13:22:35 -08:00
John Koleszar
11ce364dfc Merge remote branch 'internal/upstream' into HEAD 2011-01-19 00:05:21 -05:00
John Koleszar
6c0f7e3ae7 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-19 00:05:21 -05:00
John Koleszar
ae4db164e5 Merge remote branch 'origin/master' into experimental
Change-Id: I7125984ec28a7094195b640d6659590c6eead533
2011-01-19 00:05:18 -05:00
John Koleszar
7e3d1b4fe5 Merge remote branch 'internal/upstream' into HEAD 2011-01-18 00:05:17 -05:00
John Koleszar
76eb1b0519 Merge remote branch 'origin/master' into experimental
Change-Id: I3e51945a61446e1ee70caaf97ff7cf0c740bf1da
2011-01-18 00:05:17 -05:00
John Koleszar
04fb68664d Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-16 00:05:15 -05:00
John Koleszar
d9f0e22e8d Merge remote branch 'internal/upstream' into HEAD 2011-01-15 00:05:21 -05:00
John Koleszar
6dfec43bfd Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-15 00:05:20 -05:00
John Koleszar
746cc92327 Merge remote branch 'origin/master' into experimental
Change-Id: Id03b5485239fdb2a5e2351a3393eeed847a6e641
2011-01-15 00:05:11 -05:00
John Koleszar
9a7b92ebe7 Merge remote branch 'origin/master' into experimental
Change-Id: I229048ab797a4087437c265e6bb96db5c32e7b3d
2011-01-14 00:05:08 -05:00
John Koleszar
9b9ecb38de Merge remote branch 'internal/upstream' into HEAD 2011-01-13 11:35:00 -05:00
John Koleszar
05be098748 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-13 11:35:00 -05:00
John Koleszar
757a45f3eb Merge remote branch 'origin/master' into experimental
Change-Id: I0859ddc498ff2d8f75fc4d2bc37127eb6188e231
2011-01-13 00:05:11 -05:00
John Koleszar
20d7cfd8d5 Merge remote branch 'origin/master' into experimental
Change-Id: Id5da32e6d58a58e04a4dff9ca1df23ebb6c436b8
2011-01-12 00:05:17 -05:00
John Koleszar
2dc04461f2 Merge remote branch 'internal/upstream' into HEAD 2011-01-11 00:05:35 -05:00
John Koleszar
4a3f592109 Merge remote branch 'origin/master' into experimental
Change-Id: I0ecbf2f417540d75435542182a661f5f6bb84ac0
2011-01-11 00:05:27 -05:00
John Koleszar
f3aa1515f3 Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-10 08:29:26 -05:00
John Koleszar
3cb26b4864 Merge remote branch 'origin/master' into experimental
Change-Id: Ib34bc09a295141eb65c8c0478bde6136f178909b
2011-01-08 00:05:09 -05:00
John Koleszar
b5ebc45797 Merge remote branch 'internal/upstream' into HEAD 2011-01-07 00:05:17 -05:00
John Koleszar
cd5932d2e1 Merge remote branch 'origin/master' into experimental
Change-Id: I733a72f6f46c7ea048b3d1732e5abbc697651229
2011-01-07 00:05:15 -05:00
John Koleszar
1f3e814bbf Merge remote branch 'internal/upstream-experimental' into HEAD 2011-01-06 00:05:13 -05:00
John Koleszar
9f0b9c6378 Merge remote branch 'internal/upstream' into HEAD 2011-01-05 00:05:13 -05:00
John Koleszar
55864fd530 Merge remote branch 'origin/master' into experimental
Change-Id: Ib7a1fdc49f9db6ebbd6a43ca139f842d9a260c5d
2011-01-05 00:05:08 -05:00
John Koleszar
8cfb70c3d4 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-31 00:05:25 -05:00
John Koleszar
4d98741c61 Merge remote branch 'internal/upstream' into HEAD 2010-12-30 00:05:14 -05:00
John Koleszar
4164847748 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-30 00:05:14 -05:00
John Koleszar
1e2ab6ace0 Merge remote branch 'origin/master' into experimental
Change-Id: Iedf38035a53aa772b947ae39e44e1da473d916ac
2010-12-30 00:05:09 -05:00
John Koleszar
74441baac5 Merge remote branch 'internal/upstream' into HEAD 2010-12-29 00:05:05 -05:00
John Koleszar
e5f7139951 Merge remote branch 'origin/master' into experimental
Change-Id: Ib599ea0443526714d3c43b876cbfea732faba112
2010-12-29 00:05:04 -05:00
John Koleszar
3454bf2910 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-28 00:05:08 -05:00
John Koleszar
760d3475eb Merge remote branch 'internal/upstream' into HEAD 2010-12-27 00:05:09 -05:00
John Koleszar
2a68727af9 Merge remote branch 'origin/master' into experimental
Change-Id: I238df40ea8e0f34b85a38525605f7c91905f650a
2010-12-27 00:05:06 -05:00
John Koleszar
156e7b3262 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-25 00:05:07 -05:00
John Koleszar
93536be4b9 Merge remote branch 'internal/upstream' into HEAD 2010-12-24 00:05:10 -05:00
John Koleszar
891df506f2 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-24 00:05:10 -05:00
John Koleszar
7c8ae69ad8 Merge remote branch 'origin/master' into experimental
Change-Id: I05d5b211674cb4560d3a54dcdfa853f8d84599e6
2010-12-24 00:05:06 -05:00
John Koleszar
8faec020dc Merge remote branch 'internal/upstream' into HEAD 2010-12-23 00:05:25 -05:00
John Koleszar
7c3e704e6d Merge remote branch 'origin/master' into experimental
Change-Id: I5540e41567ba5dafc278ff72b5c276f4d5fb1e6b
2010-12-23 00:05:21 -05:00
John Koleszar
85f3104913 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-22 00:05:06 -05:00
John Koleszar
c99c0e1798 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/vp8_cx_iface.c

Change-Id: Id670128595d04d6a61ec811b2ad896b138acded8
2010-12-21 07:56:46 -05:00
John Koleszar
0b710c8d1a Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/vp8_cx_iface.c

Change-Id: I76f302448f11b28772efd4b5643f86a7cc69a8c2
2010-12-21 07:54:10 -05:00
John Koleszar
ea24bc8760 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-19 00:05:25 -05:00
John Koleszar
01aa85ef72 Merge remote branch 'internal/upstream' into HEAD 2010-12-18 00:05:27 -05:00
John Koleszar
668950df79 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-18 00:05:25 -05:00
John Koleszar
eee331e7f3 Merge remote branch 'origin/master' into experimental
Change-Id: Iae8b85d2f6ad4d854c43dded8588e054906f7156
2010-12-18 00:05:19 -05:00
John Koleszar
4bca01d25c Merge remote branch 'internal/upstream' into HEAD 2010-12-17 00:05:10 -05:00
John Koleszar
186f3623d4 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-17 00:05:10 -05:00
John Koleszar
1d7c6e79d9 Merge remote branch 'origin/master' into experimental
Change-Id: Ie8f1f1a949e310ec1362f352d7a220ae4155cbea
2010-12-17 00:05:07 -05:00
John Koleszar
52913b17fd Merge remote branch 'internal/upstream' into HEAD 2010-12-16 00:05:09 -05:00
John Koleszar
cf0b79947f Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-16 00:05:09 -05:00
John Koleszar
1f5d91d92e Merge remote branch 'origin/master' into experimental
Change-Id: I3ff6a301e89b6d17a66c58801b5acc649f929de8
2010-12-16 00:05:07 -05:00
John Koleszar
f7224e14c8 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/common/entropy.c

Change-Id: Ic95302e327f80afd0261ac5bd9881f38296def47
2010-12-15 08:11:07 -05:00
John Koleszar
f6dc56a1c9 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-15 08:10:29 -05:00
John Koleszar
4fa8d36f76 Merge remote branch 'origin/master' into experimental
Conflicts:
	vp8/common/entropy.c

Change-Id: I35fd49cf92a50d09082fe199d3bf21bfca68a94f
2010-12-15 08:08:18 -05:00
John Koleszar
7211ac407b Merge remote branch 'internal/upstream' into HEAD 2010-12-14 00:05:07 -05:00
John Koleszar
6a80032280 Merge remote branch 'origin/master' into experimental
Change-Id: Ic88e9b2fcf1dcb2852a7205bcda3f181103f5612
2010-12-14 00:05:05 -05:00
John Koleszar
373781a24a Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-12 00:05:07 -05:00
John Koleszar
b6905e36d9 Merge remote branch 'origin/master' into experimental
Change-Id: Ibbe41ff2356aa8583c728e9ab1b0814958a51752
2010-12-11 00:05:08 -05:00
John Koleszar
eb1c033731 Merge remote branch 'internal/upstream' into HEAD 2010-12-11 00:05:08 -05:00
John Koleszar
f420000184 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-11 00:05:08 -05:00
John Koleszar
3bf929f18e Merge remote branch 'internal/upstream' into HEAD 2010-12-10 00:05:09 -05:00
John Koleszar
f3af9c8fb7 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-10 00:05:09 -05:00
John Koleszar
0f02b37992 Merge remote branch 'origin/master' into experimental
Change-Id: Iada4d917df4af42b16404e1b54b30ba2ca74df39
2010-12-10 00:05:07 -05:00
John Koleszar
d9c50b8103 Merge remote branch 'internal/upstream' into HEAD 2010-12-09 00:05:09 -05:00
John Koleszar
724546e5f2 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-09 00:05:08 -05:00
John Koleszar
808f3814fc Merge remote branch 'origin/master' into experimental
Change-Id: I2b70793a97f80039ad23feea164744b1c236ac74
2010-12-09 00:05:07 -05:00
John Koleszar
2905656159 Merge remote branch 'internal/upstream' into HEAD 2010-12-08 00:05:09 -05:00
John Koleszar
b9bb24b7e0 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-08 00:05:09 -05:00
John Koleszar
c5795b673d Merge remote branch 'origin/master' into experimental
Change-Id: I76ed5f6c24f3f71bba47679ff09d28e046ec1db9
2010-12-08 00:05:06 -05:00
John Koleszar
f68820390b Merge remote branch 'internal/upstream' into HEAD 2010-12-07 00:05:11 -05:00
John Koleszar
727abbb38a Merge remote branch 'origin/master' into experimental
Change-Id: I1baeedb24f321d3e200f00412cc657ab92c43143
2010-12-07 00:05:08 -05:00
John Koleszar
8d1b8f2322 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-06 00:05:08 -05:00
John Koleszar
b170d20111 Merge remote branch 'internal/upstream' into HEAD 2010-12-05 00:05:10 -05:00
John Koleszar
d83585eb68 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-05 00:05:10 -05:00
John Koleszar
7e9910c69b Merge remote branch 'origin/master' into experimental
Change-Id: I2a47e43cb3ad61620bfef9e8caf578f321487f2c
2010-12-05 00:05:06 -05:00
John Koleszar
46214a2c64 Merge remote branch 'internal/upstream' into HEAD 2010-12-04 00:05:10 -05:00
John Koleszar
16724b7c93 Merge remote branch 'origin/master' into experimental
Change-Id: I11cd10dba54d0f3f96640dadc97199e5733f1888
2010-12-04 00:05:08 -05:00
John Koleszar
908a9386f4 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-03 00:05:06 -05:00
John Koleszar
ea2a5754b4 Merge remote branch 'origin/master' into experimental
Change-Id: If95cb994d898d3f29b28db0d118a1f9c973e88d9
2010-12-02 08:20:43 -05:00
John Koleszar
cfc44aae03 Merge remote branch 'internal/upstream' into HEAD 2010-12-02 00:05:06 -05:00
John Koleszar
be9a727bd6 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-12-01 00:05:07 -05:00
John Koleszar
f99e91b65b Merge remote branch 'internal/upstream' into HEAD 2010-11-30 00:05:07 -05:00
John Koleszar
1b70862916 Merge remote branch 'origin/master' into experimental 2010-11-30 00:05:05 -05:00
John Koleszar
ce73395447 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-25 00:05:05 -05:00
John Koleszar
c9baf67f6c Merge remote branch 'internal/upstream' into HEAD 2010-11-24 00:05:05 -05:00
John Koleszar
d6cfd74c08 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-24 00:05:05 -05:00
John Koleszar
394b68c8f8 Merge remote branch 'origin/master' into experimental 2010-11-24 00:05:04 -05:00
John Koleszar
849763d05f Merge remote branch 'internal/upstream' into HEAD 2010-11-23 00:05:05 -05:00
John Koleszar
8416312095 Merge remote branch 'origin/master' into experimental 2010-11-23 00:05:05 -05:00
John Koleszar
9625fd83dd Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-23 00:05:05 -05:00
John Koleszar
006247ac33 Merge remote branch 'internal/upstream' into HEAD 2010-11-21 00:05:06 -05:00
John Koleszar
b13d1c307e Merge remote branch 'origin/master' into experimental 2010-11-21 00:05:05 -05:00
John Koleszar
1a1a8ea4df Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-19 00:05:03 -05:00
Yaowu Xu
0867b81678 remove low pass filtering from two 4x4 intra prediction
In the process of developing new intra prediction modes, tests have
shown removal of the low pass filtering from B_HE_PRED and B_VE_PRED
has an overall minor positive impact in both PSNR and SSIM metric.
Overall difference is about 0.1%. The change shall also have a small
positive impact on speed. Intuitively, this change should also reduce
some of the tendency of "flattening"

Change-Id: I3c43b0daca833c6eff77d00f19c811f9ef9368a3
2010-11-18 10:42:08 -08:00
Yaowu Xu
39ceef38a7 changed MAX_PSNR to 100
Changing the MAX_PSNR to 100 to allow testing of further experiments
on extending quantizer range to near lossless. With an effective
quantizer of 1, encoder achieves ~68DB, which is consistent with
fdct/idct round trip error.

Change-Id: I7b6d0e94a8936968ef42e82e63ebb13999c36832
2010-11-18 09:12:02 -08:00
Yaowu Xu
06c70d304f extends the range of tokens
Extending the value range of tokens allows further experiments on
extending quantizer range. Encoder and decoder were verified to
produce matching reconstructed buffers by tests with forced
quantized value of 1.

Change-Id: I12faf92832867870b6f71ddeafbf643f1040086d
2010-11-18 09:07:16 -08:00
John Koleszar
a2ebd0f3e4 Merge remote branch 'origin/master' into experimental 2010-11-18 00:05:05 -05:00
John Koleszar
f3919f1879 Merge remote branch 'internal/upstream' into HEAD 2010-11-18 00:05:04 -05:00
John Koleszar
3702229d9f Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-18 00:05:04 -05:00
Suman Sunkara
15a1dca2fb Merge "FIXED bug in when CONFIG_SEGMENTATION NOT DEFINED" into experimental 2010-11-17 12:07:24 -05:00
Jim Bankoski
c35057f0f6 FIXED bug in when CONFIG_SEGMENTATION NOT DEFINED 2010-11-17 11:30:24 -05:00
John Koleszar
3a778de77a Merge remote branch 'origin/master' into experimental 2010-11-17 00:05:05 -05:00
John Koleszar
8232a3a0e4 Merge remote branch 'internal/upstream' into HEAD 2010-11-17 00:05:04 -05:00
John Koleszar
0661ab00f3 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-17 00:05:04 -05:00
Suman Sunkara
388546bc93 Merge branch 'experimental' of ssh://on2-git.corp.google.com:29418/libvpx into test
Conflicts:
	configure

Change-Id: Id874dc46b13e8b5da4179fc3b48e354ec313a2cd
2010-11-16 16:31:59 -05:00
Suman Sunkara
4b3f72001d Merge branch 'experimental' of ssh://on2-git.corp.google.com:29418/libvpx into test
Conflicts:
	vp8/common/blockd.h
	vp8/decoder/decodemv.c
	vp8/decoder/decodframe.c
	vp8/decoder/demode.c
	vp8/decoder/onyxd_if.c
	vp8/decoder/onyxd_int.h
	vp8/encoder/encodeframe.c

Change-Id: Ic379f4dffaded9796dc19d56be304d3f8527c61f
2010-11-16 16:30:59 -05:00
Jim Bankoski
b4a3602f66 changes to start experimenting with color segmentation prediction modes. 2010-11-16 14:38:40 -05:00
John Koleszar
791cae74da Merge remote branch 'origin/master' into experimental 2010-11-16 00:05:04 -05:00
John Koleszar
00fe7441e9 Merge remote branch 'internal/upstream' into HEAD 2010-11-16 00:05:04 -05:00
John Koleszar
389228e408 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-14 00:05:04 -05:00
John Koleszar
9b5cd1c3ff Merge remote branch 'internal/upstream' into HEAD 2010-11-13 00:05:05 -05:00
John Koleszar
adbb1de01c Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-13 00:05:05 -05:00
John Koleszar
25fa447acb Merge remote branch 'origin/master' into experimental 2010-11-13 00:05:04 -05:00
John Koleszar
08d45a99b5 Merge remote branch 'internal/upstream' into HEAD 2010-11-12 00:05:03 -05:00
John Koleszar
7d799d2ced Merge remote branch 'origin/master' into experimental 2010-11-12 00:05:03 -05:00
John Koleszar
9b48257afe Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-12 00:05:03 -05:00
Suman Sunkara
b9a18344cf Use of temporal context for encoding delta updates.
- Used three probability approach for temporal context as follows:
P0 - probability of no change if both above and left not changed
P1 - probability of no change if one of above and left has changed
P2 - probability of no change if both above and left have changed

In addition, a 1 bit/frame has been used to decide whether to use temporal context or to encode directly.  The cost of using both the schemes is calculated ahead and the temporal_update flag is set if the cost of using temporal context is lower than encoding the segment ids directly.

This approach has given around 20% reduction in cost of bits needed to encode segmentation ids.

Change-Id: I44a5509599eded215ae5be9554314280d3d35405
2010-11-11 11:31:36 -05:00
John Koleszar
f225211256 Merge remote branch 'origin/master' into experimental
Conflicts:
	configure

Change-Id: Ifa63e4610657f75cb953aa7ca08f997267612cc0
2010-11-11 09:25:10 -05:00
John Koleszar
1ea4c2924c Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	configure

Change-Id: I1c7bae5241f999387cae3f2abf2dfc84fe3f6651
2010-11-11 09:22:46 -05:00
John Koleszar
9857ebce96 Merge remote branch 'internal/upstream-experimental' into HEAD 2010-11-11 00:05:03 -05:00
John Koleszar
3a99784b5e Merge remote branch 'origin/master' into experimental 2010-11-10 00:05:06 -05:00
John Koleszar
cac05c832e Merge remote branch 'internal/upstream' into HEAD 2010-11-10 00:05:05 -05:00
John Koleszar
5d383a88e7 Merge remote branch 'internal/upstream-experimental' into HEAD
Conflicts:
	configure

Change-Id: I952d3a50ddd243990d37c5f931bd91a4244d6284
2010-11-08 08:34:46 -05:00
John Koleszar
2fa664a4e2 Merge remote branch 'origin/master' into experimental 2010-11-06 00:05:08 -04:00
John Koleszar
7a590c902b Merge remote branch 'origin/master' into experimental
Conflicts:
	configure
	ivfenc.c
	vp8/common/alloccommon.c
	vp8/common/onyxc_int.h
	vp8/vp8_cx_iface.c
2010-11-05 12:30:33 -04:00
John Koleszar
5327ea0698 Merge remote branch 'internal/upstream' into HEAD 2010-11-05 00:05:05 -04:00
John Koleszar
362f763cfe Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	vp8/common/alloccommon.c
	vp8/common/onyxc_int.h
	vp8/vp8_cx_iface.c
	vpxenc.c
2010-11-04 21:50:37 -04:00
John Koleszar
6804199073 Merge remote branch 'internal/upstream' into HEAD 2010-09-28 00:05:05 -04:00
John Koleszar
1d0db7134e Merge remote branch 'internal/upstream' into HEAD 2010-09-25 00:05:06 -04:00
John Koleszar
fbd3db91bb Merge remote branch 'internal/upstream' into HEAD 2010-09-23 00:05:10 -04:00
John Koleszar
72302f8609 Merge remote branch 'internal/upstream' into HEAD 2010-09-22 00:05:04 -04:00
John Koleszar
99c611fea6 Merge remote branch 'internal/upstream' into HEAD 2010-09-21 00:05:03 -04:00
John Koleszar
14b322e466 Merge remote branch 'internal/upstream' into HEAD 2010-09-17 00:05:04 -04:00
John Koleszar
4e31cbbe58 Merge remote branch 'internal/upstream' into HEAD 2010-09-16 00:05:08 -04:00
John Koleszar
b1879d9754 Merge remote branch 'internal/upstream' into HEAD 2010-09-15 00:05:04 -04:00
Suman Sunkara
00cec8f9e9 Changed code to remove extra read/write loops when not necessary
Modified code so that:
-When above and left contexts are same and not equal to current segment id, it needs to read a maximum of 2 segment_tree_probabilities.
- When above and left contexts are different and not equal to current segment id, it needs to read only a single segment_tree_probability.

Change-Id: Idc2cf2c4afcc6179b8162ac5a32c948ff5a9a2ba
2010-09-14 16:05:42 -04:00
John Koleszar
fe46476e98 Merge remote branch 'internal/upstream' into HEAD 2010-09-14 00:05:04 -04:00
Suman Sunkara
be7e4e854c Delta updates to segmentation map using left and above contexts.
-Updates by making use of spatial correlation.
-Checks if the segment_id is same as above or left context and encodes only the update to the map instead of updating individual segment_ids.

Change-Id: Ib861df97e8aa2b37516219eeddcdbaf552b6a249
2010-09-13 10:01:21 -04:00
John Koleszar
42cb1d84f2 Merge remote branch 'internal/upstream' into HEAD 2010-09-10 00:05:04 -04:00
John Koleszar
5d012fc26b Merge remote branch 'internal/upstream' into HEAD 2010-09-09 00:05:04 -04:00
John Koleszar
b6a41d66df Merge remote branch 'internal/upstream' into HEAD 2010-09-04 00:05:04 -04:00
John Koleszar
773eff6267 Merge remote branch 'internal/upstream' into HEAD 2010-09-03 00:05:04 -04:00
John Koleszar
2675df2d05 Merge remote branch 'internal/upstream' into HEAD 2010-09-02 00:05:04 -04:00
John Koleszar
c834a74e23 Fix compilation without --enable-experimental
Remove unconditional reference to vpx_codec_vp8x_cx_algo.

Change-Id: I2f152a5bc014a2c8f7418e90b360ce18238e8ec1
2010-09-01 13:19:08 -04:00
John Koleszar
c63ecdce46 Merge remote branch 'internal/upstream' into HEAD 2010-09-01 00:05:08 -04:00
John Koleszar
b7918d5240 Merge remote branch 'internal/upstream' into HEAD
Conflicts:
	configure
2010-08-31 15:56:52 -04:00
Yaowu Xu
f4020e2338 Enable vp8x encoder to recognize vp8 specific options
Change-Id: Ib309c8c0a6c7073b71f0e6d131028501cb241daf
2010-06-23 14:45:51 -07:00
John Koleszar
0952acb79a setup experimental infrastructure
This patch creates some basic infrastructure for doing bitstream-
incompatible changes to the VP8 encoder. The key parts are:

 - --enable-experimental configure switch, to enable support for this
   incompatible bitstream. This switch is required to be set to enable
   any "experiments"

 - A list for "experiments" which translate into --enable-<experiment>
   options and CONFIG_<experiment> macros.

 - The high bit of the "Version" field is used to indicate that the
   bitstream was produced by an experimental encoder. The decoder will
   fail to decode an experimental bitstream without
   --enable-experimental.

 - A new "vp8x" encoder interface is created to set the experimental
   bit.

 - The vp8x encoder interface is made the default for ivfenc in
   experimental mode.

Change-Id: Idbdd5eae4cec5becf75bb4770837dcd256b2abef
2010-06-01 11:14:33 -04:00
408 changed files with 101262 additions and 14574 deletions

371
args.c
View File

@@ -25,241 +25,214 @@ extern void die(const char *fmt, ...);
#endif #endif
struct arg arg_init(char **argv) struct arg arg_init(char **argv) {
{ struct arg a;
struct arg a;
a.argv = argv; a.argv = argv;
a.argv_step = 1; a.argv_step = 1;
a.name = NULL; a.name = NULL;
a.val = NULL; a.val = NULL;
a.def = NULL; a.def = NULL;
return a; return a;
} }
int arg_match(struct arg *arg_, const struct arg_def *def, char **argv) int arg_match(struct arg *arg_, const struct arg_def *def, char **argv) {
{ struct arg arg;
struct arg arg;
if (!argv[0] || argv[0][0] != '-') if (!argv[0] || argv[0][0] != '-')
return 0; return 0;
arg = arg_init(argv); arg = arg_init(argv);
if (def->short_name if (def->short_name
&& strlen(arg.argv[0]) == strlen(def->short_name) + 1 && strlen(arg.argv[0]) == strlen(def->short_name) + 1
&& !strcmp(arg.argv[0] + 1, def->short_name)) && !strcmp(arg.argv[0] + 1, def->short_name)) {
{
arg.name = arg.argv[0] + 1; arg.name = arg.argv[0] + 1;
arg.val = def->has_val ? arg.argv[1] : NULL; arg.val = def->has_val ? arg.argv[1] : NULL;
arg.argv_step = def->has_val ? 2 : 1; arg.argv_step = def->has_val ? 2 : 1;
} else if (def->long_name) {
const size_t name_len = strlen(def->long_name);
if (strlen(arg.argv[0]) >= name_len + 2
&& arg.argv[0][1] == '-'
&& !strncmp(arg.argv[0] + 2, def->long_name, name_len)
&& (arg.argv[0][name_len + 2] == '='
|| arg.argv[0][name_len + 2] == '\0')) {
arg.name = arg.argv[0] + 2;
arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL;
arg.argv_step = 1;
} }
}
if (arg.name && !arg.val && def->has_val)
die("Error: option %s requires argument.\n", arg.name);
if (arg.name && arg.val && !def->has_val)
die("Error: option %s requires no argument.\n", arg.name);
if (arg.name
&& (arg.val || !def->has_val)) {
arg.def = def;
*arg_ = arg;
return 1;
}
return 0;
}
const char *arg_next(struct arg *arg) {
if (arg->argv[0])
arg->argv += arg->argv_step;
return *arg->argv;
}
char **argv_dup(int argc, const char **argv) {
char **new_argv = malloc((argc + 1) * sizeof(*argv));
memcpy(new_argv, argv, argc * sizeof(*argv));
new_argv[argc] = NULL;
return new_argv;
}
void arg_show_usage(FILE *fp, const struct arg_def *const *defs) {
char option_text[40] = {0};
for (; *defs; defs++) {
const struct arg_def *def = *defs;
char *short_val = def->has_val ? " <arg>" : "";
char *long_val = def->has_val ? "=<arg>" : "";
if (def->short_name && def->long_name) {
char *comma = def->has_val ? "," : ", ";
snprintf(option_text, 37, "-%s%s%s --%s%6s",
def->short_name, short_val, comma,
def->long_name, long_val);
} else if (def->short_name)
snprintf(option_text, 37, "-%s%s",
def->short_name, short_val);
else if (def->long_name) else if (def->long_name)
{ snprintf(option_text, 37, " --%s%s",
const size_t name_len = strlen(def->long_name); def->long_name, long_val);
if (strlen(arg.argv[0]) >= name_len + 2 fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
&& arg.argv[0][1] == '-'
&& !strncmp(arg.argv[0] + 2, def->long_name, name_len)
&& (arg.argv[0][name_len+2] == '='
|| arg.argv[0][name_len+2] == '\0'))
{
arg.name = arg.argv[0] + 2; if (def->enums) {
arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL; const struct arg_enum_list *listptr;
arg.argv_step = 1;
} fprintf(fp, " %-37s\t ", "");
for (listptr = def->enums; listptr->name; listptr++)
fprintf(fp, "%s%s", listptr->name,
listptr[1].name ? ", " : "\n");
} }
}
if (arg.name && !arg.val && def->has_val)
die("Error: option %s requires argument.\n", arg.name);
if (arg.name && arg.val && !def->has_val)
die("Error: option %s requires no argument.\n", arg.name);
if (arg.name
&& (arg.val || !def->has_val))
{
arg.def = def;
*arg_ = arg;
return 1;
}
return 0;
} }
const char *arg_next(struct arg *arg) unsigned int arg_parse_uint(const struct arg *arg) {
{ long int rawval;
if (arg->argv[0]) char *endptr;
arg->argv += arg->argv_step;
return *arg->argv; rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0') {
if (rawval >= 0 && rawval <= UINT_MAX)
return rawval;
die("Option %s: Value %ld out of range for unsigned int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
} }
char **argv_dup(int argc, const char **argv) int arg_parse_int(const struct arg *arg) {
{ long int rawval;
char **new_argv = malloc((argc + 1) * sizeof(*argv)); char *endptr;
memcpy(new_argv, argv, argc * sizeof(*argv)); rawval = strtol(arg->val, &endptr, 10);
new_argv[argc] = NULL;
return new_argv; if (arg->val[0] != '\0' && endptr[0] == '\0') {
if (rawval >= INT_MIN && rawval <= INT_MAX)
return rawval;
die("Option %s: Value %ld out of range for signed int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
} }
void arg_show_usage(FILE *fp, const struct arg_def *const *defs) struct vpx_rational {
{ int num; /**< fraction numerator */
char option_text[40] = {0}; int den; /**< fraction denominator */
for (; *defs; defs++)
{
const struct arg_def *def = *defs;
char *short_val = def->has_val ? " <arg>" : "";
char *long_val = def->has_val ? "=<arg>" : "";
if (def->short_name && def->long_name)
{
char *comma = def->has_val ? "," : ", ";
snprintf(option_text, 37, "-%s%s%s --%s%6s",
def->short_name, short_val, comma,
def->long_name, long_val);
}
else if (def->short_name)
snprintf(option_text, 37, "-%s%s",
def->short_name, short_val);
else if (def->long_name)
snprintf(option_text, 37, " --%s%s",
def->long_name, long_val);
fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
if(def->enums)
{
const struct arg_enum_list *listptr;
fprintf(fp, " %-37s\t ", "");
for(listptr = def->enums; listptr->name; listptr++)
fprintf(fp, "%s%s", listptr->name,
listptr[1].name ? ", " : "\n");
}
}
}
unsigned int arg_parse_uint(const struct arg *arg)
{
long int rawval;
char *endptr;
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
if (rawval >= 0 && rawval <= UINT_MAX)
return rawval;
die("Option %s: Value %ld out of range for unsigned int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
}
int arg_parse_int(const struct arg *arg)
{
long int rawval;
char *endptr;
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
if (rawval >= INT_MIN && rawval <= INT_MAX)
return rawval;
die("Option %s: Value %ld out of range for signed int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
}
struct vpx_rational
{
int num; /**< fraction numerator */
int den; /**< fraction denominator */
}; };
struct vpx_rational arg_parse_rational(const struct arg *arg) struct vpx_rational arg_parse_rational(const struct arg *arg) {
{ long int rawval;
long int rawval; char *endptr;
char *endptr; struct vpx_rational rat;
struct vpx_rational rat;
/* parse numerator */ /* parse numerator */
rawval = strtol(arg->val, &endptr, 10); rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '/') if (arg->val[0] != '\0' && endptr[0] == '/') {
{ if (rawval >= INT_MIN && rawval <= INT_MAX)
if (rawval >= INT_MIN && rawval <= INT_MAX) rat.num = rawval;
rat.num = rawval; else die("Option %s: Value %ld out of range for signed int\n",
else die("Option %s: Value %ld out of range for signed int\n", arg->name, rawval);
arg->name, rawval); } else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
}
else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
/* parse denominator */ /* parse denominator */
rawval = strtol(endptr + 1, &endptr, 10); rawval = strtol(endptr + 1, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0') if (arg->val[0] != '\0' && endptr[0] == '\0') {
{ if (rawval >= INT_MIN && rawval <= INT_MAX)
if (rawval >= INT_MIN && rawval <= INT_MAX) rat.den = rawval;
rat.den = rawval; else die("Option %s: Value %ld out of range for signed int\n",
else die("Option %s: Value %ld out of range for signed int\n", arg->name, rawval);
arg->name, rawval); } else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
}
else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return rat; return rat;
} }
int arg_parse_enum(const struct arg *arg) int arg_parse_enum(const struct arg *arg) {
{ const struct arg_enum_list *listptr;
const struct arg_enum_list *listptr; long int rawval;
long int rawval; char *endptr;
char *endptr;
/* First see if the value can be parsed as a raw value */ /* First see if the value can be parsed as a raw value */
rawval = strtol(arg->val, &endptr, 10); rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0') if (arg->val[0] != '\0' && endptr[0] == '\0') {
{ /* Got a raw value, make sure it's valid */
/* Got a raw value, make sure it's valid */ for (listptr = arg->def->enums; listptr->name; listptr++)
for(listptr = arg->def->enums; listptr->name; listptr++) if (listptr->val == rawval)
if(listptr->val == rawval) return rawval;
return rawval; }
}
/* Next see if it can be parsed as a string */ /* Next see if it can be parsed as a string */
for(listptr = arg->def->enums; listptr->name; listptr++) for (listptr = arg->def->enums; listptr->name; listptr++)
if(!strcmp(arg->val, listptr->name)) if (!strcmp(arg->val, listptr->name))
return listptr->val; return listptr->val;
die("Option %s: Invalid value '%s'\n", arg->name, arg->val); die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
return 0; return 0;
} }
int arg_parse_enum_or_int(const struct arg *arg) int arg_parse_enum_or_int(const struct arg *arg) {
{ if (arg->def->enums)
if(arg->def->enums) return arg_parse_enum(arg);
return arg_parse_enum(arg); return arg_parse_int(arg);
return arg_parse_int(arg);
} }

33
args.h
View File

@@ -13,29 +13,26 @@
#define ARGS_H #define ARGS_H
#include <stdio.h> #include <stdio.h>
struct arg struct arg {
{ char **argv;
char **argv; const char *name;
const char *name; const char *val;
const char *val; unsigned int argv_step;
unsigned int argv_step; const struct arg_def *def;
const struct arg_def *def;
}; };
struct arg_enum_list struct arg_enum_list {
{ const char *name;
const char *name; int val;
int val;
}; };
#define ARG_ENUM_LIST_END {0} #define ARG_ENUM_LIST_END {0}
typedef struct arg_def typedef struct arg_def {
{ const char *short_name;
const char *short_name; const char *long_name;
const char *long_name; int has_val;
int has_val; const char *desc;
const char *desc; const struct arg_enum_list *enums;
const struct arg_enum_list *enums;
} arg_def_t; } arg_def_t;
#define ARG_DEF(s,l,v,d) {s,l,v,d, NULL} #define ARG_DEF(s,l,v,d) {s,l,v,d, NULL}
#define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e} #define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e}

View File

@@ -208,4 +208,3 @@ endif
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes) ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
$(call import-module,cpufeatures) $(call import-module,cpufeatures)
endif endif

View File

@@ -253,10 +253,25 @@ $(1):
$(if $(quiet),@echo " [LD] $$@") $(if $(quiet),@echo " [LD] $$@")
$(qexec)$$(LD) -shared $$(LDFLAGS) \ $(qexec)$$(LD) -shared $$(LDFLAGS) \
-Wl,--no-undefined -Wl,-soname,$$(SONAME) \ -Wl,--no-undefined -Wl,-soname,$$(SONAME) \
-Wl,--version-script,$$(SO_VERSION_SCRIPT) -o $$@ \ -Wl,--version-script,$$(EXPORTS_FILE) -o $$@ \
$$(filter %.o,$$?) $$(extralibs) $$(filter %.o,$$^) $$(extralibs)
endef endef
define dl_template
# Not using a pattern rule here because we don't want to generate empty
# archives when they are listed as a dependency in files not responsible
# for creating them.
$(1):
$(if $(quiet),@echo " [LD] $$@")
$(qexec)$$(LD) -dynamiclib $$(LDFLAGS) \
-exported_symbols_list $$(EXPORTS_FILE) \
-Wl,-headerpad_max_install_names,-compatibility_version,1.0,-current_version,$$(VERSION_MAJOR) \
-o $$@ \
$$(filter %.o,$$^) $$(extralibs)
endef
define lipo_lib_template define lipo_lib_template
$(1): $(addsuffix /$(1),$(FAT_ARCHS)) $(1): $(addsuffix /$(1),$(FAT_ARCHS))
$(if $(quiet),@echo " [LIPO] $$@") $(if $(quiet),@echo " [LIPO] $$@")
@@ -321,6 +336,7 @@ LIBS=$(call enabled,LIBS)
@touch $@ @touch $@
$(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib)))) $(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib))))
$(foreach lib,$(filter %so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH),$(LIBS)),$(eval $(call so_template,$(lib)))) $(foreach lib,$(filter %so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH),$(LIBS)),$(eval $(call so_template,$(lib))))
$(foreach lib,$(filter %$(VERSION_MAJOR).dylib,$(LIBS)),$(eval $(call dl_template,$(lib))))
INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS) INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS)
ifeq ($(MAKECMDGOALS),dist) ifeq ($(MAKECMDGOALS),dist)

View File

@@ -149,7 +149,7 @@ while (<STDIN>)
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/; s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
# ALIGN directive # ALIGN directive
s/ALIGN/.balign/g; s/\bALIGN\b/.balign/g;
# ARM code # ARM code
s/\sARM/.arm/g; s/\sARM/.arm/g;

View File

@@ -277,6 +277,7 @@ clean_temp_files() {
# Toolchain Check Functions # Toolchain Check Functions
# #
check_cmd() { check_cmd() {
enabled external_build && return
log "$@" log "$@"
"$@" >>${logfile} 2>&1 "$@" >>${logfile} 2>&1
} }
@@ -435,10 +436,10 @@ RTCD_OPTIONS = ${RTCD_OPTIONS}
EOF EOF
if enabled rvct; then cat >> $1 << EOF if enabled rvct; then cat >> $1 << EOF
fmt_deps = sed -e 's;^__image.axf;\$(dir \$@)\$(notdir \$<).o \$@;' #hide fmt_deps = sed -e 's;^__image.axf;\$\${@:.d=.o} \$\$@;' #hide
EOF EOF
else cat >> $1 << EOF else cat >> $1 << EOF
fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\$(dir \$@)\1\$(suffix \$<).o \$@;' fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\$\${@:.d=.o} \$\$@;'
EOF EOF
fi fi
@@ -1000,7 +1001,11 @@ EOF
soft_enable sse2 soft_enable sse2
soft_enable sse3 soft_enable sse3
soft_enable ssse3 soft_enable ssse3
soft_enable sse4_1 if enabled gcc && ! disabled sse4_1 && ! check_cflags -msse4; then
RTCD_OPTIONS="${RTCD_OPTIONS}--disable-sse4_1 "
else
soft_enable sse4_1
fi
case ${tgt_os} in case ${tgt_os} in
win*) win*)
@@ -1175,9 +1180,6 @@ EOF
;; ;;
esac esac
# for sysconf(3) and friends.
check_header unistd.h
# glibc needs these # glibc needs these
if enabled linux; then if enabled linux; then
add_cflags -D_LARGEFILE_SOURCE add_cflags -D_LARGEFILE_SOURCE

View File

@@ -26,6 +26,7 @@ Options:
--help Print this message --help Print this message
--exe Generate a project for building an Application --exe Generate a project for building an Application
--lib Generate a project for creating a static library --lib Generate a project for creating a static library
--dll Generate a project for creating a dll
--static-crt Use the static C runtime (/MT) --static-crt Use the static C runtime (/MT)
--target=isa-os-cc Target specifier (required) --target=isa-os-cc Target specifier (required)
--out=filename Write output to a file [stdout] --out=filename Write output to a file [stdout]
@@ -142,7 +143,9 @@ generate_filter() {
if [ "${f##*.}" == "$pat" ]; then if [ "${f##*.}" == "$pat" ]; then
unset file_list[i] unset file_list[i]
objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,/,_,g')
open_tag File RelativePath="./$f" open_tag File RelativePath="./$f"
if [ "$pat" == "asm" ] && $asm_use_custom_step; then if [ "$pat" == "asm" ] && $asm_use_custom_step; then
for plat in "${platforms[@]}"; do for plat in "${platforms[@]}"; do
for cfg in Debug Release; do for cfg in Debug Release; do
@@ -152,14 +155,27 @@ generate_filter() {
tag Tool \ tag Tool \
Name="VCCustomBuildTool" \ Name="VCCustomBuildTool" \
Description="Assembling \$(InputFileName)" \ Description="Assembling \$(InputFileName)" \
CommandLine="$(eval echo \$asm_${cfg}_cmdline)" \ CommandLine="$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
Outputs="\$(InputName).obj" \ Outputs="\$(IntDir)$objf" \
close_tag FileConfiguration close_tag FileConfiguration
done done
done done
fi fi
if [ "$pat" == "c" ] || [ "$pat" == "cc" ] ; then
for plat in "${platforms[@]}"; do
for cfg in Debug Release; do
open_tag FileConfiguration \
Name="${cfg}|${plat}" \
tag Tool \
Name="VCCLCompilerTool" \
ObjectFile="\$(IntDir)$objf" \
close_tag FileConfiguration
done
done
fi
close_tag File close_tag File
break break
@@ -190,6 +206,8 @@ for opt in "$@"; do
;; ;;
--exe) proj_kind="exe" --exe) proj_kind="exe"
;; ;;
--dll) proj_kind="dll"
;;
--lib) proj_kind="lib" --lib) proj_kind="lib"
;; ;;
--src-path-bare=*) src_path_bare="$optval" --src-path-bare=*) src_path_bare="$optval"
@@ -244,8 +262,10 @@ case "${vs_ver:-8}" in
asm_use_custom_step=$uses_asm asm_use_custom_step=$uses_asm
;; ;;
8) vs_ver_id="8.00" 8) vs_ver_id="8.00"
asm_use_custom_step=$uses_asm
;; ;;
9) vs_ver_id="9.00" 9) vs_ver_id="9.00"
asm_use_custom_step=$uses_asm
;; ;;
esac esac
@@ -284,10 +304,11 @@ esac
case "$target" in case "$target" in
x86_64*) x86_64*)
platforms[0]="x64" platforms[0]="x64"
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;"
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;"
;; ;;
x86*) x86*)
platforms[0]="Win32" platforms[0]="Win32"
# these are only used by vs7
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;" asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;"
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;" asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} &quot;\$(InputPath)&quot;"
;; ;;
@@ -299,6 +320,8 @@ generate_vcproj() {
case "$proj_kind" in case "$proj_kind" in
exe) vs_ConfigurationType=1 exe) vs_ConfigurationType=1
;; ;;
dll) vs_ConfigurationType=2
;;
*) vs_ConfigurationType=4 *) vs_ConfigurationType=4
;; ;;
esac esac
@@ -318,13 +341,6 @@ generate_vcproj() {
done done
close_tag Platforms close_tag Platforms
open_tag ToolFiles
case "$target" in
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
;;
esac
close_tag ToolFiles
open_tag Configurations open_tag Configurations
for plat in "${platforms[@]}"; do for plat in "${platforms[@]}"; do
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'` plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`

File diff suppressed because it is too large Load Diff

View File

@@ -7,9 +7,17 @@ REM in the file PATENTS. All contributing project authors may
REM be found in the AUTHORS file in the root of the source tree. REM be found in the AUTHORS file in the root of the source tree.
echo on echo on
cl /I "./" /I "%1" /nologo /c "%1/vp9/common/vp9_asm_com_offsets.c"
cl /I "./" /I "%1" /nologo /c "%1/vp9/decoder/vp9_asm_dec_offsets.c"
cl /I "./" /I "%1" /nologo /c "%1/vp9/encoder/vp9_asm_enc_offsets.c"
obj_int_extract.exe rvds "vp9_asm_com_offsets.obj" > "vp9_asm_com_offsets.asm"
obj_int_extract.exe rvds "vp9_asm_dec_offsets.obj" > "vp9_asm_dec_offsets.asm"
obj_int_extract.exe rvds "vp9_asm_enc_offsets.obj" > "vp9_asm_enc_offsets.asm"
cl /I "./" /I "%1" /nologo /c "%1/vp8/common/asm_com_offsets.c" cl /I "./" /I "%1" /nologo /c "%1/vp8/common/asm_com_offsets.c"
cl /I "./" /I "%1" /nologo /c "%1/vp8/decoder/asm_dec_offsets.c" cl /I "./" /I "%1" /nologo /c "%1/vp8/decoder/asm_dec_offsets.c"
cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/asm_enc_offsets.c" cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/asm_enc_offsets.c"
obj_int_extract.exe rvds "asm_com_offsets.obj" > "asm_com_offsets.asm" obj_int_extract.exe rvds "asm_com_offsets.obj" > "vp8_asm_com_offsets.asm"
obj_int_extract.exe rvds "asm_dec_offsets.obj" > "asm_dec_offsets.asm" obj_int_extract.exe rvds "asm_dec_offsets.obj" > "vp8_asm_dec_offsets.asm"
obj_int_extract.exe rvds "asm_enc_offsets.obj" > "asm_enc_offsets.asm" obj_int_extract.exe rvds "asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm"

View File

@@ -1,115 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Yasm"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="YASM"
DisplayName="Yasm Assembler"
CommandLine="yasm -Xvc -f $(PlatformName) [AllOptions] [AdditionalOptions] [Inputs]"
Outputs="[$ObjectFileName]"
FileExtensions="*.asm"
ExecutionDescription="Assembling $(InputFileName)"
ShowOnlyRuleProperties="false"
>
<Properties>
<StringProperty
Name="Defines"
DisplayName="Definitions"
Category="Pre-Defined Symbols"
Description="Specify pre-defined symbols (&apos;symbol&apos; or &apos;symbol = value&apos;) "
Switch="-D [value]"
Delimited="true"
Inheritable="true"
/>
<StringProperty
Name="IncludePaths"
DisplayName="Include Paths"
Category="Configuration"
Description="Set the paths for any additional include files"
Switch="-I [value]"
Delimited="true"
Inheritable="true"
/>
<StringProperty
Name="UnDefines"
DisplayName="Remove Definitions"
Category="Pre-Defined Symbols"
Description="Remove pre-defined symbols "
Switch="-U [value]"
Delimited="true"
Inheritable="true"
/>
<StringProperty
Name="ObjectFileName"
DisplayName="Object File Name"
Category="Output"
Description="Select the output file name"
Switch="-o [value]"
DefaultValue="$(IntDir)\$(InputName).obj"
/>
<StringProperty
Name="ListFileName"
DisplayName="List File Name"
Category="Output"
Description="Select an output listing by setting its file name"
Switch="-l [value]"
/>
<StringProperty
Name="PreIncludeFile"
DisplayName="Pre Include File"
Category="Configuration"
Description="Select a pre-included file by setting its name"
Switch="-P [value]"
/>
<BooleanProperty
Name="Debug"
DisplayName="Debug Information"
Category="Output"
Description="Generate debugging information"
Switch="-g cv8"
/>
<EnumProperty
Name="PreProc"
DisplayName="Pre-Processor"
Category="Configuration"
Description="Select the pre-processor (&apos;nasm&apos; or &apos;raw&apos;)"
>
<Values>
<EnumValue
Value="0"
Switch="-rnasm"
DisplayName="Nasm "
/>
<EnumValue
Value="1"
Switch="-rraw"
DisplayName="Raw"
/>
</Values>
</EnumProperty>
<EnumProperty
Name="Parser"
DisplayName="Parser"
Category="Configuration"
Description="Select the parser for Intel (&apos;nasm&apos;) or AT&amp;T ( &apos;gas&apos;) syntax"
>
<Values>
<EnumValue
Value="0"
Switch="-pnasm"
DisplayName="Nasm"
/>
<EnumValue
Value="1"
Switch="-pgas"
DisplayName="Gas"
/>
</Values>
</EnumProperty>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>

60
configure vendored
View File

@@ -34,6 +34,7 @@ Advanced options:
${toggle_md5} support for output of checksum data ${toggle_md5} support for output of checksum data
${toggle_static_msvcrt} use static MSVCRT (VS builds only) ${toggle_static_msvcrt} use static MSVCRT (VS builds only)
${toggle_vp8} VP8 codec support ${toggle_vp8} VP8 codec support
${toggle_vp9} VP9 codec support
${toggle_internal_stats} output of encoder internal stats for debug, if supported (encoders) ${toggle_internal_stats} output of encoder internal stats for debug, if supported (encoders)
${toggle_mem_tracker} track memory usage ${toggle_mem_tracker} track memory usage
${toggle_postproc} postprocessing ${toggle_postproc} postprocessing
@@ -176,19 +177,24 @@ enable os_support
enable temporal_denoising enable temporal_denoising
[ -d ${source_path}/../include ] && enable alt_tree_layout [ -d ${source_path}/../include ] && enable alt_tree_layout
for d in vp8; do for d in vp8 vp9; do
[ -d ${source_path}/${d} ] && disable alt_tree_layout; [ -d ${source_path}/${d} ] && disable alt_tree_layout;
done done
if ! enabled alt_tree_layout; then if ! enabled alt_tree_layout; then
# development environment # development environment
[ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder" [ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder"
[ -d ${source_path}/vp9 ] && CODECS="${CODECS} vp9_encoder vp9_decoder"
else else
# customer environment # customer environment
[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder" [ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder" [ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
[ -f ${source_path}/../include/vpx/vp9cx.h ] && CODECS="${CODECS} vp9_encoder"
[ -f ${source_path}/../include/vpx/vp9dx.h ] && CODECS="${CODECS} vp9_decoder"
[ -f ${source_path}/../include/vpx/vp8cx.h ] || disable vp8_encoder [ -f ${source_path}/../include/vpx/vp8cx.h ] || disable vp8_encoder
[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable vp8_decoder [ -f ${source_path}/../include/vpx/vp8dx.h ] || disable vp8_decoder
[ -f ${source_path}/../include/vpx/vp9cx.h ] || disable vp9_encoder
[ -f ${source_path}/../include/vpx/vp9dx.h ] || disable vp9_decoder
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt [ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
fi fi
@@ -230,6 +236,18 @@ HAVE_LIST="
sys_mman_h sys_mman_h
unistd_h unistd_h
" "
EXPERIMENT_LIST="
csm
comp_intra_pred
superblocks
pred_filter
lossless
subpelrefmv
new_mvref
implicit_segmentation
newbintramodes
comp_interintra_pred
"
CONFIG_LIST=" CONFIG_LIST="
external_build external_build
install_docs install_docs
@@ -276,8 +294,11 @@ CONFIG_LIST="
unit_tests unit_tests
multi_res_encoding multi_res_encoding
temporal_denoising temporal_denoising
experimental
${EXPERIMENT_LIST}
" "
CMDLINE_SELECT=" CMDLINE_SELECT="
external_build
extra_warnings extra_warnings
werror werror
install_docs install_docs
@@ -322,6 +343,7 @@ CMDLINE_SELECT="
unit_tests unit_tests
multi_res_encoding multi_res_encoding
temporal_denoising temporal_denoising
experimental
" "
process_cmdline() { process_cmdline() {
@@ -329,6 +351,18 @@ process_cmdline() {
optval="${opt#*=}" optval="${opt#*=}"
case "$opt" in case "$opt" in
--disable-codecs) for c in ${CODECS}; do disable $c; done ;; --disable-codecs) for c in ${CODECS}; do disable $c; done ;;
--enable-?*|--disable-?*)
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
if echo "${EXPERIMENT_LIST}" | grep "^ *$option\$" >/dev/null; then
if enabled experimental; then
$action $option
else
log_echo "Ignoring $opt -- not in experimental mode."
fi
else
process_common_cmdline $opt
fi
;;
*) process_common_cmdline "$opt" *) process_common_cmdline "$opt"
;; ;;
esac esac
@@ -464,7 +498,7 @@ process_detect() {
fi fi
fi fi
fi fi
if [ -z "$CC" ]; then if [ -z "$CC" ] || enabled external_build; then
echo "Bypassing toolchain for environment detection." echo "Bypassing toolchain for environment detection."
enable external_build enable external_build
check_header() { check_header() {
@@ -473,6 +507,7 @@ process_detect() {
shift shift
var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'` var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
disable $var disable $var
# Headers common to all environments
case $header in case $header in
stdio.h) stdio.h)
true; true;
@@ -484,6 +519,25 @@ process_detect() {
done done
${result:-true} ${result:-true}
esac && enable $var esac && enable $var
# Specialize windows and POSIX environments.
case $toolchain in
*-win*-*)
case $header-$toolchain in
stdint*-gcc) true;;
*) false;;
esac && enable $var
;;
*)
case $header in
stdint.h) true;;
pthread.h) true;;
sys/mman.h) true;;
unistd.h) true;;
*) false;;
esac && enable $var
esac
enabled $var
} }
check_ld() { check_ld() {
true true
@@ -497,6 +551,7 @@ EOF
check_header stdint.h check_header stdint.h
check_header pthread.h check_header pthread.h
check_header sys/mman.h check_header sys/mman.h
check_header unistd.h # for sysconf(3) and friends.
check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports
} }
@@ -537,6 +592,7 @@ process_toolchain() {
check_add_cflags -Wpointer-arith check_add_cflags -Wpointer-arith
check_add_cflags -Wtype-limits check_add_cflags -Wtype-limits
check_add_cflags -Wcast-qual check_add_cflags -Wcast-qual
check_add_cflags -Wvla
check_add_cflags -Wimplicit-function-declaration check_add_cflags -Wimplicit-function-declaration
check_add_cflags -Wuninitialized check_add_cflags -Wuninitialized
check_add_cflags -Wunused-variable check_add_cflags -Wunused-variable

View File

@@ -18,197 +18,174 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx/vpx_decoder.h" #include "vpx/vpx_decoder.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
#if CONFIG_VP8_DECODER #if CONFIG_VP9_DECODER
#include "vpx/vp8dx.h" #include "vpx/vp8dx.h"
#endif #endif
static char *exec_name; static char *exec_name;
static int verbose = 0; static int verbose = 0;
static const struct static const struct {
{ const char *name;
const char *name; const vpx_codec_iface_t *iface;
const vpx_codec_iface_t *iface; } ifaces[] = {
} ifaces[] = #if CONFIG_VP9_DECODER
{ {"vp9", &vpx_codec_vp8_dx_algo},
#if CONFIG_VP8_DECODER
{"vp8", &vpx_codec_vp8_dx_algo},
#endif #endif
}; };
static void usage_exit(void) static void usage_exit(void) {
{ int i;
int i;
printf("Usage: %s <options>\n\n" printf("Usage: %s <options>\n\n"
"Options:\n" "Options:\n"
"\t--codec <name>\tCodec to use (default=%s)\n" "\t--codec <name>\tCodec to use (default=%s)\n"
"\t-h <height>\tHeight of the simulated video frame, in pixels\n" "\t-h <height>\tHeight of the simulated video frame, in pixels\n"
"\t-w <width> \tWidth of the simulated video frame, in pixels\n" "\t-w <width> \tWidth of the simulated video frame, in pixels\n"
"\t-v \tVerbose mode (show individual segment sizes)\n" "\t-v \tVerbose mode (show individual segment sizes)\n"
"\t--help \tShow this message\n" "\t--help \tShow this message\n"
"\n" "\n"
"Included decoders:\n" "Included decoders:\n"
"\n", "\n",
exec_name, exec_name,
ifaces[0].name); ifaces[0].name);
for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++)
printf(" %-6s - %s\n", printf(" %-6s - %s\n",
ifaces[i].name, ifaces[i].name,
vpx_codec_iface_name(ifaces[i].iface)); vpx_codec_iface_name(ifaces[i].iface));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
static void usage_error(const char *fmt, ...) static void usage_error(const char *fmt, ...) {
{ va_list ap;
va_list ap; va_start(ap, fmt);
va_start(ap, fmt); vprintf(fmt, ap);
vprintf(fmt, ap); printf("\n");
printf("\n"); usage_exit();
usage_exit();
} }
void my_mem_dtor(vpx_codec_mmap_t *mmap) void my_mem_dtor(vpx_codec_mmap_t *mmap) {
{ if (verbose)
if (verbose) printf("freeing segment %d\n", mmap->id);
printf("freeing segment %d\n", mmap->id);
free(mmap->priv); free(mmap->priv);
} }
int main(int argc, char **argv) int main(int argc, char **argv) {
{ vpx_codec_ctx_t decoder;
vpx_codec_ctx_t decoder; vpx_codec_iface_t *iface = ifaces[0].iface;
vpx_codec_iface_t *iface = ifaces[0].iface; vpx_codec_iter_t iter;
vpx_codec_iter_t iter; vpx_codec_dec_cfg_t cfg;
vpx_codec_dec_cfg_t cfg; vpx_codec_err_t res = VPX_CODEC_OK;
vpx_codec_err_t res = VPX_CODEC_OK; unsigned int alloc_sz = 0;
unsigned int alloc_sz = 0; unsigned int w = 352;
unsigned int w = 352; unsigned int h = 288;
unsigned int h = 288; int i;
int i;
exec_name = argv[0]; exec_name = argv[0];
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++) {
{ if (!strcmp(argv[i], "--codec")) {
if (!strcmp(argv[i], "--codec")) if (i + 1 < argc) {
{ int j, k = -1;
if (i + 1 < argc)
{
int j, k = -1;
i++; i++;
for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++) for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++)
if (!strcmp(ifaces[j].name, argv[i])) if (!strcmp(ifaces[j].name, argv[i]))
k = j; k = j;
if (k >= 0) if (k >= 0)
iface = ifaces[k].iface; iface = ifaces[k].iface;
else
usage_error("Error: Unrecognized argument (%s) to --codec\n",
argv[i]);
}
else
usage_error("Error: Option --codec requires argument.\n");
}
else if (!strcmp(argv[i], "-v"))
verbose = 1;
else if (!strcmp(argv[i], "-h"))
if (i + 1 < argc)
{
h = atoi(argv[++i]);
}
else
usage_error("Error: Option -h requires argument.\n");
else if (!strcmp(argv[i], "-w"))
if (i + 1 < argc)
{
w = atoi(argv[++i]);
}
else
usage_error("Error: Option -w requires argument.\n");
else if (!strcmp(argv[i], "--help"))
usage_exit();
else else
usage_error("Error: Unrecognized option %s\n\n", argv[i]); usage_error("Error: Unrecognized argument (%s) to --codec\n",
} argv[i]);
} else
usage_error("Error: Option --codec requires argument.\n");
} else if (!strcmp(argv[i], "-v"))
verbose = 1;
else if (!strcmp(argv[i], "-h"))
if (i + 1 < argc) {
h = atoi(argv[++i]);
} else
usage_error("Error: Option -h requires argument.\n");
else if (!strcmp(argv[i], "-w"))
if (i + 1 < argc) {
w = atoi(argv[++i]);
} else
usage_error("Error: Option -w requires argument.\n");
else if (!strcmp(argv[i], "--help"))
usage_exit();
else
usage_error("Error: Unrecognized option %s\n\n", argv[i]);
}
if (argc == 1) if (argc == 1)
printf("Using built-in defaults. For options, rerun with --help\n\n"); printf("Using built-in defaults. For options, rerun with --help\n\n");
/* XMA mode is not supported on all decoders! */ /* XMA mode is not supported on all decoders! */
if (!(vpx_codec_get_caps(iface) & VPX_CODEC_CAP_XMA)) if (!(vpx_codec_get_caps(iface) & VPX_CODEC_CAP_XMA)) {
{ printf("%s does not support XMA mode!\n", vpx_codec_iface_name(iface));
printf("%s does not support XMA mode!\n", vpx_codec_iface_name(iface)); return EXIT_FAILURE;
}
/* The codec knows how much memory to allocate based on the size of the
* encoded frames. This data can be parsed from the bitstream with
* vpx_codec_peek_stream_info() if a bitstream is available. Otherwise,
* a fixed size can be used that will be the upper limit on the frame
* size the decoder can decode.
*/
cfg.w = w;
cfg.h = h;
/* Initialize the decoder in XMA mode. */
if (vpx_codec_dec_init(&decoder, iface, &cfg, VPX_CODEC_USE_XMA)) {
printf("Failed to initialize decoder in XMA mode: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
/* Iterate through the list of memory maps, allocating them with the
* requested alignment.
*/
iter = NULL;
do {
vpx_codec_mmap_t mmap;
unsigned int align;
res = vpx_codec_get_mem_map(&decoder, &mmap, &iter);
align = mmap.align ? mmap.align - 1 : 0;
if (!res) {
if (verbose)
printf("Allocating segment %u, size %lu, align %u %s\n",
mmap.id, mmap.sz, mmap.align,
mmap.flags & VPX_CODEC_MEM_ZERO ? "(ZEROED)" : "");
if (mmap.flags & VPX_CODEC_MEM_ZERO)
mmap.priv = calloc(1, mmap.sz + align);
else
mmap.priv = malloc(mmap.sz + align);
mmap.base = (void *)((((uintptr_t)mmap.priv) + align) & ~(uintptr_t)align);
mmap.dtor = my_mem_dtor;
alloc_sz += mmap.sz + align;
if (vpx_codec_set_mem_map(&decoder, &mmap, 1)) {
printf("Failed to set mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE; return EXIT_FAILURE;
}
} else if (res != VPX_CODEC_LIST_END) {
printf("Failed to get mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
} }
} while (res != VPX_CODEC_LIST_END);
/* The codec knows how much memory to allocate based on the size of the printf("%s\n %d bytes external memory required for %dx%d.\n",
* encoded frames. This data can be parsed from the bitstream with decoder.name, alloc_sz, cfg.w, cfg.h);
* vpx_codec_peek_stream_info() if a bitstream is available. Otherwise, vpx_codec_destroy(&decoder);
* a fixed size can be used that will be the upper limit on the frame return EXIT_SUCCESS;
* size the decoder can decode.
*/
cfg.w = w;
cfg.h = h;
/* Initialize the decoder in XMA mode. */
if (vpx_codec_dec_init(&decoder, iface, &cfg, VPX_CODEC_USE_XMA))
{
printf("Failed to initialize decoder in XMA mode: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
/* Iterate through the list of memory maps, allocating them with the
* requested alignment.
*/
iter = NULL;
do
{
vpx_codec_mmap_t mmap;
unsigned int align;
res = vpx_codec_get_mem_map(&decoder, &mmap, &iter);
align = mmap.align ? mmap.align - 1 : 0;
if (!res)
{
if (verbose)
printf("Allocating segment %u, size %lu, align %u %s\n",
mmap.id, mmap.sz, mmap.align,
mmap.flags & VPX_CODEC_MEM_ZERO ? "(ZEROED)" : "");
if (mmap.flags & VPX_CODEC_MEM_ZERO)
mmap.priv = calloc(1, mmap.sz + align);
else
mmap.priv = malloc(mmap.sz + align);
mmap.base = (void *)((((uintptr_t)mmap.priv) + align) & ~(uintptr_t)align);
mmap.dtor = my_mem_dtor;
alloc_sz += mmap.sz + align;
if (vpx_codec_set_mem_map(&decoder, &mmap, 1))
{
printf("Failed to set mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
}
else if (res != VPX_CODEC_LIST_END)
{
printf("Failed to get mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
}
while (res != VPX_CODEC_LIST_END);
printf("%s\n %d bytes external memory required for %dx%d.\n",
decoder.name, alloc_sz, cfg.w, cfg.h);
vpx_codec_destroy(&decoder);
return EXIT_SUCCESS;
} }

View File

@@ -38,7 +38,7 @@ vpxenc.SRCS += libmkv/EbmlWriter.c
vpxenc.SRCS += libmkv/EbmlWriter.h vpxenc.SRCS += libmkv/EbmlWriter.h
vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1 vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
vpxenc.DESCRIPTION = Full featured encoder vpxenc.DESCRIPTION = Full featured encoder
UTILS-$(CONFIG_ENCODERS) += vp8_scalable_patterns.c UTILS-$(CONFIG_VP8_ENCODER) += vp8_scalable_patterns.c
vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
vp8_scalable_patterns.DESCRIPTION = Temporal Scalability Encoder vp8_scalable_patterns.DESCRIPTION = Temporal Scalability Encoder
@@ -56,37 +56,37 @@ endif
#example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022 #example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022
#example_xma.DESCRIPTION = External Memory Allocation mode usage #example_xma.DESCRIPTION = External Memory Allocation mode usage
GEN_EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += simple_decoder.c
simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
simple_decoder.DESCRIPTION = Simplified decoder loop simple_decoder.DESCRIPTION = Simplified decoder loop
GEN_EXAMPLES-$(CONFIG_DECODERS) += postproc.c GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += postproc.c
postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7 postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7
postproc.DESCRIPTION = Decoder postprocessor control postproc.DESCRIPTION = Decoder postprocessor control
GEN_EXAMPLES-$(CONFIG_DECODERS) += decode_to_md5.c GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += decode_to_md5.c
decode_to_md5.SRCS += md5_utils.h md5_utils.c decode_to_md5.SRCS += md5_utils.h md5_utils.c
decode_to_md5.GUID = 59120B9B-2735-4BFE-B022-146CA340FE42 decode_to_md5.GUID = 59120B9B-2735-4BFE-B022-146CA340FE42
decode_to_md5.DESCRIPTION = Frame by frame MD5 checksum decode_to_md5.DESCRIPTION = Frame by frame MD5 checksum
GEN_EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += simple_encoder.c
simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
simple_encoder.DESCRIPTION = Simplified encoder loop simple_encoder.DESCRIPTION = Simplified encoder loop
GEN_EXAMPLES-$(CONFIG_ENCODERS) += twopass_encoder.c GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += twopass_encoder.c
twopass_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8 twopass_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8
twopass_encoder.DESCRIPTION = Two-pass encoder loop twopass_encoder.DESCRIPTION = Two-pass encoder loop
GEN_EXAMPLES-$(CONFIG_ENCODERS) += force_keyframe.c GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += force_keyframe.c
force_keyframe.GUID = 3C67CADF-029F-4C86-81F5-D6D4F51177F0 force_keyframe.GUID = 3C67CADF-029F-4C86-81F5-D6D4F51177F0
force_keyframe.DESCRIPTION = Force generation of keyframes force_keyframe.DESCRIPTION = Force generation of keyframes
ifeq ($(CONFIG_DECODERS),yes) ifeq ($(CONFIG_DECODERS),yes)
GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_drops.c GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += decode_with_drops.c
endif endif
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26 decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
decode_with_drops.DESCRIPTION = Drops frames while decoding decode_with_drops.DESCRIPTION = Drops frames while decoding
ifeq ($(CONFIG_DECODERS),yes) ifeq ($(CONFIG_VP8_DECODER),yes)
GEN_EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c GEN_EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c
endif endif
decode_with_partial_drops.GUID = 61C2D026-5754-46AC-916F-1343ECC5537E decode_with_partial_drops.GUID = 61C2D026-5754-46AC-916F-1343ECC5537E
decode_with_partial_drops.DESCRIPTION = Drops parts of frames while decoding decode_with_partial_drops.DESCRIPTION = Drops parts of frames while decoding
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += error_resilient.c
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
error_resilient.DESCRIPTION = Error Resiliency Feature error_resilient.DESCRIPTION = Error Resiliency Feature
@@ -115,9 +115,11 @@ vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
# when building for bare-metal targets # when building for bare-metal targets
ifeq ($(CONFIG_OS_SUPPORT), yes) ifeq ($(CONFIG_OS_SUPPORT), yes)
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m
else else
ifeq ($(CONFIG_GCC), yes) ifeq ($(CONFIG_GCC), yes)
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m
endif endif
endif endif
# #
@@ -136,6 +138,8 @@ else
LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.) LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.)
INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8 INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8
INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8 INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8
INC_PATH-$(CONFIG_VP9_DECODER) += $(SRC_PATH_BARE)/vp9
INC_PATH-$(CONFIG_VP9_ENCODER) += $(SRC_PATH_BARE)/vp9
LIB_PATH := $(call enabled,LIB_PATH) LIB_PATH := $(call enabled,LIB_PATH)
INC_PATH := $(call enabled,INC_PATH) INC_PATH := $(call enabled,INC_PATH)
endif endif
@@ -179,7 +183,8 @@ BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_S
# Instantiate linker template for all examples. # Instantiate linker template for all examples.
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx) CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),.so,.a) SHARED_LIB_SUF=$(if $(filter darwin%,$(TGT_OS)),.dylib,.so)
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
$(foreach bin,$(BINS-yes),\ $(foreach bin,$(BINS-yes),\
$(if $(BUILD_OBJS),$(eval $(bin):\ $(if $(BUILD_OBJS),$(eval $(bin):\
$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\ $(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\
@@ -209,7 +214,7 @@ INSTALL_MAPS += % %
# Set up additional MSVS environment # Set up additional MSVS environment
ifeq ($(CONFIG_MSVS),yes) ifeq ($(CONFIG_MSVS),yes)
CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd) CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd))
# This variable uses deferred expansion intentionally, since the results of # This variable uses deferred expansion intentionally, since the results of
# $(wildcard) may change during the course of the Make. # $(wildcard) may change during the course of the Make.
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d)))) VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))

View File

@@ -1,238 +0,0 @@
@TEMPLATE decoder_tmpl.c
Decode With Partial Drops Example
=========================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example utility which drops a series of frames (or parts of frames),
as specified on the command line. This is useful for observing the error
recovery features of the codec.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
#include <time.h>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
struct parsed_header
{
char key_frame;
int version;
char show_frame;
int first_part_size;
};
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
{
int size = 0;
int remaining = length - pos;
/* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
int uncomp_part_size = (hdr->key_frame ? 10 : 3);
/* number of bytes yet to send from header and the first partition */
int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
if (remainFirst > 0)
{
if (remainFirst <= mtu)
{
size = remainFirst;
}
else
{
size = mtu;
}
return size;
}
/* second partition; just slot it up according to MTU */
if (remaining <= mtu)
{
size = remaining;
return size;
}
return mtu;
}
void throw_packets(unsigned char* frame, int* size, int loss_rate,
int* thrown, int* kept)
{
unsigned char loss_frame[256*1024];
int pkg_size = 1;
int pos = 0;
int loss_pos = 0;
struct parsed_header hdr;
unsigned int tmp;
int mtu = 1500;
if (*size < 3)
{
return;
}
putc('|', stdout);
/* parse uncompressed 3 bytes */
tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
hdr.key_frame = !(tmp & 0x1); /* inverse logic */
hdr.version = (tmp >> 1) & 0x7;
hdr.show_frame = (tmp >> 4) & 0x1;
hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
/* don't drop key frames */
if (hdr.key_frame)
{
int i;
*kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
for (i=0; i < *kept; i++)
putc('.', stdout);
return;
}
while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
{
int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
if (*thrown == 0 && !loss_event)
{
memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
loss_pos += pkg_size;
(*kept)++;
putc('.', stdout);
}
else
{
(*thrown)++;
putc('X', stdout);
}
pos += pkg_size;
}
memcpy(frame, loss_frame, loss_pos);
memset(frame + loss_pos, 0, *size - loss_pos);
*size = loss_pos;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
/* Initialize codec */
flags = VPX_CODEC_USE_ERROR_CONCEALMENT;
res = vpx_codec_dec_init(&codec, interface, &dec_cfg, flags);
if(res)
die_codec(&codec, "Failed to initialize decoder");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
Usage
-----
This example adds a single argument to the `simple_decoder` example,
which specifies the range or pattern of frames to drop. The parameter is
parsed as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
if(argc < 4 || argc > 6)
die("Usage: %s <infile> <outfile> [-t <num threads>] <N-M|N/M|L,S>\n",
argv[0]);
{
char *nptr;
int arg_num = 3;
if (argc == 6 && strncmp(argv[arg_num++], "-t", 2) == 0)
dec_cfg.threads = strtol(argv[arg_num++], NULL, 0);
n = strtol(argv[arg_num], &nptr, 0);
mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
m = strtol(nptr+1, NULL, 0);
if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
*nptr != '\0' && *nptr != ','))
die("Couldn't parse pattern %s\n", argv[3]);
}
seed = (m > 0) ? m : (unsigned int)time(NULL);
srand(seed);thrown_frame = 0;
printf("Seed: %u\n", seed);
printf("Threads: %d\n", dec_cfg.threads);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
Dropping A Range Of Frames
--------------------------
To drop a range of frames, specify the starting frame and the ending
frame to drop, separated by a dash. The following command will drop
frames 5 through 10 (base 1).
$ ./decode_with_partial_drops in.ivf out.i420 5-10
Dropping A Pattern Of Frames
----------------------------
To drop a pattern of frames, specify the number of frames to drop and
the number of frames after which to repeat the pattern, separated by
a forward-slash. The following command will drop 3 of 7 frames.
Specifically, it will decode 4 frames, then drop 3 frames, and then
repeat.
$ ./decode_with_partial_drops in.ivf out.i420 3/7
Dropping Random Parts Of Frames
-------------------------------
A third argument tuple is available to split the frame into 1500 bytes pieces
and randomly drop pieces rather than frames. The frame will be split at
partition boundaries where possible. The following example will seed the RNG
with the seed 123 and drop approximately 5% of the pieces. Pieces which
are depending on an already dropped piece will also be dropped.
$ ./decode_with_partial_drops in.ivf out.i420 5,123
Extra Variables
---------------
This example maintains the pattern passed on the command line in the
`n`, `m`, and `is_range` variables:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
int n, m, mode;
unsigned int seed;
int thrown=0, kept=0;
int thrown_frame=0, kept_frame=0;
vpx_codec_dec_cfg_t dec_cfg = {0};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
Making The Drop Decision
------------------------
The example decides whether to drop the frame based on the current
frame number, immediately before decoding the frame.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
/* Decide whether to throw parts of the frame or the whole frame
depending on the drop mode */
thrown_frame = 0;
kept_frame = 0;
switch (mode)
{
case 0:
if (m - (frame_cnt-1)%m <= n)
{
frame_sz = 0;
}
break;
case 1:
if (frame_cnt >= n && frame_cnt <= m)
{
frame_sz = 0;
}
break;
case 2:
throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
break;
default: break;
}
if (mode < 2)
{
if (frame_sz == 0)
{
putc('X', stdout);
thrown_frame++;
}
else
{
putc('.', stdout);
kept_frame++;
}
}
thrown += thrown_frame;
kept += kept_frame;
fflush(stdout);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE

View File

@@ -12,6 +12,7 @@
/* /*
@*INTRODUCTION @*INTRODUCTION
*/ */
#include "vpx_config.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>

View File

@@ -1,7 +1,7 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
#define VPX_CODEC_DISABLE_COMPAT 1 #define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx/vpx_decoder.h" #include "vpx/vpx_decoder.h"
#include "vpx/vp8dx.h" #include "vpx/vp9dx.h"
#define interface (vpx_codec_vp8_dx()) #define interface (vpx_codec_vp8_dx())
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES

View File

@@ -1,7 +1,7 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
#define VPX_CODEC_DISABLE_COMPAT 1 #define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx/vpx_encoder.h" #include "vpx/vpx_encoder.h"
#include "vpx/vp8cx.h" #include "vpx/vp9cx.h"
#define interface (vpx_codec_vp8_cx()) #define interface (vpx_codec_vp8_cx())
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES

View File

@@ -51,7 +51,7 @@ Some codecs provide fine grained controls over their built-in
postprocessors. VP8 is one example. The following sample code toggles postprocessors. VP8 is one example. The following sample code toggles
postprocessing on and off every 15 frames. postprocessing on and off every 15 frames.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
#if CONFIG_VP8_DECODER #if CONFIG_VP9_DECODER
if(frame_cnt%30 == 1) { if(frame_cnt%30 == 1) {
vp8_postproc_cfg_t pp = {0, 0, 0}; vp8_postproc_cfg_t pp = {0, 0, 0};

View File

@@ -1,60 +1,54 @@
//#include <strmif.h> // #include <strmif.h>
#include "EbmlBufferWriter.h" #include "EbmlBufferWriter.h"
#include "EbmlWriter.h" #include "EbmlWriter.h"
//#include <cassert> // #include <cassert>
//#include <limits> // #include <limits>
//#include <malloc.h> //_alloca // #include <malloc.h> //_alloca
#include <stdlib.h> #include <stdlib.h>
#include <wchar.h> #include <wchar.h>
#include <string.h> #include <string.h>
void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
{ unsigned char *src = glob->buf;
unsigned char *src = glob->buf; src += glob->offset;
src += glob->offset; memcpy(src, buffer_in, len);
memcpy(src, buffer_in, len); glob->offset += len;
glob->offset += len;
} }
static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
{ while (q != p) {
while (q != p) --q;
{
--q;
unsigned long cbWritten; unsigned long cbWritten;
memcpy(&(glob->buf[glob->offset]), q, 1); memcpy(&(glob->buf[glob->offset]), q, 1);
glob->offset ++; glob->offset++;
} }
} }
void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
{ // assert(buf);
//assert(buf);
const unsigned char *const p = (const unsigned char *)(buffer_in); const unsigned char *const p = (const unsigned char *)(buffer_in);
const unsigned char *const q = p + len; const unsigned char *const q = p + len;
_Serialize(glob, p, q); _Serialize(glob, p, q);
} }
void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
{ Ebml_WriteID(glob, class_id);
Ebml_WriteID(glob, class_id); ebmlLoc->offset = glob->offset;
ebmlLoc->offset = glob->offset; // todo this is always taking 8 bytes, this may need later optimization
//todo this is always taking 8 bytes, this may need later optimization unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU;
unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLLU; Ebml_Serialize(glob, (void *)&unknownLen, 8); // this is a key that says lenght unknown
Ebml_Serialize(glob, (void *)&unknownLen, 8); //this is a key that says lenght unknown
} }
void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
{ unsigned long long size = glob->offset - ebmlLoc->offset - 8;
unsigned long long size = glob->offset - ebmlLoc->offset - 8; unsigned long long curOffset = glob->offset;
unsigned long long curOffset = glob->offset; glob->offset = ebmlLoc->offset;
glob->offset = ebmlLoc->offset; size |= 0x0100000000000000LLU;
size |= 0x0100000000000000LLU; Ebml_Serialize(glob, &size, 8);
Ebml_Serialize(glob, &size, 8); glob->offset = curOffset;
glob->offset = curOffset;
} }

View File

@@ -1,16 +1,14 @@
#ifndef EBMLBUFFERWRITER_HPP #ifndef EBMLBUFFERWRITER_HPP
#define EBMLBUFFERWRITER_HPP #define EBMLBUFFERWRITER_HPP
typedef struct typedef struct {
{ unsigned long long offset;
unsigned long long offset;
} EbmlLoc; } EbmlLoc;
typedef struct typedef struct {
{ unsigned char *buf;
unsigned char *buf; unsigned int length;
unsigned int length; unsigned int offset;
unsigned int offset;
} EbmlGlobal; } EbmlGlobal;

View File

@@ -12,35 +12,34 @@
/* Commenting out values not available in webm, but available in matroska */ /* Commenting out values not available in webm, but available in matroska */
enum mkv enum mkv {
{ EBML = 0x1A45DFA3,
EBML = 0x1A45DFA3, EBMLVersion = 0x4286,
EBMLVersion = 0x4286, EBMLReadVersion = 0x42F7,
EBMLReadVersion = 0x42F7, EBMLMaxIDLength = 0x42F2,
EBMLMaxIDLength = 0x42F2, EBMLMaxSizeLength = 0x42F3,
EBMLMaxSizeLength = 0x42F3, DocType = 0x4282,
DocType = 0x4282, DocTypeVersion = 0x4287,
DocTypeVersion = 0x4287, DocTypeReadVersion = 0x4285,
DocTypeReadVersion = 0x4285,
/* CRC_32 = 0xBF, */ /* CRC_32 = 0xBF, */
Void = 0xEC, Void = 0xEC,
SignatureSlot = 0x1B538667, SignatureSlot = 0x1B538667,
SignatureAlgo = 0x7E8A, SignatureAlgo = 0x7E8A,
SignatureHash = 0x7E9A, SignatureHash = 0x7E9A,
SignaturePublicKey = 0x7EA5, SignaturePublicKey = 0x7EA5,
Signature = 0x7EB5, Signature = 0x7EB5,
SignatureElements = 0x7E5B, SignatureElements = 0x7E5B,
SignatureElementList = 0x7E7B, SignatureElementList = 0x7E7B,
SignedElement = 0x6532, SignedElement = 0x6532,
/* segment */ /* segment */
Segment = 0x18538067, Segment = 0x18538067,
/* Meta Seek Information */ /* Meta Seek Information */
SeekHead = 0x114D9B74, SeekHead = 0x114D9B74,
Seek = 0x4DBB, Seek = 0x4DBB,
SeekID = 0x53AB, SeekID = 0x53AB,
SeekPosition = 0x53AC, SeekPosition = 0x53AC,
/* Segment Information */ /* Segment Information */
Info = 0x1549A966, Info = 0x1549A966,
/* SegmentUID = 0x73A4, */ /* SegmentUID = 0x73A4, */
/* SegmentFilename = 0x7384, */ /* SegmentFilename = 0x7384, */
/* PrevUID = 0x3CB923, */ /* PrevUID = 0x3CB923, */
@@ -52,61 +51,61 @@ enum mkv
/* ChapterTranslateEditionUID = 0x69FC, */ /* ChapterTranslateEditionUID = 0x69FC, */
/* ChapterTranslateCodec = 0x69BF, */ /* ChapterTranslateCodec = 0x69BF, */
/* ChapterTranslateID = 0x69A5, */ /* ChapterTranslateID = 0x69A5, */
TimecodeScale = 0x2AD7B1, TimecodeScale = 0x2AD7B1,
Segment_Duration = 0x4489, Segment_Duration = 0x4489,
DateUTC = 0x4461, DateUTC = 0x4461,
/* Title = 0x7BA9, */ /* Title = 0x7BA9, */
MuxingApp = 0x4D80, MuxingApp = 0x4D80,
WritingApp = 0x5741, WritingApp = 0x5741,
/* Cluster */ /* Cluster */
Cluster = 0x1F43B675, Cluster = 0x1F43B675,
Timecode = 0xE7, Timecode = 0xE7,
/* SilentTracks = 0x5854, */ /* SilentTracks = 0x5854, */
/* SilentTrackNumber = 0x58D7, */ /* SilentTrackNumber = 0x58D7, */
/* Position = 0xA7, */ /* Position = 0xA7, */
PrevSize = 0xAB, PrevSize = 0xAB,
BlockGroup = 0xA0, BlockGroup = 0xA0,
Block = 0xA1, Block = 0xA1,
/* BlockVirtual = 0xA2, */ /* BlockVirtual = 0xA2, */
/* BlockAdditions = 0x75A1, */ /* BlockAdditions = 0x75A1, */
/* BlockMore = 0xA6, */ /* BlockMore = 0xA6, */
/* BlockAddID = 0xEE, */ /* BlockAddID = 0xEE, */
/* BlockAdditional = 0xA5, */ /* BlockAdditional = 0xA5, */
BlockDuration = 0x9B, BlockDuration = 0x9B,
/* ReferencePriority = 0xFA, */ /* ReferencePriority = 0xFA, */
ReferenceBlock = 0xFB, ReferenceBlock = 0xFB,
/* ReferenceVirtual = 0xFD, */ /* ReferenceVirtual = 0xFD, */
/* CodecState = 0xA4, */ /* CodecState = 0xA4, */
/* Slices = 0x8E, */ /* Slices = 0x8E, */
/* TimeSlice = 0xE8, */ /* TimeSlice = 0xE8, */
LaceNumber = 0xCC, LaceNumber = 0xCC,
/* FrameNumber = 0xCD, */ /* FrameNumber = 0xCD, */
/* BlockAdditionID = 0xCB, */ /* BlockAdditionID = 0xCB, */
/* MkvDelay = 0xCE, */ /* MkvDelay = 0xCE, */
/* Cluster_Duration = 0xCF, */ /* Cluster_Duration = 0xCF, */
SimpleBlock = 0xA3, SimpleBlock = 0xA3,
/* EncryptedBlock = 0xAF, */ /* EncryptedBlock = 0xAF, */
/* Track */ /* Track */
Tracks = 0x1654AE6B, Tracks = 0x1654AE6B,
TrackEntry = 0xAE, TrackEntry = 0xAE,
TrackNumber = 0xD7, TrackNumber = 0xD7,
TrackUID = 0x73C5, TrackUID = 0x73C5,
TrackType = 0x83, TrackType = 0x83,
FlagEnabled = 0xB9, FlagEnabled = 0xB9,
FlagDefault = 0x88, FlagDefault = 0x88,
FlagForced = 0x55AA, FlagForced = 0x55AA,
FlagLacing = 0x9C, FlagLacing = 0x9C,
/* MinCache = 0x6DE7, */ /* MinCache = 0x6DE7, */
/* MaxCache = 0x6DF8, */ /* MaxCache = 0x6DF8, */
DefaultDuration = 0x23E383, DefaultDuration = 0x23E383,
/* TrackTimecodeScale = 0x23314F, */ /* TrackTimecodeScale = 0x23314F, */
/* TrackOffset = 0x537F, */ /* TrackOffset = 0x537F, */
/* MaxBlockAdditionID = 0x55EE, */ /* MaxBlockAdditionID = 0x55EE, */
Name = 0x536E, Name = 0x536E,
Language = 0x22B59C, Language = 0x22B59C,
CodecID = 0x86, CodecID = 0x86,
CodecPrivate = 0x63A2, CodecPrivate = 0x63A2,
CodecName = 0x258688, CodecName = 0x258688,
/* AttachmentLink = 0x7446, */ /* AttachmentLink = 0x7446, */
/* CodecSettings = 0x3A9697, */ /* CodecSettings = 0x3A9697, */
/* CodecInfoURL = 0x3B4040, */ /* CodecInfoURL = 0x3B4040, */
@@ -117,33 +116,33 @@ enum mkv
/* TrackTranslateEditionUID = 0x66FC, */ /* TrackTranslateEditionUID = 0x66FC, */
/* TrackTranslateCodec = 0x66BF, */ /* TrackTranslateCodec = 0x66BF, */
/* TrackTranslateTrackID = 0x66A5, */ /* TrackTranslateTrackID = 0x66A5, */
/* video */ /* video */
Video = 0xE0, Video = 0xE0,
FlagInterlaced = 0x9A, FlagInterlaced = 0x9A,
StereoMode = 0x53B8, StereoMode = 0x53B8,
PixelWidth = 0xB0, PixelWidth = 0xB0,
PixelHeight = 0xBA, PixelHeight = 0xBA,
PixelCropBottom = 0x54AA, PixelCropBottom = 0x54AA,
PixelCropTop = 0x54BB, PixelCropTop = 0x54BB,
PixelCropLeft = 0x54CC, PixelCropLeft = 0x54CC,
PixelCropRight = 0x54DD, PixelCropRight = 0x54DD,
DisplayWidth = 0x54B0, DisplayWidth = 0x54B0,
DisplayHeight = 0x54BA, DisplayHeight = 0x54BA,
DisplayUnit = 0x54B2, DisplayUnit = 0x54B2,
AspectRatioType = 0x54B3, AspectRatioType = 0x54B3,
/* ColourSpace = 0x2EB524, */ /* ColourSpace = 0x2EB524, */
/* GammaValue = 0x2FB523, */ /* GammaValue = 0x2FB523, */
FrameRate = 0x2383E3, FrameRate = 0x2383E3,
/* end video */ /* end video */
/* audio */ /* audio */
Audio = 0xE1, Audio = 0xE1,
SamplingFrequency = 0xB5, SamplingFrequency = 0xB5,
OutputSamplingFrequency = 0x78B5, OutputSamplingFrequency = 0x78B5,
Channels = 0x9F, Channels = 0x9F,
/* ChannelPositions = 0x7D7B, */ /* ChannelPositions = 0x7D7B, */
BitDepth = 0x6264, BitDepth = 0x6264,
/* end audio */ /* end audio */
/* content encoding */ /* content encoding */
/* ContentEncodings = 0x6d80, */ /* ContentEncodings = 0x6d80, */
/* ContentEncoding = 0x6240, */ /* ContentEncoding = 0x6240, */
/* ContentEncodingOrder = 0x5031, */ /* ContentEncodingOrder = 0x5031, */
@@ -159,22 +158,22 @@ enum mkv
/* ContentSigKeyID = 0x47e4, */ /* ContentSigKeyID = 0x47e4, */
/* ContentSigAlgo = 0x47e5, */ /* ContentSigAlgo = 0x47e5, */
/* ContentSigHashAlgo = 0x47e6, */ /* ContentSigHashAlgo = 0x47e6, */
/* end content encoding */ /* end content encoding */
/* Cueing Data */ /* Cueing Data */
Cues = 0x1C53BB6B, Cues = 0x1C53BB6B,
CuePoint = 0xBB, CuePoint = 0xBB,
CueTime = 0xB3, CueTime = 0xB3,
CueTrackPositions = 0xB7, CueTrackPositions = 0xB7,
CueTrack = 0xF7, CueTrack = 0xF7,
CueClusterPosition = 0xF1, CueClusterPosition = 0xF1,
CueBlockNumber = 0x5378 CueBlockNumber = 0x5378
/* CueCodecState = 0xEA, */ /* CueCodecState = 0xEA, */
/* CueReference = 0xDB, */ /* CueReference = 0xDB, */
/* CueRefTime = 0x96, */ /* CueRefTime = 0x96, */
/* CueRefCluster = 0x97, */ /* CueRefCluster = 0x97, */
/* CueRefNumber = 0x535F, */ /* CueRefNumber = 0x535F, */
/* CueRefCodecState = 0xEB, */ /* CueRefCodecState = 0xEB, */
/* Attachment */ /* Attachment */
/* Attachments = 0x1941A469, */ /* Attachments = 0x1941A469, */
/* AttachedFile = 0x61A7, */ /* AttachedFile = 0x61A7, */
/* FileDescription = 0x467E, */ /* FileDescription = 0x467E, */
@@ -183,7 +182,7 @@ enum mkv
/* FileData = 0x465C, */ /* FileData = 0x465C, */
/* FileUID = 0x46AE, */ /* FileUID = 0x46AE, */
/* FileReferral = 0x4675, */ /* FileReferral = 0x4675, */
/* Chapters */ /* Chapters */
/* Chapters = 0x1043A770, */ /* Chapters = 0x1043A770, */
/* EditionEntry = 0x45B9, */ /* EditionEntry = 0x45B9, */
/* EditionUID = 0x45BC, */ /* EditionUID = 0x45BC, */
@@ -211,7 +210,7 @@ enum mkv
/* ChapProcessCommand = 0x6911, */ /* ChapProcessCommand = 0x6911, */
/* ChapProcessTime = 0x6922, */ /* ChapProcessTime = 0x6922, */
/* ChapProcessData = 0x6933, */ /* ChapProcessData = 0x6933, */
/* Tagging */ /* Tagging */
/* Tags = 0x1254C367, */ /* Tags = 0x1254C367, */
/* Tag = 0x7373, */ /* Tag = 0x7373, */
/* Targets = 0x63C0, */ /* Targets = 0x63C0, */

View File

@@ -18,158 +18,140 @@
#define LITERALU64(n) n##LLU #define LITERALU64(n) n##LLU
#endif #endif
void Ebml_WriteLen(EbmlGlobal *glob, int64_t val) void Ebml_WriteLen(EbmlGlobal *glob, int64_t val) {
{ /* TODO check and make sure we are not > than 0x0100000000000000LLU */
/* TODO check and make sure we are not > than 0x0100000000000000LLU */ unsigned char size = 8; /* size in bytes to output */
unsigned char size = 8; /* size in bytes to output */
/* mask to compare for byte size */ /* mask to compare for byte size */
int64_t minVal = 0xff; int64_t minVal = 0xff;
for (size = 1; size < 8; size ++) for (size = 1; size < 8; size ++) {
{ if (val < minVal)
if (val < minVal) break;
break;
minVal = (minVal << 7); minVal = (minVal << 7);
}
val |= (((uint64_t)0x80) << ((size - 1) * 7));
Ebml_Serialize(glob, (void *) &val, sizeof(val), size);
}
void Ebml_WriteString(EbmlGlobal *glob, const char *str) {
const size_t size_ = strlen(str);
const uint64_t size = size_;
Ebml_WriteLen(glob, size);
/* TODO: it's not clear from the spec whether the nul terminator
* should be serialized too. For now we omit the null terminator.
*/
Ebml_Write(glob, str, (unsigned long)size);
}
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr) {
const size_t strlen = wcslen(wstr);
/* TODO: it's not clear from the spec whether the nul terminator
* should be serialized too. For now we include it.
*/
const uint64_t size = strlen;
Ebml_WriteLen(glob, size);
Ebml_Write(glob, wstr, (unsigned long)size);
}
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id) {
int len;
if (class_id >= 0x01000000)
len = 4;
else if (class_id >= 0x00010000)
len = 3;
else if (class_id >= 0x00000100)
len = 2;
else
len = 1;
Ebml_Serialize(glob, (void *)&class_id, sizeof(class_id), len);
}
void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui) {
unsigned char sizeSerialized = 8 | 0x80;
Ebml_WriteID(glob, class_id);
Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
Ebml_Serialize(glob, &ui, sizeof(ui), 8);
}
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui) {
unsigned char size = 8; /* size in bytes to output */
unsigned char sizeSerialized = 0;
unsigned long minVal;
Ebml_WriteID(glob, class_id);
minVal = 0x7fLU; /* mask to compare for byte size */
for (size = 1; size < 4; size ++) {
if (ui < minVal) {
break;
} }
val |= (((uint64_t)0x80) << ((size - 1) * 7)); minVal <<= 7;
}
Ebml_Serialize(glob, (void *) &val, sizeof(val), size); sizeSerialized = 0x80 | size;
} Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
Ebml_Serialize(glob, &ui, sizeof(ui), size);
void Ebml_WriteString(EbmlGlobal *glob, const char *str)
{
const size_t size_ = strlen(str);
const uint64_t size = size_;
Ebml_WriteLen(glob, size);
/* TODO: it's not clear from the spec whether the nul terminator
* should be serialized too. For now we omit the null terminator.
*/
Ebml_Write(glob, str, (unsigned long)size);
}
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr)
{
const size_t strlen = wcslen(wstr);
/* TODO: it's not clear from the spec whether the nul terminator
* should be serialized too. For now we include it.
*/
const uint64_t size = strlen;
Ebml_WriteLen(glob, size);
Ebml_Write(glob, wstr, (unsigned long)size);
}
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id)
{
int len;
if (class_id >= 0x01000000)
len = 4;
else if (class_id >= 0x00010000)
len = 3;
else if (class_id >= 0x00000100)
len = 2;
else
len = 1;
Ebml_Serialize(glob, (void *)&class_id, sizeof(class_id), len);
}
void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui)
{
unsigned char sizeSerialized = 8 | 0x80;
Ebml_WriteID(glob, class_id);
Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
Ebml_Serialize(glob, &ui, sizeof(ui), 8);
}
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui)
{
unsigned char size = 8; /* size in bytes to output */
unsigned char sizeSerialized = 0;
unsigned long minVal;
Ebml_WriteID(glob, class_id);
minVal = 0x7fLU; /* mask to compare for byte size */
for (size = 1; size < 4; size ++)
{
if (ui < minVal)
{
break;
}
minVal <<= 7;
}
sizeSerialized = 0x80 | size;
Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
Ebml_Serialize(glob, &ui, sizeof(ui), size);
} }
/* TODO: perhaps this is a poor name for this id serializer helper function */ /* TODO: perhaps this is a poor name for this id serializer helper function */
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long bin) void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long bin) {
{ int size;
int size; for (size = 4; size > 1; size--) {
for (size=4; size > 1; size--) if (bin & 0x000000ff << ((size - 1) * 8))
{ break;
if (bin & 0x000000ff << ((size-1) * 8)) }
break; Ebml_WriteID(glob, class_id);
} Ebml_WriteLen(glob, size);
Ebml_WriteID(glob, class_id); Ebml_WriteID(glob, bin);
Ebml_WriteLen(glob, size);
Ebml_WriteID(glob, bin);
} }
void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d) void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d) {
{ unsigned char len = 0x88;
unsigned char len = 0x88;
Ebml_WriteID(glob, class_id); Ebml_WriteID(glob, class_id);
Ebml_Serialize(glob, &len, sizeof(len), 1); Ebml_Serialize(glob, &len, sizeof(len), 1);
Ebml_Serialize(glob, &d, sizeof(d), 8); Ebml_Serialize(glob, &d, sizeof(d), 8);
} }
void Ebml_WriteSigned16(EbmlGlobal *glob, short val) void Ebml_WriteSigned16(EbmlGlobal *glob, short val) {
{ signed long out = ((val & 0x003FFFFF) | 0x00200000) << 8;
signed long out = ((val & 0x003FFFFF) | 0x00200000) << 8; Ebml_Serialize(glob, &out, sizeof(out), 3);
Ebml_Serialize(glob, &out, sizeof(out), 3);
} }
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s) void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s) {
{ Ebml_WriteID(glob, class_id);
Ebml_WriteID(glob, class_id); Ebml_WriteString(glob, s);
Ebml_WriteString(glob, s);
} }
void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s) void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s) {
{ Ebml_WriteID(glob, class_id);
Ebml_WriteID(glob, class_id); Ebml_WriteUTF8(glob, s);
Ebml_WriteUTF8(glob, s);
} }
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length) void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length) {
{ Ebml_WriteID(glob, class_id);
Ebml_WriteID(glob, class_id); Ebml_WriteLen(glob, data_length);
Ebml_WriteLen(glob, data_length); Ebml_Write(glob, data, data_length);
Ebml_Write(glob, data, data_length);
} }
void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize) void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize) {
{ unsigned char tmp = 0;
unsigned char tmp = 0; unsigned long i = 0;
unsigned long i = 0;
Ebml_WriteID(glob, 0xEC); Ebml_WriteID(glob, 0xEC);
Ebml_WriteLen(glob, vSize); Ebml_WriteLen(glob, vSize);
for (i = 0; i < vSize; i++) for (i = 0; i < vSize; i++) {
{ Ebml_Write(glob, &tmp, 1);
Ebml_Write(glob, &tmp, 1); }
}
} }
/* TODO Serialize Date */ /* TODO Serialize Date */

View File

@@ -14,106 +14,100 @@
#define kVorbisPrivateMaxSize 4000 #define kVorbisPrivateMaxSize 4000
void writeHeader(EbmlGlobal *glob) void writeHeader(EbmlGlobal *glob) {
{ EbmlLoc start;
EbmlLoc start; Ebml_StartSubElement(glob, &start, EBML);
Ebml_StartSubElement(glob, &start, EBML); Ebml_SerializeUnsigned(glob, EBMLVersion, 1);
Ebml_SerializeUnsigned(glob, EBMLVersion, 1); Ebml_SerializeUnsigned(glob, EBMLReadVersion, 1); // EBML Read Version
Ebml_SerializeUnsigned(glob, EBMLReadVersion, 1); //EBML Read Version Ebml_SerializeUnsigned(glob, EBMLMaxIDLength, 4); // EBML Max ID Length
Ebml_SerializeUnsigned(glob, EBMLMaxIDLength, 4); //EBML Max ID Length Ebml_SerializeUnsigned(glob, EBMLMaxSizeLength, 8); // EBML Max Size Length
Ebml_SerializeUnsigned(glob, EBMLMaxSizeLength, 8); //EBML Max Size Length Ebml_SerializeString(glob, DocType, "webm"); // Doc Type
Ebml_SerializeString(glob, DocType, "webm"); //Doc Type Ebml_SerializeUnsigned(glob, DocTypeVersion, 2); // Doc Type Version
Ebml_SerializeUnsigned(glob, DocTypeVersion, 2); //Doc Type Version Ebml_SerializeUnsigned(glob, DocTypeReadVersion, 2); // Doc Type Read Version
Ebml_SerializeUnsigned(glob, DocTypeReadVersion, 2); //Doc Type Read Version Ebml_EndSubElement(glob, &start);
Ebml_EndSubElement(glob, &start);
} }
void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode, void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode,
int isKeyframe, unsigned char lacingFlag, int discardable, int isKeyframe, unsigned char lacingFlag, int discardable,
unsigned char *data, unsigned long dataLength) unsigned char *data, unsigned long dataLength) {
{ Ebml_WriteID(glob, SimpleBlock);
Ebml_WriteID(glob, SimpleBlock); unsigned long blockLength = 4 + dataLength;
unsigned long blockLength = 4 + dataLength; blockLength |= 0x10000000; // TODO check length < 0x0FFFFFFFF
blockLength |= 0x10000000; //TODO check length < 0x0FFFFFFFF Ebml_Serialize(glob, &blockLength, sizeof(blockLength), 4);
Ebml_Serialize(glob, &blockLength, sizeof(blockLength), 4); trackNumber |= 0x80; // TODO check track nubmer < 128
trackNumber |= 0x80; //TODO check track nubmer < 128 Ebml_Write(glob, &trackNumber, 1);
Ebml_Write(glob, &trackNumber, 1); // Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
//Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes Ebml_Serialize(glob, &timeCode, sizeof(timeCode), 2);
Ebml_Serialize(glob, &timeCode, sizeof(timeCode), 2); unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable; Ebml_Write(glob, &flags, 1);
Ebml_Write(glob, &flags, 1); Ebml_Write(glob, data, dataLength);
Ebml_Write(glob, data, dataLength);
} }
static UInt64 generateTrackID(unsigned int trackNumber) static UInt64 generateTrackID(unsigned int trackNumber) {
{ UInt64 t = time(NULL) * trackNumber;
UInt64 t = time(NULL) * trackNumber; UInt64 r = rand();
UInt64 r = rand(); r = r << 32;
r = r << 32; r += rand();
r += rand(); UInt64 rval = t ^ r;
UInt64 rval = t ^ r; return rval;
return rval;
} }
void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing, void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
char *codecId, unsigned int pixelWidth, unsigned int pixelHeight, char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
double frameRate) double frameRate) {
{ EbmlLoc start;
EbmlLoc start; Ebml_StartSubElement(glob, &start, TrackEntry);
Ebml_StartSubElement(glob, &start, TrackEntry); Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber); UInt64 trackID = generateTrackID(trackNumber);
UInt64 trackID = generateTrackID(trackNumber); Ebml_SerializeUnsigned(glob, TrackUID, trackID);
Ebml_SerializeUnsigned(glob, TrackUID, trackID); Ebml_SerializeString(glob, CodecName, "VP8"); // TODO shouldn't be fixed
Ebml_SerializeString(glob, CodecName, "VP8"); //TODO shouldn't be fixed
Ebml_SerializeUnsigned(glob, TrackType, 1); //video is always 1 Ebml_SerializeUnsigned(glob, TrackType, 1); // video is always 1
Ebml_SerializeString(glob, CodecID, codecId); Ebml_SerializeString(glob, CodecID, codecId);
{ {
EbmlLoc videoStart; EbmlLoc videoStart;
Ebml_StartSubElement(glob, &videoStart, Video); Ebml_StartSubElement(glob, &videoStart, Video);
Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth); Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth);
Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight); Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight);
Ebml_SerializeFloat(glob, FrameRate, frameRate); Ebml_SerializeFloat(glob, FrameRate, frameRate);
Ebml_EndSubElement(glob, &videoStart); //Video Ebml_EndSubElement(glob, &videoStart); // Video
} }
Ebml_EndSubElement(glob, &start); //Track Entry Ebml_EndSubElement(glob, &start); // Track Entry
} }
void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing, void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
char *codecId, double samplingFrequency, unsigned int channels, char *codecId, double samplingFrequency, unsigned int channels,
unsigned char *private, unsigned long privateSize) unsigned char *private, unsigned long privateSize) {
{ EbmlLoc start;
EbmlLoc start; Ebml_StartSubElement(glob, &start, TrackEntry);
Ebml_StartSubElement(glob, &start, TrackEntry); Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber); UInt64 trackID = generateTrackID(trackNumber);
UInt64 trackID = generateTrackID(trackNumber); Ebml_SerializeUnsigned(glob, TrackUID, trackID);
Ebml_SerializeUnsigned(glob, TrackUID, trackID); Ebml_SerializeUnsigned(glob, TrackType, 2); // audio is always 2
Ebml_SerializeUnsigned(glob, TrackType, 2); //audio is always 2 // I am using defaults for thesed required fields
//I am using defaults for thesed required fields /* Ebml_SerializeUnsigned(glob, FlagEnabled, 1);
/* Ebml_SerializeUnsigned(glob, FlagEnabled, 1); Ebml_SerializeUnsigned(glob, FlagDefault, 1);
Ebml_SerializeUnsigned(glob, FlagDefault, 1); Ebml_SerializeUnsigned(glob, FlagForced, 1);
Ebml_SerializeUnsigned(glob, FlagForced, 1); Ebml_SerializeUnsigned(glob, FlagLacing, flagLacing);*/
Ebml_SerializeUnsigned(glob, FlagLacing, flagLacing);*/ Ebml_SerializeString(glob, CodecID, codecId);
Ebml_SerializeString(glob, CodecID, codecId); Ebml_SerializeData(glob, CodecPrivate, private, privateSize);
Ebml_SerializeData(glob, CodecPrivate, private, privateSize);
Ebml_SerializeString(glob, CodecName, "VORBIS"); //fixed for now Ebml_SerializeString(glob, CodecName, "VORBIS"); // fixed for now
{ {
EbmlLoc AudioStart; EbmlLoc AudioStart;
Ebml_StartSubElement(glob, &AudioStart, Audio); Ebml_StartSubElement(glob, &AudioStart, Audio);
Ebml_SerializeFloat(glob, SamplingFrequency, samplingFrequency); Ebml_SerializeFloat(glob, SamplingFrequency, samplingFrequency);
Ebml_SerializeUnsigned(glob, Channels, channels); Ebml_SerializeUnsigned(glob, Channels, channels);
Ebml_EndSubElement(glob, &AudioStart); Ebml_EndSubElement(glob, &AudioStart);
} }
Ebml_EndSubElement(glob, &start); Ebml_EndSubElement(glob, &start);
} }
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc* startInfo, unsigned long timeCodeScale, double duration) void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc *startInfo, unsigned long timeCodeScale, double duration) {
{ Ebml_StartSubElement(ebml, startInfo, Info);
Ebml_StartSubElement(ebml, startInfo, Info); Ebml_SerializeUnsigned(ebml, TimecodeScale, timeCodeScale);
Ebml_SerializeUnsigned(ebml, TimecodeScale, timeCodeScale); Ebml_SerializeFloat(ebml, Segment_Duration, duration * 1000.0); // Currently fixed to using milliseconds
Ebml_SerializeFloat(ebml, Segment_Duration, duration * 1000.0); //Currently fixed to using milliseconds Ebml_SerializeString(ebml, 0x4D80, "QTmuxingAppLibWebM-0.0.1");
Ebml_SerializeString(ebml, 0x4D80, "QTmuxingAppLibWebM-0.0.1"); Ebml_SerializeString(ebml, 0x5741, "QTwritingAppLibWebM-0.0.1");
Ebml_SerializeString(ebml, 0x5741, "QTwritingAppLibWebM-0.0.1"); Ebml_EndSubElement(ebml, startInfo);
Ebml_EndSubElement(ebml, startInfo);
} }
/* /*
@@ -142,7 +136,7 @@ void Mkv_WriteSegmentInformation(Ebml& ebml_out, SegmentInformationStruct& segme
Ebml_SerializeString(ebml_out, 0x7384, segmentInformation.filename); Ebml_SerializeString(ebml_out, 0x7384, segmentInformation.filename);
Ebml_SerializeUnsigned(ebml_out, 0x2AD7B1, segmentInformation.TimecodeScale); Ebml_SerializeUnsigned(ebml_out, 0x2AD7B1, segmentInformation.TimecodeScale);
Ebml_SerializeUnsigned(ebml_out, 0x4489, segmentInformation.Duration); Ebml_SerializeUnsigned(ebml_out, 0x4489, segmentInformation.Duration);
//TODO date // TODO date
Ebml_SerializeWString(ebml_out, 0x4D80, L"MKVMUX"); Ebml_SerializeWString(ebml_out, 0x4D80, L"MKVMUX");
Ebml_SerializeWString(ebml_out, 0x5741, segmentInformation.WritingApp); Ebml_SerializeWString(ebml_out, 0x5741, segmentInformation.WritingApp);
} }
@@ -173,9 +167,9 @@ static void Mkv_WriteGenericTrackData(Ebml& ebml_out, TrackStruct& track)
void Mkv_WriteVideoTrack(Ebml& ebml_out, TrackStruct & track, VideoTrackStruct& video) void Mkv_WriteVideoTrack(Ebml& ebml_out, TrackStruct & track, VideoTrackStruct& video)
{ {
EbmlLoc trackHeadLoc, videoHeadLoc; EbmlLoc trackHeadLoc, videoHeadLoc;
Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE); //start Track Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE); // start Track
Mkv_WriteGenericTrackData(ebml_out, track); Mkv_WriteGenericTrackData(ebml_out, track);
Ebml_StartSubElement(ebml_out, videoHeadLoc, 0xE0); //start Video Ebml_StartSubElement(ebml_out, videoHeadLoc, 0xE0); // start Video
Ebml_SerializeUnsigned(ebml_out, 0x9A, video.FlagInterlaced ? 1 :0); Ebml_SerializeUnsigned(ebml_out, 0x9A, video.FlagInterlaced ? 1 :0);
Ebml_SerializeUnsigned(ebml_out, 0xB0, video.PixelWidth); Ebml_SerializeUnsigned(ebml_out, 0xB0, video.PixelWidth);
Ebml_SerializeUnsigned(ebml_out, 0xBA, video.PixelHeight); Ebml_SerializeUnsigned(ebml_out, 0xBA, video.PixelHeight);
@@ -193,7 +187,7 @@ void Mkv_WriteAudioTrack(Ebml& ebml_out, TrackStruct & track, AudioTrackStruct&
EbmlLoc trackHeadLoc, audioHeadLoc; EbmlLoc trackHeadLoc, audioHeadLoc;
Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE); Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);
Mkv_WriteGenericTrackData(ebml_out, track); Mkv_WriteGenericTrackData(ebml_out, track);
Ebml_StartSubElement(ebml_out, audioHeadLoc, 0xE0); //start Audio Ebml_StartSubElement(ebml_out, audioHeadLoc, 0xE0); // start Audio
Ebml_SerializeFloat(ebml_out, 0xB5, video.SamplingFrequency); Ebml_SerializeFloat(ebml_out, 0xB5, video.SamplingFrequency);
Ebml_SerializeUnsigned(ebml_out, 0x9F, video.Channels); Ebml_SerializeUnsigned(ebml_out, 0x9F, video.Channels);
Ebml_SerializeUnsigned(ebml_out, 0x6264, video.BitDepth); Ebml_SerializeUnsigned(ebml_out, 0x6264, video.BitDepth);
@@ -213,7 +207,7 @@ void Mkv_WriteSimpleBlockHead(Ebml& ebml_out, EbmlLoc& ebmlLoc, SimpleBlockStru
Ebml_Write1UInt(ebml_out, block.TrackNumber); Ebml_Write1UInt(ebml_out, block.TrackNumber);
Ebml_WriteSigned16(ebml_out,block.TimeCode); Ebml_WriteSigned16(ebml_out,block.TimeCode);
unsigned char flags = 0x00 | (block.iskey ? 0x80:0x00) | (block.lacing << 1) | block.discardable; unsigned char flags = 0x00 | (block.iskey ? 0x80:0x00) | (block.lacing << 1) | block.discardable;
Ebml_Write1UInt(ebml_out, flags); //TODO this may be the wrong function Ebml_Write1UInt(ebml_out, flags); // TODO this may be the wrong function
Ebml_Serialize(ebml_out, block.data, block.dataLength); Ebml_Serialize(ebml_out, block.data, block.dataLength);
Ebml_EndSubElement(ebml_out,ebmlLoc); Ebml_EndSubElement(ebml_out,ebmlLoc);
} }

View File

@@ -17,8 +17,8 @@ void writeSimpleBock(EbmlGlobal *ebml, unsigned char trackNumber, unsigned short
// these are helper functions // these are helper functions
void writeHeader(EbmlGlobal *ebml); void writeHeader(EbmlGlobal *ebml);
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc* startInfo , unsigned long timeCodeScale, double duration); void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc *startInfo, unsigned long timeCodeScale, double duration);
//this function is a helper only, it assumes a lot of defaults // this function is a helper only, it assumes a lot of defaults
void writeVideoTrack(EbmlGlobal *ebml, unsigned int trackNumber, int flagLacing, void writeVideoTrack(EbmlGlobal *ebml, unsigned int trackNumber, int flagLacing,
char *codecId, unsigned int pixelWidth, unsigned int pixelHeight, char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
double frameRate); double frameRate);

View File

@@ -13,51 +13,50 @@
#include "WebMElement.h" #include "WebMElement.h"
#include <stdio.h> #include <stdio.h>
int main(int argc, char *argv[]) int main(int argc, char *argv[]) {
{ // init the datatype we're using for ebml output
//init the datatype we're using for ebml output unsigned char data[8192];
unsigned char data[8192]; EbmlGlobal ebml;
EbmlGlobal ebml; ebml.buf = data;
ebml.buf = data; ebml.offset = 0;
ebml.offset = 0; ebml.length = 8192;
ebml.length = 8192;
writeHeader(&ebml); writeHeader(&ebml);
{
EbmlLoc startSegment;
Ebml_StartSubElement(&ebml, &startSegment, Segment); // segment
{ {
EbmlLoc startSegment; // segment info
Ebml_StartSubElement(&ebml, &startSegment, Segment); //segment EbmlLoc startInfo;
{ Ebml_StartSubElement(&ebml, &startInfo, Info);
//segment info Ebml_SerializeString(&ebml, 0x4D80, "muxingAppLibMkv");
EbmlLoc startInfo; Ebml_SerializeString(&ebml, 0x5741, "writingAppLibMkv");
Ebml_StartSubElement(&ebml, &startInfo, Info); Ebml_EndSubElement(&ebml, &startInfo);
Ebml_SerializeString(&ebml, 0x4D80, "muxingAppLibMkv");
Ebml_SerializeString(&ebml, 0x5741, "writingAppLibMkv");
Ebml_EndSubElement(&ebml, &startInfo);
}
{
EbmlLoc trackStart;
Ebml_StartSubElement(&ebml, &trackStart, Tracks);
writeVideoTrack(&ebml, 1, 1, "V_MS/VFW/FOURCC", 320, 240, 29.97);
//writeAudioTrack(&ebml,2,1, "A_VORBIS", 32000, 1, NULL, 0);
Ebml_EndSubElement(&ebml, &trackStart);
}
{
EbmlLoc clusterStart;
Ebml_StartSubElement(&ebml, &clusterStart, Cluster); //cluster
Ebml_SerializeUnsigned(&ebml, Timecode, 0);
unsigned char someData[4] = {1, 2, 3, 4};
writeSimpleBlock(&ebml, 1, 0, 1, 0, 0, someData, 4);
Ebml_EndSubElement(&ebml, &clusterStart);
} //end cluster
Ebml_EndSubElement(&ebml, &startSegment);
} }
//dump ebml stuff to the file {
FILE *file_out = fopen("test.mkv", "wb"); EbmlLoc trackStart;
size_t bytesWritten = fwrite(data, 1, ebml.offset, file_out); Ebml_StartSubElement(&ebml, &trackStart, Tracks);
fclose(file_out); writeVideoTrack(&ebml, 1, 1, "V_MS/VFW/FOURCC", 320, 240, 29.97);
return 0; // writeAudioTrack(&ebml,2,1, "A_VORBIS", 32000, 1, NULL, 0);
Ebml_EndSubElement(&ebml, &trackStart);
}
{
EbmlLoc clusterStart;
Ebml_StartSubElement(&ebml, &clusterStart, Cluster); // cluster
Ebml_SerializeUnsigned(&ebml, Timecode, 0);
unsigned char someData[4] = {1, 2, 3, 4};
writeSimpleBlock(&ebml, 1, 0, 1, 0, 0, someData, 4);
Ebml_EndSubElement(&ebml, &clusterStart);
} // end cluster
Ebml_EndSubElement(&ebml, &startSegment);
}
// dump ebml stuff to the file
FILE *file_out = fopen("test.mkv", "wb");
size_t bytesWritten = fwrite(data, 1, ebml.offset, file_out);
fclose(file_out);
return 0;
} }

198
libs.mk
View File

@@ -17,6 +17,47 @@ else
ASM:=.asm ASM:=.asm
endif endif
#
# Calculate platform- and compiler-specific offsets for hand coded assembly
#
ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
OFFSET_PATTERN:='^[a-zA-Z0-9_]* EQU'
define asm_offsets_template
$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).S
@echo " [CREATE] $$@"
$$(qexec)LC_ALL=C grep $$(OFFSET_PATTERN) $$< | tr -d '$$$$\#' $$(ADS2GAS) > $$@
$$(BUILD_PFX)$(2).S: $(2)
CLEAN-OBJS += $$(BUILD_PFX)$(1) $(2).S
endef
else
ifeq ($(filter rvct,$(TGT_CC)), $(TGT_CC))
define asm_offsets_template
$$(BUILD_PFX)$(1): obj_int_extract
$$(BUILD_PFX)$(1): $$(BUILD_PFX)$(2).o
@echo " [CREATE] $$@"
$$(qexec)./obj_int_extract rvds $$< $$(ADS2GAS) > $$@
OBJS-yes += $$(BUILD_PFX)$(2).o
CLEAN-OBJS += $$(BUILD_PFX)$(1)
$$(filter %$$(ASM).o,$$(OBJS-yes)): $$(BUILD_PFX)$(1)
endef
endif # rvct
endif # !gcc
#
# Rule to generate runtime cpu detection files
#
define rtcd_h_template
$$(BUILD_PFX)$(1).h: $$(SRC_PATH_BARE)/$(2)
@echo " [CREATE] $$@"
$$(qexec)$$(SRC_PATH_BARE)/build/make/rtcd.sh --arch=$$(TGT_ISA) \
--sym=$(1) \
--config=$$(target)$$(if $$(FAT_ARCHS),,-$$(TOOLCHAIN)).mk \
$$(RTCD_OPTIONS) $$^ > $$@
CLEAN-OBJS += $$(BUILD_PFX)$(1).h
RTCD += $$(BUILD_PFX)$(1).h
endef
CODEC_SRCS-yes += CHANGELOG CODEC_SRCS-yes += CHANGELOG
CODEC_SRCS-yes += libs.mk CODEC_SRCS-yes += libs.mk
@@ -29,9 +70,12 @@ CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk
CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS)) CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS))
ifneq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),)
VP8_PREFIX=vp8/
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8_common.mk
endif
ifeq ($(CONFIG_VP8_ENCODER),yes) ifeq ($(CONFIG_VP8_ENCODER),yes)
VP8_PREFIX=vp8/
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS)) CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS)) CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
@@ -44,7 +88,6 @@ ifeq ($(CONFIG_VP8_ENCODER),yes)
endif endif
ifeq ($(CONFIG_VP8_DECODER),yes) ifeq ($(CONFIG_VP8_DECODER),yes)
VP8_PREFIX=vp8/
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS)) CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS))
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS)) CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS))
@@ -55,6 +98,35 @@ ifeq ($(CONFIG_VP8_DECODER),yes)
CODEC_DOC_SECTIONS += vp8 vp8_decoder CODEC_DOC_SECTIONS += vp8 vp8_decoder
endif endif
ifneq ($(CONFIG_VP9_ENCODER)$(CONFIG_VP9_DECODER),)
VP9_PREFIX=vp9/
include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9_common.mk
endif
ifeq ($(CONFIG_VP9_ENCODER),yes)
VP9_PREFIX=vp9/
include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9cx.mk
CODEC_SRCS-yes += $(addprefix $(VP9_PREFIX),$(call enabled,VP9_CX_SRCS))
CODEC_EXPORTS-yes += $(addprefix $(VP9_PREFIX),$(VP9_CX_EXPORTS))
CODEC_SRCS-yes += $(VP9_PREFIX)vp9cx.mk vpx/vp8.h vpx/vp8cx.h
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP9_PREFIX)/%
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
CODEC_DOC_SECTIONS += vp9 vp9_encoder
endif
ifeq ($(CONFIG_VP9_DECODER),yes)
VP9_PREFIX=vp9/
include $(SRC_PATH_BARE)/$(VP9_PREFIX)vp9dx.mk
CODEC_SRCS-yes += $(addprefix $(VP9_PREFIX),$(call enabled,VP9_DX_SRCS))
CODEC_EXPORTS-yes += $(addprefix $(VP9_PREFIX),$(VP9_DX_EXPORTS))
CODEC_SRCS-yes += $(VP9_PREFIX)vp9dx.mk vpx/vp8.h vpx/vp8dx.h
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP9_PREFIX)/%
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
CODEC_DOC_SECTIONS += vp9 vp9_decoder
endif
ifeq ($(CONFIG_ENCODERS),yes) ifeq ($(CONFIG_ENCODERS),yes)
CODEC_DOC_SECTIONS += encoder CODEC_DOC_SECTIONS += encoder
@@ -102,6 +174,7 @@ ifeq ($(ARCH_X86)$(ARCH_X86_64),yes)
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emms.asm CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emms.asm
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm
CODEC_SRCS-$(BUILD_LIBVPX) += third_party/x86inc/x86inc.asm
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_cpuid.c CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_cpuid.c
endif endif
CODEC_SRCS-$(ARCH_ARM) += vpx_ports/arm_cpudetect.c CODEC_SRCS-$(ARCH_ARM) += vpx_ports/arm_cpudetect.c
@@ -129,7 +202,8 @@ INSTALL-LIBS-$(CONFIG_STATIC) += $(LIBSUBDIR)/libvpx.a
INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a
endif endif
CODEC_SRCS=$(filter-out %_test.cc,$(call enabled,CODEC_SRCS)) CODEC_SRCS=$(filter-out %_offsets.c,\
$(filter-out %_test.cc,$(call enabled,CODEC_SRCS)))
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS) INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS)
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS) INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
@@ -171,8 +245,8 @@ CLEAN-OBJS += vpx.def
vpx.vcproj: $(CODEC_SRCS) vpx.def vpx.vcproj: $(CODEC_SRCS) vpx.def
@echo " [CREATE] $@" @echo " [CREATE] $@"
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \ $(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \
--lib \ $(if $(CONFIG_SHARED),--dll,--lib) \
--target=$(TOOLCHAIN) \ --target=$(TOOLCHAIN) \
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \ $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
--name=vpx \ --name=vpx \
--proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74 \ --proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74 \
@@ -184,7 +258,7 @@ vpx.vcproj: $(CODEC_SRCS) vpx.def
PROJECTS-$(BUILD_LIBVPX) += vpx.vcproj PROJECTS-$(BUILD_LIBVPX) += vpx.vcproj
vpx.vcproj: vpx_config.asm vpx.vcproj: vpx_config.asm
vpx.vcproj: vpx_rtcd.h vpx.vcproj: $(RTCD)
endif endif
else else
@@ -193,17 +267,29 @@ OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS)
LIBS-$(if $(BUILD_LIBVPX),$(CONFIG_STATIC)) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a LIBS-$(if $(BUILD_LIBVPX),$(CONFIG_STATIC)) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
$(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS) $(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
BUILD_LIBVPX_SO := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED)) BUILD_LIBVPX_SO := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED))
ifeq ($(filter darwin%,$(TGT_OS)),$(TGT_OS))
LIBVPX_SO := libvpx.$(VERSION_MAJOR).dylib
EXPORT_FILE := libvpx.syms
LIBVPX_SO_SYMLINKS := $(addprefix $(LIBSUBDIR)/, \
libvpx.dylib )
else
LIBVPX_SO := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) LIBVPX_SO := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)\ EXPORT_FILE := libvpx.ver
$(notdir $(LIBVPX_SO_SYMLINKS)) SYM_LINK := libvpx.so
$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) libvpx.ver
$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm
$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
$(BUILD_PFX)$(LIBVPX_SO): SO_VERSION_SCRIPT = libvpx.ver
LIBVPX_SO_SYMLINKS := $(addprefix $(LIBSUBDIR)/, \ LIBVPX_SO_SYMLINKS := $(addprefix $(LIBSUBDIR)/, \
libvpx.so libvpx.so.$(VERSION_MAJOR) \ libvpx.so libvpx.so.$(VERSION_MAJOR) \
libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR)) libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR))
endif
LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)\
$(notdir $(LIBVPX_SO_SYMLINKS))
$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) $(EXPORT_FILE)
$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm
$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
$(BUILD_PFX)$(LIBVPX_SO): EXPORTS_FILE = $(EXPORT_FILE)
libvpx.ver: $(call enabled,CODEC_EXPORTS) libvpx.ver: $(call enabled,CODEC_EXPORTS)
@echo " [CREATE] $@" @echo " [CREATE] $@"
@@ -212,10 +298,15 @@ libvpx.ver: $(call enabled,CODEC_EXPORTS)
$(qexec)echo "local: *; };" >> $@ $(qexec)echo "local: *; };" >> $@
CLEAN-OBJS += libvpx.ver CLEAN-OBJS += libvpx.ver
libvpx.syms: $(call enabled,CODEC_EXPORTS)
@echo " [CREATE] $@"
$(qexec)awk '{print "_"$$2}' $^ >$@
CLEAN-OBJS += libvpx.syms
define libvpx_symlink_template define libvpx_symlink_template
$(1): $(2) $(1): $(2)
@echo " [LN] $$@" @echo " [LN] $(2) $$@"
$(qexec)ln -sf $(LIBVPX_SO) $$@ $(qexec)ln -sf $(2) $$@
endef endef
$(eval $(call libvpx_symlink_template,\ $(eval $(call libvpx_symlink_template,\
@@ -225,8 +316,10 @@ $(eval $(call libvpx_symlink_template,\
$(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)),\ $(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)),\
$(DIST_DIR)/$(LIBSUBDIR)/$(LIBVPX_SO))) $(DIST_DIR)/$(LIBSUBDIR)/$(LIBVPX_SO)))
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBVPX_SO_SYMLINKS)
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBSUBDIR)/$(LIBVPX_SO) INSTALL-LIBS-$(BUILD_LIBVPX_SO) += $(LIBVPX_SO_SYMLINKS)
INSTALL-LIBS-$(BUILD_LIBVPX_SO) += $(LIBSUBDIR)/$(LIBVPX_SO)
LIBS-$(BUILD_LIBVPX) += vpx.pc LIBS-$(BUILD_LIBVPX) += vpx.pc
vpx.pc: config.mk libs.mk vpx.pc: config.mk libs.mk
@@ -242,7 +335,7 @@ vpx.pc: config.mk libs.mk
$(qexec)echo 'Version: $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)' >> $@ $(qexec)echo 'Version: $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)' >> $@
$(qexec)echo 'Requires:' >> $@ $(qexec)echo 'Requires:' >> $@
$(qexec)echo 'Conflicts:' >> $@ $(qexec)echo 'Conflicts:' >> $@
$(qexec)echo 'Libs: -L$${libdir} -lvpx' >> $@ $(qexec)echo 'Libs: -L$${libdir} -lvpx -lm' >> $@
$(qexec)echo 'Libs.private: -lm -lpthread' >> $@ $(qexec)echo 'Libs.private: -lm -lpthread' >> $@
$(qexec)echo 'Cflags: -I$${includedir}' >> $@ $(qexec)echo 'Cflags: -I$${includedir}' >> $@
INSTALL-LIBS-yes += $(LIBSUBDIR)/pkgconfig/vpx.pc INSTALL-LIBS-yes += $(LIBSUBDIR)/pkgconfig/vpx.pc
@@ -278,72 +371,10 @@ endif
$(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
#
# Calculate platform- and compiler-specific offsets for hand coded assembly
#
OFFSET_PATTERN:='^[a-zA-Z0-9_]* EQU'
ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
$(BUILD_PFX)asm_com_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
@echo " [CREATE] $@"
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
$(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S: $(VP8_PREFIX)common/asm_com_offsets.c
CLEAN-OBJS += $(BUILD_PFX)asm_com_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
$(BUILD_PFX)asm_enc_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S
@echo " [CREATE] $@"
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
$(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S: $(VP8_PREFIX)encoder/asm_enc_offsets.c
CLEAN-OBJS += $(BUILD_PFX)asm_enc_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S
$(BUILD_PFX)asm_dec_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
@echo " [CREATE] $@"
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
$(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S: $(VP8_PREFIX)decoder/asm_dec_offsets.c
CLEAN-OBJS += $(BUILD_PFX)asm_dec_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
else
ifeq ($(filter rvct,$(TGT_CC)), $(TGT_CC))
asm_com_offsets.asm: obj_int_extract
asm_com_offsets.asm: $(VP8_PREFIX)common/asm_com_offsets.c.o
@echo " [CREATE] $@"
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
OBJS-yes += $(VP8_PREFIX)common/asm_com_offsets.c.o
CLEAN-OBJS += asm_com_offsets.asm
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_com_offsets.asm
asm_enc_offsets.asm: obj_int_extract
asm_enc_offsets.asm: $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
@echo " [CREATE] $@"
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
OBJS-yes += $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
CLEAN-OBJS += asm_enc_offsets.asm
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_enc_offsets.asm
asm_dec_offsets.asm: obj_int_extract
asm_dec_offsets.asm: $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
@echo " [CREATE] $@"
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
OBJS-yes += $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
CLEAN-OBJS += asm_dec_offsets.asm
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_dec_offsets.asm
endif
endif
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h) $(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
#
# Rule to generate runtime cpu detection files
#
$(BUILD_PFX)vpx_rtcd.h: $(SRC_PATH_BARE)/$(sort $(filter %rtcd_defs.sh,$(CODEC_SRCS)))
@echo " [CREATE] $@"
$(qexec)$(SRC_PATH_BARE)/build/make/rtcd.sh --arch=$(TGT_ISA) \
--sym=vpx_rtcd \
--config=$(target)$(if $(FAT_ARCHS),,-$(TOOLCHAIN)).mk \
$(RTCD_OPTIONS) $^ > $@
CLEAN-OBJS += $(BUILD_PFX)vpx_rtcd.h
CODEC_DOC_SRCS += vpx/vpx_codec.h \ CODEC_DOC_SRCS += vpx/vpx_codec.h \
vpx/vpx_decoder.h \ vpx/vpx_decoder.h \
vpx/vpx_encoder.h \ vpx/vpx_encoder.h \
@@ -393,6 +424,7 @@ gtest.vcproj: $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc
--proj-guid=EC00E1EC-AF68-4D92-A255-181690D1C9B1 \ --proj-guid=EC00E1EC-AF68-4D92-A255-181690D1C9B1 \
--ver=$(CONFIG_VS_VERSION) \ --ver=$(CONFIG_VS_VERSION) \
--src-path-bare="$(SRC_PATH_BARE)" \ --src-path-bare="$(SRC_PATH_BARE)" \
-D_VARIADIC_MAX=10 \
--out=gtest.vcproj $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc \ --out=gtest.vcproj $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc \
-I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" -I"$(SRC_PATH_BARE)/third_party/googletest/src" -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" -I"$(SRC_PATH_BARE)/third_party/googletest/src"
@@ -404,6 +436,7 @@ test_libvpx.vcproj: $(LIBVPX_TEST_SRCS)
--exe \ --exe \
--target=$(TOOLCHAIN) \ --target=$(TOOLCHAIN) \
--name=test_libvpx \ --name=test_libvpx \
-D_VARIADIC_MAX=10 \
--proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \ --proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \
--ver=$(CONFIG_VS_VERSION) \ --ver=$(CONFIG_VS_VERSION) \
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \ $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
@@ -468,5 +501,8 @@ libs.doxy: $(CODEC_DOC_SRCS)
@echo "INCLUDE_PATH += ." >> $@; @echo "INCLUDE_PATH += ." >> $@;
@echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@ @echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@
## Generate vpx_rtcd.h for all objects ## Generate rtcd.h for all objects
$(OBJS-yes:.o=.d): $(BUILD_PFX)vpx_rtcd.h $(OBJS-yes:.o=.d): $(RTCD)
## Update the global src list
SRCS += $(CODEC_SRCS) $(LIBVPX_TEST_SRCS) $(GTEST_SRCS)

View File

@@ -25,25 +25,22 @@
#include "md5_utils.h" #include "md5_utils.h"
void void
byteSwap(UWORD32 *buf, unsigned words) byteSwap(UWORD32 *buf, unsigned words) {
{ md5byte *p;
md5byte *p;
/* Only swap bytes for big endian machines */ /* Only swap bytes for big endian machines */
int i = 1; int i = 1;
if (*(char *)&i == 1) if (*(char *)&i == 1)
return; return;
p = (md5byte *)buf; p = (md5byte *)buf;
do do {
{ *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
*buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 | ((unsigned)p[1] << 8 | p[0]);
((unsigned)p[1] << 8 | p[0]); p += 4;
p += 4; } while (--words);
}
while (--words);
} }
/* /*
@@ -51,15 +48,14 @@ byteSwap(UWORD32 *buf, unsigned words)
* initialization constants. * initialization constants.
*/ */
void void
MD5Init(struct MD5Context *ctx) MD5Init(struct MD5Context *ctx) {
{ ctx->buf[0] = 0x67452301;
ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89;
ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe;
ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476;
ctx->buf[3] = 0x10325476;
ctx->bytes[0] = 0; ctx->bytes[0] = 0;
ctx->bytes[1] = 0; ctx->bytes[1] = 0;
} }
/* /*
@@ -67,44 +63,41 @@ MD5Init(struct MD5Context *ctx)
* of bytes. * of bytes.
*/ */
void void
MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) {
{ UWORD32 t;
UWORD32 t;
/* Update byte count */ /* Update byte count */
t = ctx->bytes[0]; t = ctx->bytes[0];
if ((ctx->bytes[0] = t + len) < t) if ((ctx->bytes[0] = t + len) < t)
ctx->bytes[1]++; /* Carry from low to high */ ctx->bytes[1]++; /* Carry from low to high */
t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */
if (t > len) if (t > len) {
{ memcpy((md5byte *)ctx->in + 64 - t, buf, len);
memcpy((md5byte *)ctx->in + 64 - t, buf, len); return;
return; }
}
/* First chunk is an odd size */ /* First chunk is an odd size */
memcpy((md5byte *)ctx->in + 64 - t, buf, t); memcpy((md5byte *)ctx->in + 64 - t, buf, t);
byteSwap(ctx->in, 16);
MD5Transform(ctx->buf, ctx->in);
buf += t;
len -= t;
/* Process data in 64-byte chunks */
while (len >= 64) {
memcpy(ctx->in, buf, 64);
byteSwap(ctx->in, 16); byteSwap(ctx->in, 16);
MD5Transform(ctx->buf, ctx->in); MD5Transform(ctx->buf, ctx->in);
buf += t; buf += 64;
len -= t; len -= 64;
}
/* Process data in 64-byte chunks */ /* Handle any remaining bytes of data. */
while (len >= 64) memcpy(ctx->in, buf, len);
{
memcpy(ctx->in, buf, 64);
byteSwap(ctx->in, 16);
MD5Transform(ctx->buf, ctx->in);
buf += 64;
len -= 64;
}
/* Handle any remaining bytes of data. */
memcpy(ctx->in, buf, len);
} }
/* /*
@@ -112,37 +105,35 @@ MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len)
* 1 0* (64-bit count of bits processed, MSB-first) * 1 0* (64-bit count of bits processed, MSB-first)
*/ */
void void
MD5Final(md5byte digest[16], struct MD5Context *ctx) MD5Final(md5byte digest[16], struct MD5Context *ctx) {
{ int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ md5byte *p = (md5byte *)ctx->in + count;
md5byte *p = (md5byte *)ctx->in + count;
/* Set the first char of padding to 0x80. There is always room. */ /* Set the first char of padding to 0x80. There is always room. */
*p++ = 0x80; *p++ = 0x80;
/* Bytes of padding needed to make 56 bytes (-8..55) */ /* Bytes of padding needed to make 56 bytes (-8..55) */
count = 56 - 1 - count; count = 56 - 1 - count;
if (count < 0) /* Padding forces an extra block */ if (count < 0) { /* Padding forces an extra block */
{ memset(p, 0, count + 8);
memset(p, 0, count + 8); byteSwap(ctx->in, 16);
byteSwap(ctx->in, 16);
MD5Transform(ctx->buf, ctx->in);
p = (md5byte *)ctx->in;
count = 56;
}
memset(p, 0, count);
byteSwap(ctx->in, 14);
/* Append length in bits and transform */
ctx->in[14] = ctx->bytes[0] << 3;
ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
MD5Transform(ctx->buf, ctx->in); MD5Transform(ctx->buf, ctx->in);
p = (md5byte *)ctx->in;
count = 56;
}
byteSwap(ctx->buf, 4); memset(p, 0, count);
memcpy(digest, ctx->buf, 16); byteSwap(ctx->in, 14);
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
/* Append length in bits and transform */
ctx->in[14] = ctx->bytes[0] << 3;
ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
MD5Transform(ctx->buf, ctx->in);
byteSwap(ctx->buf, 4);
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
} }
#ifndef ASM_MD5 #ifndef ASM_MD5
@@ -157,7 +148,7 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx)
/* This is the central step in the MD5 algorithm. */ /* This is the central step in the MD5 algorithm. */
#define MD5STEP(f,w,x,y,z,in,s) \ #define MD5STEP(f,w,x,y,z,in,s) \
(w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x) (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
/* /*
* The core of the MD5 algorithm, this alters an existing MD5 hash to * The core of the MD5 algorithm, this alters an existing MD5 hash to
@@ -165,87 +156,86 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx)
* the data and converts bytes into longwords for this routine. * the data and converts bytes into longwords for this routine.
*/ */
void void
MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) {
{ register UWORD32 a, b, c, d;
register UWORD32 a, b, c, d;
a = buf[0]; a = buf[0];
b = buf[1]; b = buf[1];
c = buf[2]; c = buf[2];
d = buf[3]; d = buf[3];
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
buf[0] += a; buf[0] += a;
buf[1] += b; buf[1] += b;
buf[2] += c; buf[2] += c;
buf[3] += d; buf[3] += d;
} }
#endif #endif

View File

@@ -27,11 +27,10 @@
#define UWORD32 unsigned int #define UWORD32 unsigned int
typedef struct MD5Context MD5Context; typedef struct MD5Context MD5Context;
struct MD5Context struct MD5Context {
{ UWORD32 buf[4];
UWORD32 buf[4]; UWORD32 bytes[2];
UWORD32 bytes[2]; UWORD32 in[16];
UWORD32 in[16];
}; };
void MD5Init(struct MD5Context *context); void MD5Init(struct MD5Context *context);

View File

@@ -67,6 +67,7 @@ extern "C" {
#define NESTEGG_CODEC_VP8 0 /**< Track uses Google On2 VP8 codec. */ #define NESTEGG_CODEC_VP8 0 /**< Track uses Google On2 VP8 codec. */
#define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */ #define NESTEGG_CODEC_VORBIS 1 /**< Track uses Xiph Vorbis codec. */
#define NESTEGG_CODEC_VP9 2 /**< Track uses Google On2 VP9 codec. */
#define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */ #define NESTEGG_SEEK_SET 0 /**< Seek offset relative to beginning of stream. */
#define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */ #define NESTEGG_SEEK_CUR 1 /**< Seek offset relative to current position in stream. */

View File

@@ -127,6 +127,7 @@ enum ebml_type_enum {
/* Track IDs */ /* Track IDs */
#define TRACK_ID_VP8 "V_VP8" #define TRACK_ID_VP8 "V_VP8"
#define TRACK_ID_VP9 "V_VP9"
#define TRACK_ID_VORBIS "A_VORBIS" #define TRACK_ID_VORBIS "A_VORBIS"
enum vint_mask { enum vint_mask {
@@ -1669,6 +1670,9 @@ nestegg_track_codec_id(nestegg * ctx, unsigned int track)
if (strcmp(codec_id, TRACK_ID_VP8) == 0) if (strcmp(codec_id, TRACK_ID_VP8) == 0)
return NESTEGG_CODEC_VP8; return NESTEGG_CODEC_VP8;
if (strcmp(codec_id, TRACK_ID_VP9) == 0)
return NESTEGG_CODEC_VP9;
if (strcmp(codec_id, TRACK_ID_VORBIS) == 0) if (strcmp(codec_id, TRACK_ID_VORBIS) == 0)
return NESTEGG_CODEC_VORBIS; return NESTEGG_CODEC_VORBIS;

356
test/dct16x16_test.cc Normal file
View File

@@ -0,0 +1,356 @@
/*
* 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 <math.h>
#include <stdlib.h>
#include <string.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" {
#include "vp9/common/entropy.h"
#include "vp9_rtcd.h"
}
#include "acm_random.h"
#include "vpx/vpx_integer.h"
using libvpx_test::ACMRandom;
namespace {
const double PI = 3.1415926535898;
void reference2_16x16_idct_2d(double *input, double *output) {
double x;
for (int l = 0; l < 16; ++l) {
for (int k = 0; k < 16; ++k) {
double s = 0;
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 16; ++j) {
x=cos(PI*j*(l+0.5)/16.0)*cos(PI*i*(k+0.5)/16.0)*input[i*16+j]/256;
if (i != 0)
x *= sqrt(2.0);
if (j != 0)
x *= sqrt(2.0);
s += x;
}
}
output[k*16+l] = s;
}
}
}
static const double C1 = 0.995184726672197;
static const double C2 = 0.98078528040323;
static const double C3 = 0.956940335732209;
static const double C4 = 0.923879532511287;
static const double C5 = 0.881921264348355;
static const double C6 = 0.831469612302545;
static const double C7 = 0.773010453362737;
static const double C8 = 0.707106781186548;
static const double C9 = 0.634393284163646;
static const double C10 = 0.555570233019602;
static const double C11 = 0.471396736825998;
static const double C12 = 0.38268343236509;
static const double C13 = 0.290284677254462;
static const double C14 = 0.195090322016128;
static const double C15 = 0.098017140329561;
static void butterfly_16x16_dct_1d(double input[16], double output[16]) {
double step[16];
double intermediate[16];
double temp1, temp2;
// step 1
step[ 0] = input[0] + input[15];
step[ 1] = input[1] + input[14];
step[ 2] = input[2] + input[13];
step[ 3] = input[3] + input[12];
step[ 4] = input[4] + input[11];
step[ 5] = input[5] + input[10];
step[ 6] = input[6] + input[ 9];
step[ 7] = input[7] + input[ 8];
step[ 8] = input[7] - input[ 8];
step[ 9] = input[6] - input[ 9];
step[10] = input[5] - input[10];
step[11] = input[4] - input[11];
step[12] = input[3] - input[12];
step[13] = input[2] - input[13];
step[14] = input[1] - input[14];
step[15] = input[0] - input[15];
// step 2
output[0] = step[0] + step[7];
output[1] = step[1] + step[6];
output[2] = step[2] + step[5];
output[3] = step[3] + step[4];
output[4] = step[3] - step[4];
output[5] = step[2] - step[5];
output[6] = step[1] - step[6];
output[7] = step[0] - step[7];
temp1 = step[ 8]*C7;
temp2 = step[15]*C9;
output[ 8] = temp1 + temp2;
temp1 = step[ 9]*C11;
temp2 = step[14]*C5;
output[ 9] = temp1 - temp2;
temp1 = step[10]*C3;
temp2 = step[13]*C13;
output[10] = temp1 + temp2;
temp1 = step[11]*C15;
temp2 = step[12]*C1;
output[11] = temp1 - temp2;
temp1 = step[11]*C1;
temp2 = step[12]*C15;
output[12] = temp2 + temp1;
temp1 = step[10]*C13;
temp2 = step[13]*C3;
output[13] = temp2 - temp1;
temp1 = step[ 9]*C5;
temp2 = step[14]*C11;
output[14] = temp2 + temp1;
temp1 = step[ 8]*C9;
temp2 = step[15]*C7;
output[15] = temp2 - temp1;
// step 3
step[ 0] = output[0] + output[3];
step[ 1] = output[1] + output[2];
step[ 2] = output[1] - output[2];
step[ 3] = output[0] - output[3];
temp1 = output[4]*C14;
temp2 = output[7]*C2;
step[ 4] = temp1 + temp2;
temp1 = output[5]*C10;
temp2 = output[6]*C6;
step[ 5] = temp1 + temp2;
temp1 = output[5]*C6;
temp2 = output[6]*C10;
step[ 6] = temp2 - temp1;
temp1 = output[4]*C2;
temp2 = output[7]*C14;
step[ 7] = temp2 - temp1;
step[ 8] = output[ 8] + output[11];
step[ 9] = output[ 9] + output[10];
step[10] = output[ 9] - output[10];
step[11] = output[ 8] - output[11];
step[12] = output[12] + output[15];
step[13] = output[13] + output[14];
step[14] = output[13] - output[14];
step[15] = output[12] - output[15];
// step 4
output[ 0] = (step[ 0] + step[ 1]);
output[ 8] = (step[ 0] - step[ 1]);
temp1 = step[2]*C12;
temp2 = step[3]*C4;
temp1 = temp1 + temp2;
output[ 4] = 2*(temp1*C8);
temp1 = step[2]*C4;
temp2 = step[3]*C12;
temp1 = temp2 - temp1;
output[12] = 2*(temp1*C8);
output[ 2] = 2*((step[4] + step[ 5])*C8);
output[14] = 2*((step[7] - step[ 6])*C8);
temp1 = step[4] - step[5];
temp2 = step[6] + step[7];
output[ 6] = (temp1 + temp2);
output[10] = (temp1 - temp2);
intermediate[8] = step[8] + step[14];
intermediate[9] = step[9] + step[15];
temp1 = intermediate[8]*C12;
temp2 = intermediate[9]*C4;
temp1 = temp1 - temp2;
output[3] = 2*(temp1*C8);
temp1 = intermediate[8]*C4;
temp2 = intermediate[9]*C12;
temp1 = temp2 + temp1;
output[13] = 2*(temp1*C8);
output[ 9] = 2*((step[10] + step[11])*C8);
intermediate[11] = step[10] - step[11];
intermediate[12] = step[12] + step[13];
intermediate[13] = step[12] - step[13];
intermediate[14] = step[ 8] - step[14];
intermediate[15] = step[ 9] - step[15];
output[15] = (intermediate[11] + intermediate[12]);
output[ 1] = -(intermediate[11] - intermediate[12]);
output[ 7] = 2*(intermediate[13]*C8);
temp1 = intermediate[14]*C12;
temp2 = intermediate[15]*C4;
temp1 = temp1 - temp2;
output[11] = -2*(temp1*C8);
temp1 = intermediate[14]*C4;
temp2 = intermediate[15]*C12;
temp1 = temp2 + temp1;
output[ 5] = 2*(temp1*C8);
}
static void reference_16x16_dct_1d(double in[16], double out[16]) {
const double kPi = 3.141592653589793238462643383279502884;
const double kInvSqrt2 = 0.707106781186547524400844362104;
for (int k = 0; k < 16; k++) {
out[k] = 0.0;
for (int n = 0; n < 16; n++)
out[k] += in[n]*cos(kPi*(2*n+1)*k/32.0);
if (k == 0)
out[k] = out[k]*kInvSqrt2;
}
}
void reference_16x16_dct_2d(int16_t input[16*16], double output[16*16]) {
// First transform columns
for (int i = 0; i < 16; ++i) {
double temp_in[16], temp_out[16];
for (int j = 0; j < 16; ++j)
temp_in[j] = input[j*16 + i];
butterfly_16x16_dct_1d(temp_in, temp_out);
for (int j = 0; j < 16; ++j)
output[j*16 + i] = temp_out[j];
}
// Then transform rows
for (int i = 0; i < 16; ++i) {
double temp_in[16], temp_out[16];
for (int j = 0; j < 16; ++j)
temp_in[j] = output[j + i*16];
butterfly_16x16_dct_1d(temp_in, temp_out);
// Scale by some magic number
for (int j = 0; j < 16; ++j)
output[j + i*16] = temp_out[j]/2;
}
}
TEST(VP9Idct16x16Test, AccuracyCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
const int count_test_block = 1000;
for (int i = 0; i < count_test_block; ++i) {
int16_t in[256], coeff[256];
int16_t out_c[256];
double out_r[256];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 256; ++j)
in[j] = rnd.Rand8() - rnd.Rand8();
reference_16x16_dct_2d(in, out_r);
for (int j = 0; j < 256; j++)
coeff[j] = round(out_r[j]);
vp9_short_idct16x16_c(coeff, out_c, 32);
for (int j = 0; j < 256; ++j) {
const int diff = out_c[j] - in[j];
const int error = diff * diff;
EXPECT_GE(1, error)
<< "Error: 16x16 IDCT has error " << error
<< " at index " << j;
}
vp9_short_fdct16x16_c(in, out_c, 32);
for (int j = 0; j < 256; ++j) {
const double diff = coeff[j] - out_c[j];
const double error = diff * diff;
EXPECT_GE(1.0, error)
<< "Error: 16x16 FDCT has error " << error
<< " at index " << j;
}
}
}
TEST(VP9Fdct16x16Test, AccuracyCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int max_error = 0;
double total_error = 0;
const int count_test_block = 1000;
for (int i = 0; i < count_test_block; ++i) {
int16_t test_input_block[256];
int16_t test_temp_block[256];
int16_t test_output_block[256];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 256; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
const int pitch = 32;
vp9_short_fdct16x16_c(test_input_block, test_temp_block, pitch);
vp9_short_idct16x16_c(test_temp_block, test_output_block, pitch);
for (int j = 0; j < 256; ++j) {
const int diff = test_input_block[j] - test_output_block[j];
const int error = diff * diff;
if (max_error < error)
max_error = error;
total_error += error;
}
}
EXPECT_GE(1, max_error)
<< "Error: 16x16 FDCT/IDCT has an individual roundtrip error > 1";
EXPECT_GE(count_test_block/10, total_error)
<< "Error: 16x16 FDCT/IDCT has average roundtrip error > 1/10 per block";
}
TEST(VP9Fdct16x16Test, CoeffSizeCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
const int count_test_block = 1000;
for (int i = 0; i < count_test_block; ++i) {
int16_t input_block[256], input_extreme_block[256];
int16_t output_block[256], output_extreme_block[256];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 256; ++j) {
input_block[j] = rnd.Rand8() - rnd.Rand8();
input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255;
}
if (i == 0)
for (int j = 0; j < 256; ++j)
input_extreme_block[j] = 255;
const int pitch = 32;
vp9_short_fdct16x16_c(input_block, output_block, pitch);
vp9_short_fdct16x16_c(input_extreme_block, output_extreme_block, pitch);
// The minimum quant value is 4.
for (int j = 0; j < 256; ++j) {
EXPECT_GE(4*DCT_MAX_VALUE, abs(output_block[j]))
<< "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE";
EXPECT_GE(4*DCT_MAX_VALUE, abs(output_extreme_block[j]))
<< "Error: 16x16 FDCT extreme has coefficient larger than 4*DCT_MAX_VALUE";
}
}
}
} // namespace

View File

@@ -1,79 +1,31 @@
/* /*
* Copyright (c) 2012 The WebM project authors. All Rights Reserved. * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
* *
* Use of this source code is governed by a BSD-style license * 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 * that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found * tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may * in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include <math.h> #include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/types.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" { extern "C" {
#include "vpx_rtcd.h" #include "vp9_rtcd.h"
} }
#include "test/acm_random.h" #include "acm_random.h"
#include "third_party/googletest/src/include/gtest/gtest.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
namespace {
const int cospi8sqrt2minus1 = 20091;
const int sinpi8sqrt2 = 35468;
void reference_idct4x4(const int16_t *input, int16_t *output) {
const int16_t *ip = input;
int16_t *op = output;
for (int i = 0; i < 4; ++i) {
const int a1 = ip[0] + ip[8];
const int b1 = ip[0] - ip[8];
const int temp1 = (ip[4] * sinpi8sqrt2) >> 16;
const int temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
const int c1 = temp1 - temp2;
const int temp3 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
const int temp4 = (ip[12] * sinpi8sqrt2) >> 16;
const int d1 = temp3 + temp4;
op[0] = a1 + d1;
op[12] = a1 - d1;
op[4] = b1 + c1;
op[8] = b1 - c1;
++ip;
++op;
}
ip = output;
op = output;
for (int i = 0; i < 4; ++i) {
const int a1 = ip[0] + ip[2];
const int b1 = ip[0] - ip[2];
const int temp1 = (ip[1] * sinpi8sqrt2) >> 16;
const int temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
const int c1 = temp1 - temp2;
const int temp3 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
const int temp4 = (ip[3] * sinpi8sqrt2) >> 16;
const int d1 = temp3 + temp4;
op[0] = (a1 + d1 + 4) >> 3;
op[3] = (a1 - d1 + 4) >> 3;
op[1] = (b1 + c1 + 4) >> 3;
op[2] = (b1 - c1 + 4) >> 3;
ip += 4;
op += 4;
}
}
using libvpx_test::ACMRandom; using libvpx_test::ACMRandom;
TEST(Vp8FdctTest, SignBiasCheck) { namespace {
TEST(Vp9FdctTest, SignBiasCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed()); ACMRandom rnd(ACMRandom::DeterministicSeed());
int16_t test_input_block[16]; int16_t test_input_block[16];
int16_t test_output_block[16]; int16_t test_output_block[16];
@@ -88,7 +40,9 @@ TEST(Vp8FdctTest, SignBiasCheck) {
for (int j = 0; j < 16; ++j) for (int j = 0; j < 16; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8(); test_input_block[j] = rnd.Rand8() - rnd.Rand8();
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch); // TODO(Yaowu): this should be converted to a parameterized test
// to test optimized versions of this function.
vp9_short_fdct4x4_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 16; ++j) { for (int j = 0; j < 16; ++j) {
if (test_output_block[j] < 0) if (test_output_block[j] < 0)
@@ -98,13 +52,13 @@ TEST(Vp8FdctTest, SignBiasCheck) {
} }
} }
bool bias_acceptable = true; for (int j = 0; j < 16; ++j) {
for (int j = 0; j < 16; ++j) const bool bias_acceptable = (abs(count_sign_block[j][0] -
bias_acceptable = bias_acceptable && count_sign_block[j][1]) < 10000);
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 10000); EXPECT_TRUE(bias_acceptable)
<< "Error: 4x4 FDCT has a sign bias > 1%"
EXPECT_EQ(true, bias_acceptable) << " for input range [-255, 255] at index " << j;
<< "Error: 4x4 FDCT has a sign bias > 1% for input range [-255, 255]"; }
memset(count_sign_block, 0, sizeof(count_sign_block)); memset(count_sign_block, 0, sizeof(count_sign_block));
@@ -113,7 +67,9 @@ TEST(Vp8FdctTest, SignBiasCheck) {
for (int j = 0; j < 16; ++j) for (int j = 0; j < 16; ++j)
test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4); test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch); // TODO(Yaowu): this should be converted to a parameterized test
// to test optimized versions of this function.
vp9_short_fdct4x4_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 16; ++j) { for (int j = 0; j < 16; ++j) {
if (test_output_block[j] < 0) if (test_output_block[j] < 0)
@@ -123,16 +79,16 @@ TEST(Vp8FdctTest, SignBiasCheck) {
} }
} }
bias_acceptable = true; for (int j = 0; j < 16; ++j) {
for (int j = 0; j < 16; ++j) const bool bias_acceptable = (abs(count_sign_block[j][0] -
bias_acceptable = bias_acceptable && count_sign_block[j][1]) < 100000);
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 100000); EXPECT_TRUE(bias_acceptable)
<< "Error: 4x4 FDCT has a sign bias > 10%"
EXPECT_EQ(true, bias_acceptable) << " for input range [-15, 15] at index " << j;
<< "Error: 4x4 FDCT has a sign bias > 10% for input range [-15, 15]"; }
}; };
TEST(Vp8FdctTest, RoundTripErrorCheck) { TEST(Vp9FdctTest, RoundTripErrorCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed()); ACMRandom rnd(ACMRandom::DeterministicSeed());
int max_error = 0; int max_error = 0;
double total_error = 0; double total_error = 0;
@@ -146,9 +102,25 @@ TEST(Vp8FdctTest, RoundTripErrorCheck) {
for (int j = 0; j < 16; ++j) for (int j = 0; j < 16; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8(); test_input_block[j] = rnd.Rand8() - rnd.Rand8();
// TODO(Yaowu): this should be converted to a parameterized test
// to test optimized versions of this function.
const int pitch = 8; const int pitch = 8;
vp8_short_fdct4x4_c(test_input_block, test_temp_block, pitch); vp9_short_fdct4x4_c(test_input_block, test_temp_block, pitch);
reference_idct4x4(test_temp_block, test_output_block);
for (int j = 0; j < 16; ++j) {
if(test_temp_block[j] > 0) {
test_temp_block[j] += 2;
test_temp_block[j] /= 4;
test_temp_block[j] *= 4;
} else {
test_temp_block[j] -= 2;
test_temp_block[j] /= 4;
test_temp_block[j] *= 4;
}
}
// Because the bitstream is not frozen yet, use the idct in the codebase.
vp9_short_idct4x4llm_c(test_temp_block, test_output_block, pitch);
for (int j = 0; j < 16; ++j) { for (int j = 0; j < 16; ++j) {
const int diff = test_input_block[j] - test_output_block[j]; const int diff = test_input_block[j] - test_output_block[j];
@@ -158,12 +130,11 @@ TEST(Vp8FdctTest, RoundTripErrorCheck) {
total_error += error; total_error += error;
} }
} }
EXPECT_GE(1, max_error)
EXPECT_GE(1, max_error ) << "Error: FDCT/IDCT has an individual roundtrip error > 1";
<< "Error: FDCT/IDCT has an individual roundtrip error > 1";
EXPECT_GE(count_test_block, total_error) EXPECT_GE(count_test_block, total_error)
<< "Error: FDCT/IDCT has average roundtrip error > 1 per block"; << "Error: FDCT/IDCT has average roundtrip error > 1 per block";
}; };
} // namespace } // namespace

168
test/fdct8x8_test.cc Normal file
View File

@@ -0,0 +1,168 @@
/*
* 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 <math.h>
#include <stdlib.h>
#include <string.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" {
#include "vp9_rtcd.h"
}
#include "acm_random.h"
#include "vpx/vpx_integer.h"
using libvpx_test::ACMRandom;
namespace {
TEST(VP9Fdct8x8Test, SignBiasCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int16_t test_input_block[64];
int16_t test_output_block[64];
const int pitch = 16;
int count_sign_block[64][2];
const int count_test_block = 100000;
memset(count_sign_block, 0, sizeof(count_sign_block));
for (int i = 0; i < count_test_block; ++i) {
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 64; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
vp9_short_fdct8x8_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 64; ++j) {
if (test_output_block[j] < 0)
++count_sign_block[j][0];
else if (test_output_block[j] > 0)
++count_sign_block[j][1];
}
}
for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] -
count_sign_block[j][1]) < 1000);
EXPECT_TRUE(bias_acceptable)
<< "Error: 8x8 FDCT has a sign bias > 1%"
<< " for input range [-255, 255] at index " << j;
}
memset(count_sign_block, 0, sizeof(count_sign_block));
for (int i = 0; i < count_test_block; ++i) {
// Initialize a test block with input range [-15, 15].
for (int j = 0; j < 64; ++j)
test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
vp9_short_fdct8x8_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 64; ++j) {
if (test_output_block[j] < 0)
++count_sign_block[j][0];
else if (test_output_block[j] > 0)
++count_sign_block[j][1];
}
}
for (int j = 0; j < 64; ++j) {
const bool bias_acceptable = (abs(count_sign_block[j][0] -
count_sign_block[j][1]) < 10000);
EXPECT_TRUE(bias_acceptable)
<< "Error: 8x8 FDCT has a sign bias > 10%"
<< " for input range [-15, 15] at index " << j;
}
};
TEST(VP9Fdct8x8Test, RoundTripErrorCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int max_error = 0;
double total_error = 0;
const int count_test_block = 100000;
for (int i = 0; i < count_test_block; ++i) {
int16_t test_input_block[64];
int16_t test_temp_block[64];
int16_t test_output_block[64];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 64; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
const int pitch = 16;
vp9_short_fdct8x8_c(test_input_block, test_temp_block, pitch);
for (int j = 0; j < 64; ++j){
if(test_temp_block[j] > 0) {
test_temp_block[j] += 2;
test_temp_block[j] /= 4;
test_temp_block[j] *= 4;
} else {
test_temp_block[j] -= 2;
test_temp_block[j] /= 4;
test_temp_block[j] *= 4;
}
}
vp9_short_idct8x8_c(test_temp_block, test_output_block, pitch);
for (int j = 0; j < 64; ++j) {
const int diff = test_input_block[j] - test_output_block[j];
const int error = diff * diff;
if (max_error < error)
max_error = error;
total_error += error;
}
}
EXPECT_GE(1, max_error)
<< "Error: 8x8 FDCT/IDCT has an individual roundtrip error > 1";
EXPECT_GE(count_test_block/5, total_error)
<< "Error: 8x8 FDCT/IDCT has average roundtrip error > 1/5 per block";
};
TEST(VP9Fdct8x8Test, ExtremalCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int max_error = 0;
double total_error = 0;
const int count_test_block = 100000;
for (int i = 0; i < count_test_block; ++i) {
int16_t test_input_block[64];
int16_t test_temp_block[64];
int16_t test_output_block[64];
// Initialize a test block with input range {-255, 255}.
for (int j = 0; j < 64; ++j)
test_input_block[j] = rnd.Rand8() % 2 ? 255 : -255;
const int pitch = 16;
vp9_short_fdct8x8_c(test_input_block, test_temp_block, pitch);
vp9_short_idct8x8_c(test_temp_block, test_output_block, pitch);
for (int j = 0; j < 64; ++j) {
const int diff = test_input_block[j] - test_output_block[j];
const int error = diff * diff;
if (max_error < error)
max_error = error;
total_error += error;
}
EXPECT_GE(1, max_error)
<< "Error: Extremal 8x8 FDCT/IDCT has an"
<< " individual roundtrip error > 1";
EXPECT_GE(count_test_block/5, total_error)
<< "Error: Extremal 8x8 FDCT/IDCT has average"
<< " roundtrip error > 1/5 per block";
}
};
} // namespace

162
test/idct8x8_test.cc Normal file
View File

@@ -0,0 +1,162 @@
/*
* 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 <math.h>
#include <stdlib.h>
#include <string.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" {
#include "vp9_rtcd.h"
}
#include "acm_random.h"
#include "vpx/vpx_integer.h"
using libvpx_test::ACMRandom;
namespace {
#ifdef _MSC_VER
static int round(double x) {
if(x < 0)
return (int)ceil(x - 0.5);
else
return (int)floor(x + 0.5);
}
#endif
void reference_dct_1d(double input[8], double output[8]) {
const double kPi = 3.141592653589793238462643383279502884;
const double kInvSqrt2 = 0.707106781186547524400844362104;
for (int k = 0; k < 8; k++) {
output[k] = 0.0;
for (int n = 0; n < 8; n++)
output[k] += input[n]*cos(kPi*(2*n+1)*k/16.0);
if (k == 0)
output[k] = output[k]*kInvSqrt2;
}
}
void reference_dct_2d(int16_t input[64], double output[64]) {
// First transform columns
for (int i = 0; i < 8; ++i) {
double temp_in[8], temp_out[8];
for (int j = 0; j < 8; ++j)
temp_in[j] = input[j*8 + i];
reference_dct_1d(temp_in, temp_out);
for (int j = 0; j < 8; ++j)
output[j*8 + i] = temp_out[j];
}
// Then transform rows
for (int i = 0; i < 8; ++i) {
double temp_in[8], temp_out[8];
for (int j = 0; j < 8; ++j)
temp_in[j] = output[j + i*8];
reference_dct_1d(temp_in, temp_out);
for (int j = 0; j < 8; ++j)
output[j + i*8] = temp_out[j];
}
// Scale by some magic number
for (int i = 0; i < 64; ++i)
output[i] *= 2;
}
void reference_idct_1d(double input[8], double output[8]) {
const double kPi = 3.141592653589793238462643383279502884;
const double kSqrt2 = 1.414213562373095048801688724209698;
for (int k = 0; k < 8; k++) {
output[k] = 0.0;
for (int n = 0; n < 8; n++) {
output[k] += input[n]*cos(kPi*(2*k+1)*n/16.0);
if (n == 0)
output[k] = output[k]/kSqrt2;
}
}
}
void reference_idct_2d(double input[64], int16_t output[64]) {
double out[64], out2[64];
// First transform rows
for (int i = 0; i < 8; ++i) {
double temp_in[8], temp_out[8];
for (int j = 0; j < 8; ++j)
temp_in[j] = input[j + i*8];
reference_idct_1d(temp_in, temp_out);
for (int j = 0; j < 8; ++j)
out[j + i*8] = temp_out[j];
}
// Then transform columns
for (int i = 0; i < 8; ++i) {
double temp_in[8], temp_out[8];
for (int j = 0; j < 8; ++j)
temp_in[j] = out[j*8 + i];
reference_idct_1d(temp_in, temp_out);
for (int j = 0; j < 8; ++j)
out2[j*8 + i] = temp_out[j];
}
for (int i = 0; i < 64; ++i)
output[i] = round(out2[i]/32);
}
TEST(VP9Idct8x8Test, AccuracyCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
const int count_test_block = 10000;
for (int i = 0; i < count_test_block; ++i) {
int16_t input[64], coeff[64];
int16_t output_c[64];
double output_r[64];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 64; ++j)
input[j] = rnd.Rand8() - rnd.Rand8();
const int pitch = 16;
vp9_short_fdct8x8_c(input, output_c, pitch);
reference_dct_2d(input, output_r);
for (int j = 0; j < 64; ++j) {
const double diff = output_c[j] - output_r[j];
const double error = diff * diff;
// An error in a DCT coefficient isn't that bad.
// We care more about the reconstructed pixels.
EXPECT_GE(2.0, error)
<< "Error: 8x8 FDCT/IDCT has error " << error
<< " at index " << j;
}
#if 0
// Tests that the reference iDCT and fDCT match.
reference_dct_2d(input, output_r);
reference_idct_2d(output_r, output_c);
for (int j = 0; j < 64; ++j) {
const int diff = output_c[j] -input[j];
const int error = diff * diff;
EXPECT_EQ(0, error)
<< "Error: 8x8 FDCT/IDCT has error " << error
<< " at index " << j;
}
#endif
reference_dct_2d(input, output_r);
for (int j = 0; j < 64; ++j)
coeff[j] = round(output_r[j]);
vp9_short_idct8x8_c(coeff, output_c, pitch);
for (int j = 0; j < 64; ++j) {
const int diff = output_c[j] -input[j];
const int error = diff * diff;
EXPECT_GE(1, error)
<< "Error: 8x8 FDCT/IDCT has error " << error
<< " at index " << j;
}
}
}
} // namespace

View File

@@ -11,7 +11,7 @@
extern "C" { extern "C" {
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
} }
#include "third_party/googletest/src/include/gtest/gtest.h" #include "third_party/googletest/src/include/gtest/gtest.h"

View File

@@ -14,7 +14,7 @@
#include "third_party/googletest/src/include/gtest/gtest.h" #include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" { extern "C" {
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
} }

View File

@@ -10,7 +10,7 @@
#include "third_party/googletest/src/include/gtest/gtest.h" #include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" { extern "C" {
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
} }

View File

@@ -15,7 +15,7 @@
extern "C" { extern "C" {
#include "./vpx_config.h" #include "./vpx_config.h"
#include "./vpx_rtcd.h" #include "./vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
} }

View File

@@ -16,7 +16,7 @@
#include "third_party/googletest/src/include/gtest/gtest.h" #include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" { extern "C" {
#include "./vpx_config.h" #include "./vpx_config.h"
#include "./vpx_rtcd.h" #include "./vp8_rtcd.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
} }

View File

@@ -12,7 +12,7 @@
#include "test/acm_random.h" #include "test/acm_random.h"
extern "C" { extern "C" {
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#include "vp8/encoder/block.h" #include "vp8/encoder/block.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"

View File

@@ -1,5 +1,6 @@
LIBVPX_TEST_SRCS-yes += acm_random.h
LIBVPX_TEST_SRCS-yes += test.mk LIBVPX_TEST_SRCS-yes += test.mk
LIBVPX_TEST_SRCS-yes += acm_random.h
LIBVPX_TEST_SRCS-yes += test_libvpx.cc LIBVPX_TEST_SRCS-yes += test_libvpx.cc
LIBVPX_TEST_SRCS-yes += util.h LIBVPX_TEST_SRCS-yes += util.h
LIBVPX_TEST_SRCS-yes += video_source.h LIBVPX_TEST_SRCS-yes += video_source.h
@@ -33,12 +34,14 @@ LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += test_vector_test.cc
## ##
ifeq ($(CONFIG_SHARED),) ifeq ($(CONFIG_SHARED),)
## VP8
ifneq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),)
# These tests require both the encoder and decoder to be built. # These tests require both the encoder and decoder to be built.
ifeq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),yesyes) ifeq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),yesyes)
LIBVPX_TEST_SRCS-yes += boolcoder_test.cc LIBVPX_TEST_SRCS-yes += vp8_boolcoder_test.cc
endif endif
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += fdct4x4_test.cc
LIBVPX_TEST_SRCS-yes += idctllm_test.cc LIBVPX_TEST_SRCS-yes += idctllm_test.cc
LIBVPX_TEST_SRCS-yes += intrapred_test.cc LIBVPX_TEST_SRCS-yes += intrapred_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_POSTPROC) += pp_filter_test.cc LIBVPX_TEST_SRCS-$(CONFIG_POSTPROC) += pp_filter_test.cc
@@ -46,6 +49,25 @@ LIBVPX_TEST_SRCS-yes += sad_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += set_roi.cc LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += set_roi.cc
LIBVPX_TEST_SRCS-yes += sixtap_predict_test.cc LIBVPX_TEST_SRCS-yes += sixtap_predict_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += subtract_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += subtract_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += vp8_fdct4x4_test.cc
endif # VP8
## VP9
ifneq ($(CONFIG_VP9_ENCODER)$(CONFIG_VP9_DECODER),)
# These tests require both the encoder and decoder to be built.
ifeq ($(CONFIG_VP9_ENCODER)$(CONFIG_VP9_DECODER),yesyes)
LIBVPX_TEST_SRCS-yes += vp9_boolcoder_test.cc
endif
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += fdct4x4_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += fdct8x8_test.cc
#LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += dct16x16_test.cc
LIBVPX_TEST_SRCS-yes += idct8x8_test.cc
LIBVPX_TEST_SRCS-yes += variance_test.cc
endif # VP9
endif endif

View File

@@ -12,6 +12,12 @@
#if ARCH_X86 || ARCH_X86_64 #if ARCH_X86 || ARCH_X86_64
extern "C" { extern "C" {
#include "vpx_ports/x86.h" #include "vpx_ports/x86.h"
#if CONFIG_VP8
extern void vp8_rtcd();
#endif
#if CONFIG_VP9
extern void vp9_rtcd();
#endif
} }
#endif #endif
#include "third_party/googletest/src/include/gtest/gtest.h" #include "third_party/googletest/src/include/gtest/gtest.h"
@@ -27,19 +33,26 @@ int main(int argc, char **argv) {
#if ARCH_X86 || ARCH_X86_64 #if ARCH_X86 || ARCH_X86_64
const int simd_caps = x86_simd_caps(); const int simd_caps = x86_simd_caps();
if(!(simd_caps & HAS_MMX)) if (!(simd_caps & HAS_MMX))
append_gtest_filter(":-MMX/*"); append_gtest_filter(":-MMX/*");
if(!(simd_caps & HAS_SSE)) if (!(simd_caps & HAS_SSE))
append_gtest_filter(":-SSE/*"); append_gtest_filter(":-SSE/*");
if(!(simd_caps & HAS_SSE2)) if (!(simd_caps & HAS_SSE2))
append_gtest_filter(":-SSE2/*"); append_gtest_filter(":-SSE2/*");
if(!(simd_caps & HAS_SSE3)) if (!(simd_caps & HAS_SSE3))
append_gtest_filter(":-SSE3/*"); append_gtest_filter(":-SSE3/*");
if(!(simd_caps & HAS_SSSE3)) if (!(simd_caps & HAS_SSSE3))
append_gtest_filter(":-SSSE3/*"); append_gtest_filter(":-SSSE3/*");
if(!(simd_caps & HAS_SSE4_1)) if (!(simd_caps & HAS_SSE4_1))
append_gtest_filter(":-SSE4_1/*"); append_gtest_filter(":-SSE4_1/*");
#endif #endif
#if CONFIG_VP8
vp8_rtcd();
#endif
#if CONFIG_VP9
vp9_rtcd();
#endif
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
} }

123
test/variance_test.cc Normal file
View File

@@ -0,0 +1,123 @@
/*
* 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 <stdlib.h>
#include <new>
#include "third_party/googletest/src/include/gtest/gtest.h"
#include "vpx_config.h"
extern "C" {
#include "vp9/encoder/vp9_variance.h"
#include "vpx/vpx_integer.h"
#include "vp9_rtcd.h"
}
namespace {
using ::std::tr1::get;
using ::std::tr1::make_tuple;
using ::std::tr1::tuple;
class VP9VarianceTest :
public ::testing::TestWithParam<tuple<int, int, vp9_variance_fn_t> > {
public:
virtual void SetUp() {
const tuple<int, int, vp9_variance_fn_t>& params = GetParam();
width_ = get<0>(params);
height_ = get<1>(params);
variance_ = get<2>(params);
block_size_ = width_ * height_;
src_ = new uint8_t[block_size_];
ref_ = new uint8_t[block_size_];
ASSERT_TRUE(src_ != NULL);
ASSERT_TRUE(ref_ != NULL);
}
virtual void TearDown() {
delete[] src_;
delete[] ref_;
}
protected:
uint8_t* src_;
uint8_t* ref_;
int width_;
int height_;
int block_size_;
vp9_variance_fn_t variance_;
};
TEST_P(VP9VarianceTest, Zero) {
for (int i = 0; i <= 255; ++i) {
memset(src_, i, block_size_);
for (int j = 0; j <= 255; ++j) {
memset(ref_, j, block_size_);
unsigned int sse;
const unsigned int var = variance_(src_, width_, ref_, width_, &sse);
EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
}
}
}
TEST_P(VP9VarianceTest, OneQuarter) {
memset(src_, 255, block_size_);
const int half = block_size_ / 2;
memset(ref_, 255, half);
memset(ref_ + half, 0, half);
unsigned int sse;
const unsigned int var = variance_(src_, width_, ref_, width_, &sse);
const unsigned int expected = block_size_ * 255 * 255 / 4;
EXPECT_EQ(expected, var);
}
const vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
const vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
const vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
const vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
const vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
INSTANTIATE_TEST_CASE_P(
C, VP9VarianceTest,
::testing::Values(make_tuple(4, 4, variance4x4_c),
make_tuple(8, 8, variance8x8_c),
make_tuple(8, 16, variance8x16_c),
make_tuple(16, 8, variance16x8_c),
make_tuple(16, 16, variance16x16_c)));
#if HAVE_MMX
const vp9_variance_fn_t variance4x4_mmx = vp9_variance4x4_mmx;
const vp9_variance_fn_t variance8x8_mmx = vp9_variance8x8_mmx;
const vp9_variance_fn_t variance8x16_mmx = vp9_variance8x16_mmx;
const vp9_variance_fn_t variance16x8_mmx = vp9_variance16x8_mmx;
const vp9_variance_fn_t variance16x16_mmx = vp9_variance16x16_mmx;
INSTANTIATE_TEST_CASE_P(
MMX, VP9VarianceTest,
::testing::Values(make_tuple(4, 4, variance4x4_mmx),
make_tuple(8, 8, variance8x8_mmx),
make_tuple(8, 16, variance8x16_mmx),
make_tuple(16, 8, variance16x8_mmx),
make_tuple(16, 16, variance16x16_mmx)));
#endif
#if HAVE_SSE2
const vp9_variance_fn_t variance4x4_wmt = vp9_variance4x4_wmt;
const vp9_variance_fn_t variance8x8_wmt = vp9_variance8x8_wmt;
const vp9_variance_fn_t variance8x16_wmt = vp9_variance8x16_wmt;
const vp9_variance_fn_t variance16x8_wmt = vp9_variance16x8_wmt;
const vp9_variance_fn_t variance16x16_wmt = vp9_variance16x16_wmt;
INSTANTIATE_TEST_CASE_P(
SSE2, VP9VarianceTest,
::testing::Values(make_tuple(4, 4, variance4x4_wmt),
make_tuple(8, 8, variance8x8_wmt),
make_tuple(8, 16, variance8x16_wmt),
make_tuple(16, 8, variance16x8_wmt),
make_tuple(16, 16, variance16x16_wmt)));
#endif
} // namespace

169
test/vp8_fdct4x4_test.cc Normal file
View File

@@ -0,0 +1,169 @@
/*
* 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 <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
extern "C" {
#include "vp8_rtcd.h"
}
#include "test/acm_random.h"
#include "third_party/googletest/src/include/gtest/gtest.h"
#include "vpx/vpx_integer.h"
namespace {
const int cospi8sqrt2minus1 = 20091;
const int sinpi8sqrt2 = 35468;
void reference_idct4x4(const int16_t *input, int16_t *output) {
const int16_t *ip = input;
int16_t *op = output;
for (int i = 0; i < 4; ++i) {
const int a1 = ip[0] + ip[8];
const int b1 = ip[0] - ip[8];
const int temp1 = (ip[4] * sinpi8sqrt2) >> 16;
const int temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
const int c1 = temp1 - temp2;
const int temp3 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
const int temp4 = (ip[12] * sinpi8sqrt2) >> 16;
const int d1 = temp3 + temp4;
op[0] = a1 + d1;
op[12] = a1 - d1;
op[4] = b1 + c1;
op[8] = b1 - c1;
++ip;
++op;
}
ip = output;
op = output;
for (int i = 0; i < 4; ++i) {
const int a1 = ip[0] + ip[2];
const int b1 = ip[0] - ip[2];
const int temp1 = (ip[1] * sinpi8sqrt2) >> 16;
const int temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
const int c1 = temp1 - temp2;
const int temp3 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
const int temp4 = (ip[3] * sinpi8sqrt2) >> 16;
const int d1 = temp3 + temp4;
op[0] = (a1 + d1 + 4) >> 3;
op[3] = (a1 - d1 + 4) >> 3;
op[1] = (b1 + c1 + 4) >> 3;
op[2] = (b1 - c1 + 4) >> 3;
ip += 4;
op += 4;
}
}
using libvpx_test::ACMRandom;
TEST(Vp8FdctTest, SignBiasCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int16_t test_input_block[16];
int16_t test_output_block[16];
const int pitch = 8;
int count_sign_block[16][2];
const int count_test_block = 1000000;
memset(count_sign_block, 0, sizeof(count_sign_block));
for (int i = 0; i < count_test_block; ++i) {
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 16; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 16; ++j) {
if (test_output_block[j] < 0)
++count_sign_block[j][0];
else if (test_output_block[j] > 0)
++count_sign_block[j][1];
}
}
bool bias_acceptable = true;
for (int j = 0; j < 16; ++j)
bias_acceptable = bias_acceptable &&
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 10000);
EXPECT_EQ(true, bias_acceptable)
<< "Error: 4x4 FDCT has a sign bias > 1% for input range [-255, 255]";
memset(count_sign_block, 0, sizeof(count_sign_block));
for (int i = 0; i < count_test_block; ++i) {
// Initialize a test block with input range [-15, 15].
for (int j = 0; j < 16; ++j)
test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch);
for (int j = 0; j < 16; ++j) {
if (test_output_block[j] < 0)
++count_sign_block[j][0];
else if (test_output_block[j] > 0)
++count_sign_block[j][1];
}
}
bias_acceptable = true;
for (int j = 0; j < 16; ++j)
bias_acceptable = bias_acceptable &&
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 100000);
EXPECT_EQ(true, bias_acceptable)
<< "Error: 4x4 FDCT has a sign bias > 10% for input range [-15, 15]";
};
TEST(Vp8FdctTest, RoundTripErrorCheck) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
int max_error = 0;
double total_error = 0;
const int count_test_block = 1000000;
for (int i = 0; i < count_test_block; ++i) {
int16_t test_input_block[16];
int16_t test_temp_block[16];
int16_t test_output_block[16];
// Initialize a test block with input range [-255, 255].
for (int j = 0; j < 16; ++j)
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
const int pitch = 8;
vp8_short_fdct4x4_c(test_input_block, test_temp_block, pitch);
reference_idct4x4(test_temp_block, test_output_block);
for (int j = 0; j < 16; ++j) {
const int diff = test_input_block[j] - test_output_block[j];
const int error = diff * diff;
if (max_error < error)
max_error = error;
total_error += error;
}
}
EXPECT_GE(1, max_error )
<< "Error: FDCT/IDCT has an individual roundtrip error > 1";
EXPECT_GE(count_test_block, total_error)
<< "Error: FDCT/IDCT has average roundtrip error > 1 per block";
};
} // namespace

View File

@@ -0,0 +1,88 @@
/*
* 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 <math.h>
#include <stdlib.h>
#include <string.h>
#include "third_party/googletest/src/include/gtest/gtest.h"
extern "C" {
#include "vp9/encoder/vp9_boolhuff.h"
#include "vp9/decoder/vp9_dboolhuff.h"
}
#include "acm_random.h"
#include "vpx/vpx_integer.h"
using libvpx_test::ACMRandom;
namespace {
const int num_tests = 10;
} // namespace
TEST(VP9, TestBitIO) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
for (int n = 0; n < num_tests; ++n) {
for (int method = 0; method <= 7; ++method) { // we generate various proba
const int bits_to_test = 1000;
uint8_t probas[bits_to_test];
for (int i = 0; i < bits_to_test; ++i) {
const int parity = i & 1;
probas[i] =
(method == 0) ? 0 : (method == 1) ? 255 :
(method == 2) ? 128 :
(method == 3) ? rnd.Rand8() :
(method == 4) ? (parity ? 0 : 255) :
// alternate between low and high proba:
(method == 5) ? (parity ? rnd(128) : 255 - rnd(128)) :
(method == 6) ?
(parity ? rnd(64) : 255 - rnd(64)) :
(parity ? rnd(32) : 255 - rnd(32));
}
for (int bit_method = 0; bit_method <= 3; ++bit_method) {
const int random_seed = 6432;
const int buffer_size = 10000;
ACMRandom bit_rnd(random_seed);
BOOL_CODER bw;
uint8_t bw_buffer[buffer_size];
vp9_start_encode(&bw, bw_buffer);
int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0;
for (int i = 0; i < bits_to_test; ++i) {
if (bit_method == 2) {
bit = (i & 1);
} else if (bit_method == 3) {
bit = bit_rnd(2);
}
encode_bool(&bw, bit, static_cast<int>(probas[i]));
}
vp9_stop_encode(&bw);
BOOL_DECODER br;
vp9_start_decode(&br, bw_buffer, buffer_size);
bit_rnd.Reset(random_seed);
for (int i = 0; i < bits_to_test; ++i) {
if (bit_method == 2) {
bit = (i & 1);
} else if (bit_method == 3) {
bit = bit_rnd(2);
}
GTEST_ASSERT_EQ(decode_bool(&br, probas[i]), bit)
<< "pos: " << i << " / " << bits_to_test
<< " bit_method: " << bit_method
<< " method: " << method;
}
}
}
}
}

18
third_party/x86inc/LICENSE vendored Normal file
View File

@@ -0,0 +1,18 @@
Copyright (C) 2005-2012 x264 project
Authors: Loren Merritt <lorenm@u.washington.edu>
Anton Mitrofanov <BugMaster@narod.ru>
Jason Garrett-Glaser <darkshikari@gmail.com>
Henrik Gramner <hengar-6@student.ltu.se>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

11
third_party/x86inc/README.webm vendored Normal file
View File

@@ -0,0 +1,11 @@
URL: http://git.videolan.org/?p=x264.git
Version: 999b753ff0f4dc872077f4fa90d465e948cbe656
License: ISC
License File: LICENSE
Description:
x264/libav's framework for x86 assembly. Contains a variety of macros and
defines that help automatically allow assembly to work cross-platform.
Local Modifications:
Some modifications to allow PIC to work with x86inc.

1118
third_party/x86inc/x86inc.asm vendored Normal file

File diff suppressed because it is too large Load Diff

72
tools/all_builds.py Executable file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/python
import getopt
import subprocess
import sys
LONG_OPTIONS = ["shard=", "shards="]
BASE_COMMAND = "./configure --enable-internal-stats --enable-experimental"
def RunCommand(command):
run = subprocess.Popen(command, shell=True)
output = run.communicate()
if run.returncode:
print "Non-zero return code: " + str(run.returncode) + " => exiting!"
sys.exit(1)
def list_of_experiments():
experiments = []
configure_file = open("configure")
list_start = False
for line in configure_file.read().split("\n"):
if line == 'EXPERIMENT_LIST="':
list_start = True
elif line == '"':
list_start = False
elif list_start:
currently_broken = ["csm"]
experiment = line[4:]
if experiment not in currently_broken:
experiments.append(experiment)
return experiments
def main(argv):
# Parse arguments
options = {"--shard": 0, "--shards": 1}
if "--" in argv:
opt_end_index = argv.index("--")
else:
opt_end_index = len(argv)
try:
o, _ = getopt.getopt(argv[1:opt_end_index], None, LONG_OPTIONS)
except getopt.GetoptError, err:
print str(err)
print "Usage: %s [--shard=<n> --shards=<n>] -- [configure flag ...]"%argv[0]
sys.exit(2)
options.update(o)
extra_args = argv[opt_end_index + 1:]
# Shard experiment list
shard = int(options["--shard"])
shards = int(options["--shards"])
experiments = list_of_experiments()
base_command = " ".join([BASE_COMMAND] + extra_args)
configs = [base_command]
configs += ["%s --enable-%s" % (base_command, e) for e in experiments]
my_configs = zip(configs, range(len(configs)))
my_configs = filter(lambda x: x[1] % shards == shard, my_configs)
my_configs = [e[0] for e in my_configs]
# Run configs for this shard
for config in my_configs:
test_build(config)
def test_build(configure_command):
print "\033[34m\033[47mTesting %s\033[0m" % (configure_command)
RunCommand(configure_command)
RunCommand("make clean")
RunCommand("make")
if __name__ == "__main__":
main(sys.argv)

3361
tools/cpplint.py vendored Executable file

File diff suppressed because it is too large Load Diff

127
tools/diff.py Normal file
View File

@@ -0,0 +1,127 @@
#!/usr/bin/env python
## 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.
##
"""Classes for representing diff pieces."""
__author__ = "jkoleszar@google.com"
import re
class DiffLines(object):
"""A container for one half of a diff."""
def __init__(self, filename, offset, length):
self.filename = filename
self.offset = offset
self.length = length
self.lines = []
self.delta_line_nums = []
def Append(self, line):
l = len(self.lines)
if line[0] != " ":
self.delta_line_nums.append(self.offset + l)
self.lines.append(line[1:])
assert l+1 <= self.length
def Complete(self):
return len(self.lines) == self.length
def __contains__(self, item):
return item >= self.offset and item <= self.offset + self.length - 1
class DiffHunk(object):
"""A container for one diff hunk, consisting of two DiffLines."""
def __init__(self, header, file_a, file_b, start_a, len_a, start_b, len_b):
self.header = header
self.left = DiffLines(file_a, start_a, len_a)
self.right = DiffLines(file_b, start_b, len_b)
self.lines = []
def Append(self, line):
"""Adds a line to the DiffHunk and its DiffLines children."""
if line[0] == "-":
self.left.Append(line)
elif line[0] == "+":
self.right.Append(line)
elif line[0] == " ":
self.left.Append(line)
self.right.Append(line)
else:
assert False, ("Unrecognized character at start of diff line "
"%r" % line[0])
self.lines.append(line)
def Complete(self):
return self.left.Complete() and self.right.Complete()
def __repr__(self):
return "DiffHunk(%s, %s, len %d)" % (
self.left.filename, self.right.filename,
max(self.left.length, self.right.length))
def ParseDiffHunks(stream):
"""Walk a file-like object, yielding DiffHunks as they're parsed."""
file_regex = re.compile(r"(\+\+\+|---) (\S+)")
range_regex = re.compile(r"@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?")
hunk = None
while True:
line = stream.readline()
if not line:
break
if hunk is None:
# Parse file names
diff_file = file_regex.match(line)
if diff_file:
if line.startswith("---"):
a_line = line
a = diff_file.group(2)
continue
if line.startswith("+++"):
b_line = line
b = diff_file.group(2)
continue
# Parse offset/lengths
diffrange = range_regex.match(line)
if diffrange:
if diffrange.group(2):
start_a = int(diffrange.group(1))
len_a = int(diffrange.group(3))
else:
start_a = 1
len_a = int(diffrange.group(1))
if diffrange.group(5):
start_b = int(diffrange.group(4))
len_b = int(diffrange.group(6))
else:
start_b = 1
len_b = int(diffrange.group(4))
header = [a_line, b_line, line]
hunk = DiffHunk(header, a, b, start_a, len_a, start_b, len_b)
else:
# Add the current line to the hunk
hunk.Append(line)
# See if the whole hunk has been parsed. If so, yield it and prepare
# for the next hunk.
if hunk.Complete():
yield hunk
hunk = None
# Partial hunks are a parse error
assert hunk is None

View File

@@ -29,12 +29,13 @@ log() {
vpx_style() { vpx_style() {
astyle --style=bsd --min-conditional-indent=0 --break-blocks \ for f; do
--pad-oper --pad-header --unpad-paren \ case "$f" in
--align-pointer=name \ *.h|*.c|*.cc)
--indent-preprocessor --convert-tabs --indent-labels \ "${dirname_self}"/vpx-astyle.sh "$f"
--suffix=none --quiet "$@" ;;
sed -i "" 's/[[:space:]]\{1,\},/,/g' "$@" esac
done
} }
@@ -119,8 +120,7 @@ cd "$(git rev-parse --show-toplevel)"
git show > "${ORIG_DIFF}" git show > "${ORIG_DIFF}"
# Apply the style guide on new and modified files and collect its diff # Apply the style guide on new and modified files and collect its diff
for f in $(git diff HEAD^ --name-only -M90 --diff-filter=AM \ for f in $(git diff HEAD^ --name-only -M90 --diff-filter=AM); do
| grep '\.[ch]$'); do
case "$f" in case "$f" in
third_party/*) continue;; third_party/*) continue;;
nestegg/*) continue;; nestegg/*) continue;;

View File

@@ -16,121 +16,9 @@ are relevant to A. The resulting file can be applied with patch(1) on top of A.
__author__ = "jkoleszar@google.com" __author__ = "jkoleszar@google.com"
import re
import sys import sys
import diff
class DiffLines(object):
"""A container for one half of a diff."""
def __init__(self, filename, offset, length):
self.filename = filename
self.offset = offset
self.length = length
self.lines = []
self.delta_line_nums = []
def Append(self, line):
l = len(self.lines)
if line[0] != " ":
self.delta_line_nums.append(self.offset + l)
self.lines.append(line[1:])
assert l+1 <= self.length
def Complete(self):
return len(self.lines) == self.length
def __contains__(self, item):
return item >= self.offset and item <= self.offset + self.length - 1
class DiffHunk(object):
"""A container for one diff hunk, consisting of two DiffLines."""
def __init__(self, header, file_a, file_b, start_a, len_a, start_b, len_b):
self.header = header
self.left = DiffLines(file_a, start_a, len_a)
self.right = DiffLines(file_b, start_b, len_b)
self.lines = []
def Append(self, line):
"""Adds a line to the DiffHunk and its DiffLines children."""
if line[0] == "-":
self.left.Append(line)
elif line[0] == "+":
self.right.Append(line)
elif line[0] == " ":
self.left.Append(line)
self.right.Append(line)
else:
assert False, ("Unrecognized character at start of diff line "
"%r" % line[0])
self.lines.append(line)
def Complete(self):
return self.left.Complete() and self.right.Complete()
def __repr__(self):
return "DiffHunk(%s, %s, len %d)" % (
self.left.filename, self.right.filename,
max(self.left.length, self.right.length))
def ParseDiffHunks(stream):
"""Walk a file-like object, yielding DiffHunks as they're parsed."""
file_regex = re.compile(r"(\+\+\+|---) (\S+)")
range_regex = re.compile(r"@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))?")
hunk = None
while True:
line = stream.readline()
if not line:
break
if hunk is None:
# Parse file names
diff_file = file_regex.match(line)
if diff_file:
if line.startswith("---"):
a_line = line
a = diff_file.group(2)
continue
if line.startswith("+++"):
b_line = line
b = diff_file.group(2)
continue
# Parse offset/lengths
diffrange = range_regex.match(line)
if diffrange:
if diffrange.group(2):
start_a = int(diffrange.group(1))
len_a = int(diffrange.group(3))
else:
start_a = 1
len_a = int(diffrange.group(1))
if diffrange.group(5):
start_b = int(diffrange.group(4))
len_b = int(diffrange.group(6))
else:
start_b = 1
len_b = int(diffrange.group(4))
header = [a_line, b_line, line]
hunk = DiffHunk(header, a, b, start_a, len_a, start_b, len_b)
else:
# Add the current line to the hunk
hunk.Append(line)
# See if the whole hunk has been parsed. If so, yield it and prepare
# for the next hunk.
if hunk.Complete():
yield hunk
hunk = None
# Partial hunks are a parse error
assert hunk is None
def FormatDiffHunks(hunks): def FormatDiffHunks(hunks):
@@ -162,8 +50,8 @@ def ZipHunks(rhs_hunks, lhs_hunks):
def main(): def main():
old_hunks = [x for x in ParseDiffHunks(open(sys.argv[1], "r"))] old_hunks = [x for x in diff.ParseDiffHunks(open(sys.argv[1], "r"))]
new_hunks = [x for x in ParseDiffHunks(open(sys.argv[2], "r"))] new_hunks = [x for x in diff.ParseDiffHunks(open(sys.argv[2], "r"))]
out_hunks = [] out_hunks = []
# Join the right hand side of the older diff with the left hand side of the # Join the right hand side of the older diff with the left hand side of the

144
tools/lint-hunks.py Executable file
View File

@@ -0,0 +1,144 @@
#!/usr/bin/python
## 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.
##
"""Performs style checking on each diff hunk."""
import getopt
import os
import StringIO
import subprocess
import sys
import diff
SHORT_OPTIONS = "h"
LONG_OPTIONS = ["help"]
TOPLEVEL_CMD = ["git", "rev-parse", "--show-toplevel"]
DIFF_CMD = ["git", "diff"]
DIFF_INDEX_CMD = ["git", "diff-index", "-u", "HEAD", "--"]
SHOW_CMD = ["git", "show"]
CPPLINT_FILTERS = ["-readability/casting", "-runtime/int"]
class Usage(Exception):
pass
class SubprocessException(Exception):
def __init__(self, args):
msg = "Failed to execute '%s'"%(" ".join(args))
super(SubprocessException, self).__init__(msg)
class Subprocess(subprocess.Popen):
"""Adds the notion of an expected returncode to Popen."""
def __init__(self, args, expected_returncode=0, **kwargs):
self._args = args
self._expected_returncode = expected_returncode
super(Subprocess, self).__init__(args, **kwargs)
def communicate(self, *args, **kwargs):
result = super(Subprocess, self).communicate(*args, **kwargs)
if self._expected_returncode is not None:
try:
ok = self.returncode in self._expected_returncode
except TypeError:
ok = self.returncode == self._expected_returncode
if not ok:
raise SubprocessException(self._args)
return result
def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
except getopt.error, msg:
raise Usage(msg)
# process options
for o, _ in opts:
if o in ("-h", "--help"):
print __doc__
sys.exit(0)
if args and len(args) > 1:
print __doc__
sys.exit(0)
# Find the fully qualified path to the root of the tree
tl = Subprocess(TOPLEVEL_CMD, stdout=subprocess.PIPE)
tl = tl.communicate()[0].strip()
# See if we're working on the index or not.
if args:
diff_cmd = DIFF_CMD + [args[0] + "^!"]
else:
diff_cmd = DIFF_INDEX_CMD
# Build the command line to execute cpplint
cpplint_cmd = [os.path.join(tl, "tools", "cpplint.py"),
"--filter=" + ",".join(CPPLINT_FILTERS),
"-"]
# Get a list of all affected lines
file_affected_line_map = {}
p = Subprocess(diff_cmd, stdout=subprocess.PIPE)
stdout = p.communicate()[0]
for hunk in diff.ParseDiffHunks(StringIO.StringIO(stdout)):
filename = hunk.right.filename[2:]
if filename not in file_affected_line_map:
file_affected_line_map[filename] = set()
file_affected_line_map[filename].update(hunk.right.delta_line_nums)
# Run each affected file through cpplint
lint_failed = False
for filename, affected_lines in file_affected_line_map.iteritems():
if filename.split(".")[-1] not in ("c", "h", "cc"):
continue
if args:
# File contents come from git
show_cmd = SHOW_CMD + [args[0] + ":" + filename]
show = Subprocess(show_cmd, stdout=subprocess.PIPE)
lint = Subprocess(cpplint_cmd, expected_returncode=(0, 1),
stdin=show.stdout, stderr=subprocess.PIPE)
lint_out = lint.communicate()[1]
else:
# File contents come from the working tree
lint = Subprocess(cpplint_cmd, expected_returncode=(0, 1),
stdin=subprocess.PIPE, stderr=subprocess.PIPE)
stdin = open(os.path.join(tl, filename)).read()
lint_out = lint.communicate(stdin)[1]
for line in lint_out.split("\n"):
fields = line.split(":")
if fields[0] != "-":
continue
warning_line_num = int(fields[1])
if warning_line_num in affected_lines:
print "%s:%d:%s"%(filename, warning_line_num,
":".join(fields[2:]))
lint_failed = True
# Set exit code if any relevant lint errors seen
if lint_failed:
return 1
except Usage, err:
print >>sys.stderr, err
print >>sys.stderr, "for help use --help"
return 2
if __name__ == "__main__":
sys.exit(main())

27
tools/vpx-astyle.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/sh
set -e
astyle --style=java --indent=spaces=2 --indent-switches\
--min-conditional-indent=0 \
--pad-oper --pad-header --unpad-paren \
--align-pointer=name \
--indent-preprocessor --convert-tabs --indent-labels \
--suffix=none --quiet --max-instatement-indent=80 "$@"
# Disabled, too greedy?
#sed -i 's;[[:space:]]\{1,\}\[;[;g' "$@"
sed_i() {
# Incompatible sed parameter parsing.
if sed -i 2>&1 | grep -q 'requires an argument'; then
sed -i '' "$@"
else
sed -i "$@"
fi
}
sed_i -e 's/[[:space:]]\{1,\}\([,;]\)/\1/g' \
-e 's/[[:space:]]\{1,\}\([+-]\{2\};\)/\1/g' \
-e 's/,[[:space:]]*}/}/g' \
-e 's;//\([^/[:space:]].*$\);// \1;g' \
-e 's/^\(public\|private\|protected\):$/ \1:/g' \
-e 's/[[:space:]]\{1,\}$//g' \
"$@"

View File

@@ -20,11 +20,10 @@
#endif #endif
#endif #endif
FILE* set_binary_mode(FILE *stream) FILE *set_binary_mode(FILE *stream) {
{ (void)stream;
(void)stream;
#if defined(_WIN32) || defined(__OS2__) #if defined(_WIN32) || defined(__OS2__)
_setmode(_fileno(stream), _O_BINARY); _setmode(_fileno(stream), _O_BINARY);
#endif #endif
return stream; return stream;
} }

View File

@@ -11,6 +11,6 @@
#define TOOLS_COMMON_H #define TOOLS_COMMON_H
/* Sets a stdio stream into binary mode */ /* Sets a stdio stream into binary mode */
FILE* set_binary_mode(FILE *stream); FILE *set_binary_mode(FILE *stream);
#endif #endif

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
void vp8_dequant_idct_add_y_block_v6(short *q, short *dq, void vp8_dequant_idct_add_y_block_v6(short *q, short *dq,

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include <math.h> #include <math.h>
#include "vp8/common/filter.h" #include "vp8/common/filter.h"
#include "bilinearfilter_arm.h" #include "bilinearfilter_arm.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include <math.h> #include <math.h>
#include "vp8/common/filter.h" #include "vp8/common/filter.h"
#include "vpx_ports/mem.h" #include "vpx_ports/mem.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/loopfilter.h" #include "vp8/common/loopfilter.h"
#include "vp8/common/onyxc_int.h" #include "vp8/common/onyxc_int.h"

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
/* place these declarations here because we don't want to maintain them /* place these declarations here because we don't want to maintain them
* outside of this scope * outside of this scope

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/variance.h" #include "vp8/common/variance.h"
#include "vp8/common/filter.h" #include "vp8/common/filter.h"

View File

@@ -12,7 +12,6 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx/vpx_codec.h" #include "vpx/vpx_codec.h"
#include "vpx_ports/asm_offsets.h" #include "vpx_ports/asm_offsets.h"
#include "vpx_scale/yv12config.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#if CONFIG_POSTPROC #if CONFIG_POSTPROC
@@ -21,19 +20,6 @@
BEGIN BEGIN
/* vpx_scale */
DEFINE(yv12_buffer_config_y_width, offsetof(YV12_BUFFER_CONFIG, y_width));
DEFINE(yv12_buffer_config_y_height, offsetof(YV12_BUFFER_CONFIG, y_height));
DEFINE(yv12_buffer_config_y_stride, offsetof(YV12_BUFFER_CONFIG, y_stride));
DEFINE(yv12_buffer_config_uv_width, offsetof(YV12_BUFFER_CONFIG, uv_width));
DEFINE(yv12_buffer_config_uv_height, offsetof(YV12_BUFFER_CONFIG, uv_height));
DEFINE(yv12_buffer_config_uv_stride, offsetof(YV12_BUFFER_CONFIG, uv_stride));
DEFINE(yv12_buffer_config_y_buffer, offsetof(YV12_BUFFER_CONFIG, y_buffer));
DEFINE(yv12_buffer_config_u_buffer, offsetof(YV12_BUFFER_CONFIG, u_buffer));
DEFINE(yv12_buffer_config_v_buffer, offsetof(YV12_BUFFER_CONFIG, v_buffer));
DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border));
DEFINE(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS);
#if CONFIG_POSTPROC #if CONFIG_POSTPROC
/* mfqe.c / filter_by_weight */ /* mfqe.c / filter_by_weight */
DEFINE(MFQE_PRECISION_VAL, MFQE_PRECISION); DEFINE(MFQE_PRECISION_VAL, MFQE_PRECISION);
@@ -58,11 +44,6 @@ ct_assert(B_HD_PRED, B_HD_PRED == 8);
ct_assert(B_HU_PRED, B_HU_PRED == 9); ct_assert(B_HU_PRED, B_HU_PRED == 9);
#endif #endif
#if HAVE_NEON
/* vp8_yv12_extend_frame_borders_neon makes several assumptions based on this */
ct_assert(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS == 32)
#endif
#if HAVE_SSE2 #if HAVE_SSE2
#if CONFIG_POSTPROC #if CONFIG_POSTPROC
/* vp8_filter_by_weight16x16 and 8x8 */ /* vp8_filter_by_weight16x16 and 8x8 */

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#if ARCH_ARM #if ARCH_ARM
#include "vpx_ports/arm.h" #include "vpx_ports/arm.h"
#elif ARCH_X86 || ARCH_X86_64 #elif ARCH_X86 || ARCH_X86_64

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
void vp8_dequant_idct_add_c(short *input, short *dq, void vp8_dequant_idct_add_c(short *input, short *dq,
unsigned char *dest, int stride); unsigned char *dest, int stride);

View File

@@ -13,7 +13,7 @@
#define __INC_INVTRANS_H #define __INC_INVTRANS_H
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "blockd.h" #include "blockd.h"
#include "onyxc_int.h" #include "onyxc_int.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "loopfilter.h" #include "loopfilter.h"
#include "onyxc_int.h" #include "onyxc_int.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"

View File

@@ -14,7 +14,7 @@
#include "vpx_ports/mem.h" #include "vpx_ports/mem.h"
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#define MAX_LOOP_FILTER 63 #define MAX_LOOP_FILTER 63
/* fraction of total macroblock rows to be used in fast filter level picking */ /* fraction of total macroblock rows to be used in fast filter level picking */

View File

@@ -20,7 +20,7 @@
#include "postproc.h" #include "postproc.h"
#include "variance.h" #include "variance.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_scale/yv12config.h" #include "vpx_scale/yv12config.h"
#include <limits.h> #include <limits.h>

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
#if HAVE_DSPR2 #if HAVE_DSPR2

View File

@@ -10,7 +10,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_ports/mem.h" #include "vpx_ports/mem.h"
#if HAVE_DSPR2 #if HAVE_DSPR2

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#if HAVE_DSPR2 #if HAVE_DSPR2

View File

@@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#if HAVE_DSPR2 #if HAVE_DSPR2
#define CROP_WIDTH 256 #define CROP_WIDTH 256

View File

@@ -10,7 +10,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/onyxc_int.h" #include "vp8/common/onyxc_int.h"
#if HAVE_DSPR2 #if HAVE_DSPR2

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
#if HAVE_DSPR2 #if HAVE_DSPR2

View File

@@ -13,7 +13,7 @@
#define __INC_VP8C_INT_H #define __INC_VP8C_INT_H
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx/internal/vpx_codec_internal.h" #include "vpx/internal/vpx_codec_internal.h"
#include "loopfilter.h" #include "loopfilter.h"
#include "entropymv.h" #include "entropymv.h"

View File

@@ -10,7 +10,8 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_scale_rtcd.h"
#include "vpx_scale/yv12config.h" #include "vpx_scale/yv12config.h"
#include "postproc.h" #include "postproc.h"
#include "common.h" #include "common.h"

View File

@@ -12,13 +12,8 @@
#include "subpixel.h" #include "subpixel.h"
#include "loopfilter.h" #include "loopfilter.h"
#include "recon.h" #include "recon.h"
#include "idct.h"
#include "onyxc_int.h" #include "onyxc_int.h"
void (*vp8_short_idct4x4)(short *input, short *output, int pitch);
void (*vp8_short_idct4x4_1)(short *input, short *output, int pitch);
void (*vp8_dc_only_idct)(short input_dc, short *output, int pitch);
extern void (*vp8_post_proc_down_and_across_mb_row)( extern void (*vp8_post_proc_down_and_across_mb_row)(
unsigned char *src_ptr, unsigned char *src_ptr,
unsigned char *dst_ptr, unsigned char *dst_ptr,

View File

@@ -11,7 +11,7 @@
#include <limits.h> #include <limits.h>
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx/vpx_integer.h" #include "vpx/vpx_integer.h"
#include "blockd.h" #include "blockd.h"
#include "reconinter.h" #include "reconinter.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
#include "blockd.h" #include "blockd.h"

View File

@@ -10,17 +10,17 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "blockd.h" #include "blockd.h"
void vp8_intra4x4_predict_c(unsigned char *Above, void vp8_intra4x4_predict_c(unsigned char *Above,
unsigned char *yleft, int left_stride, unsigned char *yleft, int left_stride,
B_PREDICTION_MODE b_mode, int _b_mode,
unsigned char *dst, int dst_stride, unsigned char *dst, int dst_stride,
unsigned char top_left) unsigned char top_left)
{ {
int i, r, c; int i, r, c;
B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode;
unsigned char Left[4]; unsigned char Left[4];
Left[0] = yleft[0]; Left[0] = yleft[0];
Left[1] = yleft[left_stride]; Left[1] = yleft[left_stride];

View File

@@ -9,97 +9,13 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#define RTCD_C #define RTCD_C
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_ports/vpx_once.h"
#if CONFIG_MULTITHREAD && defined(_WIN32) extern void vpx_scale_rtcd(void);
#include <windows.h>
#include <stdlib.h> void vp8_rtcd()
static void once(void (*func)(void))
{
static CRITICAL_SECTION *lock;
static LONG waiters;
static int done;
void *lock_ptr = &lock;
/* If the initialization is complete, return early. This isn't just an
* optimization, it prevents races on the destruction of the global
* lock.
*/
if(done)
return;
InterlockedIncrement(&waiters);
/* Get a lock. We create one and try to make it the one-true-lock,
* throwing it away if we lost the race.
*/
{
/* Scope to protect access to new_lock */
CRITICAL_SECTION *new_lock = malloc(sizeof(CRITICAL_SECTION));
InitializeCriticalSection(new_lock);
if (InterlockedCompareExchangePointer(lock_ptr, new_lock, NULL) != NULL)
{
DeleteCriticalSection(new_lock);
free(new_lock);
}
}
/* At this point, we have a lock that can be synchronized on. We don't
* care which thread actually performed the allocation.
*/
EnterCriticalSection(lock);
if (!done)
{
func();
done = 1;
}
LeaveCriticalSection(lock);
/* Last one out should free resources. The destructed objects are
* protected by checking if(done) above.
*/
if(!InterlockedDecrement(&waiters))
{
DeleteCriticalSection(lock);
free(lock);
lock = NULL;
}
}
#elif CONFIG_MULTITHREAD && HAVE_PTHREAD_H
#include <pthread.h>
static void once(void (*func)(void))
{
static pthread_once_t lock = PTHREAD_ONCE_INIT;
pthread_once(&lock, func);
}
#else
/* No-op version that performs no synchronization. vpx_rtcd() is idempotent,
* so as long as your platform provides atomic loads/stores of pointers
* no synchronization is strictly necessary.
*/
static void once(void (*func)(void))
{
static int done;
if(!done)
{
func();
done = 1;
}
}
#endif
void vpx_rtcd()
{ {
vpx_scale_rtcd();
once(setup_rtcd_internal); once(setup_rtcd_internal);
} }

View File

@@ -1,6 +1,8 @@
common_forward_decls() { vp8_common_forward_decls() {
cat <<EOF cat <<EOF
#include "vp8/common/blockd.h" /*
* VP8
*/
struct blockd; struct blockd;
struct macroblockd; struct macroblockd;
@@ -14,7 +16,7 @@ union int_mv;
struct yv12_buffer_config; struct yv12_buffer_config;
EOF EOF
} }
forward_decls common_forward_decls forward_decls vp8_common_forward_decls
# #
# Dequant # Dequant
@@ -146,7 +148,7 @@ specialize vp8_build_intra_predictors_mby_s sse2 ssse3
prototype void vp8_build_intra_predictors_mbuv_s "struct macroblockd *x, unsigned char * uabove_row, unsigned char * vabove_row, unsigned char *uleft, unsigned char *vleft, int left_stride, unsigned char * upred_ptr, unsigned char * vpred_ptr, int pred_stride" prototype void vp8_build_intra_predictors_mbuv_s "struct macroblockd *x, unsigned char * uabove_row, unsigned char * vabove_row, unsigned char *uleft, unsigned char *vleft, int left_stride, unsigned char * upred_ptr, unsigned char * vpred_ptr, int pred_stride"
specialize vp8_build_intra_predictors_mbuv_s sse2 ssse3 specialize vp8_build_intra_predictors_mbuv_s sse2 ssse3
prototype void vp8_intra4x4_predict "unsigned char *Above, unsigned char *yleft, int left_stride, B_PREDICTION_MODE b_mode, unsigned char *dst, int dst_stride, unsigned char top_left" prototype void vp8_intra4x4_predict "unsigned char *Above, unsigned char *yleft, int left_stride, int b_mode, unsigned char *dst, int dst_stride, unsigned char top_left"
specialize vp8_intra4x4_predict media specialize vp8_intra4x4_predict media
vp8_intra4x4_predict_media=vp8_intra4x4_predict_armv6 vp8_intra4x4_predict_media=vp8_intra4x4_predict_armv6
@@ -530,39 +532,3 @@ fi
# End of encoder only functions # End of encoder only functions
fi fi
# Scaler functions
if [ "CONFIG_SPATIAL_RESAMPLING" != "yes" ]; then
prototype void vp8_horizontal_line_4_5_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_4_5_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_last_vertical_band_4_5_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_2_3_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_2_3_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_last_vertical_band_2_3_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_3_5_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_3_5_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_last_vertical_band_3_5_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_3_4_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_3_4_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_last_vertical_band_3_4_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_1_2_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_1_2_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_last_vertical_band_1_2_scale "unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_5_4_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_5_4_scale "unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_5_3_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_5_3_scale "unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_horizontal_line_2_1_scale "const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width"
prototype void vp8_vertical_band_2_1_scale "unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
prototype void vp8_vertical_band_2_1_scale_i "unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width"
fi
prototype void vp8_yv12_extend_frame_borders "struct yv12_buffer_config *ybf"
specialize vp8_yv12_extend_frame_borders neon
prototype void vp8_yv12_copy_frame "struct yv12_buffer_config *src_ybc, struct yv12_buffer_config *dst_ybc"
specialize vp8_yv12_copy_frame neon
prototype void vp8_yv12_copy_y "struct yv12_buffer_config *src_ybc, struct yv12_buffer_config *dst_ybc"
specialize vp8_yv12_copy_y neon

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"
extern void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q); extern void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q);

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
void vp8_idct_dequant_0_2x_sse2 void vp8_idct_dequant_0_2x_sse2
(short *q, short *dq , (short *q, short *dq ,

View File

@@ -9,7 +9,7 @@
*/ */
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_mem/vpx_mem.h" #include "vpx_mem/vpx_mem.h"
#include "vp8/common/blockd.h" #include "vp8/common/blockd.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "vpx_ports/mem.h" #include "vpx_ports/mem.h"
#include "filter_x86.h" #include "filter_x86.h"

View File

@@ -10,7 +10,8 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#include "./vpx_scale_rtcd.h"
#include "onyxd_int.h" #include "onyxd_int.h"
#include "vp8/common/header.h" #include "vp8/common/header.h"
#include "vp8/common/reconintra4x4.h" #include "vp8/common/reconintra4x4.h"

View File

@@ -25,6 +25,7 @@
#include <assert.h> #include <assert.h>
#include "vp8/common/quant_common.h" #include "vp8/common/quant_common.h"
#include "./vpx_scale_rtcd.h"
#include "vpx_scale/vpxscale.h" #include "vpx_scale/vpxscale.h"
#include "vp8/common/systemdependent.h" #include "vp8/common/systemdependent.h"
#include "vpx_ports/vpx_timer.h" #include "vpx_ports/vpx_timer.h"

View File

@@ -10,7 +10,7 @@
#include "vpx_config.h" #include "vpx_config.h"
#include "vpx_rtcd.h" #include "vp8_rtcd.h"
#if !defined(WIN32) && CONFIG_OS_SUPPORT == 1 #if !defined(WIN32) && CONFIG_OS_SUPPORT == 1
# include <unistd.h> # include <unistd.h>
#endif #endif

View File

@@ -15,7 +15,7 @@
EXPORT |vp8_encode_value| EXPORT |vp8_encode_value|
IMPORT |vp8_validate_buffer_arm| IMPORT |vp8_validate_buffer_arm|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

View File

@@ -12,7 +12,7 @@
EXPORT |vp8cx_pack_tokens_armv5| EXPORT |vp8cx_pack_tokens_armv5|
IMPORT |vp8_validate_buffer_arm| IMPORT |vp8_validate_buffer_arm|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

View File

@@ -12,7 +12,7 @@
EXPORT |vp8cx_pack_mb_row_tokens_armv5| EXPORT |vp8cx_pack_mb_row_tokens_armv5|
IMPORT |vp8_validate_buffer_arm| IMPORT |vp8_validate_buffer_arm|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

View File

@@ -12,7 +12,7 @@
EXPORT |vp8cx_pack_tokens_into_partitions_armv5| EXPORT |vp8cx_pack_tokens_into_partitions_armv5|
IMPORT |vp8_validate_buffer_arm| IMPORT |vp8_validate_buffer_arm|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

View File

@@ -11,7 +11,7 @@
EXPORT |vp8_fast_quantize_b_armv6| EXPORT |vp8_fast_quantize_b_armv6|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

View File

@@ -13,7 +13,7 @@
EXPORT |vp8_subtract_mbuv_armv6| EXPORT |vp8_subtract_mbuv_armv6|
EXPORT |vp8_subtract_b_armv6| EXPORT |vp8_subtract_b_armv6|
INCLUDE asm_enc_offsets.asm INCLUDE vp8_asm_enc_offsets.asm
ARM ARM
REQUIRE8 REQUIRE8

Some files were not shown because too many files have changed in this diff Show More