Compare commits
294 Commits
sandbox/jk
...
v1.1.0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
297dc90255 | ||
![]() |
499510f2be | ||
![]() |
2d6cb342c2 | ||
![]() |
c8f4c187b3 | ||
![]() |
14d827f44e | ||
![]() |
22f56b93e5 | ||
![]() |
3e32105d63 | ||
![]() |
2bf8fb5889 | ||
![]() |
f039a85fd8 | ||
![]() |
9f9cc8fe71 | ||
![]() |
d8216b19b6 | ||
![]() |
d46ddd0839 | ||
![]() |
8b1a14d12f | ||
![]() |
e50c842755 | ||
![]() |
22ae1403e9 | ||
![]() |
14c9fce8e4 | ||
![]() |
f2a6799cc9 | ||
![]() |
e918ed98d4 | ||
![]() |
e5cef5d5a6 | ||
![]() |
faed00d844 | ||
![]() |
101c2bd1fa | ||
![]() |
60b36abf85 | ||
![]() |
061a16d96e | ||
![]() |
1b27e93cd1 | ||
![]() |
3939e85b26 | ||
![]() |
dba053898a | ||
![]() |
504601bb14 | ||
![]() |
a7eea3e267 | ||
![]() |
d72c536ede | ||
![]() |
8e858f90f3 | ||
![]() |
c311b3b3a9 | ||
![]() |
21173e1999 | ||
![]() |
b5b61c179d | ||
![]() |
0c261715b0 | ||
![]() |
3c5ed6f52e | ||
![]() |
6dc21bce63 | ||
![]() |
87b12ac875 | ||
![]() |
72b7db36f3 | ||
![]() |
e0a80519c7 | ||
![]() |
46da1cae05 | ||
![]() |
e4dc2b9248 | ||
![]() |
6b33ca395f | ||
![]() |
9aa58f3fcb | ||
![]() |
d9ca52452b | ||
![]() |
8106df8f5a | ||
![]() |
c459d37c26 | ||
![]() |
811d0ff209 | ||
![]() |
21ac3c8f26 | ||
![]() |
4ed05a8bb1 | ||
![]() |
00794a93ec | ||
![]() |
8b15cf6929 | ||
![]() |
3df4436e1a | ||
![]() |
a46ec16569 | ||
![]() |
3f8349467a | ||
![]() |
31322c5faa | ||
![]() |
a337725625 | ||
![]() |
b3151c80fc | ||
![]() |
0799cccce3 | ||
![]() |
c88fc5b2f9 | ||
![]() |
cb265a497d | ||
![]() |
ccea000c4b | ||
![]() |
403966ae00 | ||
![]() |
bf2c903000 | ||
![]() |
85ef83a173 | ||
![]() |
1991123054 | ||
![]() |
9e9f5f3d70 | ||
![]() |
06dc2f6166 | ||
![]() |
66ba79f5fb | ||
![]() |
fd9df44a05 | ||
![]() |
3c021e1d79 | ||
![]() |
451ab0c01e | ||
![]() |
bcee56bed5 | ||
![]() |
921ffdd2c9 | ||
![]() |
9ed1b2f09e | ||
![]() |
6a819ce4fe | ||
![]() |
56e8485c84 | ||
![]() |
a05bf133ae | ||
![]() |
e68953b7c8 | ||
![]() |
9aa2bd8a03 | ||
![]() |
6b7cf3077d | ||
![]() |
eb0c5a6ffc | ||
![]() |
422f97d7ab | ||
![]() |
7af4eb014b | ||
![]() |
20cd3e6b8f | ||
![]() |
6b66c01c88 | ||
![]() |
9c41143d66 | ||
![]() |
e9cacfd66d | ||
![]() |
301409107f | ||
![]() |
ddf94f6184 | ||
![]() |
c21f53a501 | ||
![]() |
7a1590713e | ||
![]() |
9ed874713f | ||
![]() |
676610d2a8 | ||
![]() |
fd903902ef | ||
![]() |
154b4b4196 | ||
![]() |
953c6a011e | ||
![]() |
e50f96a4a3 | ||
![]() |
5d88a82aa0 | ||
![]() |
cbcfbe1b29 | ||
![]() |
888699091d | ||
![]() |
87c40b35eb | ||
![]() |
a6f538cefa | ||
![]() |
a60461a340 | ||
![]() |
f0f609c2e2 | ||
![]() |
91b5c98b3d | ||
![]() |
8d07a97acc | ||
![]() |
6d84322762 | ||
![]() |
c34d91a84e | ||
![]() |
aabae97e57 | ||
![]() |
52cf4dcaea | ||
![]() |
b8fa2839a2 | ||
![]() |
2578b767c3 | ||
![]() |
ce328b855f | ||
![]() |
aab70f4d7a | ||
![]() |
bcba86e2e9 | ||
![]() |
9a4052a4ec | ||
![]() |
b1bfd0ba87 | ||
![]() |
019384f2d3 | ||
![]() |
e2c6b05f9a | ||
![]() |
61c5e31ca1 | ||
![]() |
ad1216151d | ||
![]() |
02a31e6b3c | ||
![]() |
84be08b07f | ||
![]() |
313bfbb6a2 | ||
![]() |
2089f26b08 | ||
![]() |
507ee87e3e | ||
![]() |
f2bd11faa4 | ||
![]() |
0c1cec2205 | ||
![]() |
dadc9189ed | ||
![]() |
f05feab7b9 | ||
![]() |
02360dd2c2 | ||
![]() |
b0a12a2880 | ||
![]() |
b5ce9456db | ||
![]() |
e6047a17a9 | ||
![]() |
f93b1e7be1 | ||
![]() |
04b9e0d787 | ||
![]() |
ce42e79abc | ||
![]() |
565d0e6feb | ||
![]() |
6b151d436d | ||
![]() |
5f0b303c28 | ||
![]() |
3653fb473a | ||
![]() |
9e50ed7f27 | ||
![]() |
732cb9a643 | ||
![]() |
c535025c12 | ||
![]() |
e8223bd250 | ||
![]() |
7989bb7fe7 | ||
![]() |
6776bd62b5 | ||
![]() |
a5879f7c81 | ||
![]() |
12ee845ee7 | ||
![]() |
d02e74a073 | ||
![]() |
78071b3b97 | ||
![]() |
efd54f8f41 | ||
![]() |
8144132866 | ||
![]() |
e6df50031e | ||
![]() |
169823428f | ||
![]() |
12d45f62f6 | ||
![]() |
8c50a70a95 | ||
![]() |
768ae275dc | ||
![]() |
fea3556e20 | ||
![]() |
2e0d55314c | ||
![]() |
2dad8d65d9 | ||
![]() |
51acb01167 | ||
![]() |
417b852967 | ||
![]() |
45f4b87e8e | ||
![]() |
9df0d29823 | ||
![]() |
a040eb37e4 | ||
![]() |
fa1a9290e6 | ||
![]() |
d8ebdcd89d | ||
![]() |
11c706488b | ||
![]() |
e2000cc5ca | ||
![]() |
07c6eb18ad | ||
![]() |
749bc98618 | ||
![]() |
57d459ba82 | ||
![]() |
8aae246089 | ||
![]() |
109b69a706 | ||
![]() |
0b0bc8d098 | ||
![]() |
be8af188d0 | ||
![]() |
61311e6103 | ||
![]() |
510e0ab467 | ||
![]() |
83a91e789c | ||
![]() |
f103dcefaf | ||
![]() |
2a8f57f50d | ||
![]() |
fdb61a4531 | ||
![]() |
ab77b4e898 | ||
![]() |
55f74c59c7 | ||
![]() |
a910049aea | ||
![]() |
57cc35dd60 | ||
![]() |
9951f46133 | ||
![]() |
2b0aee4b5d | ||
![]() |
5e3f607e73 | ||
![]() |
21071373e7 | ||
![]() |
8be41bba80 | ||
![]() |
8978358358 | ||
![]() |
319f7c4d56 | ||
![]() |
83cef816fd | ||
![]() |
294aa37745 | ||
![]() |
630d3b95e2 | ||
![]() |
c14754be1d | ||
![]() |
8a6af9f98f | ||
![]() |
892102842a | ||
![]() |
f357e5e2f7 | ||
![]() |
47dcd769c1 | ||
![]() |
ac97b089d1 | ||
![]() |
185eb70011 | ||
![]() |
6a4ff6f325 | ||
![]() |
4753ee4166 | ||
![]() |
15c29afeca | ||
![]() |
315b58ec38 | ||
![]() |
de368fd0b5 | ||
![]() |
d830573111 | ||
![]() |
0e06bc817a | ||
![]() |
d3879738bf | ||
![]() |
ed208f7d2f | ||
![]() |
c1c5932260 | ||
![]() |
90b9f993c1 | ||
![]() |
e479379abb | ||
![]() |
4ade079633 | ||
![]() |
bd5bfd94b8 | ||
![]() |
9c2ca8c1ca | ||
![]() |
e6c91b625e | ||
![]() |
6c0d3d9522 | ||
![]() |
6ce1f15dfb | ||
![]() |
55610053af | ||
![]() |
892e23a5ba | ||
![]() |
34168287ed | ||
![]() |
28aa08748e | ||
![]() |
16a02e341c | ||
![]() |
7ec139ccc8 | ||
![]() |
80528410fc | ||
![]() |
66da859e5e | ||
![]() |
2a0d7b1a55 | ||
![]() |
5f25d4c175 | ||
![]() |
70a5104ead | ||
![]() |
87aa846b47 | ||
![]() |
0780f258da | ||
![]() |
b2c8dff727 | ||
![]() |
89cdfdb231 | ||
![]() |
77119a5cd8 | ||
![]() |
b73e6c89cd | ||
![]() |
5bfa29b6c5 | ||
![]() |
9f1083e9a0 | ||
![]() |
33d9ea5471 | ||
![]() |
2b2c0c9bda | ||
![]() |
3cb92b85b9 | ||
![]() |
31e86192ba | ||
![]() |
b510863f8f | ||
![]() |
2d8d15a71c | ||
![]() |
03fadc4b20 | ||
![]() |
d48ea5a2ab | ||
![]() |
adb10c47a8 | ||
![]() |
64c4be2669 | ||
![]() |
09080d4e5e | ||
![]() |
0c2b2c79ae | ||
![]() |
f56918ba9c | ||
![]() |
aa8650dd7f | ||
![]() |
efb4783d36 | ||
![]() |
a2407935d2 | ||
![]() |
0c2f8e77cc | ||
![]() |
bf1a8073c3 | ||
![]() |
b651875e24 | ||
![]() |
db389cb804 | ||
![]() |
bb1915274f | ||
![]() |
16a8948c45 | ||
![]() |
1d7d18c69c | ||
![]() |
63d9c4da5e | ||
![]() |
b0056c3b5e | ||
![]() |
056bcc8771 | ||
![]() |
080919b3c2 | ||
![]() |
c75f0ec379 | ||
![]() |
fd294c553a | ||
![]() |
c647ec4462 | ||
![]() |
24196dd987 | ||
![]() |
26c6a44c66 | ||
![]() |
0ccefd2c8f | ||
![]() |
a53d5a4c44 | ||
![]() |
c8df1656bd | ||
![]() |
e06c242baa | ||
![]() |
d7e09b6ada | ||
![]() |
72f459c77f | ||
![]() |
4f8f360098 | ||
![]() |
7d54dfc6e4 | ||
![]() |
24beb58dd5 | ||
![]() |
e542627b0c | ||
![]() |
247e7343d5 | ||
![]() |
c1c47e83b0 | ||
![]() |
51c4f9e6b1 | ||
![]() |
55fbdd58ac | ||
![]() |
c4aeff94b1 | ||
![]() |
f8b431c334 | ||
![]() |
d6020f9d52 | ||
![]() |
8bc60e4749 | ||
![]() |
c4aa1d508e | ||
![]() |
a4e410a3ca | ||
![]() |
df49c7c58d |
3
.mailmap
3
.mailmap
@@ -3,3 +3,6 @@ Johann Koenig <johannkoenig@google.com>
|
|||||||
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
|
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
|
||||||
Tom Finegan <tomfinegan@google.com>
|
Tom Finegan <tomfinegan@google.com>
|
||||||
Ralph Giles <giles@xiph.org> <giles@entropywave.com>
|
Ralph Giles <giles@xiph.org> <giles@entropywave.com>
|
||||||
|
Ralph Giles <giles@xiph.org> <giles@mozilla.com>
|
||||||
|
Alpha Lam <hclam@google.com> <hclam@chromium.org>
|
||||||
|
Deb Mukherjee <debargha@google.com>
|
||||||
|
8
AUTHORS
8
AUTHORS
@@ -6,10 +6,12 @@ Adrian Grange <agrange@google.com>
|
|||||||
Alex Converse <alex.converse@gmail.com>
|
Alex Converse <alex.converse@gmail.com>
|
||||||
Alexis Ballier <aballier@gentoo.org>
|
Alexis Ballier <aballier@gentoo.org>
|
||||||
Alok Ahuja <waveletcoeff@gmail.com>
|
Alok Ahuja <waveletcoeff@gmail.com>
|
||||||
|
Alpha Lam <hclam@google.com>
|
||||||
Andoni Morales Alastruey <ylatuya@gmail.com>
|
Andoni Morales Alastruey <ylatuya@gmail.com>
|
||||||
Andres Mejia <mcitadel@gmail.com>
|
Andres Mejia <mcitadel@gmail.com>
|
||||||
Aron Rosenberg <arosenberg@logitech.com>
|
Aron Rosenberg <arosenberg@logitech.com>
|
||||||
Attila Nagy <attilanagy@google.com>
|
Attila Nagy <attilanagy@google.com>
|
||||||
|
Deb Mukherjee <debargha@google.com>
|
||||||
Fabio Pedretti <fabio.ped@libero.it>
|
Fabio Pedretti <fabio.ped@libero.it>
|
||||||
Frank Galligan <fgalligan@google.com>
|
Frank Galligan <fgalligan@google.com>
|
||||||
Fredrik Söderquist <fs@opera.com>
|
Fredrik Söderquist <fs@opera.com>
|
||||||
@@ -21,6 +23,7 @@ Henrik Lundin <hlundin@google.com>
|
|||||||
James Berry <jamesberry@google.com>
|
James Berry <jamesberry@google.com>
|
||||||
James Zern <jzern@google.com>
|
James Zern <jzern@google.com>
|
||||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Jeff Faust <jfaust@google.com>
|
||||||
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
||||||
Jim Bankoski <jimbankoski@google.com>
|
Jim Bankoski <jimbankoski@google.com>
|
||||||
Johann Koenig <johannkoenig@google.com>
|
Johann Koenig <johannkoenig@google.com>
|
||||||
@@ -28,9 +31,11 @@ John Koleszar <jkoleszar@google.com>
|
|||||||
Joshua Bleecher Snyder <josh@treelinelabs.com>
|
Joshua Bleecher Snyder <josh@treelinelabs.com>
|
||||||
Justin Clift <justin@salasaga.org>
|
Justin Clift <justin@salasaga.org>
|
||||||
Justin Lebar <justin.lebar@gmail.com>
|
Justin Lebar <justin.lebar@gmail.com>
|
||||||
|
KO Myung-Hun <komh@chollian.net>
|
||||||
Lou Quillio <louquillio@google.com>
|
Lou Quillio <louquillio@google.com>
|
||||||
Luca Barbato <lu_zero@gentoo.org>
|
Luca Barbato <lu_zero@gentoo.org>
|
||||||
Makoto Kato <makoto.kt@gmail.com>
|
Makoto Kato <makoto.kt@gmail.com>
|
||||||
|
Marco Paniconi <marpan@google.com>
|
||||||
Martin Ettl <ettl.martin78@googlemail.com>
|
Martin Ettl <ettl.martin78@googlemail.com>
|
||||||
Michael Kohler <michaelkohler@live.com>
|
Michael Kohler <michaelkohler@live.com>
|
||||||
Mike Hommey <mhommey@mozilla.com>
|
Mike Hommey <mhommey@mozilla.com>
|
||||||
@@ -40,12 +45,15 @@ Patrik Westin <patrik.westin@gmail.com>
|
|||||||
Paul Wilkins <paulwilkins@google.com>
|
Paul Wilkins <paulwilkins@google.com>
|
||||||
Pavol Rusnak <stick@gk2.sk>
|
Pavol Rusnak <stick@gk2.sk>
|
||||||
Philip Jägenstedt <philipj@opera.com>
|
Philip Jägenstedt <philipj@opera.com>
|
||||||
|
Priit Laes <plaes@plaes.org>
|
||||||
Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
|
Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
|
||||||
|
Rafaël Carré <funman@videolan.org>
|
||||||
Ralph Giles <giles@xiph.org>
|
Ralph Giles <giles@xiph.org>
|
||||||
Ronald S. Bultje <rbultje@google.com>
|
Ronald S. Bultje <rbultje@google.com>
|
||||||
Scott LaVarnway <slavarnway@google.com>
|
Scott LaVarnway <slavarnway@google.com>
|
||||||
Stefan Holmer <holmer@google.com>
|
Stefan Holmer <holmer@google.com>
|
||||||
Taekhyun Kim <takim@nvidia.com>
|
Taekhyun Kim <takim@nvidia.com>
|
||||||
|
Takanori MATSUURA <t.matsuu@gmail.com>
|
||||||
Tero Rintaluoma <teror@google.com>
|
Tero Rintaluoma <teror@google.com>
|
||||||
Thijs Vermeir <thijsvermeir@gmail.com>
|
Thijs Vermeir <thijsvermeir@gmail.com>
|
||||||
Timothy B. Terriberry <tterribe@xiph.org>
|
Timothy B. Terriberry <tterribe@xiph.org>
|
||||||
|
140
CHANGELOG
140
CHANGELOG
@@ -1,3 +1,143 @@
|
|||||||
|
2012-05-09 v1.1.0 "Eider"
|
||||||
|
This introduces a number of enhancements, mostly focused on real-time
|
||||||
|
encoding. In addition, it fixes a decoder bug (first introduced in
|
||||||
|
Duclair) so all users of that release are encouraged to upgrade.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||||
|
of older releases should refer to the Upgrading notes in this
|
||||||
|
document for that release.
|
||||||
|
|
||||||
|
This release introduces a new temporal denoiser, controlled by the
|
||||||
|
VP8E_SET_NOISE_SENSITIVITY control. The temporal denoiser does not
|
||||||
|
currently take a strength parameter, so the control is effectively
|
||||||
|
a boolean - zero (off) or non-zero (on). For compatibility with
|
||||||
|
existing applications, the values accepted are the same as those
|
||||||
|
for the spatial denoiser (0-6). The temporal denoiser is enabled
|
||||||
|
by default, and the older spatial denoiser may be restored by
|
||||||
|
configuring with --disable-temporal-denoising. The temporal denoiser
|
||||||
|
is more computationally intensive than the spatial one.
|
||||||
|
|
||||||
|
This release removes support for a legacy, decode only API that was
|
||||||
|
supported, but deprecated, at the initial release of libvpx
|
||||||
|
(v0.9.0). This is not expected to have any impact. If you are
|
||||||
|
impacted, you can apply a reversion to commit 2bf8fb58 locally.
|
||||||
|
Please update to the latest libvpx API if you are affected.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
Adds a motion compensated temporal denoiser to the encoder, which
|
||||||
|
gives higher quality than the older spatial denoiser. (See above
|
||||||
|
for notes on upgrading).
|
||||||
|
|
||||||
|
In addition, support for new compilers and platforms were added,
|
||||||
|
including:
|
||||||
|
improved support for XCode
|
||||||
|
Android x86 NDK build
|
||||||
|
OS/2 support
|
||||||
|
SunCC support
|
||||||
|
|
||||||
|
Changing resolution with vpx_codec_enc_config_set() is now
|
||||||
|
supported. Previously, reinitializing the codec was required to
|
||||||
|
change the input resolution.
|
||||||
|
|
||||||
|
The vpxenc application has initial support for producing multiple
|
||||||
|
encodes from the same input in one call. Resizing is not yet
|
||||||
|
supported, but varying other codec parameters is. Use -- to
|
||||||
|
delineate output streams. Options persist from one stream to the
|
||||||
|
next.
|
||||||
|
|
||||||
|
Also, the vpxenc application will now use a keyframe interval of
|
||||||
|
5 seconds by default. Use the --kf-max-dist option to override.
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Decoder performance improved 2.5% versus Duclair. Encoder speed is
|
||||||
|
consistent with Duclair for most material. Two pass encoding of
|
||||||
|
slideshow-like material will see significant improvements.
|
||||||
|
|
||||||
|
Large realtime encoding speed gains at a small quality expense are
|
||||||
|
possible by configuring the on-the-fly bitpacking experiment with
|
||||||
|
--enable-onthefly-bitpacking. Realtime encoder can be up to 13%
|
||||||
|
faster (ARM) depending on the number of threads and bitrate
|
||||||
|
settings. This technique sees constant gain over the 5-16 speed
|
||||||
|
range. For VC style input the loss seen is up to 0.2dB. See commit
|
||||||
|
52cf4dca for further details.
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
On the whole, quality is consistent with the Duclair release. Some
|
||||||
|
tweaks:
|
||||||
|
|
||||||
|
Reduced blockiness in easy sections by applying a penalty to
|
||||||
|
intra modes.
|
||||||
|
|
||||||
|
Improved quality of static sections (like slideshows) with
|
||||||
|
two pass encoding.
|
||||||
|
|
||||||
|
Improved keyframe sizing with multiple temporal layers
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
Corrected alt-ref contribution to frame rate for visible updates
|
||||||
|
to the alt-ref buffer. This affected applications making manual
|
||||||
|
usage of the frame reference flags, or temporal layers.
|
||||||
|
|
||||||
|
Additional constraints were added to disable multi-frame quality
|
||||||
|
enhancement (MFQE) in sections of the frame where there is motion.
|
||||||
|
(#392)
|
||||||
|
|
||||||
|
Fixed corruption issues when vpx_codec_enc_config_set() was called
|
||||||
|
with spatial resampling enabled.
|
||||||
|
|
||||||
|
Fixed a decoder error introduced in Duclair where the segmentation
|
||||||
|
map was not being reinitialized on keyframes (#378)
|
||||||
|
|
||||||
|
|
||||||
|
2012-01-27 v1.0.0 "Duclair"
|
||||||
|
Our fourth named release, focused on performance and features related to
|
||||||
|
real-time encoding. It also fixes a decoder crash bug introduced in
|
||||||
|
v0.9.7, so all users of that release are encouraged to upgrade.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is ABI incompatible with prior releases of libvpx, so the
|
||||||
|
"major" version number has been bumped to 1. You must recompile your
|
||||||
|
applications against the latest version of the libvpx headers. The
|
||||||
|
API remains compatible, and this should not require code changes in most
|
||||||
|
applications.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
This release introduces several substantial new features to the encoder,
|
||||||
|
of particular interest to real time streaming applications.
|
||||||
|
|
||||||
|
Temporal scalability allows the encoder to produce a stream that can
|
||||||
|
be decimated to different frame rates, with independent rate targetting
|
||||||
|
for each substream.
|
||||||
|
|
||||||
|
Multiframe quality enhancement postprocessing can make visual quality
|
||||||
|
more consistent in the presence of frames that are substantially
|
||||||
|
different quality than the surrounding frames, as in the temporal
|
||||||
|
scalability case and in some forced keyframe scenarios.
|
||||||
|
|
||||||
|
Multiple-resolution encoding support allows the encoding of the
|
||||||
|
same content at different resolutions faster than encoding them
|
||||||
|
separately.
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Optimization targets for this release included the decoder and the real-
|
||||||
|
time modes of the encoder. Decoder speed on x86 has improved 10.5% with
|
||||||
|
this release. Encoder improvements followed a curve where speeds 1-3
|
||||||
|
improved 4.0%-1.5%, speeds 4-8 improved <1%, and speeds 9-16 improved
|
||||||
|
1.5% to 10.5%, respectively. "Best" mode speed is consistent with the
|
||||||
|
Cayuga release.
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
Encoder quality in the single stream case is consistent with the Cayuga
|
||||||
|
release.
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
This release fixes an OOB read decoder crash bug present in v0.9.7
|
||||||
|
related to the clamping of motion vectors in SPLITMV blocks. This
|
||||||
|
behavior could be triggered by corrupt input or by starting
|
||||||
|
decoding from a P-frame.
|
||||||
|
|
||||||
|
|
||||||
2011-08-15 v0.9.7-p1 "Cayuga" patch 1
|
2011-08-15 v0.9.7-p1 "Cayuga" patch 1
|
||||||
This is an incremental bugfix release against Cayuga. All users of that
|
This is an incremental bugfix release against Cayuga. All users of that
|
||||||
release are strongly encouraged to upgrade.
|
release are strongly encouraged to upgrade.
|
||||||
|
8
README
8
README
@@ -42,17 +42,13 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
|||||||
--help output of the configure script. As of this writing, the list of
|
--help output of the configure script. As of this writing, the list of
|
||||||
available targets is:
|
available targets is:
|
||||||
|
|
||||||
|
armv5te-android-gcc
|
||||||
armv5te-linux-rvct
|
armv5te-linux-rvct
|
||||||
armv5te-linux-gcc
|
armv5te-linux-gcc
|
||||||
armv5te-symbian-gcc
|
|
||||||
armv6-darwin-gcc
|
armv6-darwin-gcc
|
||||||
armv6-linux-rvct
|
armv6-linux-rvct
|
||||||
armv6-linux-gcc
|
armv6-linux-gcc
|
||||||
armv6-symbian-gcc
|
armv7-android-gcc
|
||||||
iwmmxt-linux-rvct
|
|
||||||
iwmmxt-linux-gcc
|
|
||||||
iwmmxt2-linux-rvct
|
|
||||||
iwmmxt2-linux-gcc
|
|
||||||
armv7-linux-rvct
|
armv7-linux-rvct
|
||||||
armv7-linux-gcc
|
armv7-linux-gcc
|
||||||
mips32-linux-gcc
|
mips32-linux-gcc
|
||||||
|
2
args.c
2
args.c
@@ -57,7 +57,7 @@ int arg_match(struct arg *arg_, const struct arg_def *def, char **argv)
|
|||||||
}
|
}
|
||||||
else if (def->long_name)
|
else if (def->long_name)
|
||||||
{
|
{
|
||||||
int name_len = strlen(def->long_name);
|
const size_t name_len = strlen(def->long_name);
|
||||||
|
|
||||||
if (strlen(arg.argv[0]) >= name_len + 2
|
if (strlen(arg.argv[0]) >= name_len + 2
|
||||||
&& arg.argv[0][1] == '-'
|
&& arg.argv[0][1] == '-'
|
||||||
|
199
build/make/Android.mk
Normal file
199
build/make/Android.mk
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
##
|
||||||
|
## 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.
|
||||||
|
##
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file is to be used for compiling libvpx for Android using the NDK.
|
||||||
|
# In an Android project place a libvpx checkout in the jni directory.
|
||||||
|
# Run the configure script from the jni directory. Base libvpx
|
||||||
|
# encoder/decoder configuration will look similar to:
|
||||||
|
# ./libvpx/configure --target=armv7-android-gcc --disable-examples \
|
||||||
|
# --sdk-path=/opt/android-ndk-r6b/
|
||||||
|
#
|
||||||
|
# When targeting Android, realtime-only is enabled by default. This can
|
||||||
|
# be overridden by adding the command line flag:
|
||||||
|
# --disable-realtime-only
|
||||||
|
#
|
||||||
|
# This will create .mk files that contain variables that contain the
|
||||||
|
# source files to compile.
|
||||||
|
#
|
||||||
|
# Place an Android.mk file in the jni directory that references the
|
||||||
|
# Android.mk file in the libvpx directory:
|
||||||
|
# LOCAL_PATH := $(call my-dir)
|
||||||
|
# include $(CLEAR_VARS)
|
||||||
|
# include libvpx/build/make/Android.mk
|
||||||
|
#
|
||||||
|
# There are currently two TARGET_ARCH_ABI targets for ARM.
|
||||||
|
# armeabi and armeabi-v7a. armeabi-v7a is selected by creating an
|
||||||
|
# Application.mk in the jni directory that contains:
|
||||||
|
# APP_ABI := armeabi-v7a
|
||||||
|
#
|
||||||
|
# To change to building armeabi, run ./libvpx/configure again, but with
|
||||||
|
# --target=arm5te-android-gcc and and modify the Application.mk file to
|
||||||
|
# set APP_ABI := armeabi
|
||||||
|
#
|
||||||
|
# Running ndk-build will build libvpx and include it in your project.
|
||||||
|
#
|
||||||
|
|
||||||
|
CONFIG_DIR := $(LOCAL_PATH)
|
||||||
|
LIBVPX_PATH := $(LOCAL_PATH)/libvpx
|
||||||
|
ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas
|
||||||
|
ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL)
|
||||||
|
|
||||||
|
# Makefiles created by the libvpx configure process
|
||||||
|
# This will need to be fixed to handle x86.
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
include $(CONFIG_DIR)/libs-armv7-android-gcc.mk
|
||||||
|
else
|
||||||
|
include $(CONFIG_DIR)/libs-armv5te-android-gcc.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Rule that is normally in Makefile created by libvpx
|
||||||
|
# configure. Used to filter out source files based on configuration.
|
||||||
|
enabled=$(filter-out $($(1)-no),$($(1)-yes))
|
||||||
|
|
||||||
|
# Override the relative path that is defined by the libvpx
|
||||||
|
# configure process
|
||||||
|
SRC_PATH_BARE := $(LIBVPX_PATH)
|
||||||
|
|
||||||
|
# Include the list of files to be built
|
||||||
|
include $(LIBVPX_PATH)/libs.mk
|
||||||
|
|
||||||
|
# Want arm, not thumb, optimized
|
||||||
|
LOCAL_ARM_MODE := arm
|
||||||
|
LOCAL_CFLAGS := -O3
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Template : asm_offsets_template
|
||||||
|
# Arguments : 1: assembly offsets file to be created
|
||||||
|
# 2: c file to base assembly offsets on
|
||||||
|
# Returns : None
|
||||||
|
# Usage : $(eval $(call asm_offsets_template,<asmfile>, <srcfile>
|
||||||
|
# Rationale : Create offsets at compile time using for structures that are
|
||||||
|
# defined in c, but used in assembly functions.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
define asm_offsets_template
|
||||||
|
|
||||||
|
_SRC:=$(2)
|
||||||
|
_OBJ:=$(ASM_CNV_PATH)/$$(notdir $(2)).S
|
||||||
|
|
||||||
|
_FLAGS = $$($$(my)CFLAGS) \
|
||||||
|
$$(call get-src-file-target-cflags,$(2)) \
|
||||||
|
$$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(CONFIG_DIR)) \
|
||||||
|
$$(LOCAL_CFLAGS) \
|
||||||
|
$$(NDK_APP_CFLAGS) \
|
||||||
|
$$(call host-c-includes,$$($(my)C_INCLUDES)) \
|
||||||
|
-DINLINE_ASM \
|
||||||
|
-S \
|
||||||
|
|
||||||
|
_TEXT = "Compile $$(call get-src-file-text,$(2))"
|
||||||
|
_CC = $$(TARGET_CC)
|
||||||
|
|
||||||
|
$$(eval $$(call ev-build-file))
|
||||||
|
|
||||||
|
$(1) : $$(_OBJ) $(2)
|
||||||
|
@mkdir -p $$(dir $$@)
|
||||||
|
@grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)/$(ASM_CONVERSION) > $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Use ads2gas script to convert from RVCT format to GAS format. This passes
|
||||||
|
# puts the processed file under $(ASM_CNV_PATH). Local clean rule
|
||||||
|
# to handle removing these
|
||||||
|
ASM_CNV_OFFSETS_DEPEND = $(ASM_CNV_PATH)/asm_com_offsets.asm
|
||||||
|
ifeq ($(CONFIG_VP8_DECODER), yes)
|
||||||
|
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_dec_offsets.asm
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||||
|
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_enc_offsets.asm
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PRECIOUS: %.asm.s
|
||||||
|
$(ASM_CNV_PATH)/libvpx/%.asm.s: $(LIBVPX_PATH)/%.asm $(ASM_CNV_OFFSETS_DEPEND)
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
@$(CONFIG_DIR)/$(ASM_CONVERSION) <$< > $@
|
||||||
|
|
||||||
|
# For building vpx_rtcd.h, which has a rule in libs.mk
|
||||||
|
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
|
||||||
|
target := libs
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += vpx_config.c
|
||||||
|
|
||||||
|
# Remove duplicate entries
|
||||||
|
CODEC_SRCS_UNIQUE = $(sort $(CODEC_SRCS))
|
||||||
|
|
||||||
|
# Pull out C files. vpx_config.c is in the immediate directory and
|
||||||
|
# so it does not need libvpx/ prefixed like the rest of the source files.
|
||||||
|
CODEC_SRCS_C = $(filter %.c, $(CODEC_SRCS_UNIQUE))
|
||||||
|
LOCAL_CODEC_SRCS_C = $(filter-out vpx_config.c, $(CODEC_SRCS_C))
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += $(foreach file, $(LOCAL_CODEC_SRCS_C), libvpx/$(file))
|
||||||
|
|
||||||
|
# Pull out assembly files, splitting NEON from the rest. This is
|
||||||
|
# done to specify that the NEON assembly files use NEON assembler flags.
|
||||||
|
CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE))
|
||||||
|
CODEC_SRCS_ASM = $(foreach v, \
|
||||||
|
$(CODEC_SRCS_ASM_ALL), \
|
||||||
|
$(if $(findstring neon,$(v)),,$(v)))
|
||||||
|
CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \
|
||||||
|
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||||
|
$(CODEC_SRCS_ASM))
|
||||||
|
LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS)
|
||||||
|
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
CODEC_SRCS_ASM_NEON = $(foreach v, \
|
||||||
|
$(CODEC_SRCS_ASM_ALL),\
|
||||||
|
$(if $(findstring neon,$(v)),$(v),))
|
||||||
|
CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \
|
||||||
|
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||||
|
$(CODEC_SRCS_ASM_NEON))
|
||||||
|
LOCAL_SRC_FILES += $(patsubst %.s, \
|
||||||
|
%.s.neon, \
|
||||||
|
$(CODEC_SRCS_ASM_NEON_ADS2GAS))
|
||||||
|
endif
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-DHAVE_CONFIG_H=vpx_config.h \
|
||||||
|
-I$(LIBVPX_PATH) \
|
||||||
|
-I$(ASM_CNV_PATH)
|
||||||
|
|
||||||
|
LOCAL_MODULE := libvpx
|
||||||
|
|
||||||
|
LOCAL_LDLIBS := -llog
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES := cpufeatures
|
||||||
|
|
||||||
|
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_rtcd.h
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]"
|
||||||
|
@$(RM) $(CODEC_SRCS_ASM_ADS2GAS) $(CODEC_SRCS_ASM_NEON_ADS2GAS)
|
||||||
|
@$(RM) $(patsubst %.asm, %.*, $(ASM_CNV_OFFSETS_DEPEND))
|
||||||
|
@$(RM) -r $(ASM_CNV_PATH)
|
||||||
|
@$(RM) $(CLEAN-OBJS)
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_com_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/common/asm_com_offsets.c))
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_VP8_DECODER), yes)
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_dec_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/decoder/asm_dec_offsets.c))
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_enc_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/encoder/asm_enc_offsets.c))
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(call import-module,cpufeatures)
|
@@ -129,11 +129,14 @@ while (<STDIN>)
|
|||||||
# ARM code
|
# ARM code
|
||||||
s/\sARM/.arm/g;
|
s/\sARM/.arm/g;
|
||||||
|
|
||||||
|
# eabi_attributes numerical equivalents can be found in the
|
||||||
|
# "ARM IHI 0045C" document.
|
||||||
|
|
||||||
# REQUIRE8 Stack is required to be 8-byte aligned
|
# REQUIRE8 Stack is required to be 8-byte aligned
|
||||||
s/\sREQUIRE8/.eabi_attribute Tag_ABI_align_needed, 1/g;
|
s/\sREQUIRE8/.eabi_attribute 24, 1 \@Tag_ABI_align_needed/g;
|
||||||
|
|
||||||
# PRESERVE8 Stack 8-byte align is preserved
|
# PRESERVE8 Stack 8-byte align is preserved
|
||||||
s/\sPRESERVE8/.eabi_attribute Tag_ABI_align_preserved, 1/g;
|
s/\sPRESERVE8/.eabi_attribute 25, 1 \@Tag_ABI_align_preserved/g;
|
||||||
|
|
||||||
# Use PROC and ENDP to give the symbols a .size directive.
|
# Use PROC and ENDP to give the symbols a .size directive.
|
||||||
# This makes them show up properly in debugging tools like gdb and valgrind.
|
# This makes them show up properly in debugging tools like gdb and valgrind.
|
||||||
|
@@ -30,6 +30,8 @@ my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8
|
|||||||
|
|
||||||
my @incoming_array;
|
my @incoming_array;
|
||||||
|
|
||||||
|
my @imported_functions;
|
||||||
|
|
||||||
# Perl trim function to remove whitespace from the start and end of the string
|
# Perl trim function to remove whitespace from the start and end of the string
|
||||||
sub trim($)
|
sub trim($)
|
||||||
{
|
{
|
||||||
@@ -132,7 +134,18 @@ while (<STDIN>)
|
|||||||
# Make function visible to linker, and make additional symbol with
|
# Make function visible to linker, and make additional symbol with
|
||||||
# prepended underscore
|
# prepended underscore
|
||||||
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
|
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
|
||||||
s/IMPORT\s+\|([\$\w]*)\|/.globl $1/;
|
|
||||||
|
# Prepend imported functions with _
|
||||||
|
if (s/IMPORT\s+\|([\$\w]*)\|/.globl $1/)
|
||||||
|
{
|
||||||
|
$function = trim($1);
|
||||||
|
push(@imported_functions, $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach $function (@imported_functions)
|
||||||
|
{
|
||||||
|
s/$function/_$function/;
|
||||||
|
}
|
||||||
|
|
||||||
# No vertical bars required; make additional symbol with prepended
|
# No vertical bars required; make additional symbol with prepended
|
||||||
# underscore
|
# underscore
|
||||||
|
@@ -391,6 +391,8 @@ LDFLAGS = ${LDFLAGS}
|
|||||||
ASFLAGS = ${ASFLAGS}
|
ASFLAGS = ${ASFLAGS}
|
||||||
extralibs = ${extralibs}
|
extralibs = ${extralibs}
|
||||||
AS_SFX = ${AS_SFX:-.asm}
|
AS_SFX = ${AS_SFX:-.asm}
|
||||||
|
EXE_SFX = ${EXE_SFX}
|
||||||
|
RTCD_OPTIONS = ${RTCD_OPTIONS}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if enabled rvct; then cat >> $1 << EOF
|
if enabled rvct; then cat >> $1 << EOF
|
||||||
@@ -454,9 +456,25 @@ process_common_cmdline() {
|
|||||||
;;
|
;;
|
||||||
--enable-?*|--disable-?*)
|
--enable-?*|--disable-?*)
|
||||||
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
echo "${CMDLINE_SELECT} ${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null || die_unknown $opt
|
if echo "${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null; then
|
||||||
|
[ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||||
|
elif [ $action = "disable" ] && ! disabled $option ; then
|
||||||
|
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||||
|
die_unknown $opt
|
||||||
|
elif [ $action = "enable" ] && ! enabled $option ; then
|
||||||
|
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||||
|
die_unknown $opt
|
||||||
|
fi
|
||||||
$action $option
|
$action $option
|
||||||
;;
|
;;
|
||||||
|
--require-?*)
|
||||||
|
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
|
if echo "${ARCH_EXT_LIST}" none | grep "^ *$option\$" >/dev/null; then
|
||||||
|
RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||||
|
else
|
||||||
|
die_unknown $opt
|
||||||
|
fi
|
||||||
|
;;
|
||||||
--force-enable-?*|--force-disable-?*)
|
--force-enable-?*|--force-disable-?*)
|
||||||
eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
|
eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
$action $option
|
$action $option
|
||||||
@@ -477,7 +495,11 @@ process_common_cmdline() {
|
|||||||
--libdir=*)
|
--libdir=*)
|
||||||
libdir="${optval}"
|
libdir="${optval}"
|
||||||
;;
|
;;
|
||||||
--libc|--as|--prefix|--libdir)
|
--sdk-path=*)
|
||||||
|
[ -d "${optval}" ] || die "Not a directory: ${optval}"
|
||||||
|
sdk_path="${optval}"
|
||||||
|
;;
|
||||||
|
--libc|--as|--prefix|--libdir|--sdk-path)
|
||||||
die "Option ${opt} requires argument"
|
die "Option ${opt} requires argument"
|
||||||
;;
|
;;
|
||||||
--help|-h) show_help
|
--help|-h) show_help
|
||||||
@@ -522,6 +544,7 @@ setup_gnu_toolchain() {
|
|||||||
STRIP=${STRIP:-${CROSS}strip}
|
STRIP=${STRIP:-${CROSS}strip}
|
||||||
NM=${NM:-${CROSS}nm}
|
NM=${NM:-${CROSS}nm}
|
||||||
AS_SFX=.s
|
AS_SFX=.s
|
||||||
|
EXE_SFX=
|
||||||
}
|
}
|
||||||
|
|
||||||
process_common_toolchain() {
|
process_common_toolchain() {
|
||||||
@@ -561,6 +584,14 @@ process_common_toolchain() {
|
|||||||
tgt_isa=x86_64
|
tgt_isa=x86_64
|
||||||
tgt_os=darwin10
|
tgt_os=darwin10
|
||||||
;;
|
;;
|
||||||
|
*darwin11*)
|
||||||
|
tgt_isa=x86_64
|
||||||
|
tgt_os=darwin11
|
||||||
|
;;
|
||||||
|
*darwin12*)
|
||||||
|
tgt_isa=x86_64
|
||||||
|
tgt_os=darwin12
|
||||||
|
;;
|
||||||
*mingw32*|*cygwin*)
|
*mingw32*|*cygwin*)
|
||||||
[ -z "$tgt_isa" ] && tgt_isa=x86
|
[ -z "$tgt_isa" ] && tgt_isa=x86
|
||||||
tgt_os=win32
|
tgt_os=win32
|
||||||
@@ -571,6 +602,9 @@ process_common_toolchain() {
|
|||||||
*solaris2.10)
|
*solaris2.10)
|
||||||
tgt_os=solaris
|
tgt_os=solaris
|
||||||
;;
|
;;
|
||||||
|
*os2*)
|
||||||
|
tgt_os=os2
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
|
if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
|
||||||
@@ -599,8 +633,8 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Enable the architecture family
|
# Enable the architecture family
|
||||||
case ${tgt_isa} in
|
case ${tgt_isa} in
|
||||||
arm*|iwmmxt*) enable arm;;
|
arm*) enable arm;;
|
||||||
mips*) enable mips;;
|
mips*) enable mips;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# PIC is probably what we want when building shared libs
|
# PIC is probably what we want when building shared libs
|
||||||
@@ -608,35 +642,51 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Handle darwin variants. Newer SDKs allow targeting older
|
# Handle darwin variants. Newer SDKs allow targeting older
|
||||||
# platforms, so find the newest SDK available.
|
# platforms, so find the newest SDK available.
|
||||||
if [ -d "/Developer/SDKs/MacOSX10.4u.sdk" ]; then
|
case ${toolchain} in
|
||||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.4u.sdk"
|
*-darwin*)
|
||||||
fi
|
if [ -z "${DEVELOPER_DIR}" ]; then
|
||||||
if [ -d "/Developer/SDKs/MacOSX10.5.sdk" ]; then
|
DEVELOPER_DIR=`xcode-select -print-path 2> /dev/null`
|
||||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.5.sdk"
|
[ $? -ne 0 ] && OSX_SKIP_DIR_CHECK=1
|
||||||
fi
|
fi
|
||||||
if [ -d "/Developer/SDKs/MacOSX10.6.sdk" ]; then
|
if [ -z "${OSX_SKIP_DIR_CHECK}" ]; then
|
||||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.6.sdk"
|
OSX_SDK_ROOTS="${DEVELOPER_DIR}/SDKs"
|
||||||
|
OSX_SDK_VERSIONS="MacOSX10.4u.sdk MacOSX10.5.sdk MacOSX10.6.sdk"
|
||||||
|
OSX_SDK_VERSIONS="${OSX_SDK_VERSIONS} MacOSX10.7.sdk"
|
||||||
|
for v in ${OSX_SDK_VERSIONS}; do
|
||||||
|
if [ -d "${OSX_SDK_ROOTS}/${v}" ]; then
|
||||||
|
osx_sdk_dir="${OSX_SDK_ROOTS}/${v}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -d "${osx_sdk_dir}" ]; then
|
||||||
|
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||||
|
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
*-darwin8-*)
|
*-darwin8-*)
|
||||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_cflags "-mmacosx-version-min=10.4"
|
add_cflags "-mmacosx-version-min=10.4"
|
||||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.4"
|
add_ldflags "-mmacosx-version-min=10.4"
|
||||||
;;
|
;;
|
||||||
*-darwin9-*)
|
*-darwin9-*)
|
||||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_cflags "-mmacosx-version-min=10.5"
|
add_cflags "-mmacosx-version-min=10.5"
|
||||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.5"
|
add_ldflags "-mmacosx-version-min=10.5"
|
||||||
;;
|
;;
|
||||||
*-darwin10-*)
|
*-darwin10-*)
|
||||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_cflags "-mmacosx-version-min=10.6"
|
add_cflags "-mmacosx-version-min=10.6"
|
||||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.6"
|
add_ldflags "-mmacosx-version-min=10.6"
|
||||||
;;
|
;;
|
||||||
|
*-darwin11-*)
|
||||||
|
add_cflags "-mmacosx-version-min=10.7"
|
||||||
|
add_ldflags "-mmacosx-version-min=10.7"
|
||||||
|
;;
|
||||||
|
*-darwin12-*)
|
||||||
|
add_cflags "-mmacosx-version-min=10.8"
|
||||||
|
add_ldflags "-mmacosx-version-min=10.8"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Handle Solaris variants. Solaris 10 needs -lposix4
|
# Handle Solaris variants. Solaris 10 needs -lposix4
|
||||||
@@ -652,40 +702,44 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Process ARM architecture variants
|
# Process ARM architecture variants
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
arm*|iwmmxt*)
|
arm*)
|
||||||
# on arm, isa versions are supersets
|
# on arm, isa versions are supersets
|
||||||
enabled armv7a && soft_enable armv7 ### DEBUG
|
case ${tgt_isa} in
|
||||||
enabled armv7 && soft_enable armv6
|
armv7)
|
||||||
enabled armv7 || enabled armv6 && soft_enable armv5te
|
soft_enable neon
|
||||||
enabled armv7 || enabled armv6 && soft_enable fast_unaligned
|
soft_enable media
|
||||||
enabled iwmmxt2 && soft_enable iwmmxt
|
soft_enable edsp
|
||||||
enabled iwmmxt && soft_enable armv5te
|
soft_enable fast_unaligned
|
||||||
|
;;
|
||||||
|
armv6)
|
||||||
|
soft_enable media
|
||||||
|
soft_enable edsp
|
||||||
|
soft_enable fast_unaligned
|
||||||
|
;;
|
||||||
|
armv5te)
|
||||||
|
soft_enable edsp
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
asm_conversion_cmd="cat"
|
asm_conversion_cmd="cat"
|
||||||
|
|
||||||
case ${tgt_cc} in
|
case ${tgt_cc} in
|
||||||
gcc)
|
gcc)
|
||||||
if enabled iwmmxt || enabled iwmmxt2
|
CROSS=${CROSS:-arm-none-linux-gnueabi-}
|
||||||
then
|
|
||||||
CROSS=${CROSS:-arm-iwmmxt-linux-gnueabi-}
|
|
||||||
elif enabled symbian; then
|
|
||||||
CROSS=${CROSS:-arm-none-symbianelf-}
|
|
||||||
else
|
|
||||||
CROSS=${CROSS:-arm-none-linux-gnueabi-}
|
|
||||||
fi
|
|
||||||
link_with_cc=gcc
|
link_with_cc=gcc
|
||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
arch_int=${tgt_isa##armv}
|
arch_int=${tgt_isa##armv}
|
||||||
arch_int=${arch_int%%te}
|
arch_int=${arch_int%%te}
|
||||||
check_add_asflags --defsym ARCHITECTURE=${arch_int}
|
check_add_asflags --defsym ARCHITECTURE=${arch_int}
|
||||||
tune_cflags="-mtune="
|
tune_cflags="-mtune="
|
||||||
if enabled iwmmxt || enabled iwmmxt2
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
then
|
if enabled neon
|
||||||
check_add_asflags -mcpu=${tgt_isa}
|
then
|
||||||
elif enabled armv7
|
check_add_cflags -mfpu=neon #-ftree-vectorize
|
||||||
then
|
check_add_asflags -mfpu=neon
|
||||||
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize
|
fi
|
||||||
check_add_asflags -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-march=armv7-a
|
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp
|
||||||
|
check_add_asflags -mcpu=cortex-a8 -mfloat-abi=softfp #-march=armv7-a
|
||||||
else
|
else
|
||||||
check_add_cflags -march=${tgt_isa}
|
check_add_cflags -march=${tgt_isa}
|
||||||
check_add_asflags -march=${tgt_isa}
|
check_add_asflags -march=${tgt_isa}
|
||||||
@@ -703,10 +757,14 @@ process_common_toolchain() {
|
|||||||
tune_cflags="--cpu="
|
tune_cflags="--cpu="
|
||||||
tune_asflags="--cpu="
|
tune_asflags="--cpu="
|
||||||
if [ -z "${tune_cpu}" ]; then
|
if [ -z "${tune_cpu}" ]; then
|
||||||
if enabled armv7
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
then
|
if enabled neon
|
||||||
check_add_cflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
|
then
|
||||||
check_add_asflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
|
check_add_cflags --fpu=softvfp+vfpv3
|
||||||
|
check_add_asflags --fpu=softvfp+vfpv3
|
||||||
|
fi
|
||||||
|
check_add_cflags --cpu=Cortex-A8
|
||||||
|
check_add_asflags --cpu=Cortex-A8
|
||||||
else
|
else
|
||||||
check_add_cflags --cpu=${tgt_isa##armv}
|
check_add_cflags --cpu=${tgt_isa##armv}
|
||||||
check_add_asflags --cpu=${tgt_isa##armv}
|
check_add_asflags --cpu=${tgt_isa##armv}
|
||||||
@@ -727,12 +785,51 @@ process_common_toolchain() {
|
|||||||
disable multithread
|
disable multithread
|
||||||
disable os_support
|
disable os_support
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
android*)
|
||||||
|
SDK_PATH=${sdk_path}
|
||||||
|
COMPILER_LOCATION=`find "${SDK_PATH}" \
|
||||||
|
-name "arm-linux-androideabi-gcc*" -print -quit`
|
||||||
|
TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi-
|
||||||
|
CC=${TOOLCHAIN_PATH}gcc
|
||||||
|
AR=${TOOLCHAIN_PATH}ar
|
||||||
|
LD=${TOOLCHAIN_PATH}gcc
|
||||||
|
AS=${TOOLCHAIN_PATH}as
|
||||||
|
STRIP=${TOOLCHAIN_PATH}strip
|
||||||
|
NM=${TOOLCHAIN_PATH}nm
|
||||||
|
|
||||||
|
if [ -z "${alt_libc}" ]; then
|
||||||
|
alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \
|
||||||
|
awk '{n = split($0,a,"/"); \
|
||||||
|
split(a[n-1],b,"-"); \
|
||||||
|
print $0 " " b[2]}' | \
|
||||||
|
sort -g -k 2 | \
|
||||||
|
awk '{ print $1 }' | tail -1`
|
||||||
|
fi
|
||||||
|
|
||||||
|
add_cflags "--sysroot=${alt_libc}"
|
||||||
|
add_ldflags "--sysroot=${alt_libc}"
|
||||||
|
|
||||||
|
add_cflags "-I${SDK_PATH}/sources/android/cpufeatures/"
|
||||||
|
|
||||||
|
enable pic
|
||||||
|
soft_enable realtime_only
|
||||||
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
|
enable runtime_cpu_detect
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
darwin*)
|
darwin*)
|
||||||
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
|
if [ -z "${sdk_path}" ]; then
|
||||||
|
SDK_PATH=`xcode-select -print-path 2> /dev/null`
|
||||||
|
SDK_PATH=${SDK_PATH}/Platforms/iPhoneOS.platform/Developer
|
||||||
|
else
|
||||||
|
SDK_PATH=${sdk_path}
|
||||||
|
fi
|
||||||
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
|
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
|
||||||
CC=${TOOLCHAIN_PATH}/gcc
|
CC=${TOOLCHAIN_PATH}/gcc
|
||||||
AR=${TOOLCHAIN_PATH}/ar
|
AR=${TOOLCHAIN_PATH}/ar
|
||||||
LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-gcc-4.2.1
|
LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-llvm-gcc-4.2
|
||||||
AS=${TOOLCHAIN_PATH}/as
|
AS=${TOOLCHAIN_PATH}/as
|
||||||
STRIP=${TOOLCHAIN_PATH}/strip
|
STRIP=${TOOLCHAIN_PATH}/strip
|
||||||
NM=${TOOLCHAIN_PATH}/nm
|
NM=${TOOLCHAIN_PATH}/nm
|
||||||
@@ -746,13 +843,14 @@ process_common_toolchain() {
|
|||||||
add_cflags -arch ${tgt_isa}
|
add_cflags -arch ${tgt_isa}
|
||||||
add_ldflags -arch_only ${tgt_isa}
|
add_ldflags -arch_only ${tgt_isa}
|
||||||
|
|
||||||
add_cflags "-isysroot ${SDK_PATH}/SDKs/iPhoneOS4.3.sdk"
|
if [ -z "${alt_libc}" ]; then
|
||||||
|
alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.1.sdk
|
||||||
|
fi
|
||||||
|
|
||||||
# This should be overridable
|
add_cflags "-isysroot ${alt_libc}"
|
||||||
alt_libc=${SDK_PATH}/SDKs/iPhoneOS4.3.sdk
|
|
||||||
|
|
||||||
# Add the paths for the alternate libc
|
# Add the paths for the alternate libc
|
||||||
for d in usr/include usr/include/gcc/darwin/4.2/ usr/lib/gcc/arm-apple-darwin10/4.2.1/include/; do
|
for d in usr/include; do
|
||||||
try_dir="${alt_libc}/${d}"
|
try_dir="${alt_libc}/${d}"
|
||||||
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
||||||
done
|
done
|
||||||
@@ -789,19 +887,6 @@ process_common_toolchain() {
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
symbian*)
|
|
||||||
enable symbian
|
|
||||||
# Add the paths for the alternate libc
|
|
||||||
for d in include/libc; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
|
||||||
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
|
||||||
done
|
|
||||||
for d in release/armv5/urel; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
|
||||||
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
|
|
||||||
done
|
|
||||||
add_cflags -DIMPORT_C=
|
|
||||||
|
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
mips*)
|
mips*)
|
||||||
@@ -856,6 +941,9 @@ process_common_toolchain() {
|
|||||||
LD=${LD:-${CROSS}gcc}
|
LD=${LD:-${CROSS}gcc}
|
||||||
CROSS=${CROSS:-g}
|
CROSS=${CROSS:-g}
|
||||||
;;
|
;;
|
||||||
|
os2)
|
||||||
|
AS=${AS:-nasm}
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AS="${alt_as:-${AS:-auto}}"
|
AS="${alt_as:-${AS:-auto}}"
|
||||||
@@ -926,6 +1014,11 @@ process_common_toolchain() {
|
|||||||
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
|
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
|
||||||
enabled icc && ! enabled pic && add_cflags -fno-pic
|
enabled icc && ! enabled pic && add_cflags -fno-pic
|
||||||
;;
|
;;
|
||||||
|
os2)
|
||||||
|
add_asflags -f aout
|
||||||
|
enabled debug && add_asflags -g
|
||||||
|
EXE_SFX=.exe
|
||||||
|
;;
|
||||||
*) log "Warning: Unknown os $tgt_os while setting up $AS flags"
|
*) log "Warning: Unknown os $tgt_os while setting up $AS flags"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -988,6 +1081,7 @@ EOF
|
|||||||
if enabled multithread; then
|
if enabled multithread; then
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
*-win*);;
|
*-win*);;
|
||||||
|
*-android-gcc);;
|
||||||
*) check_header pthread.h && add_extralibs -lpthread
|
*) check_header pthread.h && add_extralibs -lpthread
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
@@ -42,7 +42,7 @@ done
|
|||||||
|
|
||||||
[ -n "$srcfile" ] || show_help
|
[ -n "$srcfile" ] || show_help
|
||||||
sfx=${sfx:-asm}
|
sfx=${sfx:-asm}
|
||||||
includes=$(egrep -i "include +\"?+[a-z0-9_/]+\.${sfx}" $srcfile |
|
includes=$(LC_ALL=C egrep -i "include +\"?+[a-z0-9_/]+\.${sfx}" $srcfile |
|
||||||
perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
|
perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
|
||||||
#" restore editor state
|
#" restore editor state
|
||||||
for inc in ${includes}; do
|
for inc in ${includes}; do
|
||||||
|
330
build/make/rtcd.sh
Executable file
330
build/make/rtcd.sh
Executable file
@@ -0,0 +1,330 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
self=$0
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF >&2
|
||||||
|
Usage: $self [options] FILE
|
||||||
|
|
||||||
|
Reads the Run Time CPU Detections definitions from FILE and generates a
|
||||||
|
C header file on stdout.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--arch=ARCH Architecture to generate defs for (required)
|
||||||
|
--disable-EXT Disable support for EXT extensions
|
||||||
|
--require-EXT Require support for EXT extensions
|
||||||
|
--sym=SYMBOL Unique symbol to use for RTCD initialization function
|
||||||
|
--config=FILE File with CONFIG_FOO=yes lines to parse
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
echo "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
die_argument_required() {
|
||||||
|
die "Option $opt requires argument"
|
||||||
|
}
|
||||||
|
|
||||||
|
for opt; do
|
||||||
|
optval="${opt#*=}"
|
||||||
|
case "$opt" in
|
||||||
|
--arch) die_argument_required;;
|
||||||
|
--arch=*) arch=${optval};;
|
||||||
|
--disable-*) eval "disable_${opt#--disable-}=true";;
|
||||||
|
--require-*) REQUIRES="${REQUIRES}${opt#--require-} ";;
|
||||||
|
--sym) die_argument_required;;
|
||||||
|
--sym=*) symbol=${optval};;
|
||||||
|
--config=*) config_file=${optval};;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
die "Unrecognized option: ${opt%%=*}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
defs_file="$defs_file $opt"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
for f in $defs_file; do [ -f "$f" ] || usage; done
|
||||||
|
[ -n "$arch" ] || usage
|
||||||
|
|
||||||
|
# Import the configuration
|
||||||
|
[ -f "$config_file" ] && eval $(grep CONFIG_ "$config_file")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Routines for the RTCD DSL to call
|
||||||
|
#
|
||||||
|
prototype() {
|
||||||
|
local rtyp
|
||||||
|
case "$1" in
|
||||||
|
unsigned) rtyp="$1 "; shift;;
|
||||||
|
esac
|
||||||
|
rtyp="${rtyp}$1"
|
||||||
|
local fn="$2"
|
||||||
|
local args="$3"
|
||||||
|
|
||||||
|
eval "${2}_rtyp='$rtyp'"
|
||||||
|
eval "${2}_args='$3'"
|
||||||
|
ALL_FUNCS="$ALL_FUNCS $fn"
|
||||||
|
specialize $fn c
|
||||||
|
}
|
||||||
|
|
||||||
|
specialize() {
|
||||||
|
local fn="$1"
|
||||||
|
shift
|
||||||
|
for opt in "$@"; do
|
||||||
|
eval "${fn}_${opt}=${fn}_${opt}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
require() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
|
||||||
|
# if we already have a default, then we can disable it, as we know
|
||||||
|
# we can do better.
|
||||||
|
local best=$(eval "echo \$${fn}_default")
|
||||||
|
local best_ofn=$(eval "echo \$${best}")
|
||||||
|
[ -n "$best" ] && [ "$best_ofn" != "$ofn" ] && eval "${best}_link=false"
|
||||||
|
eval "${fn}_default=${fn}_${opt}"
|
||||||
|
eval "${fn}_${opt}_link=true"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
forward_decls() {
|
||||||
|
ALL_FORWARD_DECLS="$ALL_FORWARD_DECLS $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Include the user's directives
|
||||||
|
#
|
||||||
|
for f in $defs_file; do
|
||||||
|
. $f
|
||||||
|
done
|
||||||
|
|
||||||
|
#
|
||||||
|
# Process the directives according to the command line
|
||||||
|
#
|
||||||
|
process_forward_decls() {
|
||||||
|
for fn in $ALL_FORWARD_DECLS; do
|
||||||
|
eval $fn
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
determine_indirection() {
|
||||||
|
[ "$CONFIG_RUNTIME_CPU_DETECT" = "yes" ] || require $ALL_ARCHS
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local n=""
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
local link=$(eval "echo \$${fn}_${opt}_link")
|
||||||
|
[ "$link" = "false" ] && continue
|
||||||
|
n="${n}x"
|
||||||
|
done
|
||||||
|
if [ "$n" = "x" ]; then
|
||||||
|
eval "${fn}_indirect=false"
|
||||||
|
else
|
||||||
|
eval "${fn}_indirect=true"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
declare_function_pointers() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
echo "$rtyp ${ofn}($args);"
|
||||||
|
done
|
||||||
|
if [ "$(eval "echo \$${fn}_indirect")" = "false" ]; then
|
||||||
|
echo "#define ${fn} ${dfn}"
|
||||||
|
else
|
||||||
|
echo "RTCD_EXTERN $rtyp (*${fn})($args);"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
set_function_pointers() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local n=""
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
if $(eval "echo \$${fn}_indirect"); then
|
||||||
|
echo " $fn = $dfn;"
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
[ "$ofn" = "$dfn" ] && continue;
|
||||||
|
local link=$(eval "echo \$${fn}_${opt}_link")
|
||||||
|
[ "$link" = "false" ] && continue
|
||||||
|
local cond="$(eval "echo \$have_${opt}")"
|
||||||
|
echo " if (${cond}) $fn = $ofn;"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
filter() {
|
||||||
|
local filtered
|
||||||
|
for opt in "$@"; do
|
||||||
|
[ -z $(eval "echo \$disable_${opt}") ] && filtered="$filtered $opt"
|
||||||
|
done
|
||||||
|
echo $filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Helper functions for generating the arch specific RTCD files
|
||||||
|
#
|
||||||
|
common_top() {
|
||||||
|
local outfile_basename=$(basename ${symbol:-rtcd.h})
|
||||||
|
local include_guard=$(echo $outfile_basename | tr '[a-z]' '[A-Z]' | tr -c '[A-Z]' _)
|
||||||
|
cat <<EOF
|
||||||
|
#ifndef ${include_guard}
|
||||||
|
#define ${include_guard}
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#define RTCD_EXTERN
|
||||||
|
#else
|
||||||
|
#define RTCD_EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
$(process_forward_decls)
|
||||||
|
|
||||||
|
$(declare_function_pointers c $ALL_ARCHS)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
common_bottom() {
|
||||||
|
cat <<EOF
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
x86() {
|
||||||
|
determine_indirection c $ALL_ARCHS
|
||||||
|
|
||||||
|
# Assign the helper variable for each enabled extension
|
||||||
|
for opt in $ALL_ARCHS; do
|
||||||
|
local uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||||
|
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||||
|
done
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
void ${symbol:-rtcd}(void);
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#include "vpx_ports/x86.h"
|
||||||
|
void ${symbol:-rtcd}(void)
|
||||||
|
{
|
||||||
|
int flags = x86_simd_caps();
|
||||||
|
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
|
$(set_function_pointers c $ALL_ARCHS)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
arm() {
|
||||||
|
determine_indirection c $ALL_ARCHS
|
||||||
|
|
||||||
|
# Assign the helper variable for each enabled extension
|
||||||
|
for opt in $ALL_ARCHS; do
|
||||||
|
local uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||||
|
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||||
|
done
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
#include "vpx_config.h"
|
||||||
|
|
||||||
|
void ${symbol:-rtcd}(void);
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#include "vpx_ports/arm.h"
|
||||||
|
void ${symbol:-rtcd}(void)
|
||||||
|
{
|
||||||
|
int flags = arm_cpu_caps();
|
||||||
|
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
|
$(set_function_pointers c $ALL_ARCHS)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unoptimized() {
|
||||||
|
determine_indirection c
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
#include "vpx_config.h"
|
||||||
|
|
||||||
|
void ${symbol:-rtcd}(void);
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
void ${symbol:-rtcd}(void)
|
||||||
|
{
|
||||||
|
$(set_function_pointers c)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Main Driver
|
||||||
|
#
|
||||||
|
require c
|
||||||
|
case $arch in
|
||||||
|
x86)
|
||||||
|
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1)
|
||||||
|
x86
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1)
|
||||||
|
REQUIRES=${REQUIRES:-mmx sse sse2}
|
||||||
|
require $(filter $REQUIRES)
|
||||||
|
x86
|
||||||
|
;;
|
||||||
|
armv5te)
|
||||||
|
ALL_ARCHS=$(filter edsp)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
armv6)
|
||||||
|
ALL_ARCHS=$(filter edsp media)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
armv7)
|
||||||
|
ALL_ARCHS=$(filter edsp media neon)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
unoptimized
|
||||||
|
;;
|
||||||
|
esac
|
55
configure
vendored
55
configure
vendored
@@ -25,6 +25,7 @@ Advanced options:
|
|||||||
${toggle_unit_tests} build unit tests
|
${toggle_unit_tests} build unit tests
|
||||||
--libc=PATH path to alternate libc
|
--libc=PATH path to alternate libc
|
||||||
--as={yasm|nasm|auto} use specified assembler [auto, yasm preferred]
|
--as={yasm|nasm|auto} use specified assembler [auto, yasm preferred]
|
||||||
|
--sdk-path=PATH path to root of sdk (iOS, android builds only)
|
||||||
${toggle_fast_unaligned} don't use unaligned accesses, even when
|
${toggle_fast_unaligned} don't use unaligned accesses, even when
|
||||||
supported by hardware [auto]
|
supported by hardware [auto]
|
||||||
${toggle_codec_srcs} in/exclude codec library source code
|
${toggle_codec_srcs} in/exclude codec library source code
|
||||||
@@ -38,6 +39,7 @@ Advanced options:
|
|||||||
${toggle_multithread} multithreaded encoding and decoding
|
${toggle_multithread} multithreaded encoding and decoding
|
||||||
${toggle_spatial_resampling} spatial sampling (scaling) support
|
${toggle_spatial_resampling} spatial sampling (scaling) support
|
||||||
${toggle_realtime_only} enable this option while building for real-time encoding
|
${toggle_realtime_only} enable this option while building for real-time encoding
|
||||||
|
${toggle_onthefly_bitpacking} enable on-the-fly bitpacking in real-time encoding
|
||||||
${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses
|
${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses
|
||||||
${toggle_runtime_cpu_detect} runtime cpu detection
|
${toggle_runtime_cpu_detect} runtime cpu detection
|
||||||
${toggle_shared} shared library support
|
${toggle_shared} shared library support
|
||||||
@@ -45,6 +47,7 @@ Advanced options:
|
|||||||
${toggle_small} favor smaller size over speed
|
${toggle_small} favor smaller size over speed
|
||||||
${toggle_postproc_visualizer} macro block / block level visualizers
|
${toggle_postproc_visualizer} macro block / block level visualizers
|
||||||
${toggle_multi_res_encoding} enable multiple-resolution encoding
|
${toggle_multi_res_encoding} enable multiple-resolution encoding
|
||||||
|
${toggle_temporal_denoising} enable temporal denoising and disable the spatial denoiser
|
||||||
|
|
||||||
Codecs:
|
Codecs:
|
||||||
Codecs can be selectively enabled or disabled individually, or by family:
|
Codecs can be selectively enabled or disabled individually, or by family:
|
||||||
@@ -80,19 +83,15 @@ EOF
|
|||||||
|
|
||||||
# all_platforms is a list of all supported target platforms. Maintain
|
# all_platforms is a list of all supported target platforms. Maintain
|
||||||
# alphabetically by architecture, generic-gnu last.
|
# alphabetically by architecture, generic-gnu last.
|
||||||
|
all_platforms="${all_platforms} armv5te-android-gcc"
|
||||||
all_platforms="${all_platforms} armv5te-linux-rvct"
|
all_platforms="${all_platforms} armv5te-linux-rvct"
|
||||||
all_platforms="${all_platforms} armv5te-linux-gcc"
|
all_platforms="${all_platforms} armv5te-linux-gcc"
|
||||||
all_platforms="${all_platforms} armv5te-none-rvct"
|
all_platforms="${all_platforms} armv5te-none-rvct"
|
||||||
all_platforms="${all_platforms} armv5te-symbian-gcc"
|
|
||||||
all_platforms="${all_platforms} armv6-darwin-gcc"
|
all_platforms="${all_platforms} armv6-darwin-gcc"
|
||||||
all_platforms="${all_platforms} armv6-linux-rvct"
|
all_platforms="${all_platforms} armv6-linux-rvct"
|
||||||
all_platforms="${all_platforms} armv6-linux-gcc"
|
all_platforms="${all_platforms} armv6-linux-gcc"
|
||||||
all_platforms="${all_platforms} armv6-none-rvct"
|
all_platforms="${all_platforms} armv6-none-rvct"
|
||||||
all_platforms="${all_platforms} armv6-symbian-gcc"
|
all_platforms="${all_platforms} armv7-android-gcc" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-rvct"
|
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-gcc"
|
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
|
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
|
|
||||||
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
|
||||||
@@ -110,8 +109,11 @@ all_platforms="${all_platforms} x86-darwin8-icc"
|
|||||||
all_platforms="${all_platforms} x86-darwin9-gcc"
|
all_platforms="${all_platforms} x86-darwin9-gcc"
|
||||||
all_platforms="${all_platforms} x86-darwin9-icc"
|
all_platforms="${all_platforms} x86-darwin9-icc"
|
||||||
all_platforms="${all_platforms} x86-darwin10-gcc"
|
all_platforms="${all_platforms} x86-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} x86-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} x86-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} x86-linux-gcc"
|
all_platforms="${all_platforms} x86-linux-gcc"
|
||||||
all_platforms="${all_platforms} x86-linux-icc"
|
all_platforms="${all_platforms} x86-linux-icc"
|
||||||
|
all_platforms="${all_platforms} x86-os2-gcc"
|
||||||
all_platforms="${all_platforms} x86-solaris-gcc"
|
all_platforms="${all_platforms} x86-solaris-gcc"
|
||||||
all_platforms="${all_platforms} x86-win32-gcc"
|
all_platforms="${all_platforms} x86-win32-gcc"
|
||||||
all_platforms="${all_platforms} x86-win32-vs7"
|
all_platforms="${all_platforms} x86-win32-vs7"
|
||||||
@@ -119,6 +121,8 @@ all_platforms="${all_platforms} x86-win32-vs8"
|
|||||||
all_platforms="${all_platforms} x86-win32-vs9"
|
all_platforms="${all_platforms} x86-win32-vs9"
|
||||||
all_platforms="${all_platforms} x86_64-darwin9-gcc"
|
all_platforms="${all_platforms} x86_64-darwin9-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-darwin10-gcc"
|
all_platforms="${all_platforms} x86_64-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} x86_64-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} x86_64-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-linux-gcc"
|
all_platforms="${all_platforms} x86_64-linux-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-linux-icc"
|
all_platforms="${all_platforms} x86_64-linux-icc"
|
||||||
all_platforms="${all_platforms} x86_64-solaris-gcc"
|
all_platforms="${all_platforms} x86_64-solaris-gcc"
|
||||||
@@ -127,6 +131,9 @@ all_platforms="${all_platforms} x86_64-win64-vs8"
|
|||||||
all_platforms="${all_platforms} x86_64-win64-vs9"
|
all_platforms="${all_platforms} x86_64-win64-vs9"
|
||||||
all_platforms="${all_platforms} universal-darwin8-gcc"
|
all_platforms="${all_platforms} universal-darwin8-gcc"
|
||||||
all_platforms="${all_platforms} universal-darwin9-gcc"
|
all_platforms="${all_platforms} universal-darwin9-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} generic-gnu"
|
all_platforms="${all_platforms} generic-gnu"
|
||||||
|
|
||||||
# all_targets is a list of all targets that can be configured
|
# all_targets is a list of all targets that can be configured
|
||||||
@@ -165,6 +172,7 @@ enable md5
|
|||||||
enable spatial_resampling
|
enable spatial_resampling
|
||||||
enable multithread
|
enable multithread
|
||||||
enable os_support
|
enable os_support
|
||||||
|
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; do
|
||||||
@@ -178,6 +186,8 @@ 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/vp8cx.h ] || disable vp8_encoder
|
||||||
|
[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable vp8_decoder
|
||||||
|
|
||||||
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
|
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
|
||||||
fi
|
fi
|
||||||
@@ -194,11 +204,9 @@ ARCH_LIST="
|
|||||||
ppc64
|
ppc64
|
||||||
"
|
"
|
||||||
ARCH_EXT_LIST="
|
ARCH_EXT_LIST="
|
||||||
armv5te
|
edsp
|
||||||
armv6
|
media
|
||||||
armv7
|
neon
|
||||||
iwmmxt
|
|
||||||
iwmmxt2
|
|
||||||
|
|
||||||
mips32
|
mips32
|
||||||
|
|
||||||
@@ -256,6 +264,7 @@ CONFIG_LIST="
|
|||||||
static_msvcrt
|
static_msvcrt
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
onthefly_bitpacking
|
||||||
error_concealment
|
error_concealment
|
||||||
shared
|
shared
|
||||||
static
|
static
|
||||||
@@ -264,6 +273,7 @@ CONFIG_LIST="
|
|||||||
os_support
|
os_support
|
||||||
unit_tests
|
unit_tests
|
||||||
multi_res_encoding
|
multi_res_encoding
|
||||||
|
temporal_denoising
|
||||||
"
|
"
|
||||||
CMDLINE_SELECT="
|
CMDLINE_SELECT="
|
||||||
extra_warnings
|
extra_warnings
|
||||||
@@ -300,6 +310,7 @@ CMDLINE_SELECT="
|
|||||||
mem_tracker
|
mem_tracker
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
onthefly_bitpacking
|
||||||
error_concealment
|
error_concealment
|
||||||
shared
|
shared
|
||||||
static
|
static
|
||||||
@@ -307,6 +318,7 @@ CMDLINE_SELECT="
|
|||||||
postproc_visualizer
|
postproc_visualizer
|
||||||
unit_tests
|
unit_tests
|
||||||
multi_res_encoding
|
multi_res_encoding
|
||||||
|
temporal_denoising
|
||||||
"
|
"
|
||||||
|
|
||||||
process_cmdline() {
|
process_cmdline() {
|
||||||
@@ -487,11 +499,20 @@ process_toolchain() {
|
|||||||
case $toolchain in
|
case $toolchain in
|
||||||
universal-darwin*)
|
universal-darwin*)
|
||||||
local darwin_ver=${tgt_os##darwin}
|
local darwin_ver=${tgt_os##darwin}
|
||||||
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
|
||||||
|
|
||||||
# Intel
|
# Snow Leopard (10.6/darwin10) dropped support for PPC
|
||||||
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
|
# Include PPC support for all prior versions
|
||||||
if [ $darwin_ver -gt 8 ]; then
|
if [ $darwin_ver -lt 10 ]; then
|
||||||
|
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Tiger (10.4/darwin8) brought support for x86
|
||||||
|
if [ $darwin_ver -ge 8 ]; then
|
||||||
|
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Leopard (10.5/darwin9) brought 64 bit support
|
||||||
|
if [ $darwin_ver -ge 9 ]; then
|
||||||
fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
|
fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -507,6 +528,10 @@ 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 -Wimplicit-function-declaration
|
||||||
|
check_add_cflags -Wuninitialized
|
||||||
|
check_add_cflags -Wunused-variable
|
||||||
|
check_add_cflags -Wunused-but-set-variable
|
||||||
enabled extra_warnings || check_add_cflags -Wno-unused-function
|
enabled extra_warnings || check_add_cflags -Wno-unused-function
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
3
docs.mk
3
docs.mk
@@ -21,9 +21,6 @@ CODEC_DOX := mainpage.dox \
|
|||||||
usage_dx.dox \
|
usage_dx.dox \
|
||||||
|
|
||||||
# Other doxy files sourced in Markdown
|
# Other doxy files sourced in Markdown
|
||||||
TXT_DOX-$(CONFIG_VP8) += vp8_api1_migration.dox
|
|
||||||
vp8_api1_migration.dox.DESC = VP8 API 1.x Migration
|
|
||||||
|
|
||||||
TXT_DOX = $(call enabled,TXT_DOX)
|
TXT_DOX = $(call enabled,TXT_DOX)
|
||||||
|
|
||||||
%.dox: %.txt
|
%.dox: %.txt
|
||||||
|
10
examples.mk
10
examples.mk
@@ -32,6 +32,7 @@ vpxenc.SRCS += args.c args.h y4minput.c y4minput.h
|
|||||||
vpxenc.SRCS += tools_common.c tools_common.h
|
vpxenc.SRCS += tools_common.c tools_common.h
|
||||||
vpxenc.SRCS += vpx_ports/mem_ops.h
|
vpxenc.SRCS += vpx_ports/mem_ops.h
|
||||||
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
|
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
|
||||||
|
vpxenc.SRCS += vpx_ports/vpx_timer.h
|
||||||
vpxenc.SRCS += libmkv/EbmlIDs.h
|
vpxenc.SRCS += libmkv/EbmlIDs.h
|
||||||
vpxenc.SRCS += libmkv/EbmlWriter.c
|
vpxenc.SRCS += libmkv/EbmlWriter.c
|
||||||
vpxenc.SRCS += libmkv/EbmlWriter.h
|
vpxenc.SRCS += libmkv/EbmlWriter.h
|
||||||
@@ -102,6 +103,7 @@ vp8_multi_resolution_encoder.SRCS \
|
|||||||
+= third_party/libyuv/include/libyuv/basic_types.h \
|
+= third_party/libyuv/include/libyuv/basic_types.h \
|
||||||
third_party/libyuv/include/libyuv/cpu_id.h \
|
third_party/libyuv/include/libyuv/cpu_id.h \
|
||||||
third_party/libyuv/include/libyuv/scale.h \
|
third_party/libyuv/include/libyuv/scale.h \
|
||||||
|
third_party/libyuv/source/row.h \
|
||||||
third_party/libyuv/source/scale.c \
|
third_party/libyuv/source/scale.c \
|
||||||
third_party/libyuv/source/cpu_id.c
|
third_party/libyuv/source/cpu_id.c
|
||||||
vp8_multi_resolution_encoder.GUID = 04f8738e-63c8-423b-90fa-7c2703a374de
|
vp8_multi_resolution_encoder.GUID = 04f8738e-63c8-423b-90fa-7c2703a374de
|
||||||
@@ -167,12 +169,12 @@ $(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes)
|
|||||||
# Create build/install dependencies for all examples. The common case
|
# Create build/install dependencies for all examples. The common case
|
||||||
# is handled here. The MSVS case is handled below.
|
# is handled here. The MSVS case is handled below.
|
||||||
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
|
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
|
||||||
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=))
|
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||||
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=))
|
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
|
||||||
DIST-SRCS-yes += $(ALL_SRCS)
|
DIST-SRCS-yes += $(ALL_SRCS)
|
||||||
INSTALL-SRCS-yes += $(UTIL_SRCS)
|
INSTALL-SRCS-yes += $(UTIL_SRCS)
|
||||||
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
|
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
|
||||||
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=))
|
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||||
|
|
||||||
|
|
||||||
# Instantiate linker template for all examples.
|
# Instantiate linker template for all examples.
|
||||||
@@ -182,7 +184,7 @@ $(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)))\
|
||||||
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
|
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
|
||||||
$(call objs,$($(notdir $(bin)).SRCS)) \
|
$(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
|
||||||
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
|
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
|
||||||
)))\
|
)))\
|
||||||
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
|
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
|
||||||
|
@@ -58,7 +58,7 @@ if(frame_cnt%30 == 1) {
|
|||||||
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
||||||
die_codec(&codec, "Failed to turn off postproc");
|
die_codec(&codec, "Failed to turn off postproc");
|
||||||
} else if(frame_cnt%30 == 16) {
|
} else if(frame_cnt%30 == 16) {
|
||||||
vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK, 4, 0};
|
vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0};
|
||||||
|
|
||||||
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
||||||
die_codec(&codec, "Failed to turn on postproc");
|
die_codec(&codec, "Failed to turn on postproc");
|
||||||
|
31
libs.mk
31
libs.mk
@@ -17,6 +17,7 @@ else
|
|||||||
ASM:=.asm
|
ASM:=.asm
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CODEC_SRCS-yes += CHANGELOG
|
||||||
CODEC_SRCS-yes += libs.mk
|
CODEC_SRCS-yes += libs.mk
|
||||||
|
|
||||||
include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
|
include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
|
||||||
@@ -34,9 +35,9 @@ ifeq ($(CONFIG_VP8_ENCODER),yes)
|
|||||||
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))
|
||||||
CODEC_SRCS-yes += $(VP8_PREFIX)vp8cx.mk vpx/vp8.h vpx/vp8cx.h vpx/vp8e.h
|
CODEC_SRCS-yes += $(VP8_PREFIX)vp8cx.mk vpx/vp8.h vpx/vp8cx.h
|
||||||
CODEC_SRCS-$(ARCH_ARM) += $(VP8_PREFIX)vp8cx_arm.mk
|
CODEC_SRCS-$(ARCH_ARM) += $(VP8_PREFIX)vp8cx_arm.mk
|
||||||
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8e.h include/vpx/vp8cx.h
|
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
|
||||||
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
||||||
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
|
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
|
||||||
CODEC_DOC_SECTIONS += vp8 vp8_encoder
|
CODEC_DOC_SECTIONS += vp8 vp8_encoder
|
||||||
@@ -48,7 +49,6 @@ ifeq ($(CONFIG_VP8_DECODER),yes)
|
|||||||
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))
|
||||||
CODEC_SRCS-yes += $(VP8_PREFIX)vp8dx.mk vpx/vp8.h vpx/vp8dx.h
|
CODEC_SRCS-yes += $(VP8_PREFIX)vp8dx.mk vpx/vp8.h vpx/vp8dx.h
|
||||||
CODEC_SRCS-$(ARCH_ARM) += $(VP8_PREFIX)vp8dx_arm.mk
|
|
||||||
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
|
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
|
||||||
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
||||||
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
|
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
|
||||||
@@ -90,6 +90,7 @@ endif
|
|||||||
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
|
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
|
||||||
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
|
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
|
||||||
|
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/rtcd.sh
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx/vpx_integer.h
|
CODEC_SRCS-$(BUILD_LIBVPX) += vpx/vpx_integer.h
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/asm_offsets.h
|
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/asm_offsets.h
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_timer.h
|
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_timer.h
|
||||||
@@ -114,7 +115,6 @@ INSTALL-LIBS-yes += include/vpx/vpx_integer.h
|
|||||||
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_top.h
|
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_top.h
|
||||||
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_bottom.h
|
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_bottom.h
|
||||||
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
|
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
|
||||||
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder_compat.h
|
|
||||||
INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
|
INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
|
||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
@@ -183,6 +183,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
|
||||||
|
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
@@ -232,7 +233,7 @@ vpx.pc: config.mk libs.mk
|
|||||||
$(qexec)echo '# pkg-config file from libvpx $(VERSION_STRING)' > $@
|
$(qexec)echo '# pkg-config file from libvpx $(VERSION_STRING)' > $@
|
||||||
$(qexec)echo 'prefix=$(PREFIX)' >> $@
|
$(qexec)echo 'prefix=$(PREFIX)' >> $@
|
||||||
$(qexec)echo 'exec_prefix=$${prefix}' >> $@
|
$(qexec)echo 'exec_prefix=$${prefix}' >> $@
|
||||||
$(qexec)echo 'libdir=$${prefix}/lib' >> $@
|
$(qexec)echo 'libdir=$${prefix}/$(LIBSUBDIR)' >> $@
|
||||||
$(qexec)echo 'includedir=$${prefix}/include' >> $@
|
$(qexec)echo 'includedir=$${prefix}/include' >> $@
|
||||||
$(qexec)echo '' >> $@
|
$(qexec)echo '' >> $@
|
||||||
$(qexec)echo 'Name: vpx' >> $@
|
$(qexec)echo 'Name: vpx' >> $@
|
||||||
@@ -279,19 +280,21 @@ $(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
|||||||
# Calculate platform- and compiler-specific offsets for hand coded assembly
|
# 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))
|
ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
|
||||||
$(BUILD_PFX)asm_com_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
|
$(BUILD_PFX)asm_com_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
|
||||||
grep -w EQU $< | tr -d '$$\#' $(ADS2GAS) > $@
|
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
|
$(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
|
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
|
$(BUILD_PFX)asm_enc_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S
|
||||||
grep -w EQU $< | tr -d '$$\#' $(ADS2GAS) > $@
|
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
|
$(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
|
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
|
$(BUILD_PFX)asm_dec_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
|
||||||
grep -w EQU $< | tr -d '$$\#' $(ADS2GAS) > $@
|
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
|
$(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
|
CLEAN-OBJS += $(BUILD_PFX)asm_dec_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
|
||||||
else
|
else
|
||||||
@@ -322,6 +325,18 @@ 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
|
||||||
|
#
|
||||||
|
$(OBJS-yes:.o=.d): $(BUILD_PFX)vpx_rtcd.h
|
||||||
|
$(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 \
|
||||||
|
16
mainpage.dox
16
mainpage.dox
@@ -12,8 +12,12 @@
|
|||||||
|
|
||||||
This distribution of the WebM VP8 Codec SDK includes the following support:
|
This distribution of the WebM VP8 Codec SDK includes the following support:
|
||||||
|
|
||||||
\if vp8_encoder - \ref vp8_encoder \endif
|
\if vp8_encoder
|
||||||
\if vp8_decoder - \ref vp8_decoder \endif
|
- \ref vp8_encoder
|
||||||
|
\endif
|
||||||
|
\if vp8_decoder
|
||||||
|
- \ref vp8_decoder
|
||||||
|
\endif
|
||||||
|
|
||||||
|
|
||||||
\section main_startpoints Starting Points
|
\section main_startpoints Starting Points
|
||||||
@@ -24,8 +28,12 @@
|
|||||||
- Read the \ref samples "sample code" for examples of how to interact with the
|
- Read the \ref samples "sample code" for examples of how to interact with the
|
||||||
codec.
|
codec.
|
||||||
- \ref codec reference
|
- \ref codec reference
|
||||||
\if encoder - \ref encoder reference \endif
|
\if encoder
|
||||||
\if decoder - \ref decoder reference \endif
|
- \ref encoder reference
|
||||||
|
\endif
|
||||||
|
\if decoder
|
||||||
|
- \ref decoder reference
|
||||||
|
\endif
|
||||||
|
|
||||||
\section main_support Support Options & FAQ
|
\section main_support Support Options & FAQ
|
||||||
The WebM project is an open source project supported by its community. For
|
The WebM project is an open source project supported by its community. For
|
||||||
|
160
tools/ftfy.sh
Executable file
160
tools/ftfy.sh
Executable file
@@ -0,0 +1,160 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
self="$0"
|
||||||
|
dirname_self=$(dirname "$self")
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF >&2
|
||||||
|
Usage: $self [option]
|
||||||
|
|
||||||
|
This script applies a whitespace transformation to the commit at HEAD. If no
|
||||||
|
options are given, then the modified files are left in the working tree.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Shows this message
|
||||||
|
-n, --dry-run Shows a diff of the changes to be made.
|
||||||
|
--amend Squashes the changes into the commit at HEAD
|
||||||
|
This option will also reformat the commit message.
|
||||||
|
--commit Creates a new commit containing only the whitespace changes
|
||||||
|
--msg-only Reformat the commit message only, ignore the patch itself.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
rm -f ${CLEAN_FILES}
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "${self##*/}: $@" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vpx_style() {
|
||||||
|
astyle --style=bsd --min-conditional-indent=0 --break-blocks \
|
||||||
|
--pad-oper --pad-header --unpad-paren \
|
||||||
|
--align-pointer=name \
|
||||||
|
--indent-preprocessor --convert-tabs --indent-labels \
|
||||||
|
--suffix=none --quiet "$@"
|
||||||
|
sed -i 's/[[:space:]]\{1,\},/,/g' "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
apply() {
|
||||||
|
[ $INTERSECT_RESULT -ne 0 ] && patch -p1 < "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
commit() {
|
||||||
|
LAST_CHANGEID=$(git show | awk '/Change-Id:/{print $2}')
|
||||||
|
if [ -z "$LAST_CHANGEID" ]; then
|
||||||
|
log "HEAD doesn't have a Change-Id, unable to generate a new commit"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build a deterministic Change-Id from the parent's
|
||||||
|
NEW_CHANGEID=${LAST_CHANGEID}-styled
|
||||||
|
NEW_CHANGEID=I$(echo $NEW_CHANGEID | git hash-object --stdin)
|
||||||
|
|
||||||
|
# Commit, preserving authorship from the parent commit.
|
||||||
|
git commit -a -C HEAD > /dev/null
|
||||||
|
git commit --amend -F- << EOF
|
||||||
|
Cosmetic: Fix whitespace in change ${LAST_CHANGEID:0:9}
|
||||||
|
|
||||||
|
Change-Id: ${NEW_CHANGEID}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
show_commit_msg_diff() {
|
||||||
|
if [ $DIFF_MSG_RESULT -ne 0 ]; then
|
||||||
|
log "Modified commit message:"
|
||||||
|
diff -u "$ORIG_COMMIT_MSG" "$NEW_COMMIT_MSG" | tail -n +3
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
amend() {
|
||||||
|
show_commit_msg_diff
|
||||||
|
if [ $DIFF_MSG_RESULT -ne 0 ] || [ $INTERSECT_RESULT -ne 0 ]; then
|
||||||
|
git commit -a --amend -F "$NEW_COMMIT_MSG"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
diff_msg() {
|
||||||
|
git log -1 --format=%B > "$ORIG_COMMIT_MSG"
|
||||||
|
"${dirname_self}"/wrap-commit-msg.py \
|
||||||
|
< "$ORIG_COMMIT_MSG" > "$NEW_COMMIT_MSG"
|
||||||
|
cmp -s "$ORIG_COMMIT_MSG" "$NEW_COMMIT_MSG"
|
||||||
|
DIFF_MSG_RESULT=$?
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
ORIG_DIFF=orig.diff.$$
|
||||||
|
MODIFIED_DIFF=modified.diff.$$
|
||||||
|
FINAL_DIFF=final.diff.$$
|
||||||
|
ORIG_COMMIT_MSG=orig.commit-msg.$$
|
||||||
|
NEW_COMMIT_MSG=new.commit-msg.$$
|
||||||
|
CLEAN_FILES="${ORIG_DIFF} ${MODIFIED_DIFF} ${FINAL_DIFF}"
|
||||||
|
CLEAN_FILES="${CLEAN_FILES} ${ORIG_COMMIT_MSG} ${NEW_COMMIT_MSG}"
|
||||||
|
|
||||||
|
# Preconditions
|
||||||
|
[ $# -lt 2 ] || usage
|
||||||
|
|
||||||
|
# Check that astyle supports pad-header and align-pointer=name
|
||||||
|
if ! astyle --pad-header --align-pointer=name < /dev/null; then
|
||||||
|
log "Install astyle v1.24 or newer"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git diff --quiet HEAD; then
|
||||||
|
log "Working tree is dirty, commit your changes first"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Need to be in the root
|
||||||
|
cd "$(git rev-parse --show-toplevel)"
|
||||||
|
|
||||||
|
# Collect the original diff
|
||||||
|
git show > "${ORIG_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 \
|
||||||
|
| grep '\.[ch]$'); do
|
||||||
|
case "$f" in
|
||||||
|
third_party/*) continue;;
|
||||||
|
nestegg/*) continue;;
|
||||||
|
esac
|
||||||
|
vpx_style "$f"
|
||||||
|
done
|
||||||
|
git diff --no-color --no-ext-diff > "${MODIFIED_DIFF}"
|
||||||
|
|
||||||
|
# Intersect the two diffs
|
||||||
|
"${dirname_self}"/intersect-diffs.py \
|
||||||
|
"${ORIG_DIFF}" "${MODIFIED_DIFF}" > "${FINAL_DIFF}"
|
||||||
|
INTERSECT_RESULT=$?
|
||||||
|
git reset --hard >/dev/null
|
||||||
|
|
||||||
|
# Fixup the commit message
|
||||||
|
diff_msg
|
||||||
|
|
||||||
|
# Handle options
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
case "$1" in
|
||||||
|
-h|--help) usage;;
|
||||||
|
-n|--dry-run) cat "${FINAL_DIFF}"; show_commit_msg_diff;;
|
||||||
|
--commit) apply "${FINAL_DIFF}"; commit;;
|
||||||
|
--amend) apply "${FINAL_DIFF}"; amend;;
|
||||||
|
--msg-only) amend;;
|
||||||
|
*) usage;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
apply "${FINAL_DIFF}"
|
||||||
|
if ! git diff --quiet; then
|
||||||
|
log "Formatting changes applied, verify and commit."
|
||||||
|
log "See also: http://www.webmproject.org/code/contribute/conventions/"
|
||||||
|
git diff --stat
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f ${CLEAN_FILES}
|
188
tools/intersect-diffs.py
Executable file
188
tools/intersect-diffs.py
Executable file
@@ -0,0 +1,188 @@
|
|||||||
|
#!/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.
|
||||||
|
##
|
||||||
|
"""Calculates the "intersection" of two unified diffs.
|
||||||
|
|
||||||
|
Given two diffs, A and B, it finds all hunks in B that had non-context lines
|
||||||
|
in A and prints them to stdout. This is useful to determine the hunks in B that
|
||||||
|
are relevant to A. The resulting file can be applied with patch(1) on top of A.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "jkoleszar@google.com"
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
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):
|
||||||
|
"""Re-serialize a list of DiffHunks."""
|
||||||
|
r = []
|
||||||
|
last_header = None
|
||||||
|
for hunk in hunks:
|
||||||
|
this_header = hunk.header[0:2]
|
||||||
|
if last_header != this_header:
|
||||||
|
r.extend(hunk.header)
|
||||||
|
last_header = this_header
|
||||||
|
else:
|
||||||
|
r.extend(hunk.header[2])
|
||||||
|
r.extend(hunk.lines)
|
||||||
|
r.append("\n")
|
||||||
|
return "".join(r)
|
||||||
|
|
||||||
|
|
||||||
|
def ZipHunks(rhs_hunks, lhs_hunks):
|
||||||
|
"""Join two hunk lists on filename."""
|
||||||
|
for rhs_hunk in rhs_hunks:
|
||||||
|
rhs_file = rhs_hunk.right.filename.split("/")[1:]
|
||||||
|
|
||||||
|
for lhs_hunk in lhs_hunks:
|
||||||
|
lhs_file = lhs_hunk.left.filename.split("/")[1:]
|
||||||
|
if lhs_file != rhs_file:
|
||||||
|
continue
|
||||||
|
yield (rhs_hunk, lhs_hunk)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
old_hunks = [x for x in ParseDiffHunks(open(sys.argv[1], "r"))]
|
||||||
|
new_hunks = [x for x in ParseDiffHunks(open(sys.argv[2], "r"))]
|
||||||
|
out_hunks = []
|
||||||
|
|
||||||
|
# Join the right hand side of the older diff with the left hand side of the
|
||||||
|
# newer diff.
|
||||||
|
for old_hunk, new_hunk in ZipHunks(old_hunks, new_hunks):
|
||||||
|
if new_hunk in out_hunks:
|
||||||
|
continue
|
||||||
|
old_lines = old_hunk.right
|
||||||
|
new_lines = new_hunk.left
|
||||||
|
|
||||||
|
# Determine if this hunk overlaps any non-context line from the other
|
||||||
|
for i in old_lines.delta_line_nums:
|
||||||
|
if i in new_lines:
|
||||||
|
out_hunks.append(new_hunk)
|
||||||
|
break
|
||||||
|
|
||||||
|
if out_hunks:
|
||||||
|
print FormatDiffHunks(out_hunks)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
70
tools/wrap-commit-msg.py
Executable file
70
tools/wrap-commit-msg.py
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/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.
|
||||||
|
##
|
||||||
|
"""Wraps paragraphs of text, preserving manual formatting
|
||||||
|
|
||||||
|
This is like fold(1), but has the special convention of not modifying lines
|
||||||
|
that start with whitespace. This allows you to intersperse blocks with
|
||||||
|
special formatting, like code blocks, with written prose. The prose will
|
||||||
|
be wordwrapped, and the manual formatting will be preserved.
|
||||||
|
|
||||||
|
* This won't handle the case of a bulleted (or ordered) list specially, so
|
||||||
|
manual wrapping must be done.
|
||||||
|
|
||||||
|
Occasionally it's useful to put something with explicit formatting that
|
||||||
|
doesn't look at all like a block of text inline.
|
||||||
|
|
||||||
|
indicator = has_leading_whitespace(line);
|
||||||
|
if (indicator)
|
||||||
|
preserve_formatting(line);
|
||||||
|
|
||||||
|
The intent is that this docstring would make it through the transform
|
||||||
|
and still be legible and presented as it is in the source. If additional
|
||||||
|
cases are handled, update this doc to describe the effect.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__author__ = "jkoleszar@google.com"
|
||||||
|
import textwrap
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def wrap(text):
|
||||||
|
if text:
|
||||||
|
return textwrap.fill(text, break_long_words=False) + '\n'
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def main(fileobj):
|
||||||
|
text = ""
|
||||||
|
output = ""
|
||||||
|
while True:
|
||||||
|
line = fileobj.readline()
|
||||||
|
if not line:
|
||||||
|
break
|
||||||
|
|
||||||
|
if line.lstrip() == line:
|
||||||
|
text += line
|
||||||
|
else:
|
||||||
|
output += wrap(text)
|
||||||
|
text=""
|
||||||
|
output += line
|
||||||
|
output += wrap(text)
|
||||||
|
|
||||||
|
# Replace the file or write to stdout.
|
||||||
|
if fileobj == sys.stdin:
|
||||||
|
fileobj = sys.stdout
|
||||||
|
else:
|
||||||
|
fileobj.seek(0)
|
||||||
|
fileobj.truncate(0)
|
||||||
|
fileobj.write(output)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
main(open(sys.argv[1], "r+"))
|
||||||
|
else:
|
||||||
|
main(sys.stdin)
|
@@ -9,15 +9,21 @@
|
|||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "tools_common.h"
|
#include "tools_common.h"
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32) || defined(__OS2__)
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifdef __OS2__
|
||||||
|
#define _setmode setmode
|
||||||
|
#define _fileno fileno
|
||||||
|
#define _O_BINARY O_BINARY
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FILE* set_binary_mode(FILE *stream)
|
FILE* set_binary_mode(FILE *stream)
|
||||||
{
|
{
|
||||||
(void)stream;
|
(void)stream;
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32) || defined(__OS2__)
|
||||||
_setmode(_fileno(stream), _O_BINARY);
|
_setmode(_fileno(stream), _O_BINARY);
|
||||||
#endif
|
#endif
|
||||||
return stream;
|
return stream;
|
||||||
|
10
usage.dox
10
usage.dox
@@ -1,6 +1,6 @@
|
|||||||
/*!\page usage Usage
|
/*!\page usage Usage
|
||||||
|
|
||||||
The vpx Multi-Format codec SDK provides a unified interface amongst its
|
The vpx multi-format codec SDK provides a unified interface amongst its
|
||||||
supported codecs. This abstraction allows applications using this SDK to
|
supported codecs. This abstraction allows applications using this SDK to
|
||||||
easily support multiple video formats with minimal code duplication or
|
easily support multiple video formats with minimal code duplication or
|
||||||
"special casing." This section describes the interface common to all codecs.
|
"special casing." This section describes the interface common to all codecs.
|
||||||
@@ -14,8 +14,12 @@
|
|||||||
|
|
||||||
Fore more information on decoder and encoder specific usage, see the
|
Fore more information on decoder and encoder specific usage, see the
|
||||||
following pages:
|
following pages:
|
||||||
\if decoder - \subpage usage_decode \endif
|
\if decoder
|
||||||
\if decoder - \subpage usage_encode \endif
|
- \subpage usage_decode
|
||||||
|
\endif
|
||||||
|
\if decoder
|
||||||
|
- \subpage usage_encode
|
||||||
|
\endif
|
||||||
|
|
||||||
\section usage_types Important Data Types
|
\section usage_types Important Data Types
|
||||||
There are two important data structures to consider in this interface.
|
There are two important data structures to consider in this interface.
|
||||||
|
@@ -37,12 +37,15 @@ static void update_mode_info_border(MODE_INFO *mi, int rows, int cols)
|
|||||||
void vp8_de_alloc_frame_buffers(VP8_COMMON *oci)
|
void vp8_de_alloc_frame_buffers(VP8_COMMON *oci)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < NUM_YV12_BUFFERS; i++)
|
for (i = 0; i < NUM_YV12_BUFFERS; i++)
|
||||||
vp8_yv12_de_alloc_frame_buffer(&oci->yv12_fb[i]);
|
vp8_yv12_de_alloc_frame_buffer(&oci->yv12_fb[i]);
|
||||||
|
|
||||||
vp8_yv12_de_alloc_frame_buffer(&oci->temp_scale_frame);
|
vp8_yv12_de_alloc_frame_buffer(&oci->temp_scale_frame);
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
vp8_yv12_de_alloc_frame_buffer(&oci->post_proc_buffer);
|
vp8_yv12_de_alloc_frame_buffer(&oci->post_proc_buffer);
|
||||||
|
if (oci->post_proc_buffer_int_used)
|
||||||
|
vp8_yv12_de_alloc_frame_buffer(&oci->post_proc_buffer_int);
|
||||||
|
#endif
|
||||||
|
|
||||||
vpx_free(oci->above_context);
|
vpx_free(oci->above_context);
|
||||||
vpx_free(oci->mip);
|
vpx_free(oci->mip);
|
||||||
@@ -95,12 +98,18 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer, width, height, VP8BORDERINPIXELS) < 0)
|
if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer, width, height, VP8BORDERINPIXELS) < 0)
|
||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oci->post_proc_buffer_int_used = 0;
|
||||||
|
vpx_memset(&oci->postproc_state, 0, sizeof(oci->postproc_state));
|
||||||
|
vpx_memset((&oci->post_proc_buffer)->buffer_alloc,128,(&oci->post_proc_buffer)->frame_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
oci->mb_rows = height >> 4;
|
oci->mb_rows = height >> 4;
|
||||||
oci->mb_cols = width >> 4;
|
oci->mb_cols = width >> 4;
|
||||||
oci->MBs = oci->mb_rows * oci->mb_cols;
|
oci->MBs = oci->mb_rows * oci->mb_cols;
|
||||||
@@ -199,7 +208,7 @@ void vp8_create_common(VP8_COMMON *oci)
|
|||||||
oci->clr_type = REG_YUV;
|
oci->clr_type = REG_YUV;
|
||||||
oci->clamp_type = RECON_CLAMP_REQUIRED;
|
oci->clamp_type = RECON_CLAMP_REQUIRED;
|
||||||
|
|
||||||
/* Initialise reference frame sign bias structure to defaults */
|
/* Initialize reference frame sign bias structure to defaults */
|
||||||
vpx_memset(oci->ref_frame_sign_bias, 0, sizeof(oci->ref_frame_sign_bias));
|
vpx_memset(oci->ref_frame_sign_bias, 0, sizeof(oci->ref_frame_sign_bias));
|
||||||
|
|
||||||
/* Default disable buffer to buffer copying */
|
/* Default disable buffer to buffer copying */
|
||||||
@@ -211,13 +220,3 @@ void vp8_remove_common(VP8_COMMON *oci)
|
|||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_initialize_common()
|
|
||||||
{
|
|
||||||
vp8_coef_tree_initialize();
|
|
||||||
|
|
||||||
vp8_entropy_mode_init();
|
|
||||||
|
|
||||||
vp8_init_scan_order_mask();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
|
||||||
#include "vpx_ports/arm.h"
|
|
||||||
#include "vp8/common/g_common.h"
|
|
||||||
#include "vp8/common/pragmas.h"
|
|
||||||
#include "vp8/common/subpixel.h"
|
|
||||||
#include "vp8/common/loopfilter.h"
|
|
||||||
#include "vp8/common/recon.h"
|
|
||||||
#include "vp8/common/idct.h"
|
|
||||||
#include "vp8/common/onyxc_int.h"
|
|
||||||
|
|
||||||
void vp8_arch_arm_common_init(VP8_COMMON *ctx)
|
|
||||||
{
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
VP8_COMMON_RTCD *rtcd = &ctx->rtcd;
|
|
||||||
int flags = arm_cpu_caps();
|
|
||||||
rtcd->flags = flags;
|
|
||||||
|
|
||||||
/* Override default functions with fastest ones for this CPU. */
|
|
||||||
#if HAVE_ARMV5TE
|
|
||||||
if (flags & HAS_EDSP)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
|
||||||
if (flags & HAS_MEDIA)
|
|
||||||
{
|
|
||||||
rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_armv6;
|
|
||||||
rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_armv6;
|
|
||||||
rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_armv6;
|
|
||||||
rtcd->subpix.sixtap4x4 = vp8_sixtap_predict_armv6;
|
|
||||||
rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_armv6;
|
|
||||||
rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_armv6;
|
|
||||||
rtcd->subpix.bilinear8x4 = vp8_bilinear_predict8x4_armv6;
|
|
||||||
rtcd->subpix.bilinear4x4 = vp8_bilinear_predict4x4_armv6;
|
|
||||||
|
|
||||||
rtcd->idct.idct16 = vp8_short_idct4x4llm_v6_dual;
|
|
||||||
rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_v6;
|
|
||||||
|
|
||||||
rtcd->loopfilter.normal_mb_v = vp8_loop_filter_mbv_armv6;
|
|
||||||
rtcd->loopfilter.normal_b_v = vp8_loop_filter_bv_armv6;
|
|
||||||
rtcd->loopfilter.normal_mb_h = vp8_loop_filter_mbh_armv6;
|
|
||||||
rtcd->loopfilter.normal_b_h = vp8_loop_filter_bh_armv6;
|
|
||||||
rtcd->loopfilter.simple_mb_v =
|
|
||||||
vp8_loop_filter_simple_vertical_edge_armv6;
|
|
||||||
rtcd->loopfilter.simple_b_v = vp8_loop_filter_bvs_armv6;
|
|
||||||
rtcd->loopfilter.simple_mb_h =
|
|
||||||
vp8_loop_filter_simple_horizontal_edge_armv6;
|
|
||||||
rtcd->loopfilter.simple_b_h = vp8_loop_filter_bhs_armv6;
|
|
||||||
|
|
||||||
rtcd->recon.copy16x16 = vp8_copy_mem16x16_v6;
|
|
||||||
rtcd->recon.copy8x8 = vp8_copy_mem8x8_v6;
|
|
||||||
rtcd->recon.copy8x4 = vp8_copy_mem8x4_v6;
|
|
||||||
rtcd->recon.intra4x4_predict = vp8_intra4x4_predict_armv6;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
if (flags & HAS_NEON)
|
|
||||||
{
|
|
||||||
rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_neon;
|
|
||||||
rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_neon;
|
|
||||||
rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_neon;
|
|
||||||
rtcd->subpix.sixtap4x4 = vp8_sixtap_predict_neon;
|
|
||||||
rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_neon;
|
|
||||||
rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_neon;
|
|
||||||
rtcd->subpix.bilinear8x4 = vp8_bilinear_predict8x4_neon;
|
|
||||||
rtcd->subpix.bilinear4x4 = vp8_bilinear_predict4x4_neon;
|
|
||||||
|
|
||||||
rtcd->idct.idct16 = vp8_short_idct4x4llm_neon;
|
|
||||||
rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_neon;
|
|
||||||
|
|
||||||
rtcd->loopfilter.normal_mb_v = vp8_loop_filter_mbv_neon;
|
|
||||||
rtcd->loopfilter.normal_b_v = vp8_loop_filter_bv_neon;
|
|
||||||
rtcd->loopfilter.normal_mb_h = vp8_loop_filter_mbh_neon;
|
|
||||||
rtcd->loopfilter.normal_b_h = vp8_loop_filter_bh_neon;
|
|
||||||
rtcd->loopfilter.simple_mb_v = vp8_loop_filter_mbvs_neon;
|
|
||||||
rtcd->loopfilter.simple_b_v = vp8_loop_filter_bvs_neon;
|
|
||||||
rtcd->loopfilter.simple_mb_h = vp8_loop_filter_mbhs_neon;
|
|
||||||
rtcd->loopfilter.simple_b_h = vp8_loop_filter_bhs_neon;
|
|
||||||
|
|
||||||
rtcd->recon.copy16x16 = vp8_copy_mem16x16_neon;
|
|
||||||
rtcd->recon.copy8x8 = vp8_copy_mem8x8_neon;
|
|
||||||
rtcd->recon.copy8x4 = vp8_copy_mem8x4_neon;
|
|
||||||
rtcd->recon.build_intra_predictors_mby =
|
|
||||||
vp8_build_intra_predictors_mby_neon;
|
|
||||||
rtcd->recon.build_intra_predictors_mby_s =
|
|
||||||
vp8_build_intra_predictors_mby_s_neon;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
@@ -9,8 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/decoder/dequantize.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,
|
@@ -144,7 +144,7 @@ loop
|
|||||||
ldr r6, [sp, #40] ; get address of sse
|
ldr r6, [sp, #40] ; get address of sse
|
||||||
mul r0, r8, r8 ; sum * sum
|
mul r0, r8, r8 ; sum * sum
|
||||||
str r11, [r6] ; store sse
|
str r11, [r6] ; store sse
|
||||||
sub r0, r11, r0, asr #8 ; return (sse - ((sum * sum) >> 8))
|
sub r0, r11, r0, lsr #8 ; return (sse - ((sum * sum) >> 8))
|
||||||
|
|
||||||
ldmfd sp!, {r4-r12, pc}
|
ldmfd sp!, {r4-r12, pc}
|
||||||
|
|
@@ -169,7 +169,7 @@ loop
|
|||||||
ldr r6, [sp, #40] ; get address of sse
|
ldr r6, [sp, #40] ; get address of sse
|
||||||
mul r0, r8, r8 ; sum * sum
|
mul r0, r8, r8 ; sum * sum
|
||||||
str r11, [r6] ; store sse
|
str r11, [r6] ; store sse
|
||||||
sub r0, r11, r0, asr #8 ; return (sse - ((sum * sum) >> 8))
|
sub r0, r11, r0, lsr #8 ; return (sse - ((sum * sum) >> 8))
|
||||||
|
|
||||||
ldmfd sp!, {r4-r12, pc}
|
ldmfd sp!, {r4-r12, pc}
|
||||||
|
|
@@ -210,7 +210,7 @@ loop
|
|||||||
ldr r6, [sp, #40] ; get address of sse
|
ldr r6, [sp, #40] ; get address of sse
|
||||||
mul r0, r8, r8 ; sum * sum
|
mul r0, r8, r8 ; sum * sum
|
||||||
str r11, [r6] ; store sse
|
str r11, [r6] ; store sse
|
||||||
sub r0, r11, r0, asr #8 ; return (sse - ((sum * sum) >> 8))
|
sub r0, r11, r0, lsr #8 ; return (sse - ((sum * sum) >> 8))
|
||||||
|
|
||||||
ldmfd sp!, {r4-r12, pc}
|
ldmfd sp!, {r4-r12, pc}
|
||||||
|
|
@@ -171,7 +171,7 @@ loop
|
|||||||
ldr r6, [sp, #40] ; get address of sse
|
ldr r6, [sp, #40] ; get address of sse
|
||||||
mul r0, r8, r8 ; sum * sum
|
mul r0, r8, r8 ; sum * sum
|
||||||
str r11, [r6] ; store sse
|
str r11, [r6] ; store sse
|
||||||
sub r0, r11, r0, asr #8 ; return (sse - ((sum * sum) >> 8))
|
sub r0, r11, r0, lsr #8 ; return (sse - ((sum * sum) >> 8))
|
||||||
|
|
||||||
ldmfd sp!, {r4-r12, pc}
|
ldmfd sp!, {r4-r12, pc}
|
||||||
|
|
@@ -8,10 +8,10 @@
|
|||||||
* 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_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vp8/common/filter.h"
|
#include "vp8/common/filter.h"
|
||||||
#include "vp8/common/subpixel.h"
|
|
||||||
#include "bilinearfilter_arm.h"
|
#include "bilinearfilter_arm.h"
|
||||||
|
|
||||||
void vp8_filter_block2d_bil_armv6
|
void vp8_filter_block2d_bil_armv6
|
||||||
|
@@ -10,36 +10,32 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/decoder/dequantize.h"
|
#include "vp8/common/blockd.h"
|
||||||
#include "vp8/common/idct.h"
|
|
||||||
#include "vpx_mem/vpx_mem.h"
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
extern void vp8_dequantize_b_loop_neon(short *Q, short *DQC, short *DQ);
|
extern void vp8_dequantize_b_loop_neon(short *Q, short *DQC, short *DQ);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
extern void vp8_dequantize_b_loop_v6(short *Q, short *DQC, short *DQ);
|
extern void vp8_dequantize_b_loop_v6(short *Q, short *DQC, short *DQ);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
|
|
||||||
void vp8_dequantize_b_neon(BLOCKD *d)
|
void vp8_dequantize_b_neon(BLOCKD *d, short *DQC)
|
||||||
{
|
{
|
||||||
short *DQ = d->dqcoeff;
|
short *DQ = d->dqcoeff;
|
||||||
short *Q = d->qcoeff;
|
short *Q = d->qcoeff;
|
||||||
short *DQC = d->dequant;
|
|
||||||
|
|
||||||
vp8_dequantize_b_loop_neon(Q, DQC, DQ);
|
vp8_dequantize_b_loop_neon(Q, DQC, DQ);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
void vp8_dequantize_b_v6(BLOCKD *d)
|
void vp8_dequantize_b_v6(BLOCKD *d, short *DQC)
|
||||||
{
|
{
|
||||||
short *DQ = d->dqcoeff;
|
short *DQ = d->dqcoeff;
|
||||||
short *Q = d->qcoeff;
|
short *Q = d->qcoeff;
|
||||||
short *DQC = d->dequant;
|
|
||||||
|
|
||||||
vp8_dequantize_b_loop_v6(Q, DQC, DQ);
|
vp8_dequantize_b_loop_v6(Q, DQC, DQ);
|
||||||
}
|
}
|
@@ -10,9 +10,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vp8/common/filter.h"
|
#include "vp8/common/filter.h"
|
||||||
#include "vp8/common/subpixel.h"
|
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
extern void vp8_filter_block2d_first_pass_armv6
|
extern void vp8_filter_block2d_first_pass_armv6
|
||||||
@@ -86,8 +86,8 @@ extern void vp8_filter_block2d_second_pass_only_armv6
|
|||||||
const short *vp8_filter
|
const short *vp8_filter
|
||||||
);
|
);
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
void vp8_sixtap_predict_armv6
|
void vp8_sixtap_predict4x4_armv6
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
int src_pixels_per_line,
|
int src_pixels_per_line,
|
||||||
|
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef IDCT_ARM_H
|
|
||||||
#define IDCT_ARM_H
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
|
||||||
extern prototype_idct(vp8_short_idct4x4llm_v6_dual);
|
|
||||||
extern prototype_idct_scalar_add(vp8_dc_only_idct_add_v6);
|
|
||||||
extern prototype_second_order(vp8_short_inv_walsh4x4_1_v6);
|
|
||||||
extern prototype_second_order(vp8_short_inv_walsh4x4_v6);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_idct_idct16
|
|
||||||
#define vp8_idct_idct16 vp8_short_idct4x4llm_v6_dual
|
|
||||||
|
|
||||||
#undef vp8_idct_idct1_scalar_add
|
|
||||||
#define vp8_idct_idct1_scalar_add vp8_dc_only_idct_add_v6
|
|
||||||
|
|
||||||
#undef vp8_idct_iwalsh16
|
|
||||||
#define vp8_idct_iwalsh16 vp8_short_inv_walsh4x4_v6
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
extern prototype_idct(vp8_short_idct4x4llm_neon);
|
|
||||||
extern prototype_idct_scalar_add(vp8_dc_only_idct_add_neon);
|
|
||||||
extern prototype_second_order(vp8_short_inv_walsh4x4_1_neon);
|
|
||||||
extern prototype_second_order(vp8_short_inv_walsh4x4_neon);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_idct_idct16
|
|
||||||
#define vp8_idct_idct16 vp8_short_idct4x4llm_neon
|
|
||||||
|
|
||||||
#undef vp8_idct_idct1_scalar_add
|
|
||||||
#define vp8_idct_idct1_scalar_add vp8_dc_only_idct_add_neon
|
|
||||||
|
|
||||||
#undef vp8_idct_iwalsh16
|
|
||||||
#define vp8_idct_iwalsh16 vp8_short_inv_walsh4x4_neon
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -10,17 +10,22 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "vp8/common/loopfilter.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "vp8/common/onyxc_int.h"
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#define prototype_loopfilter(sym) \
|
||||||
|
void sym(unsigned char *src, int pitch, const unsigned char *blimit,\
|
||||||
|
const unsigned char *limit, const unsigned char *thresh, int count)
|
||||||
|
|
||||||
|
#if HAVE_MEDIA
|
||||||
extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
|
extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
|
||||||
extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
|
extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
|
||||||
extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
|
extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
|
||||||
extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
|
extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
typedef void loopfilter_y_neon(unsigned char *src, int pitch,
|
typedef void loopfilter_y_neon(unsigned char *src, int pitch,
|
||||||
unsigned char blimit, unsigned char limit, unsigned char thresh);
|
unsigned char blimit, unsigned char limit, unsigned char thresh);
|
||||||
typedef void loopfilter_uv_neon(unsigned char *u, int pitch,
|
typedef void loopfilter_uv_neon(unsigned char *u, int pitch,
|
||||||
@@ -38,8 +43,8 @@ extern loopfilter_uv_neon vp8_mbloop_filter_horizontal_edge_uv_neon;
|
|||||||
extern loopfilter_uv_neon vp8_mbloop_filter_vertical_edge_uv_neon;
|
extern loopfilter_uv_neon vp8_mbloop_filter_vertical_edge_uv_neon;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
/*ARMV6 loopfilter functions*/
|
/* ARMV6/MEDIA loopfilter functions*/
|
||||||
/* Horizontal MB filtering */
|
/* Horizontal MB filtering */
|
||||||
void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
int y_stride, int uv_stride, loop_filter_info *lfi)
|
int y_stride, int uv_stride, loop_filter_info *lfi)
|
||||||
@@ -113,7 +118,7 @@ void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, int y_stride,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
/* NEON loopfilter functions */
|
/* NEON loopfilter functions */
|
||||||
/* Horizontal MB filtering */
|
/* Horizontal MB filtering */
|
||||||
void vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
|
@@ -1,93 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LOOPFILTER_ARM_H
|
|
||||||
#define LOOPFILTER_ARM_H
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_mbv_armv6);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_bv_armv6);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_mbh_armv6);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_bh_armv6);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_bvs_armv6);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_bhs_armv6);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_lf_normal_mb_v
|
|
||||||
#define vp8_lf_normal_mb_v vp8_loop_filter_mbv_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_b_v
|
|
||||||
#define vp8_lf_normal_b_v vp8_loop_filter_bv_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_mb_h
|
|
||||||
#define vp8_lf_normal_mb_h vp8_loop_filter_mbh_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_b_h
|
|
||||||
#define vp8_lf_normal_b_h vp8_loop_filter_bh_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_mb_v
|
|
||||||
#define vp8_lf_simple_mb_v vp8_loop_filter_simple_vertical_edge_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_b_v
|
|
||||||
#define vp8_lf_simple_b_v vp8_loop_filter_bvs_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_mb_h
|
|
||||||
#define vp8_lf_simple_mb_h vp8_loop_filter_simple_horizontal_edge_armv6
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_b_h
|
|
||||||
#define vp8_lf_simple_b_h vp8_loop_filter_bhs_armv6
|
|
||||||
#endif /* !CONFIG_RUNTIME_CPU_DETECT */
|
|
||||||
|
|
||||||
#endif /* HAVE_ARMV6 */
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_mbv_neon);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_bv_neon);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_mbh_neon);
|
|
||||||
extern prototype_loopfilter_block(vp8_loop_filter_bh_neon);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_mbvs_neon);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_bvs_neon);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_mbhs_neon);
|
|
||||||
extern prototype_simple_loopfilter(vp8_loop_filter_bhs_neon);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_lf_normal_mb_v
|
|
||||||
#define vp8_lf_normal_mb_v vp8_loop_filter_mbv_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_b_v
|
|
||||||
#define vp8_lf_normal_b_v vp8_loop_filter_bv_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_mb_h
|
|
||||||
#define vp8_lf_normal_mb_h vp8_loop_filter_mbh_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_normal_b_h
|
|
||||||
#define vp8_lf_normal_b_h vp8_loop_filter_bh_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_mb_v
|
|
||||||
#define vp8_lf_simple_mb_v vp8_loop_filter_mbvs_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_b_v
|
|
||||||
#define vp8_lf_simple_b_v vp8_loop_filter_bvs_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_mb_h
|
|
||||||
#define vp8_lf_simple_mb_h vp8_loop_filter_mbhs_neon
|
|
||||||
|
|
||||||
#undef vp8_lf_simple_b_h
|
|
||||||
#define vp8_lf_simple_b_h vp8_loop_filter_bhs_neon
|
|
||||||
#endif /* !CONFIG_RUNTIME_CPU_DETECT */
|
|
||||||
|
|
||||||
#endif /* HAVE_ARMV7 */
|
|
||||||
|
|
||||||
#endif /* LOOPFILTER_ARM_H */
|
|
@@ -9,8 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/decoder/dequantize.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
|
@@ -9,7 +9,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
EXPORT |vp8_sixtap_predict_neon|
|
EXPORT |vp8_sixtap_predict4x4_neon|
|
||||||
ARM
|
ARM
|
||||||
REQUIRE8
|
REQUIRE8
|
||||||
PRESERVE8
|
PRESERVE8
|
||||||
@@ -33,7 +33,7 @@ filter4_coeff
|
|||||||
; stack(r4) unsigned char *dst_ptr,
|
; stack(r4) unsigned char *dst_ptr,
|
||||||
; stack(lr) int dst_pitch
|
; stack(lr) int dst_pitch
|
||||||
|
|
||||||
|vp8_sixtap_predict_neon| PROC
|
|vp8_sixtap_predict4x4_neon| PROC
|
||||||
push {r4, lr}
|
push {r4, lr}
|
||||||
|
|
||||||
adr r12, filter4_coeff
|
adr r12, filter4_coeff
|
||||||
|
@@ -77,14 +77,14 @@ variance16x16_neon_loop
|
|||||||
;vmov.32 r1, d1[0]
|
;vmov.32 r1, d1[0]
|
||||||
;mul r0, r0, r0
|
;mul r0, r0, r0
|
||||||
;str r1, [r12]
|
;str r1, [r12]
|
||||||
;sub r0, r1, r0, asr #8
|
;sub r0, r1, r0, lsr #8
|
||||||
|
|
||||||
;sum is in [-255x256, 255x256]. sumxsum is 32-bit. Shift to right should
|
; while sum is signed, sum * sum is always positive and must be treated as
|
||||||
;have sign-bit exension, which is vshr.s. Have to use s32 to make it right.
|
; unsigned to avoid propagating the sign bit.
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [r12] ;store sse
|
vst1.32 {d1[0]}, [r12] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
bx lr
|
bx lr
|
||||||
@@ -145,8 +145,8 @@ variance16x8_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [r12] ;store sse
|
vst1.32 {d1[0]}, [r12] ;store sse
|
||||||
vshr.s32 d10, d10, #7
|
vshr.u32 d10, d10, #7
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
bx lr
|
bx lr
|
||||||
@@ -200,8 +200,8 @@ variance8x16_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [r12] ;store sse
|
vst1.32 {d1[0]}, [r12] ;store sse
|
||||||
vshr.s32 d10, d10, #7
|
vshr.u32 d10, d10, #7
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
bx lr
|
bx lr
|
||||||
@@ -265,8 +265,8 @@ variance8x8_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [r12] ;store sse
|
vst1.32 {d1[0]}, [r12] ;store sse
|
||||||
vshr.s32 d10, d10, #6
|
vshr.u32 d10, d10, #6
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
bx lr
|
bx lr
|
@@ -9,6 +9,11 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
bilinear_taps_coeff
|
||||||
|
DCD 128, 0, 112, 16, 96, 32, 80, 48, 64, 64, 48, 80, 32, 96, 16, 112
|
||||||
|
|
||||||
|
;-----------------
|
||||||
|
|
||||||
EXPORT |vp8_sub_pixel_variance16x16_neon_func|
|
EXPORT |vp8_sub_pixel_variance16x16_neon_func|
|
||||||
ARM
|
ARM
|
||||||
REQUIRE8
|
REQUIRE8
|
||||||
@@ -27,7 +32,7 @@
|
|||||||
|vp8_sub_pixel_variance16x16_neon_func| PROC
|
|vp8_sub_pixel_variance16x16_neon_func| PROC
|
||||||
push {r4-r6, lr}
|
push {r4-r6, lr}
|
||||||
|
|
||||||
ldr r12, _BilinearTaps_coeff_
|
adr r12, bilinear_taps_coeff
|
||||||
ldr r4, [sp, #16] ;load *dst_ptr from stack
|
ldr r4, [sp, #16] ;load *dst_ptr from stack
|
||||||
ldr r5, [sp, #20] ;load dst_pixels_per_line from stack
|
ldr r5, [sp, #20] ;load dst_pixels_per_line from stack
|
||||||
ldr r6, [sp, #24] ;load *sse from stack
|
ldr r6, [sp, #24] ;load *sse from stack
|
||||||
@@ -405,8 +410,8 @@ sub_pixel_variance16x16_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [r6] ;store sse
|
vst1.32 {d1[0]}, [r6] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
add sp, sp, #528
|
add sp, sp, #528
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
@@ -415,11 +420,4 @@ sub_pixel_variance16x16_neon_loop
|
|||||||
|
|
||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
|
||||||
|
|
||||||
_BilinearTaps_coeff_
|
|
||||||
DCD bilinear_taps_coeff
|
|
||||||
bilinear_taps_coeff
|
|
||||||
DCD 128, 0, 112, 16, 96, 32, 80, 48, 64, 64, 48, 80, 32, 96, 16, 112
|
|
||||||
|
|
||||||
END
|
END
|
@@ -112,8 +112,8 @@ vp8_filt_fpo16x16s_4_0_loop_neon
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [lr] ;store sse
|
vst1.32 {d1[0]}, [lr] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
pop {pc}
|
pop {pc}
|
||||||
@@ -208,8 +208,8 @@ vp8_filt_spo16x16s_0_4_loop_neon
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [lr] ;store sse
|
vst1.32 {d1[0]}, [lr] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
pop {pc}
|
pop {pc}
|
||||||
@@ -327,8 +327,8 @@ vp8_filt16x16s_4_4_loop_neon
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [lr] ;store sse
|
vst1.32 {d1[0]}, [lr] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
pop {pc}
|
pop {pc}
|
||||||
@@ -560,8 +560,8 @@ sub_pixel_variance16x16s_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [lr] ;store sse
|
vst1.32 {d1[0]}, [lr] ;store sse
|
||||||
vshr.s32 d10, d10, #8
|
vshr.u32 d10, d10, #8
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
add sp, sp, #256
|
add sp, sp, #256
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
@@ -27,7 +27,7 @@
|
|||||||
|vp8_sub_pixel_variance8x8_neon| PROC
|
|vp8_sub_pixel_variance8x8_neon| PROC
|
||||||
push {r4-r5, lr}
|
push {r4-r5, lr}
|
||||||
|
|
||||||
ldr r12, _BilinearTaps_coeff_
|
adr r12, bilinear_taps_coeff
|
||||||
ldr r4, [sp, #12] ;load *dst_ptr from stack
|
ldr r4, [sp, #12] ;load *dst_ptr from stack
|
||||||
ldr r5, [sp, #16] ;load dst_pixels_per_line from stack
|
ldr r5, [sp, #16] ;load dst_pixels_per_line from stack
|
||||||
ldr lr, [sp, #20] ;load *sse from stack
|
ldr lr, [sp, #20] ;load *sse from stack
|
||||||
@@ -206,8 +206,8 @@ sub_pixel_variance8x8_neon_loop
|
|||||||
|
|
||||||
vmull.s32 q5, d0, d0
|
vmull.s32 q5, d0, d0
|
||||||
vst1.32 {d1[0]}, [lr] ;store sse
|
vst1.32 {d1[0]}, [lr] ;store sse
|
||||||
vshr.s32 d10, d10, #6
|
vshr.u32 d10, d10, #6
|
||||||
vsub.s32 d0, d1, d10
|
vsub.u32 d0, d1, d10
|
||||||
|
|
||||||
vmov.32 r0, d0[0] ;return
|
vmov.32 r0, d0[0] ;return
|
||||||
pop {r4-r5, pc}
|
pop {r4-r5, pc}
|
||||||
@@ -216,8 +216,6 @@ sub_pixel_variance8x8_neon_loop
|
|||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
|
||||||
_BilinearTaps_coeff_
|
|
||||||
DCD bilinear_taps_coeff
|
|
||||||
bilinear_taps_coeff
|
bilinear_taps_coeff
|
||||||
DCD 128, 0, 112, 16, 96, 32, 80, 48, 64, 64, 48, 80, 32, 96, 16, 112
|
DCD 128, 0, 112, 16, 96, 32, 80, 48, 64, 64, 48, 80, 32, 96, 16, 112
|
||||||
|
|
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef RECON_ARM_H
|
|
||||||
#define RECON_ARM_H
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
|
||||||
|
|
||||||
extern prototype_copy_block(vp8_copy_mem8x8_v6);
|
|
||||||
extern prototype_copy_block(vp8_copy_mem8x4_v6);
|
|
||||||
extern prototype_copy_block(vp8_copy_mem16x16_v6);
|
|
||||||
extern prototype_intra4x4_predict(vp8_intra4x4_predict_armv6);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_recon_copy8x8
|
|
||||||
#define vp8_recon_copy8x8 vp8_copy_mem8x8_v6
|
|
||||||
|
|
||||||
#undef vp8_recon_copy8x4
|
|
||||||
#define vp8_recon_copy8x4 vp8_copy_mem8x4_v6
|
|
||||||
|
|
||||||
#undef vp8_recon_copy16x16
|
|
||||||
#define vp8_recon_copy16x16 vp8_copy_mem16x16_v6
|
|
||||||
|
|
||||||
#undef vp8_recon_intra4x4_predict
|
|
||||||
#define vp8_recon_intra4x4_predict vp8_intra4x4_predict_armv6
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
|
|
||||||
extern prototype_copy_block(vp8_copy_mem8x8_neon);
|
|
||||||
extern prototype_copy_block(vp8_copy_mem8x4_neon);
|
|
||||||
extern prototype_copy_block(vp8_copy_mem16x16_neon);
|
|
||||||
|
|
||||||
extern prototype_build_intra_predictors(vp8_build_intra_predictors_mby_neon);
|
|
||||||
extern prototype_build_intra_predictors(vp8_build_intra_predictors_mby_s_neon);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_recon_copy8x8
|
|
||||||
#define vp8_recon_copy8x8 vp8_copy_mem8x8_neon
|
|
||||||
|
|
||||||
#undef vp8_recon_copy8x4
|
|
||||||
#define vp8_recon_copy8x4 vp8_copy_mem8x4_neon
|
|
||||||
|
|
||||||
#undef vp8_recon_copy16x16
|
|
||||||
#define vp8_recon_copy16x16 vp8_copy_mem16x16_neon
|
|
||||||
|
|
||||||
#undef vp8_recon_build_intra_predictors_mby
|
|
||||||
#define vp8_recon_build_intra_predictors_mby vp8_build_intra_predictors_mby_neon
|
|
||||||
|
|
||||||
#undef vp8_recon_build_intra_predictors_mby_s
|
|
||||||
#define vp8_recon_build_intra_predictors_mby_s vp8_build_intra_predictors_mby_s_neon
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -10,12 +10,11 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "vp8/common/blockd.h"
|
||||||
#include "vp8/common/reconintra.h"
|
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vp8/common/recon.h"
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
extern void vp8_build_intra_predictors_mby_neon_func(
|
extern void vp8_build_intra_predictors_mby_neon_func(
|
||||||
unsigned char *y_buffer,
|
unsigned char *y_buffer,
|
||||||
unsigned char *ypred_ptr,
|
unsigned char *ypred_ptr,
|
||||||
@@ -35,10 +34,7 @@ void vp8_build_intra_predictors_mby_neon(MACROBLOCKD *x)
|
|||||||
|
|
||||||
vp8_build_intra_predictors_mby_neon_func(y_buffer, ypred_ptr, y_stride, mode, Up, Left);
|
vp8_build_intra_predictors_mby_neon_func(y_buffer, ypred_ptr, y_stride, mode, Up, Left);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
extern void vp8_build_intra_predictors_mby_s_neon_func(
|
extern void vp8_build_intra_predictors_mby_s_neon_func(
|
||||||
unsigned char *y_buffer,
|
unsigned char *y_buffer,
|
||||||
unsigned char *ypred_ptr,
|
unsigned char *ypred_ptr,
|
||||||
|
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SUBPIXEL_ARM_H
|
|
||||||
#define SUBPIXEL_ARM_H
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict16x16_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict8x8_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict8x4_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict16x16_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict8x8_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict8x4_armv6);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict4x4_armv6);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_subpix_sixtap16x16
|
|
||||||
#define vp8_subpix_sixtap16x16 vp8_sixtap_predict16x16_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap8x8
|
|
||||||
#define vp8_subpix_sixtap8x8 vp8_sixtap_predict8x8_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap8x4
|
|
||||||
#define vp8_subpix_sixtap8x4 vp8_sixtap_predict8x4_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap4x4
|
|
||||||
#define vp8_subpix_sixtap4x4 vp8_sixtap_predict_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear16x16
|
|
||||||
#define vp8_subpix_bilinear16x16 vp8_bilinear_predict16x16_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear8x8
|
|
||||||
#define vp8_subpix_bilinear8x8 vp8_bilinear_predict8x8_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear8x4
|
|
||||||
#define vp8_subpix_bilinear8x4 vp8_bilinear_predict8x4_armv6
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear4x4
|
|
||||||
#define vp8_subpix_bilinear4x4 vp8_bilinear_predict4x4_armv6
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict16x16_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict8x8_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict8x4_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_sixtap_predict_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict16x16_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict8x8_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict8x4_neon);
|
|
||||||
extern prototype_subpixel_predict(vp8_bilinear_predict4x4_neon);
|
|
||||||
|
|
||||||
#if !CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#undef vp8_subpix_sixtap16x16
|
|
||||||
#define vp8_subpix_sixtap16x16 vp8_sixtap_predict16x16_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap8x8
|
|
||||||
#define vp8_subpix_sixtap8x8 vp8_sixtap_predict8x8_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap8x4
|
|
||||||
#define vp8_subpix_sixtap8x4 vp8_sixtap_predict8x4_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_sixtap4x4
|
|
||||||
#define vp8_subpix_sixtap4x4 vp8_sixtap_predict_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear16x16
|
|
||||||
#define vp8_subpix_bilinear16x16 vp8_bilinear_predict16x16_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear8x8
|
|
||||||
#define vp8_subpix_bilinear8x8 vp8_bilinear_predict8x8_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear8x4
|
|
||||||
#define vp8_subpix_bilinear8x4 vp8_bilinear_predict8x4_neon
|
|
||||||
|
|
||||||
#undef vp8_subpix_bilinear4x4
|
|
||||||
#define vp8_subpix_bilinear4x4 vp8_bilinear_predict4x4_neon
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -9,11 +9,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/encoder/variance.h"
|
#include "vpx_rtcd.h"
|
||||||
|
#include "vp8/common/variance.h"
|
||||||
#include "vp8/common/filter.h"
|
#include "vp8/common/filter.h"
|
||||||
#include "vp8/common/arm/bilinearfilter_arm.h"
|
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
|
#include "vp8/common/arm/bilinearfilter_arm.h"
|
||||||
|
|
||||||
unsigned int vp8_sub_pixel_variance8x8_armv6
|
unsigned int vp8_sub_pixel_variance8x8_armv6
|
||||||
(
|
(
|
||||||
@@ -91,10 +92,21 @@ unsigned int vp8_sub_pixel_variance16x16_armv6
|
|||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_ARMV6 */
|
#endif /* HAVE_MEDIA */
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_NEON
|
||||||
|
|
||||||
|
extern unsigned int vp8_sub_pixel_variance16x16_neon_func
|
||||||
|
(
|
||||||
|
const unsigned char *src_ptr,
|
||||||
|
int src_pixels_per_line,
|
||||||
|
int xoffset,
|
||||||
|
int yoffset,
|
||||||
|
const unsigned char *dst_ptr,
|
||||||
|
int dst_pixels_per_line,
|
||||||
|
unsigned int *sse
|
||||||
|
);
|
||||||
|
|
||||||
unsigned int vp8_sub_pixel_variance16x16_neon
|
unsigned int vp8_sub_pixel_variance16x16_neon
|
||||||
(
|
(
|
@@ -15,6 +15,10 @@
|
|||||||
#include "vpx_scale/yv12config.h"
|
#include "vpx_scale/yv12config.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "vp8/common/blockd.h"
|
||||||
|
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
|
#include "postproc.h"
|
||||||
|
#endif /* CONFIG_POSTPROC */
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
/* vpx_scale */
|
/* vpx_scale */
|
||||||
@@ -30,12 +34,17 @@ DEFINE(yv12_buffer_config_v_buffer, offsetof(YV12_BUFFER_CONFIG, v_b
|
|||||||
DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border));
|
DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border));
|
||||||
DEFINE(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS);
|
DEFINE(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS);
|
||||||
|
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
|
/* mfqe.c / filter_by_weight */
|
||||||
|
DEFINE(MFQE_PRECISION_VAL, MFQE_PRECISION);
|
||||||
|
#endif /* CONFIG_POSTPROC */
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
||||||
/* add asserts for any offset that is not supported by assembly code */
|
/* add asserts for any offset that is not supported by assembly code */
|
||||||
/* add asserts for any size that is not supported by assembly code */
|
/* add asserts for any size that is not supported by assembly code */
|
||||||
|
|
||||||
#if HAVE_ARMV6
|
#if HAVE_MEDIA
|
||||||
/* switch case in vp8_intra4x4_predict_armv6 is based on these enumerated values */
|
/* switch case in vp8_intra4x4_predict_armv6 is based on these enumerated values */
|
||||||
ct_assert(B_DC_PRED, B_DC_PRED == 0);
|
ct_assert(B_DC_PRED, B_DC_PRED == 0);
|
||||||
ct_assert(B_TM_PRED, B_TM_PRED == 1);
|
ct_assert(B_TM_PRED, B_TM_PRED == 1);
|
||||||
@@ -49,7 +58,14 @@ 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_ARMV7
|
#if HAVE_NEON
|
||||||
/* vp8_yv12_extend_frame_borders_neon makes several assumptions based on this */
|
/* vp8_yv12_extend_frame_borders_neon makes several assumptions based on this */
|
||||||
ct_assert(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS == 32)
|
ct_assert(VP8BORDERINPIXELS_VAL, VP8BORDERINPIXELS == 32)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SSE2
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
|
/* vp8_filter_by_weight16x16 and 8x8 */
|
||||||
|
ct_assert(MFQE_PRECISION_VAL, MFQE_PRECISION == 4)
|
||||||
|
#endif /* CONFIG_POSTPROC */
|
||||||
|
#endif /* HAVE_SSE2 */
|
||||||
|
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _bigend_h
|
|
||||||
#define _bigend_h
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define invert2(x) ( (((x)>>8)&0x00ff) | (((x)<<8)&0xff00) )
|
|
||||||
#define invert4(x) ( ((invert2(x)&0x0000ffff)<<16) | (invert2((x>>16))&0x0000ffff) )
|
|
||||||
|
|
||||||
#define high_byte(x) (unsigned char)x
|
|
||||||
#define mid2Byte(x) (unsigned char)(x >> 8)
|
|
||||||
#define mid1Byte(x) (unsigned char)(x >> 16)
|
|
||||||
#define low_byte(x) (unsigned char)(x >> 24)
|
|
||||||
|
|
||||||
#define SWAPENDS 1
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@@ -18,12 +18,8 @@ void vpx_log(const char *format, ...);
|
|||||||
#include "vpx_scale/yv12config.h"
|
#include "vpx_scale/yv12config.h"
|
||||||
#include "mv.h"
|
#include "mv.h"
|
||||||
#include "treecoder.h"
|
#include "treecoder.h"
|
||||||
#include "subpixel.h"
|
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
|
|
||||||
/*#define DCPRED 1*/
|
/*#define DCPRED 1*/
|
||||||
#define DCPREDSIMTHRESH 0
|
#define DCPREDSIMTHRESH 0
|
||||||
#define DCPREDCNTTHRESH 3
|
#define DCPREDCNTTHRESH 3
|
||||||
@@ -154,14 +150,15 @@ typedef enum
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
MB_PREDICTION_MODE mode, uv_mode;
|
uint8_t mode, uv_mode;
|
||||||
MV_REFERENCE_FRAME ref_frame;
|
uint8_t ref_frame;
|
||||||
|
uint8_t is_4x4;
|
||||||
int_mv mv;
|
int_mv mv;
|
||||||
|
|
||||||
unsigned char partitioning;
|
uint8_t partitioning;
|
||||||
unsigned char mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */
|
uint8_t mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */
|
||||||
unsigned char need_to_clamp_mvs;
|
uint8_t need_to_clamp_mvs;
|
||||||
unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */
|
uint8_t segment_id; /* Which set of segmentation parameters should be used for this MB */
|
||||||
} MB_MODE_INFO;
|
} MB_MODE_INFO;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -182,36 +179,33 @@ typedef struct
|
|||||||
} LOWER_RES_INFO;
|
} LOWER_RES_INFO;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct
|
typedef struct blockd
|
||||||
{
|
{
|
||||||
short *qcoeff;
|
short *qcoeff;
|
||||||
short *dqcoeff;
|
short *dqcoeff;
|
||||||
unsigned char *predictor;
|
unsigned char *predictor;
|
||||||
short *diff;
|
|
||||||
short *dequant;
|
short *dequant;
|
||||||
|
|
||||||
/* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
|
int offset;
|
||||||
unsigned char **base_pre;
|
|
||||||
int pre;
|
|
||||||
int pre_stride;
|
|
||||||
|
|
||||||
unsigned char **base_dst;
|
|
||||||
int dst;
|
|
||||||
int dst_stride;
|
|
||||||
|
|
||||||
char *eob;
|
char *eob;
|
||||||
|
|
||||||
union b_mode_info bmi;
|
union b_mode_info bmi;
|
||||||
} BLOCKD;
|
} BLOCKD;
|
||||||
|
|
||||||
typedef struct MacroBlockD
|
typedef void (*vp8_subpix_fn_t)(unsigned char *src, int src_pitch, int xofst, int yofst, unsigned char *dst, int dst_pitch);
|
||||||
|
|
||||||
|
typedef struct macroblockd
|
||||||
{
|
{
|
||||||
DECLARE_ALIGNED(16, short, diff[400]); /* from idct diff */
|
|
||||||
DECLARE_ALIGNED(16, unsigned char, predictor[384]);
|
DECLARE_ALIGNED(16, unsigned char, predictor[384]);
|
||||||
DECLARE_ALIGNED(16, short, qcoeff[400]);
|
DECLARE_ALIGNED(16, short, qcoeff[400]);
|
||||||
DECLARE_ALIGNED(16, short, dqcoeff[400]);
|
DECLARE_ALIGNED(16, short, dqcoeff[400]);
|
||||||
DECLARE_ALIGNED(16, char, eobs[25]);
|
DECLARE_ALIGNED(16, char, eobs[25]);
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, short, dequant_y1[16]);
|
||||||
|
DECLARE_ALIGNED(16, short, dequant_y1_dc[16]);
|
||||||
|
DECLARE_ALIGNED(16, short, dequant_y2[16]);
|
||||||
|
DECLARE_ALIGNED(16, short, dequant_uv[16]);
|
||||||
|
|
||||||
/* 16 Y blocks, 4 U, 4 V, 1 DC 2nd order block, each with 16 entries. */
|
/* 16 Y blocks, 4 U, 4 V, 1 DC 2nd order block, each with 16 entries. */
|
||||||
BLOCKD block[25];
|
BLOCKD block[25];
|
||||||
int fullpixel_mask;
|
int fullpixel_mask;
|
||||||
@@ -222,11 +216,21 @@ typedef struct MacroBlockD
|
|||||||
MODE_INFO *mode_info_context;
|
MODE_INFO *mode_info_context;
|
||||||
int mode_info_stride;
|
int mode_info_stride;
|
||||||
|
|
||||||
|
#if CONFIG_TEMPORAL_DENOISING
|
||||||
|
MB_PREDICTION_MODE best_sse_inter_mode;
|
||||||
|
int_mv best_sse_mv;
|
||||||
|
unsigned char need_to_clamp_best_mvs;
|
||||||
|
#endif
|
||||||
|
|
||||||
FRAME_TYPE frame_type;
|
FRAME_TYPE frame_type;
|
||||||
|
|
||||||
int up_available;
|
int up_available;
|
||||||
int left_available;
|
int left_available;
|
||||||
|
|
||||||
|
unsigned char *recon_above[3];
|
||||||
|
unsigned char *recon_left[3];
|
||||||
|
int recon_left_stride[2];
|
||||||
|
|
||||||
/* Y,U,V,Y2 */
|
/* Y,U,V,Y2 */
|
||||||
ENTROPY_CONTEXT_PLANES *above_context;
|
ENTROPY_CONTEXT_PLANES *above_context;
|
||||||
ENTROPY_CONTEXT_PLANES *left_context;
|
ENTROPY_CONTEXT_PLANES *left_context;
|
||||||
@@ -265,11 +269,8 @@ typedef struct MacroBlockD
|
|||||||
int mb_to_top_edge;
|
int mb_to_top_edge;
|
||||||
int mb_to_bottom_edge;
|
int mb_to_bottom_edge;
|
||||||
|
|
||||||
int ref_frame_cost[MAX_REF_FRAMES];
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int frames_since_golden;
|
|
||||||
unsigned int frames_till_alt_ref_frame;
|
|
||||||
vp8_subpix_fn_t subpixel_predict;
|
vp8_subpix_fn_t subpixel_predict;
|
||||||
vp8_subpix_fn_t subpixel_predict8x4;
|
vp8_subpix_fn_t subpixel_predict8x4;
|
||||||
vp8_subpix_fn_t subpixel_predict8x8;
|
vp8_subpix_fn_t subpixel_predict8x8;
|
||||||
@@ -286,10 +287,6 @@ typedef struct MacroBlockD
|
|||||||
*/
|
*/
|
||||||
DECLARE_ALIGNED(32, unsigned char, y_buf[22*32]);
|
DECLARE_ALIGNED(32, unsigned char, y_buf[22*32]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
struct VP8_COMMON_RTCD *rtcd;
|
|
||||||
#endif
|
|
||||||
} MACROBLOCKD;
|
} MACROBLOCKD;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
#include "common_types.h"
|
|
||||||
|
|
||||||
/* Only need this for fixed-size arrays, for structs just assign. */
|
/* Only need this for fixed-size arrays, for structs just assign. */
|
||||||
|
|
||||||
#define vp8_copy( Dest, Src) { \
|
#define vp8_copy( Dest, Src) { \
|
||||||
|
@@ -10,16 +10,15 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "dequantize.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "vp8/common/blockd.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
void vp8_dequantize_b_c(BLOCKD *d)
|
void vp8_dequantize_b_c(BLOCKD *d, short *DQC)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
short *DQ = d->dqcoeff;
|
short *DQ = d->dqcoeff;
|
||||||
short *Q = d->qcoeff;
|
short *Q = d->qcoeff;
|
||||||
short *DQC = d->dequant;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
{
|
{
|
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _dma_desc_h
|
|
||||||
#define _dma_desc_h
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define NDSIZE_LG 0x00000900 // Next Descriptor Size
|
|
||||||
#define NDSIZE_SM 0x00000800 // Next Descriptor Size
|
|
||||||
#define NDSIZE_7 0x00000700 // Next Descriptor Size
|
|
||||||
#define NDSIZE_6 0x00000600 // Next Descriptor Size
|
|
||||||
#define NDSIZE_5 0x00000500 // Next Descriptor Size
|
|
||||||
#define NDSIZE_4 0x00000400 // Next Descriptor Size
|
|
||||||
#define NDSIZE_3 0x00000300 // Next Descriptor Size
|
|
||||||
#define NDSIZE_2 0x00000200 // Next Descriptor Size
|
|
||||||
#define NDSIZE_1 0x00000100 // Next Descriptor Size
|
|
||||||
|
|
||||||
#define FLOW_STOP 0x0000
|
|
||||||
#define FLOW_AUTO 0x1000
|
|
||||||
#define FLOW_DESC_AR 0x4000
|
|
||||||
#define FLOW_DESC_SM 0x6000
|
|
||||||
#define FLOW_DESC_LG 0x7000
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned int ndp;
|
|
||||||
//unsigned short ndpl;
|
|
||||||
//unsigned short ndph;
|
|
||||||
unsigned int sa;
|
|
||||||
//unsigned short sal;
|
|
||||||
//unsigned short sah;
|
|
||||||
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
unsigned short xmod;
|
|
||||||
unsigned short ycnt;
|
|
||||||
unsigned short ymod;
|
|
||||||
|
|
||||||
} LARGE_DESC;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short ndpl;
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
unsigned short xmod;
|
|
||||||
unsigned short ycnt;
|
|
||||||
unsigned short ymod;
|
|
||||||
} SMALL_DESC;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
unsigned short xmod;
|
|
||||||
unsigned short ycnt;
|
|
||||||
unsigned short ymod;
|
|
||||||
} ARRAY_DESC_7;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
unsigned short xmod;
|
|
||||||
unsigned short ycnt;
|
|
||||||
} ARRAY_DESC_6;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
unsigned short xmod;
|
|
||||||
} ARRAY_DESC_5;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
unsigned short xcnt;
|
|
||||||
} ARRAY_DESC_4;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
unsigned short dmacfg;
|
|
||||||
} ARRAY_DESC_3;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
unsigned short sah;
|
|
||||||
} ARRAY_DESC_2;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned short sal;
|
|
||||||
} ARRAY_DESC_1;
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //_dma_desc_h
|
|
@@ -1,116 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _duck_io_h
|
|
||||||
#define _duck_io_h
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (_WIN32)
|
|
||||||
typedef __int64 int64_t;
|
|
||||||
#elif defined(__MWERKS__)
|
|
||||||
typedef long long int64_t;
|
|
||||||
#elif defined(__APPLE__) || defined(__POWERPC)
|
|
||||||
#include <ppc/types.h>
|
|
||||||
#else
|
|
||||||
typedef long long int64_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int64_t offset; // offset to start from
|
|
||||||
int blocking; // non-zero for blocking
|
|
||||||
} re_open_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
SAL_ERR_MAX = -10,
|
|
||||||
SAL_ERROR = -11, // Default error
|
|
||||||
SAL_ERR_WSASTARTUP = -12,
|
|
||||||
SAL_ERR_SOCKET_CREATE = -13,
|
|
||||||
SAL_ERR_RESOLVING_HOSTNAME = -14,
|
|
||||||
SAL_ERR_SERVER_CONNECTION = -15,
|
|
||||||
SAL_ERR_SENDING_DATA = -16,
|
|
||||||
SAL_ERR_RECEIVING_DATA = -17,
|
|
||||||
SAL_ERR_404_FILE_NOT_FOUND = -18,
|
|
||||||
SAL_ERR_PARSING_HTTP_HEADER = -19,
|
|
||||||
SAL_ERR_PARSING_CONTENT_LEN = -20,
|
|
||||||
SAL_ERR_CONNECTION_TIMEOUT = -21,
|
|
||||||
SAL_ERR_FILE_OPEN_FAILED = -22,
|
|
||||||
SAL_ERR_MIN = -23
|
|
||||||
} SAL_ERR; /* EMH 1-15-03 */
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct sal_err_map_temp
|
|
||||||
{
|
|
||||||
SAL_ERR code;
|
|
||||||
const char *decode;
|
|
||||||
|
|
||||||
} sal_err_map_t;
|
|
||||||
|
|
||||||
|
|
||||||
static char *sal_err_text(SAL_ERR e)
|
|
||||||
{
|
|
||||||
int t;
|
|
||||||
const sal_err_map_t g_sal_err_map[] =
|
|
||||||
{
|
|
||||||
{ SAL_ERR_WSASTARTUP, "Error with WSAStartup" },
|
|
||||||
{ SAL_ERR_SOCKET_CREATE, "Error creating socket" },
|
|
||||||
{ SAL_ERR_RESOLVING_HOSTNAME, "Error resolving hostname" },
|
|
||||||
{ SAL_ERR_SERVER_CONNECTION, "Error connecting to server" },
|
|
||||||
{ SAL_ERR_SENDING_DATA, "Error sending data" },
|
|
||||||
{ SAL_ERR_RECEIVING_DATA, "Error receiving data" },
|
|
||||||
{ SAL_ERR_404_FILE_NOT_FOUND, "Error file not found " },
|
|
||||||
{ SAL_ERR_PARSING_HTTP_HEADER, "Error parsing http header" },
|
|
||||||
{ SAL_ERR_PARSING_CONTENT_LEN, "Error parsing content length" },
|
|
||||||
{ SAL_ERR_CONNECTION_TIMEOUT, "Error Connection timed out" },
|
|
||||||
{ SAL_ERR_FILE_OPEN_FAILED, "Error opening file" }
|
|
||||||
};
|
|
||||||
|
|
||||||
for (t = 0; t < sizeof(g_sal_err_map) / sizeof(sal_err_map_t); t++)
|
|
||||||
{
|
|
||||||
if (e == g_sal_err_map[t].code)
|
|
||||||
return (char *) g_sal_err_map[t].decode;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int duck_open(const char *fname, unsigned long user_data);
|
|
||||||
|
|
||||||
void duck_close(int ghndl);
|
|
||||||
|
|
||||||
int duck_read(int ghndl, unsigned char *buf, int nbytes);
|
|
||||||
|
|
||||||
int64_t duck_seek(int g_hndl, int64_t offs, int origin);
|
|
||||||
|
|
||||||
int duck_read_finished(int han, int flag); /* FWG 7-9-99 */
|
|
||||||
|
|
||||||
int duck_name(int handle, char name[], size_t max_len); /* EMH 9-23-03 */
|
|
||||||
|
|
||||||
int duck_read_blocking(int handle, unsigned char *buffer, int bytes); /* EMH 9-23-03 */
|
|
||||||
|
|
||||||
int64_t duck_available_data(int handle); /* EMH 10-23-03 */
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -8,23 +8,11 @@
|
|||||||
* 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 <stdio.h>
|
|
||||||
|
|
||||||
#include "entropy.h"
|
#include "entropy.h"
|
||||||
#include "string.h"
|
|
||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
#include "onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
#define uchar unsigned char /* typedefs can clash */
|
|
||||||
#define uint unsigned int
|
|
||||||
|
|
||||||
typedef const uchar cuchar;
|
|
||||||
typedef const uint cuint;
|
|
||||||
|
|
||||||
typedef vp8_prob Prob;
|
|
||||||
|
|
||||||
#include "coefupdateprobs.h"
|
#include "coefupdateprobs.h"
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) =
|
DECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) =
|
||||||
@@ -47,10 +35,11 @@ DECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) =
|
|||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, cuchar, vp8_coef_bands[16]) =
|
DECLARE_ALIGNED(16, const unsigned char, vp8_coef_bands[16]) =
|
||||||
{ 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7};
|
{ 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, cuchar, vp8_prev_token_class[MAX_ENTROPY_TOKENS]) =
|
DECLARE_ALIGNED(16, const unsigned char,
|
||||||
|
vp8_prev_token_class[MAX_ENTROPY_TOKENS]) =
|
||||||
{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0};
|
{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) =
|
DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) =
|
||||||
@@ -69,7 +58,26 @@ DECLARE_ALIGNED(16, const short, vp8_default_inv_zig_zag[16]) =
|
|||||||
10, 11, 15, 16
|
10, 11, 15, 16
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, short, vp8_default_zig_zag_mask[16]);
|
/* vp8_default_zig_zag_mask generated with:
|
||||||
|
|
||||||
|
void vp8_init_scan_order_mask()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
vp8_default_zig_zag_mask[vp8_default_zig_zag1d[i]] = 1 << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
DECLARE_ALIGNED(16, const short, vp8_default_zig_zag_mask[16]) =
|
||||||
|
{
|
||||||
|
1, 2, 32, 64,
|
||||||
|
4, 16, 128, 4096,
|
||||||
|
8, 256, 2048, 8192,
|
||||||
|
512, 1024, 16384, -32768
|
||||||
|
};
|
||||||
|
|
||||||
const int vp8_mb_feature_data_bits[MB_LVL_MAX] = {7, 6};
|
const int vp8_mb_feature_data_bits[MB_LVL_MAX] = {7, 6};
|
||||||
|
|
||||||
@@ -90,56 +98,72 @@ const vp8_tree_index vp8_coef_tree[ 22] = /* corresponding _CONTEXT_NODEs */
|
|||||||
-DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6 /* 10 = CAT_FIVE */
|
-DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6 /* 10 = CAT_FIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vp8_token_struct vp8_coef_encodings[MAX_ENTROPY_TOKENS];
|
/* vp8_coef_encodings generated with:
|
||||||
|
vp8_tokens_from_tree(vp8_coef_encodings, vp8_coef_tree);
|
||||||
|
*/
|
||||||
|
const vp8_token vp8_coef_encodings[MAX_ENTROPY_TOKENS] =
|
||||||
|
{
|
||||||
|
{2, 2},
|
||||||
|
{6, 3},
|
||||||
|
{28, 5},
|
||||||
|
{58, 6},
|
||||||
|
{59, 6},
|
||||||
|
{60, 6},
|
||||||
|
{61, 6},
|
||||||
|
{124, 7},
|
||||||
|
{125, 7},
|
||||||
|
{126, 7},
|
||||||
|
{127, 7},
|
||||||
|
{0, 1}
|
||||||
|
};
|
||||||
|
|
||||||
/* Trees for extra bits. Probabilities are constant and
|
/* Trees for extra bits. Probabilities are constant and
|
||||||
do not depend on previously encoded bits */
|
do not depend on previously encoded bits */
|
||||||
|
|
||||||
static const Prob Pcat1[] = { 159};
|
static const vp8_prob Pcat1[] = { 159};
|
||||||
static const Prob Pcat2[] = { 165, 145};
|
static const vp8_prob Pcat2[] = { 165, 145};
|
||||||
static const Prob Pcat3[] = { 173, 148, 140};
|
static const vp8_prob Pcat3[] = { 173, 148, 140};
|
||||||
static const Prob Pcat4[] = { 176, 155, 140, 135};
|
static const vp8_prob Pcat4[] = { 176, 155, 140, 135};
|
||||||
static const Prob Pcat5[] = { 180, 157, 141, 134, 130};
|
static const vp8_prob Pcat5[] = { 180, 157, 141, 134, 130};
|
||||||
static const Prob Pcat6[] =
|
static const vp8_prob Pcat6[] =
|
||||||
{ 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129};
|
{ 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129};
|
||||||
|
|
||||||
static vp8_tree_index cat1[2], cat2[4], cat3[6], cat4[8], cat5[10], cat6[22];
|
|
||||||
|
|
||||||
void vp8_init_scan_order_mask()
|
/* tree index tables generated with:
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
void init_bit_tree(vp8_tree_index *p, int n)
|
||||||
{
|
{
|
||||||
vp8_default_zig_zag_mask[vp8_default_zig_zag1d[i]] = 1 << i;
|
int i = 0;
|
||||||
|
|
||||||
|
while (++i < n)
|
||||||
|
{
|
||||||
|
p[0] = p[1] = i << 1;
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
p[0] = p[1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
void init_bit_trees()
|
||||||
|
|
||||||
static void init_bit_tree(vp8_tree_index *p, int n)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while (++i < n)
|
|
||||||
{
|
{
|
||||||
p[0] = p[1] = i << 1;
|
init_bit_tree(cat1, 1);
|
||||||
p += 2;
|
init_bit_tree(cat2, 2);
|
||||||
|
init_bit_tree(cat3, 3);
|
||||||
|
init_bit_tree(cat4, 4);
|
||||||
|
init_bit_tree(cat5, 5);
|
||||||
|
init_bit_tree(cat6, 11);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
p[0] = p[1] = 0;
|
static const vp8_tree_index cat1[2] = { 0, 0 };
|
||||||
}
|
static const vp8_tree_index cat2[4] = { 2, 2, 0, 0 };
|
||||||
|
static const vp8_tree_index cat3[6] = { 2, 2, 4, 4, 0, 0 };
|
||||||
|
static const vp8_tree_index cat4[8] = { 2, 2, 4, 4, 6, 6, 0, 0 };
|
||||||
|
static const vp8_tree_index cat5[10] = { 2, 2, 4, 4, 6, 6, 8, 8, 0, 0 };
|
||||||
|
static const vp8_tree_index cat6[22] = { 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12,
|
||||||
|
14, 14, 16, 16, 18, 18, 20, 20, 0, 0 };
|
||||||
|
|
||||||
static void init_bit_trees()
|
const vp8_extra_bit_struct vp8_extra_bits[12] =
|
||||||
{
|
|
||||||
init_bit_tree(cat1, 1);
|
|
||||||
init_bit_tree(cat2, 2);
|
|
||||||
init_bit_tree(cat3, 3);
|
|
||||||
init_bit_tree(cat4, 4);
|
|
||||||
init_bit_tree(cat5, 5);
|
|
||||||
init_bit_tree(cat6, 11);
|
|
||||||
}
|
|
||||||
|
|
||||||
vp8_extra_bit_struct vp8_extra_bits[12] =
|
|
||||||
{
|
{
|
||||||
{ 0, 0, 0, 0},
|
{ 0, 0, 0, 0},
|
||||||
{ 0, 0, 0, 1},
|
{ 0, 0, 0, 1},
|
||||||
@@ -163,8 +187,3 @@ void vp8_default_coef_probs(VP8_COMMON *pc)
|
|||||||
sizeof(default_coef_probs));
|
sizeof(default_coef_probs));
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_coef_tree_initialize()
|
|
||||||
{
|
|
||||||
init_bit_trees();
|
|
||||||
vp8_tokens_from_tree(vp8_coef_encodings, vp8_coef_tree);
|
|
||||||
}
|
|
||||||
|
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
extern const vp8_tree_index vp8_coef_tree[];
|
extern const vp8_tree_index vp8_coef_tree[];
|
||||||
|
|
||||||
extern struct vp8_token_struct vp8_coef_encodings[MAX_ENTROPY_TOKENS];
|
extern const struct vp8_token_struct vp8_coef_encodings[MAX_ENTROPY_TOKENS];
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -45,7 +45,7 @@ typedef struct
|
|||||||
int base_val;
|
int base_val;
|
||||||
} vp8_extra_bit_struct;
|
} vp8_extra_bit_struct;
|
||||||
|
|
||||||
extern vp8_extra_bit_struct vp8_extra_bits[12]; /* indexed by token value */
|
extern const vp8_extra_bit_struct vp8_extra_bits[12]; /* indexed by token value */
|
||||||
|
|
||||||
#define PROB_UPDATE_BASELINE_COST 7
|
#define PROB_UPDATE_BASELINE_COST 7
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ void vp8_default_coef_probs(struct VP8Common *);
|
|||||||
|
|
||||||
extern DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]);
|
extern DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]);
|
||||||
extern DECLARE_ALIGNED(16, const short, vp8_default_inv_zig_zag[16]);
|
extern DECLARE_ALIGNED(16, const short, vp8_default_inv_zig_zag[16]);
|
||||||
extern short vp8_default_zig_zag_mask[16];
|
extern DECLARE_ALIGNED(16, const short, vp8_default_zig_zag_mask[16]);
|
||||||
extern const int vp8_mb_feature_data_bits[MB_LVL_MAX];
|
extern const int vp8_mb_feature_data_bits[MB_LVL_MAX];
|
||||||
|
|
||||||
void vp8_coef_tree_initialize(void);
|
void vp8_coef_tree_initialize(void);
|
||||||
|
@@ -8,22 +8,13 @@
|
|||||||
* 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define USE_PREBUILT_TABLES
|
||||||
|
|
||||||
#include "entropymode.h"
|
#include "entropymode.h"
|
||||||
#include "entropy.h"
|
#include "entropy.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
static const unsigned int kf_y_mode_cts[VP8_YMODES] = { 1607, 915, 812, 811, 5455};
|
#include "vp8_entropymodedata.h"
|
||||||
static const unsigned int y_mode_cts [VP8_YMODES] = { 8080, 1908, 1582, 1007, 5874};
|
|
||||||
|
|
||||||
static const unsigned int uv_mode_cts [VP8_UV_MODES] = { 59483, 13605, 16492, 4230};
|
|
||||||
static const unsigned int kf_uv_mode_cts[VP8_UV_MODES] = { 5319, 1904, 1703, 674};
|
|
||||||
|
|
||||||
static const unsigned int bmode_cts[VP8_BINTRAMODES] =
|
|
||||||
{
|
|
||||||
43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int vp8_mv_cont(const int_mv *l, const int_mv *a)
|
int vp8_mv_cont(const int_mv *l, const int_mv *a)
|
||||||
{
|
{
|
||||||
@@ -59,7 +50,7 @@ const vp8_prob vp8_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP8_SUBMVREFS-1] =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
vp8_mbsplit vp8_mbsplits [VP8_NUMMBSPLITS] =
|
const vp8_mbsplit vp8_mbsplits [VP8_NUMMBSPLITS] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
@@ -84,7 +75,7 @@ vp8_mbsplit vp8_mbsplits [VP8_NUMMBSPLITS] =
|
|||||||
4, 5, 6, 7,
|
4, 5, 6, 7,
|
||||||
8, 9, 10, 11,
|
8, 9, 10, 11,
|
||||||
12, 13, 14, 15,
|
12, 13, 14, 15,
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const int vp8_mbsplit_count [VP8_NUMMBSPLITS] = { 2, 2, 4, 16};
|
const int vp8_mbsplit_count [VP8_NUMMBSPLITS] = { 2, 2, 4, 16};
|
||||||
@@ -155,17 +146,6 @@ const vp8_tree_index vp8_sub_mv_ref_tree[6] =
|
|||||||
-ZERO4X4, -NEW4X4
|
-ZERO4X4, -NEW4X4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct vp8_token_struct vp8_bmode_encodings [VP8_BINTRAMODES];
|
|
||||||
struct vp8_token_struct vp8_ymode_encodings [VP8_YMODES];
|
|
||||||
struct vp8_token_struct vp8_kf_ymode_encodings [VP8_YMODES];
|
|
||||||
struct vp8_token_struct vp8_uv_mode_encodings [VP8_UV_MODES];
|
|
||||||
struct vp8_token_struct vp8_mbsplit_encodings [VP8_NUMMBSPLITS];
|
|
||||||
|
|
||||||
struct vp8_token_struct vp8_mv_ref_encoding_array [VP8_MVREFS];
|
|
||||||
struct vp8_token_struct vp8_sub_mv_ref_encoding_array [VP8_SUBMVREFS];
|
|
||||||
|
|
||||||
|
|
||||||
const vp8_tree_index vp8_small_mvtree [14] =
|
const vp8_tree_index vp8_small_mvtree [14] =
|
||||||
{
|
{
|
||||||
2, 8,
|
2, 8,
|
||||||
@@ -177,89 +157,21 @@ const vp8_tree_index vp8_small_mvtree [14] =
|
|||||||
-6, -7
|
-6, -7
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vp8_token_struct vp8_small_mvencodings [8];
|
|
||||||
|
|
||||||
void vp8_init_mbmode_probs(VP8_COMMON *x)
|
void vp8_init_mbmode_probs(VP8_COMMON *x)
|
||||||
{
|
{
|
||||||
unsigned int bct [VP8_YMODES] [2]; /* num Ymodes > num UV modes */
|
vpx_memcpy(x->fc.ymode_prob, vp8_ymode_prob, sizeof(vp8_ymode_prob));
|
||||||
|
vpx_memcpy(x->kf_ymode_prob, vp8_kf_ymode_prob, sizeof(vp8_kf_ymode_prob));
|
||||||
vp8_tree_probs_from_distribution(
|
vpx_memcpy(x->fc.uv_mode_prob, vp8_uv_mode_prob, sizeof(vp8_uv_mode_prob));
|
||||||
VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
|
vpx_memcpy(x->kf_uv_mode_prob, vp8_kf_uv_mode_prob, sizeof(vp8_kf_uv_mode_prob));
|
||||||
x->fc.ymode_prob, bct, y_mode_cts,
|
|
||||||
256, 1
|
|
||||||
);
|
|
||||||
vp8_tree_probs_from_distribution(
|
|
||||||
VP8_YMODES, vp8_kf_ymode_encodings, vp8_kf_ymode_tree,
|
|
||||||
x->kf_ymode_prob, bct, kf_y_mode_cts,
|
|
||||||
256, 1
|
|
||||||
);
|
|
||||||
vp8_tree_probs_from_distribution(
|
|
||||||
VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
|
|
||||||
x->fc.uv_mode_prob, bct, uv_mode_cts,
|
|
||||||
256, 1
|
|
||||||
);
|
|
||||||
vp8_tree_probs_from_distribution(
|
|
||||||
VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
|
|
||||||
x->kf_uv_mode_prob, bct, kf_uv_mode_cts,
|
|
||||||
256, 1
|
|
||||||
);
|
|
||||||
vpx_memcpy(x->fc.sub_mv_ref_prob, sub_mv_ref_prob, sizeof(sub_mv_ref_prob));
|
vpx_memcpy(x->fc.sub_mv_ref_prob, sub_mv_ref_prob, sizeof(sub_mv_ref_prob));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void intra_bmode_probs_from_distribution(
|
|
||||||
vp8_prob p [VP8_BINTRAMODES-1],
|
|
||||||
unsigned int branch_ct [VP8_BINTRAMODES-1] [2],
|
|
||||||
const unsigned int events [VP8_BINTRAMODES]
|
|
||||||
)
|
|
||||||
{
|
|
||||||
vp8_tree_probs_from_distribution(
|
|
||||||
VP8_BINTRAMODES, vp8_bmode_encodings, vp8_bmode_tree,
|
|
||||||
p, branch_ct, events,
|
|
||||||
256, 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES-1])
|
void vp8_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES-1])
|
||||||
{
|
{
|
||||||
unsigned int branch_ct [VP8_BINTRAMODES-1] [2];
|
vpx_memcpy(p, vp8_bmode_prob, sizeof(vp8_bmode_prob));
|
||||||
intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_kf_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES-1])
|
void vp8_kf_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES-1])
|
||||||
{
|
{
|
||||||
unsigned int branch_ct [VP8_BINTRAMODES-1] [2];
|
vpx_memcpy(p, vp8_kf_bmode_prob, sizeof(vp8_kf_bmode_prob));
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
int j = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
intra_bmode_probs_from_distribution(
|
|
||||||
p[i][j], branch_ct, vp8_kf_default_bmode_counts[i][j]);
|
|
||||||
|
|
||||||
}
|
|
||||||
while (++j < VP8_BINTRAMODES);
|
|
||||||
}
|
|
||||||
while (++i < VP8_BINTRAMODES);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void vp8_entropy_mode_init()
|
|
||||||
{
|
|
||||||
vp8_tokens_from_tree(vp8_bmode_encodings, vp8_bmode_tree);
|
|
||||||
vp8_tokens_from_tree(vp8_ymode_encodings, vp8_ymode_tree);
|
|
||||||
vp8_tokens_from_tree(vp8_kf_ymode_encodings, vp8_kf_ymode_tree);
|
|
||||||
vp8_tokens_from_tree(vp8_uv_mode_encodings, vp8_uv_mode_tree);
|
|
||||||
vp8_tokens_from_tree(vp8_mbsplit_encodings, vp8_mbsplit_tree);
|
|
||||||
|
|
||||||
vp8_tokens_from_tree_offset(vp8_mv_ref_encoding_array,
|
|
||||||
vp8_mv_ref_tree, NEARESTMV);
|
|
||||||
vp8_tokens_from_tree_offset(vp8_sub_mv_ref_encoding_array,
|
|
||||||
vp8_sub_mv_ref_tree, LEFT4X4);
|
|
||||||
|
|
||||||
vp8_tokens_from_tree(vp8_small_mvencodings, vp8_small_mvtree);
|
|
||||||
}
|
}
|
||||||
|
@@ -52,22 +52,20 @@ extern const vp8_tree_index vp8_mbsplit_tree[];
|
|||||||
extern const vp8_tree_index vp8_mv_ref_tree[];
|
extern const vp8_tree_index vp8_mv_ref_tree[];
|
||||||
extern const vp8_tree_index vp8_sub_mv_ref_tree[];
|
extern const vp8_tree_index vp8_sub_mv_ref_tree[];
|
||||||
|
|
||||||
extern struct vp8_token_struct vp8_bmode_encodings [VP8_BINTRAMODES];
|
extern const struct vp8_token_struct vp8_bmode_encodings[VP8_BINTRAMODES];
|
||||||
extern struct vp8_token_struct vp8_ymode_encodings [VP8_YMODES];
|
extern const struct vp8_token_struct vp8_ymode_encodings[VP8_YMODES];
|
||||||
extern struct vp8_token_struct vp8_kf_ymode_encodings [VP8_YMODES];
|
extern const struct vp8_token_struct vp8_kf_ymode_encodings[VP8_YMODES];
|
||||||
extern struct vp8_token_struct vp8_uv_mode_encodings [VP8_UV_MODES];
|
extern const struct vp8_token_struct vp8_uv_mode_encodings[VP8_UV_MODES];
|
||||||
extern struct vp8_token_struct vp8_mbsplit_encodings [VP8_NUMMBSPLITS];
|
extern const struct vp8_token_struct vp8_mbsplit_encodings[VP8_NUMMBSPLITS];
|
||||||
|
|
||||||
/* Inter mode values do not start at zero */
|
/* Inter mode values do not start at zero */
|
||||||
|
|
||||||
extern struct vp8_token_struct vp8_mv_ref_encoding_array [VP8_MVREFS];
|
extern const struct vp8_token_struct vp8_mv_ref_encoding_array[VP8_MVREFS];
|
||||||
extern struct vp8_token_struct vp8_sub_mv_ref_encoding_array [VP8_SUBMVREFS];
|
extern const struct vp8_token_struct vp8_sub_mv_ref_encoding_array[VP8_SUBMVREFS];
|
||||||
|
|
||||||
extern const vp8_tree_index vp8_small_mvtree[];
|
extern const vp8_tree_index vp8_small_mvtree[];
|
||||||
|
|
||||||
extern struct vp8_token_struct vp8_small_mvencodings [8];
|
extern const struct vp8_token_struct vp8_small_mvencodings[8];
|
||||||
|
|
||||||
void vp8_entropy_mode_init(void);
|
|
||||||
|
|
||||||
void vp8_init_mbmode_probs(VP8_COMMON *x);
|
void vp8_init_mbmode_probs(VP8_COMMON *x);
|
||||||
|
|
||||||
|
@@ -149,7 +149,7 @@ static void filter_block2d
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void vp8_sixtap_predict_c
|
void vp8_sixtap_predict4x4_c
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
int src_pixels_per_line,
|
int src_pixels_per_line,
|
||||||
|
@@ -134,13 +134,51 @@ void vp8_find_near_mvs
|
|||||||
best_mv->as_int = near_mvs[0].as_int;
|
best_mv->as_int = near_mvs[0].as_int;
|
||||||
nearest->as_int = near_mvs[CNT_NEAREST].as_int;
|
nearest->as_int = near_mvs[CNT_NEAREST].as_int;
|
||||||
nearby->as_int = near_mvs[CNT_NEAR].as_int;
|
nearby->as_int = near_mvs[CNT_NEAR].as_int;
|
||||||
|
|
||||||
//TODO: move clamp outside findnearmv
|
|
||||||
vp8_clamp_mv2(nearest, xd);
|
|
||||||
vp8_clamp_mv2(nearby, xd);
|
|
||||||
vp8_clamp_mv2(best_mv, xd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void invert_and_clamp_mvs(int_mv *inv, int_mv *src, MACROBLOCKD *xd)
|
||||||
|
{
|
||||||
|
inv->as_mv.row = src->as_mv.row * -1;
|
||||||
|
inv->as_mv.col = src->as_mv.col * -1;
|
||||||
|
vp8_clamp_mv2(inv, xd);
|
||||||
|
vp8_clamp_mv2(src, xd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int vp8_find_near_mvs_bias
|
||||||
|
(
|
||||||
|
MACROBLOCKD *xd,
|
||||||
|
const MODE_INFO *here,
|
||||||
|
int_mv mode_mv_sb[2][MB_MODE_COUNT],
|
||||||
|
int_mv best_mv_sb[2],
|
||||||
|
int cnt[4],
|
||||||
|
int refframe,
|
||||||
|
int *ref_frame_sign_bias
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int sign_bias = ref_frame_sign_bias[refframe];
|
||||||
|
|
||||||
|
vp8_find_near_mvs(xd,
|
||||||
|
here,
|
||||||
|
&mode_mv_sb[sign_bias][NEARESTMV],
|
||||||
|
&mode_mv_sb[sign_bias][NEARMV],
|
||||||
|
&best_mv_sb[sign_bias],
|
||||||
|
cnt,
|
||||||
|
refframe,
|
||||||
|
ref_frame_sign_bias);
|
||||||
|
|
||||||
|
invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARESTMV],
|
||||||
|
&mode_mv_sb[sign_bias][NEARESTMV], xd);
|
||||||
|
invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARMV],
|
||||||
|
&mode_mv_sb[sign_bias][NEARMV], xd);
|
||||||
|
invert_and_clamp_mvs(&best_mv_sb[!sign_bias],
|
||||||
|
&best_mv_sb[sign_bias], xd);
|
||||||
|
|
||||||
|
return sign_bias;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
vp8_prob *vp8_mv_ref_probs(
|
vp8_prob *vp8_mv_ref_probs(
|
||||||
vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
|
vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
|
||||||
)
|
)
|
||||||
|
@@ -60,10 +60,10 @@ static unsigned int vp8_check_mv_bounds(int_mv *mv, int mb_to_left_edge,
|
|||||||
int mb_to_bottom_edge)
|
int mb_to_bottom_edge)
|
||||||
{
|
{
|
||||||
unsigned int need_to_clamp;
|
unsigned int need_to_clamp;
|
||||||
need_to_clamp = (mv->as_mv.col < mb_to_left_edge) ? 1 : 0;
|
need_to_clamp = (mv->as_mv.col < mb_to_left_edge);
|
||||||
need_to_clamp |= (mv->as_mv.col > mb_to_right_edge) ? 1 : 0;
|
need_to_clamp |= (mv->as_mv.col > mb_to_right_edge);
|
||||||
need_to_clamp |= (mv->as_mv.row < mb_to_top_edge) ? 1 : 0;
|
need_to_clamp |= (mv->as_mv.row < mb_to_top_edge);
|
||||||
need_to_clamp |= (mv->as_mv.row > mb_to_bottom_edge) ? 1 : 0;
|
need_to_clamp |= (mv->as_mv.row > mb_to_bottom_edge);
|
||||||
return need_to_clamp;
|
return need_to_clamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,6 +77,19 @@ void vp8_find_near_mvs
|
|||||||
int *ref_frame_sign_bias
|
int *ref_frame_sign_bias
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
int vp8_find_near_mvs_bias
|
||||||
|
(
|
||||||
|
MACROBLOCKD *xd,
|
||||||
|
const MODE_INFO *here,
|
||||||
|
int_mv mode_mv_sb[2][MB_MODE_COUNT],
|
||||||
|
int_mv best_mv_sb[2],
|
||||||
|
int cnt[4],
|
||||||
|
int refframe,
|
||||||
|
int *ref_frame_sign_bias
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
vp8_prob *vp8_mv_ref_probs(
|
vp8_prob *vp8_mv_ref_probs(
|
||||||
vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
|
vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
|
||||||
);
|
);
|
||||||
|
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
extern void (*vp8_clear_system_state)(void);
|
|
||||||
extern void (*vp8_plane_add_noise)(unsigned char *Start, unsigned int Width, unsigned int Height, int Pitch, int DPitch, int q);
|
|
||||||
extern void (*de_interlace)
|
|
||||||
(
|
|
||||||
unsigned char *src_ptr,
|
|
||||||
unsigned char *dst_ptr,
|
|
||||||
int Width,
|
|
||||||
int Height,
|
|
||||||
int Stride
|
|
||||||
);
|
|
@@ -10,31 +10,33 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/common/g_common.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "vp8/common/subpixel.h"
|
#if ARCH_ARM
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "vpx_ports/arm.h"
|
||||||
#include "vp8/common/recon.h"
|
#elif ARCH_X86 || ARCH_X86_64
|
||||||
#include "vp8/common/idct.h"
|
#include "vpx_ports/x86.h"
|
||||||
|
#endif
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "vp8/common/onyxc_int.h"
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H && !defined(__OS2__)
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
|
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
#define INCL_DOS
|
||||||
|
#define INCL_DOSSPINLOCK
|
||||||
|
#include <os2.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void vp8_arch_x86_common_init(VP8_COMMON *ctx);
|
|
||||||
extern void vp8_arch_arm_common_init(VP8_COMMON *ctx);
|
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
static int get_cpu_count()
|
static int get_cpu_count()
|
||||||
{
|
{
|
||||||
int core_count = 16;
|
int core_count = 16;
|
||||||
|
|
||||||
#if HAVE_UNISTD_H
|
#if HAVE_UNISTD_H && !defined(__OS2__)
|
||||||
#if defined(_SC_NPROCESSORS_ONLN)
|
#if defined(_SC_NPROCESSORS_ONLN)
|
||||||
core_count = sysconf(_SC_NPROCESSORS_ONLN);
|
core_count = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
#elif defined(_SC_NPROC_ONLN)
|
#elif defined(_SC_NPROC_ONLN)
|
||||||
@@ -57,6 +59,21 @@ static int get_cpu_count()
|
|||||||
|
|
||||||
core_count = sysinfo.dwNumberOfProcessors;
|
core_count = sysinfo.dwNumberOfProcessors;
|
||||||
}
|
}
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
{
|
||||||
|
ULONG proc_id;
|
||||||
|
ULONG status;
|
||||||
|
|
||||||
|
core_count = 0;
|
||||||
|
for (proc_id = 1; ; proc_id++)
|
||||||
|
{
|
||||||
|
if (DosGetProcessorStatus(proc_id, &status))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (status == PROC_ONLINE)
|
||||||
|
core_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* other platforms */
|
/* other platforms */
|
||||||
#endif
|
#endif
|
||||||
@@ -65,70 +82,69 @@ static int get_cpu_count()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if HAVE_PTHREAD_H
|
||||||
|
#include <pthread.h>
|
||||||
|
static void once(void (*func)(void))
|
||||||
|
{
|
||||||
|
static pthread_once_t lock = PTHREAD_ONCE_INIT;
|
||||||
|
pthread_once(&lock, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
static void once(void (*func)(void))
|
||||||
|
{
|
||||||
|
/* Using a static initializer here rather than InitializeCriticalSection()
|
||||||
|
* since there's no race-free context in which to execute it. Protecting
|
||||||
|
* it with an atomic op like InterlockedCompareExchangePointer introduces
|
||||||
|
* an x86 dependency, and InitOnceExecuteOnce requires Vista.
|
||||||
|
*/
|
||||||
|
static CRITICAL_SECTION lock = {(void *)-1, -1, 0, 0, 0, 0};
|
||||||
|
static int done;
|
||||||
|
|
||||||
|
EnterCriticalSection(&lock);
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
{
|
||||||
|
func();
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaveCriticalSection(&lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#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 vp8_machine_specific_config(VP8_COMMON *ctx)
|
void vp8_machine_specific_config(VP8_COMMON *ctx)
|
||||||
{
|
{
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
VP8_COMMON_RTCD *rtcd = &ctx->rtcd;
|
|
||||||
|
|
||||||
rtcd->idct.idct16 = vp8_short_idct4x4llm_c;
|
|
||||||
rtcd->idct.idct1_scalar_add = vp8_dc_only_idct_add_c;
|
|
||||||
rtcd->idct.iwalsh1 = vp8_short_inv_walsh4x4_1_c;
|
|
||||||
rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_c;
|
|
||||||
|
|
||||||
rtcd->recon.copy16x16 = vp8_copy_mem16x16_c;
|
|
||||||
rtcd->recon.copy8x8 = vp8_copy_mem8x8_c;
|
|
||||||
rtcd->recon.copy8x4 = vp8_copy_mem8x4_c;
|
|
||||||
|
|
||||||
rtcd->recon.build_intra_predictors_mby =
|
|
||||||
vp8_build_intra_predictors_mby;
|
|
||||||
rtcd->recon.build_intra_predictors_mby_s =
|
|
||||||
vp8_build_intra_predictors_mby_s;
|
|
||||||
rtcd->recon.build_intra_predictors_mbuv =
|
|
||||||
vp8_build_intra_predictors_mbuv;
|
|
||||||
rtcd->recon.build_intra_predictors_mbuv_s =
|
|
||||||
vp8_build_intra_predictors_mbuv_s;
|
|
||||||
rtcd->recon.intra4x4_predict =
|
|
||||||
vp8_intra4x4_predict_c;
|
|
||||||
|
|
||||||
rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_c;
|
|
||||||
rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_c;
|
|
||||||
rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_c;
|
|
||||||
rtcd->subpix.sixtap4x4 = vp8_sixtap_predict_c;
|
|
||||||
rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_c;
|
|
||||||
rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_c;
|
|
||||||
rtcd->subpix.bilinear8x4 = vp8_bilinear_predict8x4_c;
|
|
||||||
rtcd->subpix.bilinear4x4 = vp8_bilinear_predict4x4_c;
|
|
||||||
|
|
||||||
rtcd->loopfilter.normal_mb_v = vp8_loop_filter_mbv_c;
|
|
||||||
rtcd->loopfilter.normal_b_v = vp8_loop_filter_bv_c;
|
|
||||||
rtcd->loopfilter.normal_mb_h = vp8_loop_filter_mbh_c;
|
|
||||||
rtcd->loopfilter.normal_b_h = vp8_loop_filter_bh_c;
|
|
||||||
rtcd->loopfilter.simple_mb_v = vp8_loop_filter_simple_vertical_edge_c;
|
|
||||||
rtcd->loopfilter.simple_b_v = vp8_loop_filter_bvs_c;
|
|
||||||
rtcd->loopfilter.simple_mb_h = vp8_loop_filter_simple_horizontal_edge_c;
|
|
||||||
rtcd->loopfilter.simple_b_h = vp8_loop_filter_bhs_c;
|
|
||||||
|
|
||||||
#if CONFIG_POSTPROC || (CONFIG_VP8_ENCODER && CONFIG_INTERNAL_STATS)
|
|
||||||
rtcd->postproc.down = vp8_mbpost_proc_down_c;
|
|
||||||
rtcd->postproc.across = vp8_mbpost_proc_across_ip_c;
|
|
||||||
rtcd->postproc.downacross = vp8_post_proc_down_and_across_c;
|
|
||||||
rtcd->postproc.addnoise = vp8_plane_add_noise_c;
|
|
||||||
rtcd->postproc.blend_mb_inner = vp8_blend_mb_inner_c;
|
|
||||||
rtcd->postproc.blend_mb_outer = vp8_blend_mb_outer_c;
|
|
||||||
rtcd->postproc.blend_b = vp8_blend_b_c;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARCH_X86 || ARCH_X86_64
|
|
||||||
vp8_arch_x86_common_init(ctx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARCH_ARM
|
|
||||||
vp8_arch_arm_common_init(ctx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
ctx->processor_core_count = get_cpu_count();
|
ctx->processor_core_count = get_cpu_count();
|
||||||
#endif /* CONFIG_MULTITHREAD */
|
#endif /* CONFIG_MULTITHREAD */
|
||||||
|
|
||||||
|
#if ARCH_ARM
|
||||||
|
ctx->cpu_caps = arm_cpu_caps();
|
||||||
|
#elif ARCH_X86 || ARCH_X86_64
|
||||||
|
ctx->cpu_caps = x86_simd_caps();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
once(vpx_rtcd);
|
||||||
}
|
}
|
||||||
|
@@ -1,80 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __INC_IDCT_H
|
|
||||||
#define __INC_IDCT_H
|
|
||||||
|
|
||||||
#define prototype_second_order(sym) \
|
|
||||||
void sym(short *input, short *output)
|
|
||||||
|
|
||||||
#define prototype_idct(sym) \
|
|
||||||
void sym(short *input, unsigned char *pred, int pitch, unsigned char *dst, \
|
|
||||||
int dst_stride)
|
|
||||||
|
|
||||||
#define prototype_idct_scalar_add(sym) \
|
|
||||||
void sym(short input, \
|
|
||||||
unsigned char *pred, int pred_stride, \
|
|
||||||
unsigned char *dst, \
|
|
||||||
int dst_stride)
|
|
||||||
|
|
||||||
#if ARCH_X86 || ARCH_X86_64
|
|
||||||
#include "x86/idct_x86.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARCH_ARM
|
|
||||||
#include "arm/idct_arm.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef vp8_idct_idct16
|
|
||||||
#define vp8_idct_idct16 vp8_short_idct4x4llm_c
|
|
||||||
#endif
|
|
||||||
extern prototype_idct(vp8_idct_idct16);
|
|
||||||
/* add this prototype to prevent compiler warning about implicit
|
|
||||||
* declaration of vp8_short_idct4x4llm_c function in dequantize.c
|
|
||||||
* when building, for example, neon optimized version */
|
|
||||||
extern prototype_idct(vp8_short_idct4x4llm_c);
|
|
||||||
|
|
||||||
#ifndef vp8_idct_idct1_scalar_add
|
|
||||||
#define vp8_idct_idct1_scalar_add vp8_dc_only_idct_add_c
|
|
||||||
#endif
|
|
||||||
extern prototype_idct_scalar_add(vp8_idct_idct1_scalar_add);
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef vp8_idct_iwalsh1
|
|
||||||
#define vp8_idct_iwalsh1 vp8_short_inv_walsh4x4_1_c
|
|
||||||
#endif
|
|
||||||
extern prototype_second_order(vp8_idct_iwalsh1);
|
|
||||||
|
|
||||||
#ifndef vp8_idct_iwalsh16
|
|
||||||
#define vp8_idct_iwalsh16 vp8_short_inv_walsh4x4_c
|
|
||||||
#endif
|
|
||||||
extern prototype_second_order(vp8_idct_iwalsh16);
|
|
||||||
|
|
||||||
typedef prototype_idct((*vp8_idct_fn_t));
|
|
||||||
typedef prototype_idct_scalar_add((*vp8_idct_scalar_add_fn_t));
|
|
||||||
typedef prototype_second_order((*vp8_second_order_fn_t));
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vp8_idct_fn_t idct16;
|
|
||||||
vp8_idct_scalar_add_fn_t idct1_scalar_add;
|
|
||||||
|
|
||||||
vp8_second_order_fn_t iwalsh1;
|
|
||||||
vp8_second_order_fn_t iwalsh16;
|
|
||||||
} vp8_idct_rtcd_vtable_t;
|
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#define IDCT_INVOKE(ctx,fn) (ctx)->fn
|
|
||||||
#else
|
|
||||||
#define IDCT_INVOKE(ctx,fn) vp8_idct_##fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -9,8 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "dequantize.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);
|
31
vp8/common/idctllm_test.cc
Executable file
31
vp8/common/idctllm_test.cc
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void vp8_short_idct4x4llm_c(short *input, unsigned char *pred_ptr,
|
||||||
|
int pred_stride, unsigned char *dst_ptr,
|
||||||
|
int dst_stride);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "idctllm_test.h"
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, IDCTTest,
|
||||||
|
::testing::Values(vp8_short_idct4x4llm_c));
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
113
vp8/common/idctllm_test.h
Executable file
113
vp8/common/idctllm_test.h
Executable file
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
typedef void (*idct_fn_t)(short *input, unsigned char *pred_ptr,
|
||||||
|
int pred_stride, unsigned char *dst_ptr,
|
||||||
|
int dst_stride);
|
||||||
|
namespace {
|
||||||
|
class IDCTTest : public ::testing::TestWithParam<idct_fn_t>
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
UUT = GetParam();
|
||||||
|
memset(input, 0, sizeof(input));
|
||||||
|
/* Set up guard blocks */
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
output[i] = ((i&0xF)<4&&(i<64))?0:-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
idct_fn_t UUT;
|
||||||
|
short input[16];
|
||||||
|
unsigned char output[256];
|
||||||
|
unsigned char predict[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestGuardBlocks)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(0, output[i]) << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAllZeros)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
UUT(input, output, 16, output, 16);
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(0, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAllOnes)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
input[0] = 4;
|
||||||
|
UUT(input, output, 16, output, 16);
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(1, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAddOne)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
predict[i] = i;
|
||||||
|
|
||||||
|
input[0] = 4;
|
||||||
|
UUT(input, predict, 16, output, 16);
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(i+1, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestWithData)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<16; i++)
|
||||||
|
input[i] = i;
|
||||||
|
|
||||||
|
UUT(input, output, 16, output, 16);
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) > 3 || i>63)
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
else if(i == 0)
|
||||||
|
EXPECT_EQ(11, output[i]) << "i==" << i;
|
||||||
|
else if(i == 34)
|
||||||
|
EXPECT_EQ(1, output[i]) << "i==" << i;
|
||||||
|
else if(i == 2 || i == 17 || i == 32)
|
||||||
|
EXPECT_EQ(3, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(0, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "invtrans.h"
|
|
||||||
|
|
||||||
|
|
||||||
void vp8_inverse_transform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b,
|
|
||||||
int pitch)
|
|
||||||
{
|
|
||||||
if (*b->eob > 1)
|
|
||||||
{
|
|
||||||
IDCT_INVOKE(rtcd, idct16)(b->dqcoeff, b->predictor, pitch,
|
|
||||||
*(b->base_dst) + b->dst, b->dst_stride);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IDCT_INVOKE(rtcd, idct1_scalar_add)(b->dqcoeff[0], b->predictor, pitch,
|
|
||||||
*(b->base_dst) + b->dst, b->dst_stride);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_inverse_transform_mby(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if(x->mode_info_context->mbmi.mode != SPLITMV)
|
|
||||||
{
|
|
||||||
/* do 2nd order transform on the dc block */
|
|
||||||
IDCT_INVOKE(rtcd, iwalsh16)(x->block[24].dqcoeff, x->dqcoeff);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
vp8_inverse_transform_b(rtcd, &x->block[i], 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
void vp8_inverse_transform_mbuv(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 16; i < 24; i++)
|
|
||||||
{
|
|
||||||
vp8_inverse_transform_b(rtcd, &x->block[i], 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -13,11 +13,50 @@
|
|||||||
#define __INC_INVTRANS_H
|
#define __INC_INVTRANS_H
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "idct.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
extern void vp8_inverse_transform_b(const vp8_idct_rtcd_vtable_t *rtcd, BLOCKD *b, int pitch);
|
#include "onyxc_int.h"
|
||||||
extern void vp8_inverse_transform_mb(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
|
||||||
extern void vp8_inverse_transform_mby(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
|
||||||
extern void vp8_inverse_transform_mbuv(const vp8_idct_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
|
||||||
|
|
||||||
|
#if CONFIG_MULTITHREAD
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void eob_adjust(char *eobs, short *diff)
|
||||||
|
{
|
||||||
|
/* eob adjust.... the idct can only skip if both the dc and eob are zero */
|
||||||
|
int js;
|
||||||
|
for(js = 0; js < 16; js++)
|
||||||
|
{
|
||||||
|
if((eobs[js] == 0) && (diff[0] != 0))
|
||||||
|
eobs[js]++;
|
||||||
|
diff+=16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vp8_inverse_transform_mby(MACROBLOCKD *xd)
|
||||||
|
{
|
||||||
|
short *DQC = xd->dequant_y1;
|
||||||
|
|
||||||
|
if (xd->mode_info_context->mbmi.mode != SPLITMV)
|
||||||
|
{
|
||||||
|
/* do 2nd order transform on the dc block */
|
||||||
|
if (xd->eobs[24] > 1)
|
||||||
|
{
|
||||||
|
vp8_short_inv_walsh4x4
|
||||||
|
(&xd->block[24].dqcoeff[0], xd->qcoeff);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vp8_short_inv_walsh4x4_1
|
||||||
|
(&xd->block[24].dqcoeff[0], xd->qcoeff);
|
||||||
|
}
|
||||||
|
eob_adjust(xd->eobs, xd->qcoeff);
|
||||||
|
|
||||||
|
DQC = xd->dequant_y1_dc;
|
||||||
|
}
|
||||||
|
vp8_dequant_idct_add_y_block
|
||||||
|
(xd->qcoeff, DQC,
|
||||||
|
xd->dst.y_buffer,
|
||||||
|
xd->dst.y_stride, xd->eobs);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _littlend_h
|
|
||||||
#define _littlend_h
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define invert2(x) (x)
|
|
||||||
#define invert4(x) (x)
|
|
||||||
|
|
||||||
#define low_byte(x) (unsigned char)x
|
|
||||||
#define mid1Byte(x) (unsigned char)(x >> 8)
|
|
||||||
#define mid2Byte(x) (unsigned char)(x >> 16)
|
|
||||||
#define high_byte(x) (unsigned char)(x >> 24)
|
|
||||||
|
|
||||||
#define SWAPENDS 0
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -10,96 +10,13 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_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"
|
||||||
|
|
||||||
typedef unsigned char uc;
|
typedef unsigned char uc;
|
||||||
|
|
||||||
prototype_loopfilter(vp8_loop_filter_horizontal_edge_c);
|
|
||||||
prototype_loopfilter(vp8_loop_filter_vertical_edge_c);
|
|
||||||
prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_c);
|
|
||||||
prototype_loopfilter(vp8_mbloop_filter_vertical_edge_c);
|
|
||||||
|
|
||||||
prototype_simple_loopfilter(vp8_loop_filter_simple_horizontal_edge_c);
|
|
||||||
prototype_simple_loopfilter(vp8_loop_filter_simple_vertical_edge_c);
|
|
||||||
|
|
||||||
/* Horizontal MB filtering */
|
|
||||||
void vp8_loop_filter_mbh_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
|
||||||
unsigned char *v_ptr, int y_stride, int uv_stride,
|
|
||||||
loop_filter_info *lfi)
|
|
||||||
{
|
|
||||||
vp8_mbloop_filter_horizontal_edge_c(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
|
|
||||||
if (u_ptr)
|
|
||||||
vp8_mbloop_filter_horizontal_edge_c(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
|
|
||||||
if (v_ptr)
|
|
||||||
vp8_mbloop_filter_horizontal_edge_c(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Vertical MB Filtering */
|
|
||||||
void vp8_loop_filter_mbv_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
|
||||||
unsigned char *v_ptr, int y_stride, int uv_stride,
|
|
||||||
loop_filter_info *lfi)
|
|
||||||
{
|
|
||||||
vp8_mbloop_filter_vertical_edge_c(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
|
|
||||||
if (u_ptr)
|
|
||||||
vp8_mbloop_filter_vertical_edge_c(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
|
|
||||||
if (v_ptr)
|
|
||||||
vp8_mbloop_filter_vertical_edge_c(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Horizontal B Filtering */
|
|
||||||
void vp8_loop_filter_bh_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
|
||||||
unsigned char *v_ptr, int y_stride, int uv_stride,
|
|
||||||
loop_filter_info *lfi)
|
|
||||||
{
|
|
||||||
vp8_loop_filter_horizontal_edge_c(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
vp8_loop_filter_horizontal_edge_c(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
vp8_loop_filter_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
|
|
||||||
if (u_ptr)
|
|
||||||
vp8_loop_filter_horizontal_edge_c(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
|
|
||||||
if (v_ptr)
|
|
||||||
vp8_loop_filter_horizontal_edge_c(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_loop_filter_bhs_c(unsigned char *y_ptr, int y_stride,
|
|
||||||
const unsigned char *blimit)
|
|
||||||
{
|
|
||||||
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 4 * y_stride, y_stride, blimit);
|
|
||||||
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 8 * y_stride, y_stride, blimit);
|
|
||||||
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, blimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Vertical B Filtering */
|
|
||||||
void vp8_loop_filter_bv_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
|
||||||
unsigned char *v_ptr, int y_stride, int uv_stride,
|
|
||||||
loop_filter_info *lfi)
|
|
||||||
{
|
|
||||||
vp8_loop_filter_vertical_edge_c(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
vp8_loop_filter_vertical_edge_c(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
vp8_loop_filter_vertical_edge_c(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
|
||||||
|
|
||||||
if (u_ptr)
|
|
||||||
vp8_loop_filter_vertical_edge_c(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
|
|
||||||
if (v_ptr)
|
|
||||||
vp8_loop_filter_vertical_edge_c(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_loop_filter_bvs_c(unsigned char *y_ptr, int y_stride,
|
|
||||||
const unsigned char *blimit)
|
|
||||||
{
|
|
||||||
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 4, y_stride, blimit);
|
|
||||||
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 8, y_stride, blimit);
|
|
||||||
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 12, y_stride, blimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lf_init_lut(loop_filter_info_n *lfi)
|
static void lf_init_lut(loop_filter_info_n *lfi)
|
||||||
{
|
{
|
||||||
int filt_lvl;
|
int filt_lvl;
|
||||||
@@ -293,6 +210,8 @@ void vp8_loop_filter_frame
|
|||||||
|
|
||||||
int mb_row;
|
int mb_row;
|
||||||
int mb_col;
|
int mb_col;
|
||||||
|
int mb_rows = cm->mb_rows;
|
||||||
|
int mb_cols = cm->mb_cols;
|
||||||
|
|
||||||
int filter_level;
|
int filter_level;
|
||||||
|
|
||||||
@@ -300,6 +219,8 @@ void vp8_loop_filter_frame
|
|||||||
|
|
||||||
/* Point at base of Mb MODE_INFO list */
|
/* Point at base of Mb MODE_INFO list */
|
||||||
const MODE_INFO *mode_info_context = cm->mi;
|
const MODE_INFO *mode_info_context = cm->mi;
|
||||||
|
int post_y_stride = post->y_stride;
|
||||||
|
int post_uv_stride = post->uv_stride;
|
||||||
|
|
||||||
/* Initialize the loop filter for this frame. */
|
/* Initialize the loop filter for this frame. */
|
||||||
vp8_loop_filter_frame_init(cm, mbd, cm->filter_level);
|
vp8_loop_filter_frame_init(cm, mbd, cm->filter_level);
|
||||||
@@ -310,23 +231,23 @@ void vp8_loop_filter_frame
|
|||||||
v_ptr = post->v_buffer;
|
v_ptr = post->v_buffer;
|
||||||
|
|
||||||
/* vp8_filter each macro block */
|
/* vp8_filter each macro block */
|
||||||
for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
|
if (cm->filter_type == NORMAL_LOOPFILTER)
|
||||||
{
|
{
|
||||||
for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
|
for (mb_row = 0; mb_row < mb_rows; mb_row++)
|
||||||
{
|
{
|
||||||
int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
|
for (mb_col = 0; mb_col < mb_cols; mb_col++)
|
||||||
mode_info_context->mbmi.mode != SPLITMV &&
|
|
||||||
mode_info_context->mbmi.mb_skip_coeff);
|
|
||||||
|
|
||||||
const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
|
|
||||||
const int seg = mode_info_context->mbmi.segment_id;
|
|
||||||
const int ref_frame = mode_info_context->mbmi.ref_frame;
|
|
||||||
|
|
||||||
filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
|
|
||||||
|
|
||||||
if (filter_level)
|
|
||||||
{
|
{
|
||||||
if (cm->filter_type == NORMAL_LOOPFILTER)
|
int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
|
||||||
|
mode_info_context->mbmi.mode != SPLITMV &&
|
||||||
|
mode_info_context->mbmi.mb_skip_coeff);
|
||||||
|
|
||||||
|
const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
|
||||||
|
const int seg = mode_info_context->mbmi.segment_id;
|
||||||
|
const int ref_frame = mode_info_context->mbmi.ref_frame;
|
||||||
|
|
||||||
|
filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
|
||||||
|
|
||||||
|
if (filter_level)
|
||||||
{
|
{
|
||||||
const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
|
const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
|
||||||
lfi.mblim = lfi_n->mblim[filter_level];
|
lfi.mblim = lfi_n->mblim[filter_level];
|
||||||
@@ -335,55 +256,88 @@ void vp8_loop_filter_frame
|
|||||||
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
||||||
|
|
||||||
if (mb_col > 0)
|
if (mb_col > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_v)
|
vp8_loop_filter_mbv
|
||||||
(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi);
|
(y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_v)
|
vp8_loop_filter_bv
|
||||||
(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi);
|
(y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
|
||||||
|
|
||||||
/* don't apply across umv border */
|
/* don't apply across umv border */
|
||||||
if (mb_row > 0)
|
if (mb_row > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_h)
|
vp8_loop_filter_mbh
|
||||||
(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi);
|
(y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_h)
|
vp8_loop_filter_bh
|
||||||
(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi);
|
(y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (mb_col > 0)
|
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_v)
|
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
|
||||||
|
|
||||||
if (!skip_lf)
|
y_ptr += 16;
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_v)
|
u_ptr += 8;
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
v_ptr += 8;
|
||||||
|
|
||||||
/* don't apply across umv border */
|
mode_info_context++; /* step to next MB */
|
||||||
if (mb_row > 0)
|
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_h)
|
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
|
||||||
|
|
||||||
if (!skip_lf)
|
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_h)
|
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
y_ptr += post_y_stride * 16 - post->y_width;
|
||||||
|
u_ptr += post_uv_stride * 8 - post->uv_width;
|
||||||
|
v_ptr += post_uv_stride * 8 - post->uv_width;
|
||||||
|
|
||||||
y_ptr += 16;
|
mode_info_context++; /* Skip border mb */
|
||||||
u_ptr += 8;
|
|
||||||
v_ptr += 8;
|
|
||||||
|
|
||||||
mode_info_context++; /* step to next MB */
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else /* SIMPLE_LOOPFILTER */
|
||||||
|
{
|
||||||
|
for (mb_row = 0; mb_row < mb_rows; mb_row++)
|
||||||
|
{
|
||||||
|
for (mb_col = 0; mb_col < mb_cols; mb_col++)
|
||||||
|
{
|
||||||
|
int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
|
||||||
|
mode_info_context->mbmi.mode != SPLITMV &&
|
||||||
|
mode_info_context->mbmi.mb_skip_coeff);
|
||||||
|
|
||||||
y_ptr += post->y_stride * 16 - post->y_width;
|
const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
|
||||||
u_ptr += post->uv_stride * 8 - post->uv_width;
|
const int seg = mode_info_context->mbmi.segment_id;
|
||||||
v_ptr += post->uv_stride * 8 - post->uv_width;
|
const int ref_frame = mode_info_context->mbmi.ref_frame;
|
||||||
|
|
||||||
mode_info_context++; /* Skip border mb */
|
filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
|
||||||
|
if (filter_level)
|
||||||
|
{
|
||||||
|
const unsigned char * mblim = lfi_n->mblim[filter_level];
|
||||||
|
const unsigned char * blim = lfi_n->blim[filter_level];
|
||||||
|
|
||||||
|
if (mb_col > 0)
|
||||||
|
vp8_loop_filter_simple_mbv
|
||||||
|
(y_ptr, post_y_stride, mblim);
|
||||||
|
|
||||||
|
if (!skip_lf)
|
||||||
|
vp8_loop_filter_simple_bv
|
||||||
|
(y_ptr, post_y_stride, blim);
|
||||||
|
|
||||||
|
/* don't apply across umv border */
|
||||||
|
if (mb_row > 0)
|
||||||
|
vp8_loop_filter_simple_mbh
|
||||||
|
(y_ptr, post_y_stride, mblim);
|
||||||
|
|
||||||
|
if (!skip_lf)
|
||||||
|
vp8_loop_filter_simple_bh
|
||||||
|
(y_ptr, post_y_stride, blim);
|
||||||
|
}
|
||||||
|
|
||||||
|
y_ptr += 16;
|
||||||
|
u_ptr += 8;
|
||||||
|
v_ptr += 8;
|
||||||
|
|
||||||
|
mode_info_context++; /* step to next MB */
|
||||||
|
}
|
||||||
|
y_ptr += post_y_stride * 16 - post->y_width;
|
||||||
|
u_ptr += post_uv_stride * 8 - post->uv_width;
|
||||||
|
v_ptr += post_uv_stride * 8 - post->uv_width;
|
||||||
|
|
||||||
|
mode_info_context++; /* Skip border mb */
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,39 +400,39 @@ void vp8_loop_filter_frame_yonly
|
|||||||
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
||||||
|
|
||||||
if (mb_col > 0)
|
if (mb_col > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_v)
|
vp8_loop_filter_mbv
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_v)
|
vp8_loop_filter_bv
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
/* don't apply across umv border */
|
/* don't apply across umv border */
|
||||||
if (mb_row > 0)
|
if (mb_row > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_h)
|
vp8_loop_filter_mbh
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_h)
|
vp8_loop_filter_bh
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (mb_col > 0)
|
if (mb_col > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_v)
|
vp8_loop_filter_simple_mbv
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_v)
|
vp8_loop_filter_simple_bv
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
||||||
|
|
||||||
/* don't apply across umv border */
|
/* don't apply across umv border */
|
||||||
if (mb_row > 0)
|
if (mb_row > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_h)
|
vp8_loop_filter_simple_mbh
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_h)
|
vp8_loop_filter_simple_bh
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -578,35 +532,35 @@ void vp8_loop_filter_partial_frame
|
|||||||
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
lfi.hev_thr = lfi_n->hev_thr[hev_index];
|
||||||
|
|
||||||
if (mb_col > 0)
|
if (mb_col > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_v)
|
vp8_loop_filter_mbv
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_v)
|
vp8_loop_filter_bv
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_mb_h)
|
vp8_loop_filter_mbh
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, normal_b_h)
|
vp8_loop_filter_bh
|
||||||
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
(y_ptr, 0, 0, post->y_stride, 0, &lfi);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (mb_col > 0)
|
if (mb_col > 0)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_v)
|
vp8_loop_filter_simple_mbv
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_v)
|
vp8_loop_filter_simple_bv
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
||||||
|
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_mb_h)
|
vp8_loop_filter_simple_mbh
|
||||||
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->mblim[filter_level]);
|
||||||
|
|
||||||
if (!skip_lf)
|
if (!skip_lf)
|
||||||
LF_INVOKE(&cm->rtcd.loopfilter, simple_b_h)
|
vp8_loop_filter_simple_bh
|
||||||
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
(y_ptr, post->y_stride, lfi_n->blim[filter_level]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_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 */
|
||||||
@@ -46,7 +47,7 @@ typedef struct
|
|||||||
unsigned char mode_lf_lut[10];
|
unsigned char mode_lf_lut[10];
|
||||||
} loop_filter_info_n;
|
} loop_filter_info_n;
|
||||||
|
|
||||||
typedef struct
|
typedef struct loop_filter_info
|
||||||
{
|
{
|
||||||
const unsigned char * mblim;
|
const unsigned char * mblim;
|
||||||
const unsigned char * blim;
|
const unsigned char * blim;
|
||||||
@@ -55,86 +56,6 @@ typedef struct
|
|||||||
} loop_filter_info;
|
} loop_filter_info;
|
||||||
|
|
||||||
|
|
||||||
#define prototype_loopfilter(sym) \
|
|
||||||
void sym(unsigned char *src, int pitch, const unsigned char *blimit,\
|
|
||||||
const unsigned char *limit, const unsigned char *thresh, int count)
|
|
||||||
|
|
||||||
#define prototype_loopfilter_block(sym) \
|
|
||||||
void sym(unsigned char *y, unsigned char *u, unsigned char *v, \
|
|
||||||
int ystride, int uv_stride, loop_filter_info *lfi)
|
|
||||||
|
|
||||||
#define prototype_simple_loopfilter(sym) \
|
|
||||||
void sym(unsigned char *y, int ystride, const unsigned char *blimit)
|
|
||||||
|
|
||||||
#if ARCH_X86 || ARCH_X86_64
|
|
||||||
#include "x86/loopfilter_x86.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARCH_ARM
|
|
||||||
#include "arm/loopfilter_arm.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef vp8_lf_normal_mb_v
|
|
||||||
#define vp8_lf_normal_mb_v vp8_loop_filter_mbv_c
|
|
||||||
#endif
|
|
||||||
extern prototype_loopfilter_block(vp8_lf_normal_mb_v);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_normal_b_v
|
|
||||||
#define vp8_lf_normal_b_v vp8_loop_filter_bv_c
|
|
||||||
#endif
|
|
||||||
extern prototype_loopfilter_block(vp8_lf_normal_b_v);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_normal_mb_h
|
|
||||||
#define vp8_lf_normal_mb_h vp8_loop_filter_mbh_c
|
|
||||||
#endif
|
|
||||||
extern prototype_loopfilter_block(vp8_lf_normal_mb_h);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_normal_b_h
|
|
||||||
#define vp8_lf_normal_b_h vp8_loop_filter_bh_c
|
|
||||||
#endif
|
|
||||||
extern prototype_loopfilter_block(vp8_lf_normal_b_h);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_simple_mb_v
|
|
||||||
#define vp8_lf_simple_mb_v vp8_loop_filter_simple_vertical_edge_c
|
|
||||||
#endif
|
|
||||||
extern prototype_simple_loopfilter(vp8_lf_simple_mb_v);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_simple_b_v
|
|
||||||
#define vp8_lf_simple_b_v vp8_loop_filter_bvs_c
|
|
||||||
#endif
|
|
||||||
extern prototype_simple_loopfilter(vp8_lf_simple_b_v);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_simple_mb_h
|
|
||||||
#define vp8_lf_simple_mb_h vp8_loop_filter_simple_horizontal_edge_c
|
|
||||||
#endif
|
|
||||||
extern prototype_simple_loopfilter(vp8_lf_simple_mb_h);
|
|
||||||
|
|
||||||
#ifndef vp8_lf_simple_b_h
|
|
||||||
#define vp8_lf_simple_b_h vp8_loop_filter_bhs_c
|
|
||||||
#endif
|
|
||||||
extern prototype_simple_loopfilter(vp8_lf_simple_b_h);
|
|
||||||
|
|
||||||
typedef prototype_loopfilter_block((*vp8_lf_block_fn_t));
|
|
||||||
typedef prototype_simple_loopfilter((*vp8_slf_block_fn_t));
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vp8_lf_block_fn_t normal_mb_v;
|
|
||||||
vp8_lf_block_fn_t normal_b_v;
|
|
||||||
vp8_lf_block_fn_t normal_mb_h;
|
|
||||||
vp8_lf_block_fn_t normal_b_h;
|
|
||||||
vp8_slf_block_fn_t simple_mb_v;
|
|
||||||
vp8_slf_block_fn_t simple_b_v;
|
|
||||||
vp8_slf_block_fn_t simple_mb_h;
|
|
||||||
vp8_slf_block_fn_t simple_b_h;
|
|
||||||
} vp8_loopfilter_rtcd_vtable_t;
|
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#define LF_INVOKE(ctx,fn) (ctx)->fn
|
|
||||||
#else
|
|
||||||
#define LF_INVOKE(ctx,fn) vp8_lf_##fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void loop_filter_uvfunction
|
typedef void loop_filter_uvfunction
|
||||||
(
|
(
|
||||||
unsigned char *u, /* source pointer */
|
unsigned char *u, /* source pointer */
|
||||||
@@ -147,22 +68,22 @@ typedef void loop_filter_uvfunction
|
|||||||
|
|
||||||
/* assorted loopfilter functions which get used elsewhere */
|
/* assorted loopfilter functions which get used elsewhere */
|
||||||
struct VP8Common;
|
struct VP8Common;
|
||||||
struct MacroBlockD;
|
struct macroblockd;
|
||||||
|
|
||||||
void vp8_loop_filter_init(struct VP8Common *cm);
|
void vp8_loop_filter_init(struct VP8Common *cm);
|
||||||
|
|
||||||
void vp8_loop_filter_frame_init(struct VP8Common *cm,
|
void vp8_loop_filter_frame_init(struct VP8Common *cm,
|
||||||
struct MacroBlockD *mbd,
|
struct macroblockd *mbd,
|
||||||
int default_filt_lvl);
|
int default_filt_lvl);
|
||||||
|
|
||||||
void vp8_loop_filter_frame(struct VP8Common *cm, struct MacroBlockD *mbd);
|
void vp8_loop_filter_frame(struct VP8Common *cm, struct macroblockd *mbd);
|
||||||
|
|
||||||
void vp8_loop_filter_partial_frame(struct VP8Common *cm,
|
void vp8_loop_filter_partial_frame(struct VP8Common *cm,
|
||||||
struct MacroBlockD *mbd,
|
struct macroblockd *mbd,
|
||||||
int default_filt_lvl);
|
int default_filt_lvl);
|
||||||
|
|
||||||
void vp8_loop_filter_frame_yonly(struct VP8Common *cm,
|
void vp8_loop_filter_frame_yonly(struct VP8Common *cm,
|
||||||
struct MacroBlockD *mbd,
|
struct macroblockd *mbd,
|
||||||
int default_filt_lvl);
|
int default_filt_lvl);
|
||||||
|
|
||||||
void vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi,
|
void vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi,
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
typedef unsigned char uc;
|
typedef unsigned char uc;
|
||||||
|
|
||||||
static __inline signed char vp8_signed_char_clamp(int t)
|
static signed char vp8_signed_char_clamp(int t)
|
||||||
{
|
{
|
||||||
t = (t < -128 ? -128 : t);
|
t = (t < -128 ? -128 : t);
|
||||||
t = (t > 127 ? 127 : t);
|
t = (t > 127 ? 127 : t);
|
||||||
@@ -24,9 +24,9 @@ static __inline signed char vp8_signed_char_clamp(int t)
|
|||||||
|
|
||||||
|
|
||||||
/* should we apply any filter at all ( 11111111 yes, 00000000 no) */
|
/* should we apply any filter at all ( 11111111 yes, 00000000 no) */
|
||||||
static __inline signed char vp8_filter_mask(uc limit, uc blimit,
|
static signed char vp8_filter_mask(uc limit, uc blimit,
|
||||||
uc p3, uc p2, uc p1, uc p0,
|
uc p3, uc p2, uc p1, uc p0,
|
||||||
uc q0, uc q1, uc q2, uc q3)
|
uc q0, uc q1, uc q2, uc q3)
|
||||||
{
|
{
|
||||||
signed char mask = 0;
|
signed char mask = 0;
|
||||||
mask |= (abs(p3 - p2) > limit);
|
mask |= (abs(p3 - p2) > limit);
|
||||||
@@ -40,7 +40,7 @@ static __inline signed char vp8_filter_mask(uc limit, uc blimit,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* is there high variance internal edge ( 11111111 yes, 00000000 no) */
|
/* is there high variance internal edge ( 11111111 yes, 00000000 no) */
|
||||||
static __inline signed char vp8_hevmask(uc thresh, uc p1, uc p0, uc q0, uc q1)
|
static signed char vp8_hevmask(uc thresh, uc p1, uc p0, uc q0, uc q1)
|
||||||
{
|
{
|
||||||
signed char hev = 0;
|
signed char hev = 0;
|
||||||
hev |= (abs(p1 - p0) > thresh) * -1;
|
hev |= (abs(p1 - p0) > thresh) * -1;
|
||||||
@@ -48,7 +48,7 @@ static __inline signed char vp8_hevmask(uc thresh, uc p1, uc p0, uc q0, uc q1)
|
|||||||
return hev;
|
return hev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void vp8_filter(signed char mask, uc hev, uc *op1,
|
static void vp8_filter(signed char mask, uc hev, uc *op1,
|
||||||
uc *op0, uc *oq0, uc *oq1)
|
uc *op0, uc *oq0, uc *oq1)
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -158,7 +158,7 @@ void vp8_loop_filter_vertical_edge_c
|
|||||||
while (++i < count * 8);
|
while (++i < count * 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void vp8_mbfilter(signed char mask, uc hev,
|
static void vp8_mbfilter(signed char mask, uc hev,
|
||||||
uc *op2, uc *op1, uc *op0, uc *oq0, uc *oq1, uc *oq2)
|
uc *op2, uc *op1, uc *op0, uc *oq0, uc *oq1, uc *oq2)
|
||||||
{
|
{
|
||||||
signed char s, u;
|
signed char s, u;
|
||||||
@@ -279,7 +279,7 @@ void vp8_mbloop_filter_vertical_edge_c
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* should we apply any filter at all ( 11111111 yes, 00000000 no) */
|
/* should we apply any filter at all ( 11111111 yes, 00000000 no) */
|
||||||
static __inline signed char vp8_simple_filter_mask(uc blimit, uc p1, uc p0, uc q0, uc q1)
|
static signed char vp8_simple_filter_mask(uc blimit, uc p1, uc p0, uc q0, uc q1)
|
||||||
{
|
{
|
||||||
/* Why does this cause problems for win32?
|
/* Why does this cause problems for win32?
|
||||||
* error C2143: syntax error : missing ';' before 'type'
|
* error C2143: syntax error : missing ';' before 'type'
|
||||||
@@ -289,7 +289,7 @@ static __inline signed char vp8_simple_filter_mask(uc blimit, uc p1, uc p0, uc q
|
|||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void vp8_simple_filter(signed char mask, uc *op1, uc *op0, uc *oq0, uc *oq1)
|
static void vp8_simple_filter(signed char mask, uc *op1, uc *op0, uc *oq0, uc *oq1)
|
||||||
{
|
{
|
||||||
signed char vp8_filter, Filter1, Filter2;
|
signed char vp8_filter, Filter1, Filter2;
|
||||||
signed char p1 = (signed char) * op1 ^ 0x80;
|
signed char p1 = (signed char) * op1 ^ 0x80;
|
||||||
@@ -352,3 +352,79 @@ void vp8_loop_filter_simple_vertical_edge_c
|
|||||||
while (++i < 16);
|
while (++i < 16);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Horizontal MB filtering */
|
||||||
|
void vp8_loop_filter_mbh_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
||||||
|
unsigned char *v_ptr, int y_stride, int uv_stride,
|
||||||
|
loop_filter_info *lfi)
|
||||||
|
{
|
||||||
|
vp8_mbloop_filter_horizontal_edge_c(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
|
||||||
|
if (u_ptr)
|
||||||
|
vp8_mbloop_filter_horizontal_edge_c(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
|
||||||
|
if (v_ptr)
|
||||||
|
vp8_mbloop_filter_horizontal_edge_c(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertical MB Filtering */
|
||||||
|
void vp8_loop_filter_mbv_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
||||||
|
unsigned char *v_ptr, int y_stride, int uv_stride,
|
||||||
|
loop_filter_info *lfi)
|
||||||
|
{
|
||||||
|
vp8_mbloop_filter_vertical_edge_c(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
|
||||||
|
if (u_ptr)
|
||||||
|
vp8_mbloop_filter_vertical_edge_c(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
|
||||||
|
if (v_ptr)
|
||||||
|
vp8_mbloop_filter_vertical_edge_c(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Horizontal B Filtering */
|
||||||
|
void vp8_loop_filter_bh_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
||||||
|
unsigned char *v_ptr, int y_stride, int uv_stride,
|
||||||
|
loop_filter_info *lfi)
|
||||||
|
{
|
||||||
|
vp8_loop_filter_horizontal_edge_c(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
vp8_loop_filter_horizontal_edge_c(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
vp8_loop_filter_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
|
||||||
|
if (u_ptr)
|
||||||
|
vp8_loop_filter_horizontal_edge_c(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
|
||||||
|
if (v_ptr)
|
||||||
|
vp8_loop_filter_horizontal_edge_c(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_loop_filter_bhs_c(unsigned char *y_ptr, int y_stride,
|
||||||
|
const unsigned char *blimit)
|
||||||
|
{
|
||||||
|
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 4 * y_stride, y_stride, blimit);
|
||||||
|
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 8 * y_stride, y_stride, blimit);
|
||||||
|
vp8_loop_filter_simple_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, blimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertical B Filtering */
|
||||||
|
void vp8_loop_filter_bv_c(unsigned char *y_ptr, unsigned char *u_ptr,
|
||||||
|
unsigned char *v_ptr, int y_stride, int uv_stride,
|
||||||
|
loop_filter_info *lfi)
|
||||||
|
{
|
||||||
|
vp8_loop_filter_vertical_edge_c(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
vp8_loop_filter_vertical_edge_c(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
vp8_loop_filter_vertical_edge_c(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
||||||
|
|
||||||
|
if (u_ptr)
|
||||||
|
vp8_loop_filter_vertical_edge_c(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
|
||||||
|
if (v_ptr)
|
||||||
|
vp8_loop_filter_vertical_edge_c(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_loop_filter_bvs_c(unsigned char *y_ptr, int y_stride,
|
||||||
|
const unsigned char *blimit)
|
||||||
|
{
|
||||||
|
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 4, y_stride, blimit);
|
||||||
|
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 8, y_stride, blimit);
|
||||||
|
vp8_loop_filter_simple_vertical_edge_c(y_ptr + 12, y_stride, blimit);
|
||||||
|
}
|
||||||
|
@@ -11,74 +11,6 @@
|
|||||||
|
|
||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
PRED = 0,
|
|
||||||
DEST = 1
|
|
||||||
} BLOCKSET;
|
|
||||||
|
|
||||||
static void setup_block
|
|
||||||
(
|
|
||||||
BLOCKD *b,
|
|
||||||
int mv_stride,
|
|
||||||
unsigned char **base,
|
|
||||||
int Stride,
|
|
||||||
int offset,
|
|
||||||
BLOCKSET bs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (bs == DEST)
|
|
||||||
{
|
|
||||||
b->dst_stride = Stride;
|
|
||||||
b->dst = offset;
|
|
||||||
b->base_dst = base;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
b->pre_stride = Stride;
|
|
||||||
b->pre = offset;
|
|
||||||
b->base_pre = base;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void setup_macroblock(MACROBLOCKD *x, BLOCKSET bs)
|
|
||||||
{
|
|
||||||
int block;
|
|
||||||
|
|
||||||
unsigned char **y, **u, **v;
|
|
||||||
|
|
||||||
if (bs == DEST)
|
|
||||||
{
|
|
||||||
y = &x->dst.y_buffer;
|
|
||||||
u = &x->dst.u_buffer;
|
|
||||||
v = &x->dst.v_buffer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
y = &x->pre.y_buffer;
|
|
||||||
u = &x->pre.u_buffer;
|
|
||||||
v = &x->pre.v_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (block = 0; block < 16; block++) /* y blocks */
|
|
||||||
{
|
|
||||||
setup_block(&x->block[block], x->dst.y_stride, y, x->dst.y_stride,
|
|
||||||
(block >> 2) * 4 * x->dst.y_stride + (block & 3) * 4, bs);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (block = 16; block < 20; block++) /* U and V blocks */
|
|
||||||
{
|
|
||||||
setup_block(&x->block[block], x->dst.uv_stride, u, x->dst.uv_stride,
|
|
||||||
((block - 16) >> 1) * 4 * x->dst.uv_stride + (block & 1) * 4, bs);
|
|
||||||
|
|
||||||
setup_block(&x->block[block+4], x->dst.uv_stride, v, x->dst.uv_stride,
|
|
||||||
((block - 16) >> 1) * 4 * x->dst.uv_stride + (block & 1) * 4, bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
||||||
{
|
{
|
||||||
int r, c;
|
int r, c;
|
||||||
@@ -87,7 +19,6 @@ void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
for (c = 0; c < 4; c++)
|
for (c = 0; c < 4; c++)
|
||||||
{
|
{
|
||||||
x->block[r*4+c].diff = &x->diff[r * 4 * 16 + c * 4];
|
|
||||||
x->block[r*4+c].predictor = x->predictor + r * 4 * 16 + c * 4;
|
x->block[r*4+c].predictor = x->predictor + r * 4 * 16 + c * 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,7 +27,6 @@ void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
for (c = 0; c < 2; c++)
|
for (c = 0; c < 2; c++)
|
||||||
{
|
{
|
||||||
x->block[16+r*2+c].diff = &x->diff[256 + r * 4 * 8 + c * 4];
|
|
||||||
x->block[16+r*2+c].predictor = x->predictor + 256 + r * 4 * 8 + c * 4;
|
x->block[16+r*2+c].predictor = x->predictor + 256 + r * 4 * 8 + c * 4;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -106,14 +36,11 @@ void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
for (c = 0; c < 2; c++)
|
for (c = 0; c < 2; c++)
|
||||||
{
|
{
|
||||||
x->block[20+r*2+c].diff = &x->diff[320+ r * 4 * 8 + c * 4];
|
|
||||||
x->block[20+r*2+c].predictor = x->predictor + 320 + r * 4 * 8 + c * 4;
|
x->block[20+r*2+c].predictor = x->predictor + 320 + r * 4 * 8 + c * 4;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x->block[24].diff = &x->diff[384];
|
|
||||||
|
|
||||||
for (r = 0; r < 25; r++)
|
for (r = 0; r < 25; r++)
|
||||||
{
|
{
|
||||||
x->block[r].qcoeff = x->qcoeff + r * 16;
|
x->block[r].qcoeff = x->qcoeff + r * 16;
|
||||||
@@ -124,8 +51,18 @@ void vp8_setup_block_dptrs(MACROBLOCKD *x)
|
|||||||
|
|
||||||
void vp8_build_block_doffsets(MACROBLOCKD *x)
|
void vp8_build_block_doffsets(MACROBLOCKD *x)
|
||||||
{
|
{
|
||||||
|
int block;
|
||||||
|
|
||||||
/* handle the destination pitch features */
|
for (block = 0; block < 16; block++) /* y blocks */
|
||||||
setup_macroblock(x, DEST);
|
{
|
||||||
setup_macroblock(x, PRED);
|
x->block[block].offset =
|
||||||
|
(block >> 2) * 4 * x->dst.y_stride + (block & 3) * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (block = 16; block < 20; block++) /* U and V blocks */
|
||||||
|
{
|
||||||
|
x->block[block+4].offset =
|
||||||
|
x->block[block].offset =
|
||||||
|
((block - 16) >> 1) * 4 * x->dst.uv_stride + (block & 1) * 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
385
vp8/common/mfqe.c
Normal file
385
vp8/common/mfqe.c
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* MFQE: Multiframe Quality Enhancement
|
||||||
|
* In rate limited situations keyframes may cause significant visual artifacts
|
||||||
|
* commonly referred to as "popping." This file implements a postproccesing
|
||||||
|
* algorithm which blends data from the preceeding frame when there is no
|
||||||
|
* motion and the q from the previous frame is lower which indicates that it is
|
||||||
|
* higher quality.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "postproc.h"
|
||||||
|
#include "variance.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
#include "vpx_scale/yv12config.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static void filter_by_weight(unsigned char *src, int src_stride,
|
||||||
|
unsigned char *dst, int dst_stride,
|
||||||
|
int block_size, int src_weight)
|
||||||
|
{
|
||||||
|
int dst_weight = (1 << MFQE_PRECISION) - src_weight;
|
||||||
|
int rounding_bit = 1 << (MFQE_PRECISION - 1);
|
||||||
|
int r, c;
|
||||||
|
|
||||||
|
for (r = 0; r < block_size; r++)
|
||||||
|
{
|
||||||
|
for (c = 0; c < block_size; c++)
|
||||||
|
{
|
||||||
|
dst[c] = (src[c] * src_weight +
|
||||||
|
dst[c] * dst_weight +
|
||||||
|
rounding_bit) >> MFQE_PRECISION;
|
||||||
|
}
|
||||||
|
src += src_stride;
|
||||||
|
dst += dst_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_filter_by_weight16x16_c(unsigned char *src, int src_stride,
|
||||||
|
unsigned char *dst, int dst_stride,
|
||||||
|
int src_weight)
|
||||||
|
{
|
||||||
|
filter_by_weight(src, src_stride, dst, dst_stride, 16, src_weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_filter_by_weight8x8_c(unsigned char *src, int src_stride,
|
||||||
|
unsigned char *dst, int dst_stride,
|
||||||
|
int src_weight)
|
||||||
|
{
|
||||||
|
filter_by_weight(src, src_stride, dst, dst_stride, 8, src_weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_filter_by_weight4x4_c(unsigned char *src, int src_stride,
|
||||||
|
unsigned char *dst, int dst_stride,
|
||||||
|
int src_weight)
|
||||||
|
{
|
||||||
|
filter_by_weight(src, src_stride, dst, dst_stride, 4, src_weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void apply_ifactor(unsigned char *y_src,
|
||||||
|
int y_src_stride,
|
||||||
|
unsigned char *y_dst,
|
||||||
|
int y_dst_stride,
|
||||||
|
unsigned char *u_src,
|
||||||
|
unsigned char *v_src,
|
||||||
|
int uv_src_stride,
|
||||||
|
unsigned char *u_dst,
|
||||||
|
unsigned char *v_dst,
|
||||||
|
int uv_dst_stride,
|
||||||
|
int block_size,
|
||||||
|
int src_weight)
|
||||||
|
{
|
||||||
|
if (block_size == 16)
|
||||||
|
{
|
||||||
|
vp8_filter_by_weight16x16(y_src, y_src_stride, y_dst, y_dst_stride, src_weight);
|
||||||
|
vp8_filter_by_weight8x8(u_src, uv_src_stride, u_dst, uv_dst_stride, src_weight);
|
||||||
|
vp8_filter_by_weight8x8(v_src, uv_src_stride, v_dst, uv_dst_stride, src_weight);
|
||||||
|
}
|
||||||
|
else /* if (block_size == 8) */
|
||||||
|
{
|
||||||
|
vp8_filter_by_weight8x8(y_src, y_src_stride, y_dst, y_dst_stride, src_weight);
|
||||||
|
vp8_filter_by_weight4x4(u_src, uv_src_stride, u_dst, uv_dst_stride, src_weight);
|
||||||
|
vp8_filter_by_weight4x4(v_src, uv_src_stride, v_dst, uv_dst_stride, src_weight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int int_sqrt(unsigned int x)
|
||||||
|
{
|
||||||
|
unsigned int y = x;
|
||||||
|
unsigned int guess;
|
||||||
|
int p = 1;
|
||||||
|
while (y>>=1) p++;
|
||||||
|
p>>=1;
|
||||||
|
|
||||||
|
guess=0;
|
||||||
|
while (p>=0)
|
||||||
|
{
|
||||||
|
guess |= (1<<p);
|
||||||
|
if (x<guess*guess)
|
||||||
|
guess -= (1<<p);
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
/* choose between guess or guess+1 */
|
||||||
|
return guess+(guess*guess+guess+1<=x);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define USE_SSD
|
||||||
|
static void multiframe_quality_enhance_block
|
||||||
|
(
|
||||||
|
int blksize, /* Currently only values supported are 16, 8 */
|
||||||
|
int qcurr,
|
||||||
|
int qprev,
|
||||||
|
unsigned char *y,
|
||||||
|
unsigned char *u,
|
||||||
|
unsigned char *v,
|
||||||
|
int y_stride,
|
||||||
|
int uv_stride,
|
||||||
|
unsigned char *yd,
|
||||||
|
unsigned char *ud,
|
||||||
|
unsigned char *vd,
|
||||||
|
int yd_stride,
|
||||||
|
int uvd_stride
|
||||||
|
)
|
||||||
|
{
|
||||||
|
static const unsigned char VP8_ZEROS[16]=
|
||||||
|
{
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
};
|
||||||
|
int uvblksize = blksize >> 1;
|
||||||
|
int qdiff = qcurr - qprev;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
unsigned char *up;
|
||||||
|
unsigned char *udp;
|
||||||
|
unsigned char *vp;
|
||||||
|
unsigned char *vdp;
|
||||||
|
|
||||||
|
unsigned int act, actd, sad, usad, vsad, sse, thr, thrsq, actrisk;
|
||||||
|
|
||||||
|
if (blksize == 16)
|
||||||
|
{
|
||||||
|
actd = (vp8_variance16x16(yd, yd_stride, VP8_ZEROS, 0, &sse)+128)>>8;
|
||||||
|
act = (vp8_variance16x16(y, y_stride, VP8_ZEROS, 0, &sse)+128)>>8;
|
||||||
|
#ifdef USE_SSD
|
||||||
|
sad = (vp8_variance16x16(y, y_stride, yd, yd_stride, &sse));
|
||||||
|
sad = (sse + 128)>>8;
|
||||||
|
usad = (vp8_variance8x8(u, uv_stride, ud, uvd_stride, &sse));
|
||||||
|
usad = (sse + 32)>>6;
|
||||||
|
vsad = (vp8_variance8x8(v, uv_stride, vd, uvd_stride, &sse));
|
||||||
|
vsad = (sse + 32)>>6;
|
||||||
|
#else
|
||||||
|
sad = (vp8_sad16x16(y, y_stride, yd, yd_stride, INT_MAX)+128)>>8;
|
||||||
|
usad = (vp8_sad8x8(u, uv_stride, ud, uvd_stride, INT_MAX)+32)>>6;
|
||||||
|
vsad = (vp8_sad8x8(v, uv_stride, vd, uvd_stride, INT_MAX)+32)>>6;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else /* if (blksize == 8) */
|
||||||
|
{
|
||||||
|
actd = (vp8_variance8x8(yd, yd_stride, VP8_ZEROS, 0, &sse)+32)>>6;
|
||||||
|
act = (vp8_variance8x8(y, y_stride, VP8_ZEROS, 0, &sse)+32)>>6;
|
||||||
|
#ifdef USE_SSD
|
||||||
|
sad = (vp8_variance8x8(y, y_stride, yd, yd_stride, &sse));
|
||||||
|
sad = (sse + 32)>>6;
|
||||||
|
usad = (vp8_variance4x4(u, uv_stride, ud, uvd_stride, &sse));
|
||||||
|
usad = (sse + 8)>>4;
|
||||||
|
vsad = (vp8_variance4x4(v, uv_stride, vd, uvd_stride, &sse));
|
||||||
|
vsad = (sse + 8)>>4;
|
||||||
|
#else
|
||||||
|
sad = (vp8_sad8x8(y, y_stride, yd, yd_stride, INT_MAX)+32)>>6;
|
||||||
|
usad = (vp8_sad4x4(u, uv_stride, ud, uvd_stride, INT_MAX)+8)>>4;
|
||||||
|
vsad = (vp8_sad4x4(v, uv_stride, vd, uvd_stride, INT_MAX)+8)>>4;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
actrisk = (actd > act * 5);
|
||||||
|
|
||||||
|
/* thr = qdiff/8 + log2(act) + log4(qprev) */
|
||||||
|
thr = (qdiff >> 3);
|
||||||
|
while (actd >>= 1) thr++;
|
||||||
|
while (qprev >>= 2) thr++;
|
||||||
|
|
||||||
|
#ifdef USE_SSD
|
||||||
|
thrsq = thr * thr;
|
||||||
|
if (sad < thrsq &&
|
||||||
|
/* additional checks for color mismatch and excessive addition of
|
||||||
|
* high-frequencies */
|
||||||
|
4 * usad < thrsq && 4 * vsad < thrsq && !actrisk)
|
||||||
|
#else
|
||||||
|
if (sad < thr &&
|
||||||
|
/* additional checks for color mismatch and excessive addition of
|
||||||
|
* high-frequencies */
|
||||||
|
2 * usad < thr && 2 * vsad < thr && !actrisk)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int ifactor;
|
||||||
|
#ifdef USE_SSD
|
||||||
|
/* TODO: optimize this later to not need sqr root */
|
||||||
|
sad = int_sqrt(sad);
|
||||||
|
#endif
|
||||||
|
ifactor = (sad << MFQE_PRECISION) / thr;
|
||||||
|
ifactor >>= (qdiff >> 5);
|
||||||
|
|
||||||
|
if (ifactor)
|
||||||
|
{
|
||||||
|
apply_ifactor(y, y_stride, yd, yd_stride,
|
||||||
|
u, v, uv_stride,
|
||||||
|
ud, vd, uvd_stride,
|
||||||
|
blksize, ifactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* else implicitly copy from previous frame */
|
||||||
|
{
|
||||||
|
if (blksize == 16)
|
||||||
|
{
|
||||||
|
vp8_copy_mem16x16(y, y_stride, yd, yd_stride);
|
||||||
|
vp8_copy_mem8x8(u, uv_stride, ud, uvd_stride);
|
||||||
|
vp8_copy_mem8x8(v, uv_stride, vd, uvd_stride);
|
||||||
|
}
|
||||||
|
else /* if (blksize == 8) */
|
||||||
|
{
|
||||||
|
vp8_copy_mem8x8(y, y_stride, yd, yd_stride);
|
||||||
|
for (up = u, udp = ud, i = 0; i < uvblksize; ++i, up += uv_stride, udp += uvd_stride)
|
||||||
|
vpx_memcpy(udp, up, uvblksize);
|
||||||
|
for (vp = v, vdp = vd, i = 0; i < uvblksize; ++i, vp += uv_stride, vdp += uvd_stride)
|
||||||
|
vpx_memcpy(vdp, vp, uvblksize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int qualify_inter_mb(const MODE_INFO *mode_info_context, int *map)
|
||||||
|
{
|
||||||
|
if (mode_info_context->mbmi.mb_skip_coeff)
|
||||||
|
map[0] = map[1] = map[2] = map[3] = 1;
|
||||||
|
else if (mode_info_context->mbmi.mode==SPLITMV)
|
||||||
|
{
|
||||||
|
static int ndx[4][4] =
|
||||||
|
{
|
||||||
|
{0, 1, 4, 5},
|
||||||
|
{2, 3, 6, 7},
|
||||||
|
{8, 9, 12, 13},
|
||||||
|
{10, 11, 14, 15}
|
||||||
|
};
|
||||||
|
int i, j;
|
||||||
|
for (i=0; i<4; ++i)
|
||||||
|
{
|
||||||
|
map[i] = 1;
|
||||||
|
for (j=0; j<4 && map[j]; ++j)
|
||||||
|
map[i] &= (mode_info_context->bmi[ndx[i][j]].mv.as_mv.row <= 2 &&
|
||||||
|
mode_info_context->bmi[ndx[i][j]].mv.as_mv.col <= 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
map[0] = map[1] = map[2] = map[3] =
|
||||||
|
(mode_info_context->mbmi.mode > B_PRED &&
|
||||||
|
abs(mode_info_context->mbmi.mv.as_mv.row) <= 2 &&
|
||||||
|
abs(mode_info_context->mbmi.mv.as_mv.col) <= 2);
|
||||||
|
}
|
||||||
|
return (map[0]+map[1]+map[2]+map[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_multiframe_quality_enhance
|
||||||
|
(
|
||||||
|
VP8_COMMON *cm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
YV12_BUFFER_CONFIG *show = cm->frame_to_show;
|
||||||
|
YV12_BUFFER_CONFIG *dest = &cm->post_proc_buffer;
|
||||||
|
|
||||||
|
FRAME_TYPE frame_type = cm->frame_type;
|
||||||
|
/* Point at base of Mb MODE_INFO list has motion vectors etc */
|
||||||
|
const MODE_INFO *mode_info_context = cm->mi;
|
||||||
|
int mb_row;
|
||||||
|
int mb_col;
|
||||||
|
int totmap, map[4];
|
||||||
|
int qcurr = cm->base_qindex;
|
||||||
|
int qprev = cm->postproc_state.last_base_qindex;
|
||||||
|
|
||||||
|
unsigned char *y_ptr, *u_ptr, *v_ptr;
|
||||||
|
unsigned char *yd_ptr, *ud_ptr, *vd_ptr;
|
||||||
|
|
||||||
|
/* Set up the buffer pointers */
|
||||||
|
y_ptr = show->y_buffer;
|
||||||
|
u_ptr = show->u_buffer;
|
||||||
|
v_ptr = show->v_buffer;
|
||||||
|
yd_ptr = dest->y_buffer;
|
||||||
|
ud_ptr = dest->u_buffer;
|
||||||
|
vd_ptr = dest->v_buffer;
|
||||||
|
|
||||||
|
/* postprocess each macro block */
|
||||||
|
for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
|
||||||
|
{
|
||||||
|
for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
|
||||||
|
{
|
||||||
|
/* if motion is high there will likely be no benefit */
|
||||||
|
if (frame_type == INTER_FRAME) totmap = qualify_inter_mb(mode_info_context, map);
|
||||||
|
else totmap = (frame_type == KEY_FRAME ? 4 : 0);
|
||||||
|
if (totmap)
|
||||||
|
{
|
||||||
|
if (totmap < 4)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for (i=0; i<2; ++i)
|
||||||
|
for (j=0; j<2; ++j)
|
||||||
|
{
|
||||||
|
if (map[i*2+j])
|
||||||
|
{
|
||||||
|
multiframe_quality_enhance_block(8, qcurr, qprev,
|
||||||
|
y_ptr + 8*(i*show->y_stride+j),
|
||||||
|
u_ptr + 4*(i*show->uv_stride+j),
|
||||||
|
v_ptr + 4*(i*show->uv_stride+j),
|
||||||
|
show->y_stride,
|
||||||
|
show->uv_stride,
|
||||||
|
yd_ptr + 8*(i*dest->y_stride+j),
|
||||||
|
ud_ptr + 4*(i*dest->uv_stride+j),
|
||||||
|
vd_ptr + 4*(i*dest->uv_stride+j),
|
||||||
|
dest->y_stride,
|
||||||
|
dest->uv_stride);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* copy a 8x8 block */
|
||||||
|
int k;
|
||||||
|
unsigned char *up = u_ptr + 4*(i*show->uv_stride+j);
|
||||||
|
unsigned char *udp = ud_ptr + 4*(i*dest->uv_stride+j);
|
||||||
|
unsigned char *vp = v_ptr + 4*(i*show->uv_stride+j);
|
||||||
|
unsigned char *vdp = vd_ptr + 4*(i*dest->uv_stride+j);
|
||||||
|
vp8_copy_mem8x8(y_ptr + 8*(i*show->y_stride+j), show->y_stride,
|
||||||
|
yd_ptr + 8*(i*dest->y_stride+j), dest->y_stride);
|
||||||
|
for (k = 0; k < 4; ++k, up += show->uv_stride, udp += dest->uv_stride,
|
||||||
|
vp += show->uv_stride, vdp += dest->uv_stride)
|
||||||
|
{
|
||||||
|
vpx_memcpy(udp, up, 4);
|
||||||
|
vpx_memcpy(vdp, vp, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* totmap = 4 */
|
||||||
|
{
|
||||||
|
multiframe_quality_enhance_block(16, qcurr, qprev, y_ptr,
|
||||||
|
u_ptr, v_ptr,
|
||||||
|
show->y_stride,
|
||||||
|
show->uv_stride,
|
||||||
|
yd_ptr, ud_ptr, vd_ptr,
|
||||||
|
dest->y_stride,
|
||||||
|
dest->uv_stride);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vp8_copy_mem16x16(y_ptr, show->y_stride, yd_ptr, dest->y_stride);
|
||||||
|
vp8_copy_mem8x8(u_ptr, show->uv_stride, ud_ptr, dest->uv_stride);
|
||||||
|
vp8_copy_mem8x8(v_ptr, show->uv_stride, vd_ptr, dest->uv_stride);
|
||||||
|
}
|
||||||
|
y_ptr += 16;
|
||||||
|
u_ptr += 8;
|
||||||
|
v_ptr += 8;
|
||||||
|
yd_ptr += 16;
|
||||||
|
ud_ptr += 8;
|
||||||
|
vd_ptr += 8;
|
||||||
|
mode_info_context++; /* step to next MB */
|
||||||
|
}
|
||||||
|
|
||||||
|
y_ptr += show->y_stride * 16 - 16 * cm->mb_cols;
|
||||||
|
u_ptr += show->uv_stride * 8 - 8 * cm->mb_cols;
|
||||||
|
v_ptr += show->uv_stride * 8 - 8 * cm->mb_cols;
|
||||||
|
yd_ptr += dest->y_stride * 16 - 16 * cm->mb_cols;
|
||||||
|
ud_ptr += dest->uv_stride * 8 - 8 * cm->mb_cols;
|
||||||
|
vd_ptr += dest->uv_stride * 8 - 8 * cm->mb_cols;
|
||||||
|
|
||||||
|
mode_info_context++; /* Skip border mb */
|
||||||
|
}
|
||||||
|
}
|
@@ -1,146 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "entropymode.h"
|
|
||||||
|
|
||||||
const unsigned int vp8_kf_default_bmode_counts [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
/*Above Mode : 0*/
|
|
||||||
{ 43438, 2195, 470, 316, 615, 171, 217, 412, 124, 160, }, /* left_mode 0 */
|
|
||||||
{ 5722, 2751, 296, 291, 81, 68, 80, 101, 100, 170, }, /* left_mode 1 */
|
|
||||||
{ 1629, 201, 307, 25, 47, 16, 34, 72, 19, 28, }, /* left_mode 2 */
|
|
||||||
{ 332, 266, 36, 500, 20, 65, 23, 14, 154, 106, }, /* left_mode 3 */
|
|
||||||
{ 450, 97, 10, 24, 117, 10, 2, 12, 8, 71, }, /* left_mode 4 */
|
|
||||||
{ 384, 49, 29, 44, 12, 162, 51, 5, 87, 42, }, /* left_mode 5 */
|
|
||||||
{ 495, 53, 157, 27, 14, 57, 180, 17, 17, 34, }, /* left_mode 6 */
|
|
||||||
{ 695, 64, 62, 9, 27, 5, 3, 147, 10, 26, }, /* left_mode 7 */
|
|
||||||
{ 230, 54, 20, 124, 16, 125, 29, 12, 283, 37, }, /* left_mode 8 */
|
|
||||||
{ 260, 87, 21, 120, 32, 16, 33, 16, 33, 203, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 1*/
|
|
||||||
{ 3934, 2573, 355, 137, 128, 87, 133, 117, 37, 27, }, /* left_mode 0 */
|
|
||||||
{ 1036, 1929, 278, 135, 27, 37, 48, 55, 41, 91, }, /* left_mode 1 */
|
|
||||||
{ 223, 256, 253, 15, 13, 9, 28, 64, 3, 3, }, /* left_mode 2 */
|
|
||||||
{ 120, 129, 17, 316, 15, 11, 9, 4, 53, 74, }, /* left_mode 3 */
|
|
||||||
{ 129, 58, 6, 11, 38, 2, 0, 5, 2, 67, }, /* left_mode 4 */
|
|
||||||
{ 53, 22, 11, 16, 8, 26, 14, 3, 19, 12, }, /* left_mode 5 */
|
|
||||||
{ 59, 26, 61, 11, 4, 9, 35, 13, 8, 8, }, /* left_mode 6 */
|
|
||||||
{ 101, 52, 40, 8, 5, 2, 8, 59, 2, 20, }, /* left_mode 7 */
|
|
||||||
{ 48, 34, 10, 52, 8, 15, 6, 6, 63, 20, }, /* left_mode 8 */
|
|
||||||
{ 96, 48, 22, 63, 11, 14, 5, 8, 9, 96, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 2*/
|
|
||||||
{ 709, 461, 506, 36, 27, 33, 151, 98, 24, 6, }, /* left_mode 0 */
|
|
||||||
{ 201, 375, 442, 27, 13, 8, 46, 58, 6, 19, }, /* left_mode 1 */
|
|
||||||
{ 122, 140, 417, 4, 13, 3, 33, 59, 4, 2, }, /* left_mode 2 */
|
|
||||||
{ 36, 17, 22, 16, 6, 8, 12, 17, 9, 21, }, /* left_mode 3 */
|
|
||||||
{ 51, 15, 7, 1, 14, 0, 4, 5, 3, 22, }, /* left_mode 4 */
|
|
||||||
{ 18, 11, 30, 9, 7, 20, 11, 5, 2, 6, }, /* left_mode 5 */
|
|
||||||
{ 38, 21, 103, 9, 4, 12, 79, 13, 2, 5, }, /* left_mode 6 */
|
|
||||||
{ 64, 17, 66, 2, 12, 4, 2, 65, 4, 5, }, /* left_mode 7 */
|
|
||||||
{ 14, 7, 7, 16, 3, 11, 4, 13, 15, 16, }, /* left_mode 8 */
|
|
||||||
{ 36, 8, 32, 9, 9, 4, 14, 7, 6, 24, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 3*/
|
|
||||||
{ 1340, 173, 36, 119, 30, 10, 13, 10, 20, 26, }, /* left_mode 0 */
|
|
||||||
{ 156, 293, 26, 108, 5, 16, 2, 4, 23, 30, }, /* left_mode 1 */
|
|
||||||
{ 60, 34, 13, 7, 3, 3, 0, 8, 4, 5, }, /* left_mode 2 */
|
|
||||||
{ 72, 64, 1, 235, 3, 9, 2, 7, 28, 38, }, /* left_mode 3 */
|
|
||||||
{ 29, 14, 1, 3, 5, 0, 2, 2, 5, 13, }, /* left_mode 4 */
|
|
||||||
{ 22, 7, 4, 11, 2, 5, 1, 2, 6, 4, }, /* left_mode 5 */
|
|
||||||
{ 18, 14, 5, 6, 4, 3, 14, 0, 9, 2, }, /* left_mode 6 */
|
|
||||||
{ 41, 10, 7, 1, 2, 0, 0, 10, 2, 1, }, /* left_mode 7 */
|
|
||||||
{ 23, 19, 2, 33, 1, 5, 2, 0, 51, 8, }, /* left_mode 8 */
|
|
||||||
{ 33, 26, 7, 53, 3, 9, 3, 3, 9, 19, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 4*/
|
|
||||||
{ 410, 165, 43, 31, 66, 15, 30, 54, 8, 17, }, /* left_mode 0 */
|
|
||||||
{ 115, 64, 27, 18, 30, 7, 11, 15, 4, 19, }, /* left_mode 1 */
|
|
||||||
{ 31, 23, 25, 1, 7, 2, 2, 10, 0, 5, }, /* left_mode 2 */
|
|
||||||
{ 17, 4, 1, 6, 8, 2, 7, 5, 5, 21, }, /* left_mode 3 */
|
|
||||||
{ 120, 12, 1, 2, 83, 3, 0, 4, 1, 40, }, /* left_mode 4 */
|
|
||||||
{ 4, 3, 1, 2, 1, 2, 5, 0, 3, 6, }, /* left_mode 5 */
|
|
||||||
{ 10, 2, 13, 6, 6, 6, 8, 2, 4, 5, }, /* left_mode 6 */
|
|
||||||
{ 58, 10, 5, 1, 28, 1, 1, 33, 1, 9, }, /* left_mode 7 */
|
|
||||||
{ 8, 2, 1, 4, 2, 5, 1, 1, 2, 10, }, /* left_mode 8 */
|
|
||||||
{ 76, 7, 5, 7, 18, 2, 2, 0, 5, 45, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 5*/
|
|
||||||
{ 444, 46, 47, 20, 14, 110, 60, 14, 60, 7, }, /* left_mode 0 */
|
|
||||||
{ 59, 57, 25, 18, 3, 17, 21, 6, 14, 6, }, /* left_mode 1 */
|
|
||||||
{ 24, 17, 20, 6, 4, 13, 7, 2, 3, 2, }, /* left_mode 2 */
|
|
||||||
{ 13, 11, 5, 14, 4, 9, 2, 4, 15, 7, }, /* left_mode 3 */
|
|
||||||
{ 8, 5, 2, 1, 4, 0, 1, 1, 2, 12, }, /* left_mode 4 */
|
|
||||||
{ 19, 5, 5, 7, 4, 40, 6, 3, 10, 4, }, /* left_mode 5 */
|
|
||||||
{ 16, 5, 9, 1, 1, 16, 26, 2, 10, 4, }, /* left_mode 6 */
|
|
||||||
{ 11, 4, 8, 1, 1, 4, 4, 5, 4, 1, }, /* left_mode 7 */
|
|
||||||
{ 15, 1, 3, 7, 3, 21, 7, 1, 34, 5, }, /* left_mode 8 */
|
|
||||||
{ 18, 5, 1, 3, 4, 3, 7, 1, 2, 9, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 6*/
|
|
||||||
{ 476, 149, 94, 13, 14, 77, 291, 27, 23, 3, }, /* left_mode 0 */
|
|
||||||
{ 79, 83, 42, 14, 2, 12, 63, 2, 4, 14, }, /* left_mode 1 */
|
|
||||||
{ 43, 36, 55, 1, 3, 8, 42, 11, 5, 1, }, /* left_mode 2 */
|
|
||||||
{ 9, 9, 6, 16, 1, 5, 6, 3, 11, 10, }, /* left_mode 3 */
|
|
||||||
{ 10, 3, 1, 3, 10, 1, 0, 1, 1, 4, }, /* left_mode 4 */
|
|
||||||
{ 14, 6, 15, 5, 1, 20, 25, 2, 5, 0, }, /* left_mode 5 */
|
|
||||||
{ 28, 7, 51, 1, 0, 8, 127, 6, 2, 5, }, /* left_mode 6 */
|
|
||||||
{ 13, 3, 3, 2, 3, 1, 2, 8, 1, 2, }, /* left_mode 7 */
|
|
||||||
{ 10, 3, 3, 3, 3, 8, 2, 2, 9, 3, }, /* left_mode 8 */
|
|
||||||
{ 13, 7, 11, 4, 0, 4, 6, 2, 5, 8, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 7*/
|
|
||||||
{ 376, 135, 119, 6, 32, 8, 31, 224, 9, 3, }, /* left_mode 0 */
|
|
||||||
{ 93, 60, 54, 6, 13, 7, 8, 92, 2, 12, }, /* left_mode 1 */
|
|
||||||
{ 74, 36, 84, 0, 3, 2, 9, 67, 2, 1, }, /* left_mode 2 */
|
|
||||||
{ 19, 4, 4, 8, 8, 2, 4, 7, 6, 16, }, /* left_mode 3 */
|
|
||||||
{ 51, 7, 4, 1, 77, 3, 0, 14, 1, 15, }, /* left_mode 4 */
|
|
||||||
{ 7, 7, 5, 7, 4, 7, 4, 5, 0, 3, }, /* left_mode 5 */
|
|
||||||
{ 18, 2, 19, 2, 2, 4, 12, 11, 1, 2, }, /* left_mode 6 */
|
|
||||||
{ 129, 6, 27, 1, 21, 3, 0, 189, 0, 6, }, /* left_mode 7 */
|
|
||||||
{ 9, 1, 2, 8, 3, 7, 0, 5, 3, 3, }, /* left_mode 8 */
|
|
||||||
{ 20, 4, 5, 10, 4, 2, 7, 17, 3, 16, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 8*/
|
|
||||||
{ 617, 68, 34, 79, 11, 27, 25, 14, 75, 13, }, /* left_mode 0 */
|
|
||||||
{ 51, 82, 21, 26, 6, 12, 13, 1, 26, 16, }, /* left_mode 1 */
|
|
||||||
{ 29, 9, 12, 11, 3, 7, 1, 10, 2, 2, }, /* left_mode 2 */
|
|
||||||
{ 17, 19, 11, 74, 4, 3, 2, 0, 58, 13, }, /* left_mode 3 */
|
|
||||||
{ 10, 1, 1, 3, 4, 1, 0, 2, 1, 8, }, /* left_mode 4 */
|
|
||||||
{ 14, 4, 5, 5, 1, 13, 2, 0, 27, 8, }, /* left_mode 5 */
|
|
||||||
{ 10, 3, 5, 4, 1, 7, 6, 4, 5, 1, }, /* left_mode 6 */
|
|
||||||
{ 10, 2, 6, 2, 1, 1, 1, 4, 2, 1, }, /* left_mode 7 */
|
|
||||||
{ 14, 8, 5, 23, 2, 12, 6, 2, 117, 5, }, /* left_mode 8 */
|
|
||||||
{ 9, 6, 2, 19, 1, 6, 3, 2, 9, 9, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
{
|
|
||||||
/*Above Mode : 9*/
|
|
||||||
{ 680, 73, 22, 38, 42, 5, 11, 9, 6, 28, }, /* left_mode 0 */
|
|
||||||
{ 113, 112, 21, 22, 10, 2, 8, 4, 6, 42, }, /* left_mode 1 */
|
|
||||||
{ 44, 20, 24, 6, 5, 4, 3, 3, 1, 2, }, /* left_mode 2 */
|
|
||||||
{ 40, 23, 7, 71, 5, 2, 4, 1, 7, 22, }, /* left_mode 3 */
|
|
||||||
{ 85, 9, 4, 4, 17, 2, 0, 3, 2, 23, }, /* left_mode 4 */
|
|
||||||
{ 13, 4, 2, 6, 1, 7, 0, 1, 7, 6, }, /* left_mode 5 */
|
|
||||||
{ 26, 6, 8, 3, 2, 3, 8, 1, 5, 4, }, /* left_mode 6 */
|
|
||||||
{ 54, 8, 9, 6, 7, 0, 1, 11, 1, 3, }, /* left_mode 7 */
|
|
||||||
{ 9, 10, 4, 13, 2, 5, 4, 2, 14, 8, }, /* left_mode 8 */
|
|
||||||
{ 92, 9, 5, 19, 15, 3, 3, 1, 6, 58, }, /* left_mode 9 */
|
|
||||||
},
|
|
||||||
};
|
|
@@ -19,7 +19,7 @@ typedef struct
|
|||||||
short col;
|
short col;
|
||||||
} MV;
|
} MV;
|
||||||
|
|
||||||
typedef union
|
typedef union int_mv
|
||||||
{
|
{
|
||||||
uint32_t as_int;
|
uint32_t as_int;
|
||||||
MV as_mv;
|
MV as_mv;
|
||||||
|
@@ -22,9 +22,9 @@ extern "C"
|
|||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#include "vpx/vpx_encoder.h"
|
#include "vpx/vpx_encoder.h"
|
||||||
#include "vpx_scale/yv12config.h"
|
#include "vpx_scale/yv12config.h"
|
||||||
#include "type_aliases.h"
|
|
||||||
#include "ppflags.h"
|
#include "ppflags.h"
|
||||||
typedef int *VP8_PTR;
|
|
||||||
|
struct VP8_COMP;
|
||||||
|
|
||||||
/* Create/destroy static data structures. */
|
/* Create/destroy static data structures. */
|
||||||
|
|
||||||
@@ -60,19 +60,19 @@ extern "C"
|
|||||||
MODE_BESTQUALITY = 0x2,
|
MODE_BESTQUALITY = 0x2,
|
||||||
MODE_FIRSTPASS = 0x3,
|
MODE_FIRSTPASS = 0x3,
|
||||||
MODE_SECONDPASS = 0x4,
|
MODE_SECONDPASS = 0x4,
|
||||||
MODE_SECONDPASS_BEST = 0x5,
|
MODE_SECONDPASS_BEST = 0x5
|
||||||
} MODE;
|
} MODE;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
FRAMEFLAGS_KEY = 1,
|
FRAMEFLAGS_KEY = 1,
|
||||||
FRAMEFLAGS_GOLDEN = 2,
|
FRAMEFLAGS_GOLDEN = 2,
|
||||||
FRAMEFLAGS_ALTREF = 4,
|
FRAMEFLAGS_ALTREF = 4
|
||||||
} FRAMETYPE_FLAGS;
|
} FRAMETYPE_FLAGS;
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
static __inline void Scale2Ratio(int mode, int *hr, int *hs)
|
static void Scale2Ratio(int mode, int *hr, int *hs)
|
||||||
{
|
{
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
@@ -147,10 +147,14 @@ extern "C"
|
|||||||
int over_shoot_pct;
|
int over_shoot_pct;
|
||||||
|
|
||||||
// buffering parameters
|
// buffering parameters
|
||||||
int64_t starting_buffer_level; // in seconds
|
int64_t starting_buffer_level; // in bytes
|
||||||
int64_t optimal_buffer_level;
|
int64_t optimal_buffer_level;
|
||||||
int64_t maximum_buffer_size;
|
int64_t maximum_buffer_size;
|
||||||
|
|
||||||
|
int64_t starting_buffer_level_in_ms; // in milli-seconds
|
||||||
|
int64_t optimal_buffer_level_in_ms;
|
||||||
|
int64_t maximum_buffer_size_in_ms;
|
||||||
|
|
||||||
// controlling quality
|
// controlling quality
|
||||||
int fixed_q;
|
int fixed_q;
|
||||||
int worst_allowed_q;
|
int worst_allowed_q;
|
||||||
@@ -203,10 +207,10 @@ extern "C"
|
|||||||
|
|
||||||
// Temporal scaling parameters
|
// Temporal scaling parameters
|
||||||
unsigned int number_of_layers;
|
unsigned int number_of_layers;
|
||||||
unsigned int target_bitrate[MAX_PERIODICITY];
|
unsigned int target_bitrate[VPX_TS_MAX_PERIODICITY];
|
||||||
unsigned int rate_decimator[MAX_PERIODICITY];
|
unsigned int rate_decimator[VPX_TS_MAX_PERIODICITY];
|
||||||
unsigned int periodicity;
|
unsigned int periodicity;
|
||||||
unsigned int layer_id[MAX_PERIODICITY];
|
unsigned int layer_id[VPX_TS_MAX_PERIODICITY];
|
||||||
|
|
||||||
#if CONFIG_MULTI_RES_ENCODING
|
#if CONFIG_MULTI_RES_ENCODING
|
||||||
/* Number of total resolutions encoded */
|
/* Number of total resolutions encoded */
|
||||||
@@ -226,27 +230,27 @@ extern "C"
|
|||||||
|
|
||||||
void vp8_initialize();
|
void vp8_initialize();
|
||||||
|
|
||||||
VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf);
|
struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf);
|
||||||
void vp8_remove_compressor(VP8_PTR *comp);
|
void vp8_remove_compressor(struct VP8_COMP* *comp);
|
||||||
|
|
||||||
void vp8_init_config(VP8_PTR onyx, VP8_CONFIG *oxcf);
|
void vp8_init_config(struct VP8_COMP* onyx, VP8_CONFIG *oxcf);
|
||||||
void vp8_change_config(VP8_PTR onyx, VP8_CONFIG *oxcf);
|
void vp8_change_config(struct VP8_COMP* onyx, VP8_CONFIG *oxcf);
|
||||||
|
|
||||||
// receive a frames worth of data caller can assume that a copy of this frame is made
|
// receive a frames worth of data caller can assume that a copy of this frame is made
|
||||||
// and not just a copy of the pointer..
|
// and not just a copy of the pointer..
|
||||||
int vp8_receive_raw_frame(VP8_PTR comp, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time_stamp);
|
int vp8_receive_raw_frame(struct VP8_COMP* comp, unsigned int frame_flags, YV12_BUFFER_CONFIG *sd, int64_t time_stamp, int64_t end_time_stamp);
|
||||||
int vp8_get_compressed_data(VP8_PTR comp, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush);
|
int vp8_get_compressed_data(struct VP8_COMP* comp, unsigned int *frame_flags, unsigned long *size, unsigned char *dest, unsigned char *dest_end, int64_t *time_stamp, int64_t *time_end, int flush);
|
||||||
int vp8_get_preview_raw_frame(VP8_PTR comp, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags);
|
int vp8_get_preview_raw_frame(struct VP8_COMP* comp, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *flags);
|
||||||
|
|
||||||
int vp8_use_as_reference(VP8_PTR comp, int ref_frame_flags);
|
int vp8_use_as_reference(struct VP8_COMP* comp, int ref_frame_flags);
|
||||||
int vp8_update_reference(VP8_PTR comp, int ref_frame_flags);
|
int vp8_update_reference(struct VP8_COMP* comp, int ref_frame_flags);
|
||||||
int vp8_get_reference(VP8_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
int vp8_get_reference(struct VP8_COMP* comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
||||||
int vp8_set_reference(VP8_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
int vp8_set_reference(struct VP8_COMP* comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
||||||
int vp8_update_entropy(VP8_PTR comp, int update);
|
int vp8_update_entropy(struct VP8_COMP* comp, int update);
|
||||||
int vp8_set_roimap(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4]);
|
int vp8_set_roimap(struct VP8_COMP* comp, unsigned char *map, unsigned int rows, unsigned int cols, int delta_q[4], int delta_lf[4], unsigned int threshold[4]);
|
||||||
int vp8_set_active_map(VP8_PTR comp, unsigned char *map, unsigned int rows, unsigned int cols);
|
int vp8_set_active_map(struct VP8_COMP* comp, unsigned char *map, unsigned int rows, unsigned int cols);
|
||||||
int vp8_set_internal_size(VP8_PTR comp, VPX_SCALING horiz_mode, VPX_SCALING vert_mode);
|
int vp8_set_internal_size(struct VP8_COMP* comp, VPX_SCALING horiz_mode, VPX_SCALING vert_mode);
|
||||||
int vp8_get_quantizer(VP8_PTR c);
|
int vp8_get_quantizer(struct VP8_COMP* c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -13,12 +13,11 @@
|
|||||||
#define __INC_VP8C_INT_H
|
#define __INC_VP8C_INT_H
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_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"
|
||||||
#include "entropy.h"
|
#include "entropy.h"
|
||||||
#include "idct.h"
|
|
||||||
#include "recon.h"
|
|
||||||
#if CONFIG_POSTPROC
|
#if CONFIG_POSTPROC
|
||||||
#include "postproc.h"
|
#include "postproc.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -27,10 +26,6 @@
|
|||||||
#include "header.h"
|
#include "header.h"
|
||||||
/*#endif*/
|
/*#endif*/
|
||||||
|
|
||||||
/* Create/destroy static data structures. */
|
|
||||||
|
|
||||||
void vp8_initialize_common(void);
|
|
||||||
|
|
||||||
#define MINQ 0
|
#define MINQ 0
|
||||||
#define MAXQ 127
|
#define MAXQ 127
|
||||||
#define QINDEX_RANGE (MAXQ + 1)
|
#define QINDEX_RANGE (MAXQ + 1)
|
||||||
@@ -70,30 +65,14 @@ typedef enum
|
|||||||
BILINEAR = 1
|
BILINEAR = 1
|
||||||
} INTERPOLATIONFILTERTYPE;
|
} INTERPOLATIONFILTERTYPE;
|
||||||
|
|
||||||
typedef struct VP8_COMMON_RTCD
|
|
||||||
{
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
vp8_idct_rtcd_vtable_t idct;
|
|
||||||
vp8_recon_rtcd_vtable_t recon;
|
|
||||||
vp8_subpix_rtcd_vtable_t subpix;
|
|
||||||
vp8_loopfilter_rtcd_vtable_t loopfilter;
|
|
||||||
#if CONFIG_POSTPROC
|
|
||||||
vp8_postproc_rtcd_vtable_t postproc;
|
|
||||||
#endif
|
|
||||||
int flags;
|
|
||||||
#else
|
|
||||||
int unused;
|
|
||||||
#endif
|
|
||||||
} VP8_COMMON_RTCD;
|
|
||||||
|
|
||||||
typedef struct VP8Common
|
typedef struct VP8Common
|
||||||
|
|
||||||
{
|
{
|
||||||
struct vpx_internal_error_info error;
|
struct vpx_internal_error_info error;
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, short, Y1dequant[QINDEX_RANGE][16]);
|
DECLARE_ALIGNED(16, short, Y1dequant[QINDEX_RANGE][2]);
|
||||||
DECLARE_ALIGNED(16, short, Y2dequant[QINDEX_RANGE][16]);
|
DECLARE_ALIGNED(16, short, Y2dequant[QINDEX_RANGE][2]);
|
||||||
DECLARE_ALIGNED(16, short, UVdequant[QINDEX_RANGE][16]);
|
DECLARE_ALIGNED(16, short, UVdequant[QINDEX_RANGE][2]);
|
||||||
|
|
||||||
int Width;
|
int Width;
|
||||||
int Height;
|
int Height;
|
||||||
@@ -109,9 +88,13 @@ typedef struct VP8Common
|
|||||||
int fb_idx_ref_cnt[NUM_YV12_BUFFERS];
|
int fb_idx_ref_cnt[NUM_YV12_BUFFERS];
|
||||||
int new_fb_idx, lst_fb_idx, gld_fb_idx, alt_fb_idx;
|
int new_fb_idx, lst_fb_idx, gld_fb_idx, alt_fb_idx;
|
||||||
|
|
||||||
YV12_BUFFER_CONFIG post_proc_buffer;
|
|
||||||
YV12_BUFFER_CONFIG temp_scale_frame;
|
YV12_BUFFER_CONFIG temp_scale_frame;
|
||||||
|
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
|
YV12_BUFFER_CONFIG post_proc_buffer;
|
||||||
|
YV12_BUFFER_CONFIG post_proc_buffer_int;
|
||||||
|
int post_proc_buffer_int_used;
|
||||||
|
#endif
|
||||||
|
|
||||||
FRAME_TYPE last_frame_type; /* Save last frame's frame type for motion search. */
|
FRAME_TYPE last_frame_type; /* Save last frame's frame type for motion search. */
|
||||||
FRAME_TYPE frame_type;
|
FRAME_TYPE frame_type;
|
||||||
@@ -199,15 +182,13 @@ typedef struct VP8Common
|
|||||||
double bitrate;
|
double bitrate;
|
||||||
double framerate;
|
double framerate;
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
VP8_COMMON_RTCD rtcd;
|
|
||||||
#endif
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
int processor_core_count;
|
int processor_core_count;
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_POSTPROC
|
#if CONFIG_POSTPROC
|
||||||
struct postproc_state postproc_state;
|
struct postproc_state postproc_state;
|
||||||
#endif
|
#endif
|
||||||
|
int cpu_caps;
|
||||||
} VP8_COMMON;
|
} VP8_COMMON;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -18,13 +18,13 @@
|
|||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
#include "type_aliases.h"
|
|
||||||
#include "vpx_scale/yv12config.h"
|
#include "vpx_scale/yv12config.h"
|
||||||
#include "ppflags.h"
|
#include "ppflags.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
#include "vpx/vpx_codec.h"
|
#include "vpx/vpx_codec.h"
|
||||||
|
|
||||||
typedef void *VP8D_PTR;
|
struct VP8D_COMP;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int Width;
|
int Width;
|
||||||
@@ -49,19 +49,19 @@ extern "C"
|
|||||||
|
|
||||||
void vp8dx_initialize(void);
|
void vp8dx_initialize(void);
|
||||||
|
|
||||||
void vp8dx_set_setting(VP8D_PTR comp, VP8D_SETTING oxst, int x);
|
void vp8dx_set_setting(struct VP8D_COMP* comp, VP8D_SETTING oxst, int x);
|
||||||
|
|
||||||
int vp8dx_get_setting(VP8D_PTR comp, VP8D_SETTING oxst);
|
int vp8dx_get_setting(struct VP8D_COMP* comp, VP8D_SETTING oxst);
|
||||||
|
|
||||||
int vp8dx_receive_compressed_data(VP8D_PTR comp, unsigned long size, const unsigned char *dest, int64_t time_stamp);
|
int vp8dx_receive_compressed_data(struct VP8D_COMP* comp, unsigned long size, const unsigned char *dest, int64_t time_stamp);
|
||||||
int vp8dx_get_raw_frame(VP8D_PTR comp, YV12_BUFFER_CONFIG *sd, int64_t *time_stamp, int64_t *time_end_stamp, vp8_ppflags_t *flags);
|
int vp8dx_get_raw_frame(struct VP8D_COMP* comp, YV12_BUFFER_CONFIG *sd, int64_t *time_stamp, int64_t *time_end_stamp, vp8_ppflags_t *flags);
|
||||||
|
|
||||||
vpx_codec_err_t vp8dx_get_reference(VP8D_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
vpx_codec_err_t vp8dx_get_reference(struct VP8D_COMP* comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
||||||
vpx_codec_err_t vp8dx_set_reference(VP8D_PTR comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
vpx_codec_err_t vp8dx_set_reference(struct VP8D_COMP* comp, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_CONFIG *sd);
|
||||||
|
|
||||||
VP8D_PTR vp8dx_create_decompressor(VP8D_CONFIG *oxcf);
|
struct VP8D_COMP* vp8dx_create_decompressor(VP8D_CONFIG *oxcf);
|
||||||
|
|
||||||
void vp8dx_remove_decompressor(VP8D_PTR comp);
|
void vp8dx_remove_decompressor(struct VP8D_COMP* comp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -10,12 +10,14 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vpx_scale/yv12config.h"
|
#include "vpx_scale/yv12config.h"
|
||||||
#include "postproc.h"
|
#include "postproc.h"
|
||||||
#include "vpx_scale/yv12extend.h"
|
#include "common.h"
|
||||||
#include "vpx_scale/vpxscale.h"
|
#include "vpx_scale/vpxscale.h"
|
||||||
#include "systemdependent.h"
|
#include "systemdependent.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -121,7 +123,6 @@ const short vp8_rv[] =
|
|||||||
0, 9, 5, 5, 11, 10, 13, 9, 10, 13,
|
0, 9, 5, 5, 11, 10, 13, 9, 10, 13,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch);
|
extern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch);
|
||||||
extern void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch);
|
extern void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch);
|
||||||
/***********************************************************************************************************
|
/***********************************************************************************************************
|
||||||
@@ -175,6 +176,12 @@ void vp8_post_proc_down_and_across_c
|
|||||||
p_src = dst_ptr;
|
p_src = dst_ptr;
|
||||||
p_dst = dst_ptr;
|
p_dst = dst_ptr;
|
||||||
|
|
||||||
|
for (i = -8; i<0; i++)
|
||||||
|
p_src[i]=p_src[0];
|
||||||
|
|
||||||
|
for (i = cols; i<cols+8; i++)
|
||||||
|
p_src[i]=p_src[cols-1];
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
d[i] = p_src[i];
|
d[i] = p_src[i];
|
||||||
|
|
||||||
@@ -225,12 +232,19 @@ void vp8_mbpost_proc_across_ip_c(unsigned char *src, int pitch, int rows, int co
|
|||||||
unsigned char *s = src;
|
unsigned char *s = src;
|
||||||
unsigned char d[16];
|
unsigned char d[16];
|
||||||
|
|
||||||
|
|
||||||
for (r = 0; r < rows; r++)
|
for (r = 0; r < rows; r++)
|
||||||
{
|
{
|
||||||
int sumsq = 0;
|
int sumsq = 0;
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
|
||||||
|
for (i = -8; i<0; i++)
|
||||||
|
s[i]=s[0];
|
||||||
|
|
||||||
|
// 17 avoids valgrind warning - we buffer values in c in d
|
||||||
|
// and only write them when we've read 8 ahead...
|
||||||
|
for (i = cols; i<cols+17; i++)
|
||||||
|
s[i]=s[cols-1];
|
||||||
|
|
||||||
for (i = -8; i <= 6; i++)
|
for (i = -8; i <= 6; i++)
|
||||||
{
|
{
|
||||||
sumsq += s[i] * s[i];
|
sumsq += s[i] * s[i];
|
||||||
@@ -269,7 +283,7 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols, i
|
|||||||
int r, c, i;
|
int r, c, i;
|
||||||
const short *rv3 = &vp8_rv[63&rand()];
|
const short *rv3 = &vp8_rv[63&rand()];
|
||||||
|
|
||||||
for (c = 0; c < cols; c++)
|
for (c = 0; c < cols; c++ )
|
||||||
{
|
{
|
||||||
unsigned char *s = &dst[c];
|
unsigned char *s = &dst[c];
|
||||||
int sumsq = 0;
|
int sumsq = 0;
|
||||||
@@ -277,6 +291,14 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols, i
|
|||||||
unsigned char d[16];
|
unsigned char d[16];
|
||||||
const short *rv2 = rv3 + ((c * 17) & 127);
|
const short *rv2 = rv3 + ((c * 17) & 127);
|
||||||
|
|
||||||
|
for (i = -8; i < 0; i++)
|
||||||
|
s[i*pitch]=s[0];
|
||||||
|
|
||||||
|
// 17 avoids valgrind warning - we buffer values in c in d
|
||||||
|
// and only write them when we've read 8 ahead...
|
||||||
|
for (i = rows; i < rows+17; i++)
|
||||||
|
s[i*pitch]=s[(rows-1)*pitch];
|
||||||
|
|
||||||
for (i = -8; i <= 6; i++)
|
for (i = -8; i <= 6; i++)
|
||||||
{
|
{
|
||||||
sumsq += s[i*pitch] * s[i*pitch];
|
sumsq += s[i*pitch] * s[i*pitch];
|
||||||
@@ -305,46 +327,44 @@ static void vp8_deblock_and_de_macro_block(YV12_BUFFER_CONFIG *source,
|
|||||||
YV12_BUFFER_CONFIG *post,
|
YV12_BUFFER_CONFIG *post,
|
||||||
int q,
|
int q,
|
||||||
int low_var_thresh,
|
int low_var_thresh,
|
||||||
int flag,
|
int flag)
|
||||||
vp8_postproc_rtcd_vtable_t *rtcd)
|
|
||||||
{
|
{
|
||||||
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
||||||
int ppl = (int)(level + .5);
|
int ppl = (int)(level + .5);
|
||||||
(void) low_var_thresh;
|
(void) low_var_thresh;
|
||||||
(void) flag;
|
(void) flag;
|
||||||
|
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->y_buffer, post->y_buffer, source->y_stride, post->y_stride, source->y_height, source->y_width, ppl);
|
vp8_post_proc_down_and_across(source->y_buffer, post->y_buffer, source->y_stride, post->y_stride, source->y_height, source->y_width, ppl);
|
||||||
POSTPROC_INVOKE(rtcd, across)(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
|
vp8_mbpost_proc_across_ip(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
|
||||||
POSTPROC_INVOKE(rtcd, down)(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
|
vp8_mbpost_proc_down(post->y_buffer, post->y_stride, post->y_height, post->y_width, q2mbl(q));
|
||||||
|
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
vp8_post_proc_down_and_across(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
vp8_post_proc_down_and_across(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_deblock(YV12_BUFFER_CONFIG *source,
|
void vp8_deblock(YV12_BUFFER_CONFIG *source,
|
||||||
YV12_BUFFER_CONFIG *post,
|
YV12_BUFFER_CONFIG *post,
|
||||||
int q,
|
int q,
|
||||||
int low_var_thresh,
|
int low_var_thresh,
|
||||||
int flag,
|
int flag)
|
||||||
vp8_postproc_rtcd_vtable_t *rtcd)
|
|
||||||
{
|
{
|
||||||
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
||||||
int ppl = (int)(level + .5);
|
int ppl = (int)(level + .5);
|
||||||
(void) low_var_thresh;
|
(void) low_var_thresh;
|
||||||
(void) flag;
|
(void) flag;
|
||||||
|
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->y_buffer, post->y_buffer, source->y_stride, post->y_stride, source->y_height, source->y_width, ppl);
|
vp8_post_proc_down_and_across(source->y_buffer, post->y_buffer, source->y_stride, post->y_stride, source->y_height, source->y_width, ppl);
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
vp8_post_proc_down_and_across(source->u_buffer, post->u_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
vp8_post_proc_down_and_across(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !(CONFIG_TEMPORAL_DENOISING)
|
||||||
void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
||||||
YV12_BUFFER_CONFIG *post,
|
YV12_BUFFER_CONFIG *post,
|
||||||
int q,
|
int q,
|
||||||
int low_var_thresh,
|
int low_var_thresh,
|
||||||
int flag,
|
int flag)
|
||||||
vp8_postproc_rtcd_vtable_t *rtcd)
|
|
||||||
{
|
{
|
||||||
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
|
||||||
int ppl = (int)(level + .5);
|
int ppl = (int)(level + .5);
|
||||||
@@ -352,7 +372,7 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
|||||||
(void) low_var_thresh;
|
(void) low_var_thresh;
|
||||||
(void) flag;
|
(void) flag;
|
||||||
|
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(
|
vp8_post_proc_down_and_across(
|
||||||
source->y_buffer + 2 * source->y_stride + 2,
|
source->y_buffer + 2 * source->y_stride + 2,
|
||||||
source->y_buffer + 2 * source->y_stride + 2,
|
source->y_buffer + 2 * source->y_stride + 2,
|
||||||
source->y_stride,
|
source->y_stride,
|
||||||
@@ -360,14 +380,14 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
|||||||
source->y_height - 4,
|
source->y_height - 4,
|
||||||
source->y_width - 4,
|
source->y_width - 4,
|
||||||
ppl);
|
ppl);
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(
|
vp8_post_proc_down_and_across(
|
||||||
source->u_buffer + 2 * source->uv_stride + 2,
|
source->u_buffer + 2 * source->uv_stride + 2,
|
||||||
source->u_buffer + 2 * source->uv_stride + 2,
|
source->u_buffer + 2 * source->uv_stride + 2,
|
||||||
source->uv_stride,
|
source->uv_stride,
|
||||||
source->uv_stride,
|
source->uv_stride,
|
||||||
source->uv_height - 4,
|
source->uv_height - 4,
|
||||||
source->uv_width - 4, ppl);
|
source->uv_width - 4, ppl);
|
||||||
POSTPROC_INVOKE(rtcd, downacross)(
|
vp8_post_proc_down_and_across(
|
||||||
source->v_buffer + 2 * source->uv_stride + 2,
|
source->v_buffer + 2 * source->uv_stride + 2,
|
||||||
source->v_buffer + 2 * source->uv_stride + 2,
|
source->v_buffer + 2 * source->uv_stride + 2,
|
||||||
source->uv_stride,
|
source->uv_stride,
|
||||||
@@ -376,6 +396,7 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
|||||||
source->uv_width - 4, ppl);
|
source->uv_width - 4, ppl);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
double vp8_gaussian(double sigma, double mu, double x)
|
double vp8_gaussian(double sigma, double mu, double x)
|
||||||
{
|
{
|
||||||
@@ -383,9 +404,6 @@ double vp8_gaussian(double sigma, double mu, double x)
|
|||||||
(exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
|
(exp(-(x - mu) * (x - mu) / (2 * sigma * sigma)));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void (*vp8_clear_system_state)(void);
|
|
||||||
|
|
||||||
|
|
||||||
static void fillrd(struct postproc_state *state, int q, int a)
|
static void fillrd(struct postproc_state *state, int q, int a)
|
||||||
{
|
{
|
||||||
char char_dist[300];
|
char char_dist[300];
|
||||||
@@ -671,13 +689,7 @@ static void constrain_line (int x0, int *x1, int y0, int *y1, int width, int hei
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_POSTPROC
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#define RTCD_VTABLE(oci) (&(oci)->rtcd.postproc)
|
|
||||||
#else
|
|
||||||
#define RTCD_VTABLE(oci) NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *ppflags)
|
int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *ppflags)
|
||||||
{
|
{
|
||||||
int q = oci->filter_level * 10 / 6;
|
int q = oci->filter_level * 10 / 6;
|
||||||
@@ -699,28 +711,79 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
dest->y_width = oci->Width;
|
dest->y_width = oci->Width;
|
||||||
dest->y_height = oci->Height;
|
dest->y_height = oci->Height;
|
||||||
dest->uv_height = dest->y_height / 2;
|
dest->uv_height = dest->y_height / 2;
|
||||||
|
oci->postproc_state.last_base_qindex = oci->base_qindex;
|
||||||
|
oci->postproc_state.last_frame_valid = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate post_proc_buffer_int if needed */
|
||||||
|
if ((flags & VP8D_MFQE) && !oci->post_proc_buffer_int_used)
|
||||||
|
{
|
||||||
|
if ((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK))
|
||||||
|
{
|
||||||
|
int width = (oci->Width + 15) & ~15;
|
||||||
|
int height = (oci->Height + 15) & ~15;
|
||||||
|
|
||||||
|
if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer_int,
|
||||||
|
width, height, VP8BORDERINPIXELS))
|
||||||
|
vpx_internal_error(&oci->error, VPX_CODEC_MEM_ERROR,
|
||||||
|
"Failed to allocate MFQE framebuffer");
|
||||||
|
|
||||||
|
oci->post_proc_buffer_int_used = 1;
|
||||||
|
|
||||||
|
// insure that postproc is set to all 0's so that post proc
|
||||||
|
// doesn't pull random data in from edge
|
||||||
|
vpx_memset((&oci->post_proc_buffer_int)->buffer_alloc,128,(&oci->post_proc_buffer)->frame_size);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ARCH_X86||ARCH_X86_64
|
#if ARCH_X86||ARCH_X86_64
|
||||||
vpx_reset_mmx_state();
|
vpx_reset_mmx_state();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (flags & VP8D_DEMACROBLOCK)
|
if ((flags & VP8D_MFQE) &&
|
||||||
|
oci->postproc_state.last_frame_valid &&
|
||||||
|
oci->current_video_frame >= 2 &&
|
||||||
|
oci->base_qindex - oci->postproc_state.last_base_qindex >= 10)
|
||||||
|
{
|
||||||
|
vp8_multiframe_quality_enhance(oci);
|
||||||
|
if (((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK)) &&
|
||||||
|
oci->post_proc_buffer_int_used)
|
||||||
|
{
|
||||||
|
vp8_yv12_copy_frame(&oci->post_proc_buffer, &oci->post_proc_buffer_int);
|
||||||
|
if (flags & VP8D_DEMACROBLOCK)
|
||||||
|
{
|
||||||
|
vp8_deblock_and_de_macro_block(&oci->post_proc_buffer_int, &oci->post_proc_buffer,
|
||||||
|
q + (deblock_level - 5) * 10, 1, 0);
|
||||||
|
}
|
||||||
|
else if (flags & VP8D_DEBLOCK)
|
||||||
|
{
|
||||||
|
vp8_deblock(&oci->post_proc_buffer_int, &oci->post_proc_buffer,
|
||||||
|
q, 1, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Move partially towards the base q of the previous frame */
|
||||||
|
oci->postproc_state.last_base_qindex = (3*oci->postproc_state.last_base_qindex + oci->base_qindex)>>2;
|
||||||
|
}
|
||||||
|
else if (flags & VP8D_DEMACROBLOCK)
|
||||||
{
|
{
|
||||||
vp8_deblock_and_de_macro_block(oci->frame_to_show, &oci->post_proc_buffer,
|
vp8_deblock_and_de_macro_block(oci->frame_to_show, &oci->post_proc_buffer,
|
||||||
q + (deblock_level - 5) * 10, 1, 0, RTCD_VTABLE(oci));
|
q + (deblock_level - 5) * 10, 1, 0);
|
||||||
|
oci->postproc_state.last_base_qindex = oci->base_qindex;
|
||||||
}
|
}
|
||||||
else if (flags & VP8D_DEBLOCK)
|
else if (flags & VP8D_DEBLOCK)
|
||||||
{
|
{
|
||||||
vp8_deblock(oci->frame_to_show, &oci->post_proc_buffer,
|
vp8_deblock(oci->frame_to_show, &oci->post_proc_buffer,
|
||||||
q, 1, 0, RTCD_VTABLE(oci));
|
q, 1, 0);
|
||||||
|
oci->postproc_state.last_base_qindex = oci->base_qindex;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vp8_yv12_copy_frame_ptr(oci->frame_to_show, &oci->post_proc_buffer);
|
vp8_yv12_copy_frame(oci->frame_to_show, &oci->post_proc_buffer);
|
||||||
|
oci->postproc_state.last_base_qindex = oci->base_qindex;
|
||||||
}
|
}
|
||||||
|
oci->postproc_state.last_frame_valid = 1;
|
||||||
|
|
||||||
if (flags & VP8D_ADDNOISE)
|
if (flags & VP8D_ADDNOISE)
|
||||||
{
|
{
|
||||||
@@ -730,7 +793,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
fillrd(&oci->postproc_state, 63 - q, noise_level);
|
fillrd(&oci->postproc_state, 63 - q, noise_level);
|
||||||
}
|
}
|
||||||
|
|
||||||
POSTPROC_INVOKE(RTCD_VTABLE(oci), addnoise)
|
vp8_plane_add_noise
|
||||||
(oci->post_proc_buffer.y_buffer,
|
(oci->post_proc_buffer.y_buffer,
|
||||||
oci->postproc_state.noise,
|
oci->postproc_state.noise,
|
||||||
oci->postproc_state.blackclamp,
|
oci->postproc_state.blackclamp,
|
||||||
@@ -1028,7 +1091,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
U = B_PREDICTION_MODE_colors[bmi->as_mode][1];
|
U = B_PREDICTION_MODE_colors[bmi->as_mode][1];
|
||||||
V = B_PREDICTION_MODE_colors[bmi->as_mode][2];
|
V = B_PREDICTION_MODE_colors[bmi->as_mode][2];
|
||||||
|
|
||||||
POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_b)
|
vp8_blend_b
|
||||||
(yl+bx, ul+(bx>>1), vl+(bx>>1), Y, U, V, 0xc000, y_stride);
|
(yl+bx, ul+(bx>>1), vl+(bx>>1), Y, U, V, 0xc000, y_stride);
|
||||||
}
|
}
|
||||||
bmi++;
|
bmi++;
|
||||||
@@ -1045,7 +1108,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1];
|
U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1];
|
||||||
V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2];
|
V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2];
|
||||||
|
|
||||||
POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb_inner)
|
vp8_blend_mb_inner
|
||||||
(y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
|
(y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1084,7 +1147,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1];
|
U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1];
|
||||||
V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2];
|
V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2];
|
||||||
|
|
||||||
POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb_outer)
|
vp8_blend_mb_outer
|
||||||
(y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
|
(y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1107,3 +1170,4 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t
|
|||||||
dest->uv_height = dest->y_height / 2;
|
dest->uv_height = dest->y_height / 2;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@@ -12,98 +12,14 @@
|
|||||||
#ifndef POSTPROC_H
|
#ifndef POSTPROC_H
|
||||||
#define POSTPROC_H
|
#define POSTPROC_H
|
||||||
|
|
||||||
#define prototype_postproc_inplace(sym)\
|
|
||||||
void sym (unsigned char *dst, int pitch, int rows, int cols,int flimit)
|
|
||||||
|
|
||||||
#define prototype_postproc(sym)\
|
|
||||||
void sym (unsigned char *src, unsigned char *dst, int src_pitch,\
|
|
||||||
int dst_pitch, int rows, int cols, int flimit)
|
|
||||||
|
|
||||||
#define prototype_postproc_addnoise(sym) \
|
|
||||||
void sym (unsigned char *s, char *noise, char blackclamp[16],\
|
|
||||||
char whiteclamp[16], char bothclamp[16],\
|
|
||||||
unsigned int w, unsigned int h, int pitch)
|
|
||||||
|
|
||||||
#define prototype_postproc_blend_mb_inner(sym)\
|
|
||||||
void sym (unsigned char *y, unsigned char *u, unsigned char *v,\
|
|
||||||
int y1, int u1, int v1, int alpha, int stride)
|
|
||||||
|
|
||||||
#define prototype_postproc_blend_mb_outer(sym)\
|
|
||||||
void sym (unsigned char *y, unsigned char *u, unsigned char *v,\
|
|
||||||
int y1, int u1, int v1, int alpha, int stride)
|
|
||||||
|
|
||||||
#define prototype_postproc_blend_b(sym)\
|
|
||||||
void sym (unsigned char *y, unsigned char *u, unsigned char *v,\
|
|
||||||
int y1, int u1, int v1, int alpha, int stride)
|
|
||||||
|
|
||||||
#if ARCH_X86 || ARCH_X86_64
|
|
||||||
#include "x86/postproc_x86.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_down
|
|
||||||
#define vp8_postproc_down vp8_mbpost_proc_down_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_inplace(vp8_postproc_down);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_across
|
|
||||||
#define vp8_postproc_across vp8_mbpost_proc_across_ip_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_inplace(vp8_postproc_across);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_downacross
|
|
||||||
#define vp8_postproc_downacross vp8_post_proc_down_and_across_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc(vp8_postproc_downacross);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_addnoise
|
|
||||||
#define vp8_postproc_addnoise vp8_plane_add_noise_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_addnoise(vp8_postproc_addnoise);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_blend_mb_inner
|
|
||||||
#define vp8_postproc_blend_mb_inner vp8_blend_mb_inner_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_blend_mb_inner(vp8_postproc_blend_mb_inner);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_blend_mb_outer
|
|
||||||
#define vp8_postproc_blend_mb_outer vp8_blend_mb_outer_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_blend_mb_outer(vp8_postproc_blend_mb_outer);
|
|
||||||
|
|
||||||
#ifndef vp8_postproc_blend_b
|
|
||||||
#define vp8_postproc_blend_b vp8_blend_b_c
|
|
||||||
#endif
|
|
||||||
extern prototype_postproc_blend_b(vp8_postproc_blend_b);
|
|
||||||
|
|
||||||
typedef prototype_postproc((*vp8_postproc_fn_t));
|
|
||||||
typedef prototype_postproc_inplace((*vp8_postproc_inplace_fn_t));
|
|
||||||
typedef prototype_postproc_addnoise((*vp8_postproc_addnoise_fn_t));
|
|
||||||
typedef prototype_postproc_blend_mb_inner((*vp8_postproc_blend_mb_inner_fn_t));
|
|
||||||
typedef prototype_postproc_blend_mb_outer((*vp8_postproc_blend_mb_outer_fn_t));
|
|
||||||
typedef prototype_postproc_blend_b((*vp8_postproc_blend_b_fn_t));
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vp8_postproc_inplace_fn_t down;
|
|
||||||
vp8_postproc_inplace_fn_t across;
|
|
||||||
vp8_postproc_fn_t downacross;
|
|
||||||
vp8_postproc_addnoise_fn_t addnoise;
|
|
||||||
vp8_postproc_blend_mb_inner_fn_t blend_mb_inner;
|
|
||||||
vp8_postproc_blend_mb_outer_fn_t blend_mb_outer;
|
|
||||||
vp8_postproc_blend_b_fn_t blend_b;
|
|
||||||
} vp8_postproc_rtcd_vtable_t;
|
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#define POSTPROC_INVOKE(ctx,fn) (ctx)->fn
|
|
||||||
#else
|
|
||||||
#define POSTPROC_INVOKE(ctx,fn) vp8_postproc_##fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
struct postproc_state
|
struct postproc_state
|
||||||
{
|
{
|
||||||
int last_q;
|
int last_q;
|
||||||
int last_noise;
|
int last_noise;
|
||||||
char noise[3072];
|
char noise[3072];
|
||||||
|
int last_base_qindex;
|
||||||
|
int last_frame_valid;
|
||||||
DECLARE_ALIGNED(16, char, blackclamp[16]);
|
DECLARE_ALIGNED(16, char, blackclamp[16]);
|
||||||
DECLARE_ALIGNED(16, char, whiteclamp[16]);
|
DECLARE_ALIGNED(16, char, whiteclamp[16]);
|
||||||
DECLARE_ALIGNED(16, char, bothclamp[16]);
|
DECLARE_ALIGNED(16, char, bothclamp[16]);
|
||||||
@@ -118,13 +34,15 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source,
|
|||||||
YV12_BUFFER_CONFIG *post,
|
YV12_BUFFER_CONFIG *post,
|
||||||
int q,
|
int q,
|
||||||
int low_var_thresh,
|
int low_var_thresh,
|
||||||
int flag,
|
int flag);
|
||||||
vp8_postproc_rtcd_vtable_t *rtcd);
|
|
||||||
|
|
||||||
void vp8_deblock(YV12_BUFFER_CONFIG *source,
|
void vp8_deblock(YV12_BUFFER_CONFIG *source,
|
||||||
YV12_BUFFER_CONFIG *post,
|
YV12_BUFFER_CONFIG *post,
|
||||||
int q,
|
int q,
|
||||||
int low_var_thresh,
|
int low_var_thresh,
|
||||||
int flag,
|
int flag);
|
||||||
vp8_postproc_rtcd_vtable_t *rtcd);
|
|
||||||
|
#define MFQE_PRECISION 4
|
||||||
|
|
||||||
|
void vp8_multiframe_quality_enhance(struct VP8Common *cm);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -9,7 +9,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "g_common.h"
|
|
||||||
#include "subpixel.h"
|
#include "subpixel.h"
|
||||||
#include "loopfilter.h"
|
#include "loopfilter.h"
|
||||||
#include "recon.h"
|
#include "recon.h"
|
||||||
|
@@ -98,7 +98,7 @@
|
|||||||
stw r4, 0(r7) ;# sse
|
stw r4, 0(r7) ;# sse
|
||||||
|
|
||||||
mullw r3, r3, r3 ;# sum*sum
|
mullw r3, r3, r3 ;# sum*sum
|
||||||
srawi r3, r3, \DS ;# (sum*sum) >> DS
|
srlwi r3, r3, \DS ;# (sum*sum) >> DS
|
||||||
subf r3, r3, r4 ;# sse - ((sum*sum) >> DS)
|
subf r3, r3, r4 ;# sse - ((sum*sum) >> DS)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
stw r4, 0(r7) ;# sse
|
stw r4, 0(r7) ;# sse
|
||||||
|
|
||||||
mullw r3, r3, r3 ;# sum*sum
|
mullw r3, r3, r3 ;# sum*sum
|
||||||
srawi r3, r3, \DS ;# (sum*sum) >> 8
|
srlwi r3, r3, \DS ;# (sum*sum) >> 8
|
||||||
subf r3, r3, r4 ;# sse - ((sum*sum) >> 8)
|
subf r3, r3, r4 ;# sse - ((sum*sum) >> 8)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ vp8_variance4x4_ppc:
|
|||||||
stw r4, 0(r7) ;# sse
|
stw r4, 0(r7) ;# sse
|
||||||
|
|
||||||
mullw r3, r3, r3 ;# sum*sum
|
mullw r3, r3, r3 ;# sum*sum
|
||||||
srawi r3, r3, 4 ;# (sum*sum) >> 4
|
srlwi r3, r3, 4 ;# (sum*sum) >> 4
|
||||||
subf r3, r3, r4 ;# sse - ((sum*sum) >> 4)
|
subf r3, r3, r4 ;# sse - ((sum*sum) >> 4)
|
||||||
|
|
||||||
epilogue
|
epilogue
|
@@ -157,7 +157,7 @@
|
|||||||
stw r4, 0(r9) ;# sse
|
stw r4, 0(r9) ;# sse
|
||||||
|
|
||||||
mullw r3, r3, r3 ;# sum*sum
|
mullw r3, r3, r3 ;# sum*sum
|
||||||
srawi r3, r3, \DS ;# (sum*sum) >> 8
|
srlwi r3, r3, \DS ;# (sum*sum) >> 8
|
||||||
subf r3, r3, r4 ;# sse - ((sum*sum) >> 8)
|
subf r3, r3, r4 ;# sse - ((sum*sum) >> 8)
|
||||||
.endm
|
.endm
|
||||||
|
|
@@ -23,7 +23,8 @@ enum
|
|||||||
VP8D_DEBUG_TXT_RATE_INFO = 1<<6,
|
VP8D_DEBUG_TXT_RATE_INFO = 1<<6,
|
||||||
VP8D_DEBUG_DRAW_MV = 1<<7,
|
VP8D_DEBUG_DRAW_MV = 1<<7,
|
||||||
VP8D_DEBUG_CLR_BLK_MODES = 1<<8,
|
VP8D_DEBUG_CLR_BLK_MODES = 1<<8,
|
||||||
VP8D_DEBUG_CLR_FRM_REF_BLKS = 1<<9
|
VP8D_DEBUG_CLR_FRM_REF_BLKS = 1<<9,
|
||||||
|
VP8D_MFQE = 1<<10
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __INC_RECON_H
|
|
||||||
#define __INC_RECON_H
|
|
||||||
|
|
||||||
#include "blockd.h"
|
|
||||||
|
|
||||||
#define prototype_copy_block(sym) \
|
|
||||||
void sym(unsigned char *src, int src_pitch, unsigned char *dst, int dst_pitch)
|
|
||||||
|
|
||||||
#define prototype_recon_block(sym) \
|
|
||||||
void sym(unsigned char *pred, short *diff, int diff_stride, unsigned char *dst, int pitch)
|
|
||||||
|
|
||||||
#define prototype_recon_macroblock(sym) \
|
|
||||||
void sym(const struct vp8_recon_rtcd_vtable *rtcd, MACROBLOCKD *x)
|
|
||||||
|
|
||||||
#define prototype_build_intra_predictors(sym) \
|
|
||||||
void sym(MACROBLOCKD *x)
|
|
||||||
|
|
||||||
#define prototype_intra4x4_predict(sym) \
|
|
||||||
void sym(unsigned char *src, int src_stride, int b_mode, \
|
|
||||||
unsigned char *dst, int dst_stride)
|
|
||||||
|
|
||||||
struct vp8_recon_rtcd_vtable;
|
|
||||||
|
|
||||||
#if ARCH_X86 || ARCH_X86_64
|
|
||||||
#include "x86/recon_x86.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARCH_ARM
|
|
||||||
#include "arm/recon_arm.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef vp8_recon_copy16x16
|
|
||||||
#define vp8_recon_copy16x16 vp8_copy_mem16x16_c
|
|
||||||
#endif
|
|
||||||
extern prototype_copy_block(vp8_recon_copy16x16);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_copy8x8
|
|
||||||
#define vp8_recon_copy8x8 vp8_copy_mem8x8_c
|
|
||||||
#endif
|
|
||||||
extern prototype_copy_block(vp8_recon_copy8x8);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_copy8x4
|
|
||||||
#define vp8_recon_copy8x4 vp8_copy_mem8x4_c
|
|
||||||
#endif
|
|
||||||
extern prototype_copy_block(vp8_recon_copy8x4);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_build_intra_predictors_mby
|
|
||||||
#define vp8_recon_build_intra_predictors_mby vp8_build_intra_predictors_mby
|
|
||||||
#endif
|
|
||||||
extern prototype_build_intra_predictors\
|
|
||||||
(vp8_recon_build_intra_predictors_mby);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_build_intra_predictors_mby_s
|
|
||||||
#define vp8_recon_build_intra_predictors_mby_s vp8_build_intra_predictors_mby_s
|
|
||||||
#endif
|
|
||||||
extern prototype_build_intra_predictors\
|
|
||||||
(vp8_recon_build_intra_predictors_mby_s);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_build_intra_predictors_mbuv
|
|
||||||
#define vp8_recon_build_intra_predictors_mbuv vp8_build_intra_predictors_mbuv
|
|
||||||
#endif
|
|
||||||
extern prototype_build_intra_predictors\
|
|
||||||
(vp8_recon_build_intra_predictors_mbuv);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_build_intra_predictors_mbuv_s
|
|
||||||
#define vp8_recon_build_intra_predictors_mbuv_s vp8_build_intra_predictors_mbuv_s
|
|
||||||
#endif
|
|
||||||
extern prototype_build_intra_predictors\
|
|
||||||
(vp8_recon_build_intra_predictors_mbuv_s);
|
|
||||||
|
|
||||||
#ifndef vp8_recon_intra4x4_predict
|
|
||||||
#define vp8_recon_intra4x4_predict vp8_intra4x4_predict_c
|
|
||||||
#endif
|
|
||||||
extern prototype_intra4x4_predict\
|
|
||||||
(vp8_recon_intra4x4_predict);
|
|
||||||
|
|
||||||
|
|
||||||
typedef prototype_copy_block((*vp8_copy_block_fn_t));
|
|
||||||
typedef prototype_build_intra_predictors((*vp8_build_intra_pred_fn_t));
|
|
||||||
typedef prototype_intra4x4_predict((*vp8_intra4x4_pred_fn_t));
|
|
||||||
typedef struct vp8_recon_rtcd_vtable
|
|
||||||
{
|
|
||||||
vp8_copy_block_fn_t copy16x16;
|
|
||||||
vp8_copy_block_fn_t copy8x8;
|
|
||||||
vp8_copy_block_fn_t copy8x4;
|
|
||||||
|
|
||||||
vp8_build_intra_pred_fn_t build_intra_predictors_mby_s;
|
|
||||||
vp8_build_intra_pred_fn_t build_intra_predictors_mby;
|
|
||||||
vp8_build_intra_pred_fn_t build_intra_predictors_mbuv_s;
|
|
||||||
vp8_build_intra_pred_fn_t build_intra_predictors_mbuv;
|
|
||||||
vp8_intra4x4_pred_fn_t intra4x4_predict;
|
|
||||||
} vp8_recon_rtcd_vtable_t;
|
|
||||||
|
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
|
||||||
#define RECON_INVOKE(ctx,fn) (ctx)->fn
|
|
||||||
#else
|
|
||||||
#define RECON_INVOKE(ctx,fn) vp8_recon_##fn
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@@ -9,10 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vpx/vpx_integer.h"
|
#include "vpx/vpx_integer.h"
|
||||||
#include "recon.h"
|
|
||||||
#include "subpixel.h"
|
|
||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
#include "reconinter.h"
|
#include "reconinter.h"
|
||||||
#if CONFIG_RUNTIME_CPU_DETECT
|
#if CONFIG_RUNTIME_CPU_DETECT
|
||||||
@@ -123,25 +123,19 @@ void vp8_copy_mem8x4_c(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void vp8_build_inter_predictors_b(BLOCKD *d, int pitch, vp8_subpix_fn_t sppf)
|
void vp8_build_inter_predictors_b(BLOCKD *d, int pitch, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
unsigned char *ptr_base;
|
|
||||||
unsigned char *ptr;
|
|
||||||
unsigned char *pred_ptr = d->predictor;
|
unsigned char *pred_ptr = d->predictor;
|
||||||
|
unsigned char *ptr;
|
||||||
ptr_base = *(d->base_pre);
|
ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
||||||
|
|
||||||
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
||||||
{
|
{
|
||||||
ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
|
||||||
sppf(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, pred_ptr, pitch);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ptr_base += d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
|
||||||
ptr = ptr_base;
|
|
||||||
|
|
||||||
for (r = 0; r < 4; r++)
|
for (r = 0; r < 4; r++)
|
||||||
{
|
{
|
||||||
#if !(CONFIG_FAST_UNALIGNED)
|
#if !(CONFIG_FAST_UNALIGNED)
|
||||||
@@ -153,65 +147,53 @@ void vp8_build_inter_predictors_b(BLOCKD *d, int pitch, vp8_subpix_fn_t sppf)
|
|||||||
*(uint32_t *)pred_ptr = *(uint32_t *)ptr ;
|
*(uint32_t *)pred_ptr = *(uint32_t *)ptr ;
|
||||||
#endif
|
#endif
|
||||||
pred_ptr += pitch;
|
pred_ptr += pitch;
|
||||||
ptr += d->pre_stride;
|
ptr += pre_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride)
|
static void build_inter_predictors4b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride)
|
||||||
{
|
{
|
||||||
unsigned char *ptr_base;
|
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
|
ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
||||||
ptr_base = *(d->base_pre);
|
|
||||||
ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
|
||||||
|
|
||||||
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
||||||
{
|
{
|
||||||
x->subpixel_predict8x8(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
x->subpixel_predict8x8(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x8)(ptr, d->pre_stride, dst, dst_stride);
|
vp8_copy_mem8x8(ptr, pre_stride, dst, dst_stride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride)
|
static void build_inter_predictors2b(MACROBLOCKD *x, BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride)
|
||||||
{
|
{
|
||||||
unsigned char *ptr_base;
|
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
|
ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
||||||
ptr_base = *(d->base_pre);
|
|
||||||
ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
|
||||||
|
|
||||||
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
||||||
{
|
{
|
||||||
x->subpixel_predict8x4(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
x->subpixel_predict8x4(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x4)(ptr, d->pre_stride, dst, dst_stride);
|
vp8_copy_mem8x4(ptr, pre_stride, dst, dst_stride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_inter_predictors_b(BLOCKD *d, unsigned char *dst, int dst_stride, vp8_subpix_fn_t sppf)
|
static void build_inter_predictors_b(BLOCKD *d, unsigned char *dst, int dst_stride, unsigned char *base_pre, int pre_stride, vp8_subpix_fn_t sppf)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
unsigned char *ptr_base;
|
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
|
ptr = base_pre + d->offset + (d->bmi.mv.as_mv.row >> 3) * pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
||||||
ptr_base = *(d->base_pre);
|
|
||||||
|
|
||||||
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
if (d->bmi.mv.as_mv.row & 7 || d->bmi.mv.as_mv.col & 7)
|
||||||
{
|
{
|
||||||
ptr = ptr_base + d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
sppf(ptr, pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
||||||
sppf(ptr, d->pre_stride, d->bmi.mv.as_mv.col & 7, d->bmi.mv.as_mv.row & 7, dst, dst_stride);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ptr_base += d->pre + (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col >> 3);
|
|
||||||
ptr = ptr_base;
|
|
||||||
|
|
||||||
for (r = 0; r < 4; r++)
|
for (r = 0; r < 4; r++)
|
||||||
{
|
{
|
||||||
#if !(CONFIG_FAST_UNALIGNED)
|
#if !(CONFIG_FAST_UNALIGNED)
|
||||||
@@ -223,7 +205,7 @@ static void build_inter_predictors_b(BLOCKD *d, unsigned char *dst, int dst_stri
|
|||||||
*(uint32_t *)dst = *(uint32_t *)ptr ;
|
*(uint32_t *)dst = *(uint32_t *)ptr ;
|
||||||
#endif
|
#endif
|
||||||
dst += dst_stride;
|
dst += dst_stride;
|
||||||
ptr += d->pre_stride;
|
ptr += pre_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -239,22 +221,13 @@ void vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x)
|
|||||||
int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
|
int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
|
||||||
int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
|
int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
|
||||||
int offset;
|
int offset;
|
||||||
int pre_stride = x->block[16].pre_stride;
|
int pre_stride = x->pre.uv_stride;
|
||||||
|
|
||||||
/* calc uv motion vectors */
|
/* calc uv motion vectors */
|
||||||
if (mv_row < 0)
|
mv_row += 1 | (mv_row >> (sizeof(int) * CHAR_BIT - 1));
|
||||||
mv_row -= 1;
|
mv_col += 1 | (mv_col >> (sizeof(int) * CHAR_BIT - 1));
|
||||||
else
|
|
||||||
mv_row += 1;
|
|
||||||
|
|
||||||
if (mv_col < 0)
|
|
||||||
mv_col -= 1;
|
|
||||||
else
|
|
||||||
mv_col += 1;
|
|
||||||
|
|
||||||
mv_row /= 2;
|
mv_row /= 2;
|
||||||
mv_col /= 2;
|
mv_col /= 2;
|
||||||
|
|
||||||
mv_row &= x->fullpixel_mask;
|
mv_row &= x->fullpixel_mask;
|
||||||
mv_col &= x->fullpixel_mask;
|
mv_col &= x->fullpixel_mask;
|
||||||
|
|
||||||
@@ -269,8 +242,8 @@ void vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x8)(uptr, pre_stride, upred_ptr, 8);
|
vp8_copy_mem8x8(uptr, pre_stride, upred_ptr, 8);
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, pre_stride, vpred_ptr, 8);
|
vp8_copy_mem8x8(vptr, pre_stride, vpred_ptr, 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,6 +251,8 @@ void vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x)
|
|||||||
void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x)
|
void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
int pre_stride = x->pre.uv_stride;
|
||||||
|
unsigned char *base_pre;
|
||||||
|
|
||||||
/* build uv mvs */
|
/* build uv mvs */
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
@@ -295,8 +270,7 @@ void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x)
|
|||||||
+ x->block[yoffset+4].bmi.mv.as_mv.row
|
+ x->block[yoffset+4].bmi.mv.as_mv.row
|
||||||
+ x->block[yoffset+5].bmi.mv.as_mv.row;
|
+ x->block[yoffset+5].bmi.mv.as_mv.row;
|
||||||
|
|
||||||
if (temp < 0) temp -= 4;
|
temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3);
|
||||||
else temp += 4;
|
|
||||||
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
|
x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
|
||||||
|
|
||||||
@@ -305,54 +279,69 @@ void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x)
|
|||||||
+ x->block[yoffset+4].bmi.mv.as_mv.col
|
+ x->block[yoffset+4].bmi.mv.as_mv.col
|
||||||
+ x->block[yoffset+5].bmi.mv.as_mv.col;
|
+ x->block[yoffset+5].bmi.mv.as_mv.col;
|
||||||
|
|
||||||
if (temp < 0) temp -= 4;
|
temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3);
|
||||||
else temp += 4;
|
|
||||||
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
|
x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
|
||||||
|
|
||||||
x->block[voffset].bmi.mv.as_mv.row =
|
x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int;
|
||||||
x->block[uoffset].bmi.mv.as_mv.row ;
|
|
||||||
x->block[voffset].bmi.mv.as_mv.col =
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.col ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 16; i < 24; i += 2)
|
base_pre = x->pre.u_buffer;
|
||||||
|
for (i = 16; i < 20; i += 2)
|
||||||
{
|
{
|
||||||
BLOCKD *d0 = &x->block[i];
|
BLOCKD *d0 = &x->block[i];
|
||||||
BLOCKD *d1 = &x->block[i+1];
|
BLOCKD *d1 = &x->block[i+1];
|
||||||
|
|
||||||
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
||||||
build_inter_predictors2b(x, d0, d0->predictor, 8);
|
build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vp8_build_inter_predictors_b(d0, 8, x->subpixel_predict);
|
vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict);
|
||||||
vp8_build_inter_predictors_b(d1, 8, x->subpixel_predict);
|
vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base_pre = x->pre.v_buffer;
|
||||||
|
for (i = 20; i < 24; i += 2)
|
||||||
|
{
|
||||||
|
BLOCKD *d0 = &x->block[i];
|
||||||
|
BLOCKD *d1 = &x->block[i+1];
|
||||||
|
|
||||||
|
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
||||||
|
build_inter_predictors2b(x, d0, d0->predictor, 8, base_pre, pre_stride);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vp8_build_inter_predictors_b(d0, 8, base_pre, pre_stride, x->subpixel_predict);
|
||||||
|
vp8_build_inter_predictors_b(d1, 8, base_pre, pre_stride, x->subpixel_predict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*encoder only*/
|
/*encoder only*/
|
||||||
void vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x)
|
void vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x,
|
||||||
|
unsigned char *dst_y,
|
||||||
|
int dst_ystride)
|
||||||
{
|
{
|
||||||
unsigned char *ptr_base;
|
unsigned char *ptr_base;
|
||||||
unsigned char *ptr;
|
unsigned char *ptr;
|
||||||
unsigned char *pred_ptr = x->predictor;
|
|
||||||
int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
|
int mv_row = x->mode_info_context->mbmi.mv.as_mv.row;
|
||||||
int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
|
int mv_col = x->mode_info_context->mbmi.mv.as_mv.col;
|
||||||
int pre_stride = x->block[0].pre_stride;
|
int pre_stride = x->pre.y_stride;
|
||||||
|
|
||||||
ptr_base = x->pre.y_buffer;
|
ptr_base = x->pre.y_buffer;
|
||||||
ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
|
ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3);
|
||||||
|
|
||||||
if ((mv_row | mv_col) & 7)
|
if ((mv_row | mv_col) & 7)
|
||||||
{
|
{
|
||||||
x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7, pred_ptr, 16);
|
x->subpixel_predict16x16(ptr, pre_stride, mv_col & 7, mv_row & 7,
|
||||||
|
dst_y, dst_ystride);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy16x16)(ptr, pre_stride, pred_ptr, 16);
|
vp8_copy_mem16x16(ptr, pre_stride, dst_y,
|
||||||
|
dst_ystride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,7 +395,7 @@ void vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x,
|
|||||||
int_mv _16x16mv;
|
int_mv _16x16mv;
|
||||||
|
|
||||||
unsigned char *ptr_base = x->pre.y_buffer;
|
unsigned char *ptr_base = x->pre.y_buffer;
|
||||||
int pre_stride = x->block[0].pre_stride;
|
int pre_stride = x->pre.y_stride;
|
||||||
|
|
||||||
_16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int;
|
_16x16mv.as_int = x->mode_info_context->mbmi.mv.as_int;
|
||||||
|
|
||||||
@@ -423,23 +412,14 @@ void vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy16x16)(ptr, pre_stride, dst_y, dst_ystride);
|
vp8_copy_mem16x16(ptr, pre_stride, dst_y, dst_ystride);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calc uv motion vectors */
|
/* calc uv motion vectors */
|
||||||
if ( _16x16mv.as_mv.row < 0)
|
_16x16mv.as_mv.row += 1 | (_16x16mv.as_mv.row >> (sizeof(int) * CHAR_BIT - 1));
|
||||||
_16x16mv.as_mv.row -= 1;
|
_16x16mv.as_mv.col += 1 | (_16x16mv.as_mv.col >> (sizeof(int) * CHAR_BIT - 1));
|
||||||
else
|
|
||||||
_16x16mv.as_mv.row += 1;
|
|
||||||
|
|
||||||
if (_16x16mv.as_mv.col < 0)
|
|
||||||
_16x16mv.as_mv.col -= 1;
|
|
||||||
else
|
|
||||||
_16x16mv.as_mv.col += 1;
|
|
||||||
|
|
||||||
_16x16mv.as_mv.row /= 2;
|
_16x16mv.as_mv.row /= 2;
|
||||||
_16x16mv.as_mv.col /= 2;
|
_16x16mv.as_mv.col /= 2;
|
||||||
|
|
||||||
_16x16mv.as_mv.row &= x->fullpixel_mask;
|
_16x16mv.as_mv.row &= x->fullpixel_mask;
|
||||||
_16x16mv.as_mv.col &= x->fullpixel_mask;
|
_16x16mv.as_mv.col &= x->fullpixel_mask;
|
||||||
|
|
||||||
@@ -455,19 +435,21 @@ void vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x8)(uptr, pre_stride, dst_u, dst_uvstride);
|
vp8_copy_mem8x8(uptr, pre_stride, dst_u, dst_uvstride);
|
||||||
RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, pre_stride, dst_v, dst_uvstride);
|
vp8_copy_mem8x8(vptr, pre_stride, dst_v, dst_uvstride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_inter4x4_predictors_mb(MACROBLOCKD *x)
|
static void build_inter4x4_predictors_mb(MACROBLOCKD *x)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
unsigned char *base_dst = x->dst.y_buffer;
|
||||||
|
unsigned char *base_pre = x->pre.y_buffer;
|
||||||
|
|
||||||
if (x->mode_info_context->mbmi.partitioning < 3)
|
if (x->mode_info_context->mbmi.partitioning < 3)
|
||||||
{
|
{
|
||||||
BLOCKD *b;
|
BLOCKD *b;
|
||||||
int dst_stride = x->block[ 0].dst_stride;
|
int dst_stride = x->dst.y_stride;
|
||||||
|
|
||||||
x->block[ 0].bmi = x->mode_info_context->bmi[ 0];
|
x->block[ 0].bmi = x->mode_info_context->bmi[ 0];
|
||||||
x->block[ 2].bmi = x->mode_info_context->bmi[ 2];
|
x->block[ 2].bmi = x->mode_info_context->bmi[ 2];
|
||||||
@@ -482,13 +464,13 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
b = &x->block[ 0];
|
b = &x->block[ 0];
|
||||||
build_inter_predictors4b(x, b, *(b->base_dst) + b->dst, dst_stride);
|
build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
|
||||||
b = &x->block[ 2];
|
b = &x->block[ 2];
|
||||||
build_inter_predictors4b(x, b, *(b->base_dst) + b->dst, dst_stride);
|
build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
|
||||||
b = &x->block[ 8];
|
b = &x->block[ 8];
|
||||||
build_inter_predictors4b(x, b, *(b->base_dst) + b->dst, dst_stride);
|
build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
|
||||||
b = &x->block[10];
|
b = &x->block[10];
|
||||||
build_inter_predictors4b(x, b, *(b->base_dst) + b->dst, dst_stride);
|
build_inter_predictors4b(x, b, base_dst + b->offset, dst_stride, base_pre, dst_stride);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -496,7 +478,7 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
BLOCKD *d0 = &x->block[i];
|
BLOCKD *d0 = &x->block[i];
|
||||||
BLOCKD *d1 = &x->block[i+1];
|
BLOCKD *d1 = &x->block[i+1];
|
||||||
int dst_stride = x->block[ 0].dst_stride;
|
int dst_stride = x->dst.y_stride;
|
||||||
|
|
||||||
x->block[i+0].bmi = x->mode_info_context->bmi[i+0];
|
x->block[i+0].bmi = x->mode_info_context->bmi[i+0];
|
||||||
x->block[i+1].bmi = x->mode_info_context->bmi[i+1];
|
x->block[i+1].bmi = x->mode_info_context->bmi[i+1];
|
||||||
@@ -507,31 +489,51 @@ static void build_inter4x4_predictors_mb(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
||||||
build_inter_predictors2b(x, d0, *(d0->base_dst) + d0->dst, dst_stride);
|
build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
build_inter_predictors_b(d0, *(d0->base_dst) + d0->dst, dst_stride, x->subpixel_predict);
|
build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
build_inter_predictors_b(d1, *(d1->base_dst) + d1->dst, dst_stride, x->subpixel_predict);
|
build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
base_dst = x->dst.u_buffer;
|
||||||
for (i = 16; i < 24; i += 2)
|
base_pre = x->pre.u_buffer;
|
||||||
|
for (i = 16; i < 20; i += 2)
|
||||||
{
|
{
|
||||||
BLOCKD *d0 = &x->block[i];
|
BLOCKD *d0 = &x->block[i];
|
||||||
BLOCKD *d1 = &x->block[i+1];
|
BLOCKD *d1 = &x->block[i+1];
|
||||||
int dst_stride = x->block[ 16].dst_stride;
|
int dst_stride = x->dst.uv_stride;
|
||||||
|
|
||||||
/* Note: uv mvs already clamped in build_4x4uvmvs() */
|
/* Note: uv mvs already clamped in build_4x4uvmvs() */
|
||||||
|
|
||||||
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
||||||
build_inter_predictors2b(x, d0, *(d0->base_dst) + d0->dst, dst_stride);
|
build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
build_inter_predictors_b(d0, *(d0->base_dst) + d0->dst, dst_stride, x->subpixel_predict);
|
build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
build_inter_predictors_b(d1, *(d1->base_dst) + d1->dst, dst_stride, x->subpixel_predict);
|
build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base_dst = x->dst.v_buffer;
|
||||||
|
base_pre = x->pre.v_buffer;
|
||||||
|
for (i = 20; i < 24; i += 2)
|
||||||
|
{
|
||||||
|
BLOCKD *d0 = &x->block[i];
|
||||||
|
BLOCKD *d1 = &x->block[i+1];
|
||||||
|
int dst_stride = x->dst.uv_stride;
|
||||||
|
|
||||||
|
/* Note: uv mvs already clamped in build_4x4uvmvs() */
|
||||||
|
|
||||||
|
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
||||||
|
build_inter_predictors2b(x, d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
build_inter_predictors_b(d0, base_dst + d0->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
|
build_inter_predictors_b(d1, base_dst + d1->offset, dst_stride, base_pre, dst_stride, x->subpixel_predict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -556,8 +558,7 @@ void build_4x4uvmvs(MACROBLOCKD *x)
|
|||||||
+ x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row
|
+ x->mode_info_context->bmi[yoffset + 4].mv.as_mv.row
|
||||||
+ x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row;
|
+ x->mode_info_context->bmi[yoffset + 5].mv.as_mv.row;
|
||||||
|
|
||||||
if (temp < 0) temp -= 4;
|
temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3);
|
||||||
else temp += 4;
|
|
||||||
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
|
x->block[uoffset].bmi.mv.as_mv.row = (temp / 8) & x->fullpixel_mask;
|
||||||
|
|
||||||
@@ -566,18 +567,14 @@ void build_4x4uvmvs(MACROBLOCKD *x)
|
|||||||
+ x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col
|
+ x->mode_info_context->bmi[yoffset + 4].mv.as_mv.col
|
||||||
+ x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col;
|
+ x->mode_info_context->bmi[yoffset + 5].mv.as_mv.col;
|
||||||
|
|
||||||
if (temp < 0) temp -= 4;
|
temp += 4 + ((temp >> (sizeof(int) * CHAR_BIT - 1)) << 3);
|
||||||
else temp += 4;
|
|
||||||
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
|
x->block[uoffset].bmi.mv.as_mv.col = (temp / 8) & x->fullpixel_mask;
|
||||||
|
|
||||||
if (x->mode_info_context->mbmi.need_to_clamp_mvs)
|
if (x->mode_info_context->mbmi.need_to_clamp_mvs)
|
||||||
clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x);
|
clamp_uvmv_to_umv_border(&x->block[uoffset].bmi.mv.as_mv, x);
|
||||||
|
|
||||||
x->block[voffset].bmi.mv.as_mv.row =
|
x->block[voffset].bmi.mv.as_int = x->block[uoffset].bmi.mv.as_int;
|
||||||
x->block[uoffset].bmi.mv.as_mv.row ;
|
|
||||||
x->block[voffset].bmi.mv.as_mv.col =
|
|
||||||
x->block[uoffset].bmi.mv.as_mv.col ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -596,69 +593,3 @@ void vp8_build_inter_predictors_mb(MACROBLOCKD *xd)
|
|||||||
build_inter4x4_predictors_mb(xd);
|
build_inter4x4_predictors_mb(xd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* encoder only*/
|
|
||||||
static void build_inter4x4_predictors_mb_e(MACROBLOCKD *x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (x->mode_info_context->mbmi.partitioning < 3)
|
|
||||||
{
|
|
||||||
x->block[ 0].bmi = x->mode_info_context->bmi[ 0];
|
|
||||||
x->block[ 2].bmi = x->mode_info_context->bmi[ 2];
|
|
||||||
x->block[ 8].bmi = x->mode_info_context->bmi[ 8];
|
|
||||||
x->block[10].bmi = x->mode_info_context->bmi[10];
|
|
||||||
|
|
||||||
build_inter_predictors4b(x, &x->block[ 0], x->block[ 0].predictor, 16);
|
|
||||||
build_inter_predictors4b(x, &x->block[ 2], x->block[ 2].predictor, 16);
|
|
||||||
build_inter_predictors4b(x, &x->block[ 8], x->block[ 8].predictor, 16);
|
|
||||||
build_inter_predictors4b(x, &x->block[10], x->block[10].predictor, 16);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < 16; i += 2)
|
|
||||||
{
|
|
||||||
BLOCKD *d0 = &x->block[i];
|
|
||||||
BLOCKD *d1 = &x->block[i+1];
|
|
||||||
|
|
||||||
x->block[i+0].bmi = x->mode_info_context->bmi[i+0];
|
|
||||||
x->block[i+1].bmi = x->mode_info_context->bmi[i+1];
|
|
||||||
|
|
||||||
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
|
||||||
build_inter_predictors2b(x, d0, d0->predictor, 16);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
build_inter_predictors_b(d0, d0->predictor, 16, x->subpixel_predict);
|
|
||||||
build_inter_predictors_b(d1, d1->predictor, 16, x->subpixel_predict);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 16; i < 24; i += 2)
|
|
||||||
{
|
|
||||||
BLOCKD *d0 = &x->block[i];
|
|
||||||
BLOCKD *d1 = &x->block[i+1];
|
|
||||||
|
|
||||||
if (d0->bmi.mv.as_int == d1->bmi.mv.as_int)
|
|
||||||
build_inter_predictors2b(x, d0, d0->predictor, 8);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
build_inter_predictors_b(d0, d0->predictor, 8, x->subpixel_predict);
|
|
||||||
build_inter_predictors_b(d1, d1->predictor, 8, x->subpixel_predict);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void vp8_build_inter_predictors_mb_e(MACROBLOCKD *xd)
|
|
||||||
{
|
|
||||||
if (xd->mode_info_context->mbmi.mode != SPLITMV)
|
|
||||||
{
|
|
||||||
vp8_build_inter16x16_predictors_mb(xd, xd->predictor, &xd->predictor[256],
|
|
||||||
&xd->predictor[320], 16, 8);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
build_4x4uvmvs(xd);
|
|
||||||
build_inter4x4_predictors_mb_e(xd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -21,11 +21,15 @@ extern void vp8_build_inter16x16_predictors_mb(MACROBLOCKD *x,
|
|||||||
int dst_uvstride);
|
int dst_uvstride);
|
||||||
|
|
||||||
|
|
||||||
extern void vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x);
|
extern void vp8_build_inter16x16_predictors_mby(MACROBLOCKD *x,
|
||||||
extern void vp8_build_inter_predictors_b(BLOCKD *d, int pitch, vp8_subpix_fn_t sppf);
|
unsigned char *dst_y,
|
||||||
|
int dst_ystride);
|
||||||
|
extern void vp8_build_inter_predictors_b(BLOCKD *d, int pitch,
|
||||||
|
unsigned char *base_pre,
|
||||||
|
int pre_stride,
|
||||||
|
vp8_subpix_fn_t sppf);
|
||||||
|
|
||||||
extern void vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x);
|
extern void vp8_build_inter16x16_predictors_mbuv(MACROBLOCKD *x);
|
||||||
extern void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x);
|
extern void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *x);
|
||||||
extern void vp8_build_inter_predictors_mb_e(MACROBLOCKD *xd);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -10,147 +10,24 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#include "recon.h"
|
#include "vpx_rtcd.h"
|
||||||
#include "reconintra.h"
|
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
#include "blockd.h"
|
||||||
|
|
||||||
/* For skip_recon_mb(), add vp8_build_intra_predictors_mby_s(MACROBLOCKD *x) and
|
void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x,
|
||||||
* vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x).
|
unsigned char * yabove_row,
|
||||||
*/
|
unsigned char * yleft,
|
||||||
|
int left_stride,
|
||||||
void vp8_build_intra_predictors_mby(MACROBLOCKD *x)
|
unsigned char * ypred_ptr,
|
||||||
|
int y_stride)
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned char *yabove_row = x->dst.y_buffer - x->dst.y_stride;
|
|
||||||
unsigned char yleft_col[16];
|
unsigned char yleft_col[16];
|
||||||
unsigned char ytop_left = yabove_row[-1];
|
unsigned char ytop_left = yabove_row[-1];
|
||||||
unsigned char *ypred_ptr = x->predictor;
|
|
||||||
int r, c, i;
|
int r, c, i;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
yleft_col[i] = x->dst.y_buffer [i* x->dst.y_stride -1];
|
yleft_col[i] = yleft[i* left_stride];
|
||||||
}
|
|
||||||
|
|
||||||
/* for Y */
|
|
||||||
switch (x->mode_info_context->mbmi.mode)
|
|
||||||
{
|
|
||||||
case DC_PRED:
|
|
||||||
{
|
|
||||||
int expected_dc;
|
|
||||||
int i;
|
|
||||||
int shift;
|
|
||||||
int average = 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (x->up_available || x->left_available)
|
|
||||||
{
|
|
||||||
if (x->up_available)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
average += yabove_row[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x->left_available)
|
|
||||||
{
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
average += yleft_col[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
shift = 3 + x->up_available + x->left_available;
|
|
||||||
expected_dc = (average + (1 << (shift - 1))) >> shift;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
expected_dc = 128;
|
|
||||||
}
|
|
||||||
|
|
||||||
vpx_memset(ypred_ptr, expected_dc, 256);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case V_PRED:
|
|
||||||
{
|
|
||||||
|
|
||||||
for (r = 0; r < 16; r++)
|
|
||||||
{
|
|
||||||
|
|
||||||
((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
|
|
||||||
((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
|
|
||||||
((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
|
|
||||||
((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
|
|
||||||
ypred_ptr += 16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case H_PRED:
|
|
||||||
{
|
|
||||||
|
|
||||||
for (r = 0; r < 16; r++)
|
|
||||||
{
|
|
||||||
|
|
||||||
vpx_memset(ypred_ptr, yleft_col[r], 16);
|
|
||||||
ypred_ptr += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TM_PRED:
|
|
||||||
{
|
|
||||||
|
|
||||||
for (r = 0; r < 16; r++)
|
|
||||||
{
|
|
||||||
for (c = 0; c < 16; c++)
|
|
||||||
{
|
|
||||||
int pred = yleft_col[r] + yabove_row[ c] - ytop_left;
|
|
||||||
|
|
||||||
if (pred < 0)
|
|
||||||
pred = 0;
|
|
||||||
|
|
||||||
if (pred > 255)
|
|
||||||
pred = 255;
|
|
||||||
|
|
||||||
ypred_ptr[c] = pred;
|
|
||||||
}
|
|
||||||
|
|
||||||
ypred_ptr += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case B_PRED:
|
|
||||||
case NEARESTMV:
|
|
||||||
case NEARMV:
|
|
||||||
case ZEROMV:
|
|
||||||
case NEWMV:
|
|
||||||
case SPLITMV:
|
|
||||||
case MB_MODE_COUNT:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|
||||||
{
|
|
||||||
|
|
||||||
unsigned char *yabove_row = x->dst.y_buffer - x->dst.y_stride;
|
|
||||||
unsigned char yleft_col[16];
|
|
||||||
unsigned char ytop_left = yabove_row[-1];
|
|
||||||
unsigned char *ypred_ptr = x->predictor;
|
|
||||||
int r, c, i;
|
|
||||||
|
|
||||||
int y_stride = x->dst.y_stride;
|
|
||||||
ypred_ptr = x->dst.y_buffer; /*x->predictor;*/
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
yleft_col[i] = x->dst.y_buffer [i* x->dst.y_stride -1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for Y */
|
/* for Y */
|
||||||
@@ -198,7 +75,7 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|||||||
for (r = 0; r < 16; r++)
|
for (r = 0; r < 16; r++)
|
||||||
{
|
{
|
||||||
vpx_memset(ypred_ptr, expected_dc, 16);
|
vpx_memset(ypred_ptr, expected_dc, 16);
|
||||||
ypred_ptr += y_stride; /*16;*/
|
ypred_ptr += y_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -212,7 +89,7 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|||||||
((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
|
((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
|
||||||
((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
|
((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
|
||||||
((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
|
((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
|
||||||
ypred_ptr += y_stride; /*16;*/
|
ypred_ptr += y_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -223,7 +100,7 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
|
|
||||||
vpx_memset(ypred_ptr, yleft_col[r], 16);
|
vpx_memset(ypred_ptr, yleft_col[r], 16);
|
||||||
ypred_ptr += y_stride; /*16;*/
|
ypred_ptr += y_stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -246,7 +123,7 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|||||||
ypred_ptr[c] = pred;
|
ypred_ptr[c] = pred;
|
||||||
}
|
}
|
||||||
|
|
||||||
ypred_ptr += y_stride; /*16;*/
|
ypred_ptr += y_stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -262,162 +139,27 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_build_intra_predictors_mbuv(MACROBLOCKD *x)
|
void vp8_build_intra_predictors_mbuv_s_c(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)
|
||||||
{
|
{
|
||||||
unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride;
|
unsigned char uleft_col[8];
|
||||||
unsigned char uleft_col[16];
|
|
||||||
unsigned char utop_left = uabove_row[-1];
|
unsigned char utop_left = uabove_row[-1];
|
||||||
unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride;
|
unsigned char vleft_col[8];
|
||||||
unsigned char vleft_col[20];
|
|
||||||
unsigned char vtop_left = vabove_row[-1];
|
unsigned char vtop_left = vabove_row[-1];
|
||||||
unsigned char *upred_ptr = &x->predictor[256];
|
|
||||||
unsigned char *vpred_ptr = &x->predictor[320];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
|
|
||||||
vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (x->mode_info_context->mbmi.uv_mode)
|
|
||||||
{
|
|
||||||
case DC_PRED:
|
|
||||||
{
|
|
||||||
int expected_udc;
|
|
||||||
int expected_vdc;
|
|
||||||
int i;
|
|
||||||
int shift;
|
|
||||||
int Uaverage = 0;
|
|
||||||
int Vaverage = 0;
|
|
||||||
|
|
||||||
if (x->up_available)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
Uaverage += uabove_row[i];
|
|
||||||
Vaverage += vabove_row[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x->left_available)
|
|
||||||
{
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
Uaverage += uleft_col[i];
|
|
||||||
Vaverage += vleft_col[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!x->up_available && !x->left_available)
|
|
||||||
{
|
|
||||||
expected_udc = 128;
|
|
||||||
expected_vdc = 128;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
shift = 2 + x->up_available + x->left_available;
|
|
||||||
expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
|
|
||||||
expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
vpx_memset(upred_ptr, expected_udc, 64);
|
|
||||||
vpx_memset(vpred_ptr, expected_vdc, 64);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case V_PRED:
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
vpx_memcpy(upred_ptr, uabove_row, 8);
|
|
||||||
vpx_memcpy(vpred_ptr, vabove_row, 8);
|
|
||||||
upred_ptr += 8;
|
|
||||||
vpred_ptr += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case H_PRED:
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
vpx_memset(upred_ptr, uleft_col[i], 8);
|
|
||||||
vpx_memset(vpred_ptr, vleft_col[i], 8);
|
|
||||||
upred_ptr += 8;
|
|
||||||
vpred_ptr += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case TM_PRED:
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j < 8; j++)
|
|
||||||
{
|
|
||||||
int predu = uleft_col[i] + uabove_row[j] - utop_left;
|
|
||||||
int predv = vleft_col[i] + vabove_row[j] - vtop_left;
|
|
||||||
|
|
||||||
if (predu < 0)
|
|
||||||
predu = 0;
|
|
||||||
|
|
||||||
if (predu > 255)
|
|
||||||
predu = 255;
|
|
||||||
|
|
||||||
if (predv < 0)
|
|
||||||
predv = 0;
|
|
||||||
|
|
||||||
if (predv > 255)
|
|
||||||
predv = 255;
|
|
||||||
|
|
||||||
upred_ptr[j] = predu;
|
|
||||||
vpred_ptr[j] = predv;
|
|
||||||
}
|
|
||||||
|
|
||||||
upred_ptr += 8;
|
|
||||||
vpred_ptr += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case B_PRED:
|
|
||||||
case NEARESTMV:
|
|
||||||
case NEARMV:
|
|
||||||
case ZEROMV:
|
|
||||||
case NEWMV:
|
|
||||||
case SPLITMV:
|
|
||||||
case MB_MODE_COUNT:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x)
|
|
||||||
{
|
|
||||||
unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride;
|
|
||||||
unsigned char uleft_col[16];
|
|
||||||
unsigned char utop_left = uabove_row[-1];
|
|
||||||
unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride;
|
|
||||||
unsigned char vleft_col[20];
|
|
||||||
unsigned char vtop_left = vabove_row[-1];
|
|
||||||
unsigned char *upred_ptr = x->dst.u_buffer; /*&x->predictor[256];*/
|
|
||||||
unsigned char *vpred_ptr = x->dst.v_buffer; /*&x->predictor[320];*/
|
|
||||||
int uv_stride = x->dst.uv_stride;
|
|
||||||
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
|
uleft_col[i] = uleft [i* left_stride];
|
||||||
vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
|
vleft_col[i] = vleft [i* left_stride];
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (x->mode_info_context->mbmi.uv_mode)
|
switch (x->mode_info_context->mbmi.uv_mode)
|
||||||
@@ -468,8 +210,8 @@ void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
vpx_memset(upred_ptr, expected_udc, 8);
|
vpx_memset(upred_ptr, expected_udc, 8);
|
||||||
vpx_memset(vpred_ptr, expected_vdc, 8);
|
vpx_memset(vpred_ptr, expected_vdc, 8);
|
||||||
upred_ptr += uv_stride; /*8;*/
|
upred_ptr += pred_stride;
|
||||||
vpred_ptr += uv_stride; /*8;*/
|
vpred_ptr += pred_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -481,8 +223,8 @@ void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
vpx_memcpy(upred_ptr, uabove_row, 8);
|
vpx_memcpy(upred_ptr, uabove_row, 8);
|
||||||
vpx_memcpy(vpred_ptr, vabove_row, 8);
|
vpx_memcpy(vpred_ptr, vabove_row, 8);
|
||||||
upred_ptr += uv_stride; /*8;*/
|
upred_ptr += pred_stride;
|
||||||
vpred_ptr += uv_stride; /*8;*/
|
vpred_ptr += pred_stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -495,8 +237,8 @@ void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x)
|
|||||||
{
|
{
|
||||||
vpx_memset(upred_ptr, uleft_col[i], 8);
|
vpx_memset(upred_ptr, uleft_col[i], 8);
|
||||||
vpx_memset(vpred_ptr, vleft_col[i], 8);
|
vpx_memset(vpred_ptr, vleft_col[i], 8);
|
||||||
upred_ptr += uv_stride; /*8;*/
|
upred_ptr += pred_stride;
|
||||||
vpred_ptr += uv_stride; /*8;*/
|
vpred_ptr += pred_stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,8 +270,8 @@ void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x)
|
|||||||
vpred_ptr[j] = predv;
|
vpred_ptr[j] = predv;
|
||||||
}
|
}
|
||||||
|
|
||||||
upred_ptr += uv_stride; /*8;*/
|
upred_ptr += pred_stride;
|
||||||
vpred_ptr += uv_stride; /*8;*/
|
vpred_ptr += pred_stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user