Compare commits
12 Commits
v0.9.6
...
sandbox/ho
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3cf0ef4593 | ||
![]() |
0909b83427 | ||
![]() |
62da6700dc | ||
![]() |
98ea0d71a4 | ||
![]() |
8d49ea12c2 | ||
![]() |
766ad7edb6 | ||
![]() |
20431c1354 | ||
![]() |
1b913c1f78 | ||
![]() |
a64b37fdbc | ||
![]() |
a2951d8deb | ||
![]() |
83a2b4e114 | ||
![]() |
1422ce5cff |
2
.mailmap
2
.mailmap
@@ -1,4 +1,2 @@
|
|||||||
Adrian Grange <agrange@google.com>
|
Adrian Grange <agrange@google.com>
|
||||||
Johann Koenig <johannkoenig@google.com>
|
Johann Koenig <johannkoenig@google.com>
|
||||||
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
|
|
||||||
Tom Finegan <tomfinegan@google.com>
|
|
||||||
|
9
AUTHORS
9
AUTHORS
@@ -4,18 +4,13 @@
|
|||||||
Aaron Watry <awatry@gmail.com>
|
Aaron Watry <awatry@gmail.com>
|
||||||
Adrian Grange <agrange@google.com>
|
Adrian Grange <agrange@google.com>
|
||||||
Alex Converse <alex.converse@gmail.com>
|
Alex Converse <alex.converse@gmail.com>
|
||||||
Andoni Morales Alastruey <ylatuya@gmail.com>
|
|
||||||
Andres Mejia <mcitadel@gmail.com>
|
Andres Mejia <mcitadel@gmail.com>
|
||||||
Attila Nagy <attilanagy@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>
|
||||||
Fritz Koenig <frkoenig@google.com>
|
Fritz Koenig <frkoenig@google.com>
|
||||||
Gaute Strokkenes <gaute.strokkenes@broadcom.com>
|
|
||||||
Giuseppe Scrivano <gscrivano@gnu.org>
|
Giuseppe Scrivano <gscrivano@gnu.org>
|
||||||
Guillermo Ballester Valor <gbvalor@gmail.com>
|
Guillermo Ballester Valor <gbvalor@gmail.com>
|
||||||
Henrik Lundin <hlundin@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 Muizelaar <jmuizelaar@mozilla.com>
|
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
||||||
@@ -28,14 +23,10 @@ Luca Barbato <lu_zero@gentoo.org>
|
|||||||
Makoto Kato <makoto.kt@gmail.com>
|
Makoto Kato <makoto.kt@gmail.com>
|
||||||
Martin Ettl <ettl.martin78@googlemail.com>
|
Martin Ettl <ettl.martin78@googlemail.com>
|
||||||
Michael Kohler <michaelkohler@live.com>
|
Michael Kohler <michaelkohler@live.com>
|
||||||
Mikhal Shemer <mikhal@google.com>
|
|
||||||
Pascal Massimino <pascal.massimino@gmail.com>
|
|
||||||
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>
|
||||||
Scott LaVarnway <slavarnway@google.com>
|
Scott LaVarnway <slavarnway@google.com>
|
||||||
Tero Rintaluoma <teror@google.com>
|
|
||||||
Timothy B. Terriberry <tterribe@xiph.org>
|
Timothy B. Terriberry <tterribe@xiph.org>
|
||||||
Tom Finegan <tomfinegan@google.com>
|
Tom Finegan <tomfinegan@google.com>
|
||||||
Yaowu Xu <yaowu@google.com>
|
Yaowu Xu <yaowu@google.com>
|
||||||
|
77
CHANGELOG
77
CHANGELOG
@@ -1,80 +1,3 @@
|
|||||||
2011-03-07 v0.9.6 "Bali"
|
|
||||||
Our second named release, focused on a faster, higher quality, encoder.
|
|
||||||
|
|
||||||
- Upgrading:
|
|
||||||
This release is backwards compatible with Aylesbury (v0.9.5). Users
|
|
||||||
of older releases should refer to the Upgrading notes in this
|
|
||||||
document for that release.
|
|
||||||
|
|
||||||
- Enhancements:
|
|
||||||
vpxenc --psnr shows a summary when encode completes
|
|
||||||
--tune=ssim option to enable activity masking
|
|
||||||
improved postproc visualizations for development
|
|
||||||
updated support for Apple iOS to SDK 4.2
|
|
||||||
query decoder to determine which reference frames were updated
|
|
||||||
implemented error tracking in the decoder
|
|
||||||
fix pipe support on windows
|
|
||||||
|
|
||||||
- Speed:
|
|
||||||
Primary focus was on good quality mode, speed 0. Average improvement
|
|
||||||
on x86 about 40%, up to 100% on user-generated content at that speed.
|
|
||||||
Best quality mode speed improved 35%, and realtime speed 10-20%. This
|
|
||||||
release also saw significant improvement in realtime encoding speed
|
|
||||||
on ARM platforms.
|
|
||||||
|
|
||||||
Improved encoder threading
|
|
||||||
Dont pick encoder filter level when loopfilter is disabled.
|
|
||||||
Avoid double copying of key frames into alt and golden buffer
|
|
||||||
FDCT optimizations.
|
|
||||||
x86 sse2 temporal filter
|
|
||||||
SSSE3 version of fast quantizer
|
|
||||||
vp8_rd_pick_best_mbsegmentation code restructure
|
|
||||||
Adjusted breakout RD for SPLITMV
|
|
||||||
Changed segmentation check order
|
|
||||||
Improved rd_pick_intra4x4block
|
|
||||||
Adds armv6 optimized variance calculation
|
|
||||||
ARMv6 optimized sad16x16
|
|
||||||
ARMv6 optimized half pixel variance calculations
|
|
||||||
Full search SAD function optimization in SSE4.1
|
|
||||||
Improve MV prediction accuracy to achieve performance gain
|
|
||||||
Improve MV prediction in vp8_pick_inter_mode() for speed>3
|
|
||||||
|
|
||||||
- Quality:
|
|
||||||
Best quality mode improved PSNR 6.3%, and SSIM 6.1%. This release
|
|
||||||
also includes support for "activity masking," which greatly improves
|
|
||||||
SSIM at the expense of PSNR. For now, this feature is available with
|
|
||||||
the --tune=ssim option. Further experimentation in this area
|
|
||||||
is ongoing. This release also introduces a new rate control mode
|
|
||||||
called "CQ," which changes the allocation of bits within a clip to
|
|
||||||
the sections where they will have the most visual impact.
|
|
||||||
|
|
||||||
Tuning for the more exact quantizer.
|
|
||||||
Relax rate control for last few frames
|
|
||||||
CQ Mode
|
|
||||||
Limit key frame quantizer for forced key frames.
|
|
||||||
KF/GF Pulsing
|
|
||||||
Add simple version of activity masking.
|
|
||||||
make rdmult adaptive for intra in quantizer RDO
|
|
||||||
cap the best quantizer for 2nd order DC
|
|
||||||
change the threshold of DC check for encode breakout
|
|
||||||
|
|
||||||
- Bug Fixes:
|
|
||||||
Fix crash on Sparc Solaris.
|
|
||||||
Fix counter of fixed keyframe distance
|
|
||||||
ARNR filter pointer update bug fix
|
|
||||||
Fixed use of motion percentage in KF/GF group calc
|
|
||||||
Changed condition for using RD in Intra Mode
|
|
||||||
Fix encoder real-time only configuration.
|
|
||||||
Fix ARM encoder crash with multiple token partitions
|
|
||||||
Fixed bug first cluster timecode of webm file is wrong.
|
|
||||||
Fixed various encoder bugs with odd-sized images
|
|
||||||
vp8e_get_preview fixed when spatial resampling enabled
|
|
||||||
quantizer: fix assertion in fast quantizer path
|
|
||||||
Allocate source buffers to be multiples of 16
|
|
||||||
Fix for manual Golden frame frequency
|
|
||||||
Fix drastic undershoot in long form content
|
|
||||||
|
|
||||||
|
|
||||||
2010-10-28 v0.9.5 "Aylesbury"
|
2010-10-28 v0.9.5 "Aylesbury"
|
||||||
Our first named release, focused on a faster decoder, and a better encoder.
|
Our first named release, focused on a faster decoder, and a better encoder.
|
||||||
|
|
||||||
|
4
README
4
README
@@ -45,14 +45,18 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
|||||||
armv5te-linux-rvct
|
armv5te-linux-rvct
|
||||||
armv5te-linux-gcc
|
armv5te-linux-gcc
|
||||||
armv5te-symbian-gcc
|
armv5te-symbian-gcc
|
||||||
|
armv5te-wince-vs8
|
||||||
armv6-darwin-gcc
|
armv6-darwin-gcc
|
||||||
armv6-linux-rvct
|
armv6-linux-rvct
|
||||||
armv6-linux-gcc
|
armv6-linux-gcc
|
||||||
armv6-symbian-gcc
|
armv6-symbian-gcc
|
||||||
|
armv6-wince-vs8
|
||||||
iwmmxt-linux-rvct
|
iwmmxt-linux-rvct
|
||||||
iwmmxt-linux-gcc
|
iwmmxt-linux-gcc
|
||||||
|
iwmmxt-wince-vs8
|
||||||
iwmmxt2-linux-rvct
|
iwmmxt2-linux-rvct
|
||||||
iwmmxt2-linux-gcc
|
iwmmxt2-linux-gcc
|
||||||
|
iwmmxt2-wince-vs8
|
||||||
armv7-linux-rvct
|
armv7-linux-rvct
|
||||||
armv7-linux-gcc
|
armv7-linux-gcc
|
||||||
mips32-linux-gcc
|
mips32-linux-gcc
|
||||||
|
20
build/arm-wince-vs8/armasmv5.rules
Normal file
20
build/arm-wince-vs8/armasmv5.rules
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<VisualStudioToolFile
|
||||||
|
Name="armasm"
|
||||||
|
Version="8.00"
|
||||||
|
>
|
||||||
|
<Rules>
|
||||||
|
<CustomBuildRule
|
||||||
|
Name="ARMASM"
|
||||||
|
DisplayName="Armasm Assembler"
|
||||||
|
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 5
"
|
||||||
|
Outputs="$(IntDir)\$(InputName).obj"
|
||||||
|
FileExtensions="*.asm"
|
||||||
|
ExecutionDescription="Assembling $(InputName).asm"
|
||||||
|
ShowOnlyRuleProperties="false"
|
||||||
|
>
|
||||||
|
<Properties>
|
||||||
|
</Properties>
|
||||||
|
</CustomBuildRule>
|
||||||
|
</Rules>
|
||||||
|
</VisualStudioToolFile>
|
20
build/arm-wince-vs8/armasmv6.rules
Normal file
20
build/arm-wince-vs8/armasmv6.rules
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<VisualStudioToolFile
|
||||||
|
Name="armasm"
|
||||||
|
Version="8.00"
|
||||||
|
>
|
||||||
|
<Rules>
|
||||||
|
<CustomBuildRule
|
||||||
|
Name="ARMASM"
|
||||||
|
DisplayName="Armasm Assembler"
|
||||||
|
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 6
"
|
||||||
|
Outputs="$(IntDir)\$(InputName).obj"
|
||||||
|
FileExtensions="*.asm"
|
||||||
|
ExecutionDescription="Assembling $(InputName).asm"
|
||||||
|
ShowOnlyRuleProperties="false"
|
||||||
|
>
|
||||||
|
<Properties>
|
||||||
|
</Properties>
|
||||||
|
</CustomBuildRule>
|
||||||
|
</Rules>
|
||||||
|
</VisualStudioToolFile>
|
20
build/arm-wince-vs8/armasmxscale.rules
Normal file
20
build/arm-wince-vs8/armasmxscale.rules
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<VisualStudioToolFile
|
||||||
|
Name="armasm"
|
||||||
|
Version="8.00"
|
||||||
|
>
|
||||||
|
<Rules>
|
||||||
|
<CustomBuildRule
|
||||||
|
Name="ARMASM"
|
||||||
|
DisplayName="Armasm Assembler"
|
||||||
|
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -cpu XSCALE
"
|
||||||
|
Outputs="$(IntDir)\$(InputName).obj"
|
||||||
|
FileExtensions="*.asm"
|
||||||
|
ExecutionDescription="Assembling $(InputName).asm"
|
||||||
|
ShowOnlyRuleProperties="false"
|
||||||
|
>
|
||||||
|
<Properties>
|
||||||
|
</Properties>
|
||||||
|
</CustomBuildRule>
|
||||||
|
</Rules>
|
||||||
|
</VisualStudioToolFile>
|
13
build/arm-wince-vs8/obj_int_extract.bat
Normal file
13
build/arm-wince-vs8/obj_int_extract.bat
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
@echo off
|
||||||
|
REM Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
REM
|
||||||
|
REM Use of this source code is governed by a BSD-style license
|
||||||
|
REM that can be found in the LICENSE file in the root of the source
|
||||||
|
REM tree. An additional intellectual property rights grant can be found
|
||||||
|
REM in the file PATENTS. All contributing project authors may
|
||||||
|
REM be found in the AUTHORS file in the root of the source tree.
|
||||||
|
echo on
|
||||||
|
|
||||||
|
|
||||||
|
cl /I ".\\" /I "..\vp6_decoder_sdk" /I "..\vp6_decoder_sdk\vpx_ports" /D "NDEBUG" /D "_WIN32_WCE=0x420" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "_LIB" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"Pocket_PC_2003__ARMV4_\%1/" /Fd"Pocket_PC_2003__ARMV4_\%1/vc80.pdb" /W3 /nologo /c /TC ..\vp6_decoder_sdk\vp6_decoder\algo\common\arm\dec_asm_offsets_arm.c
|
||||||
|
obj_int_extract.exe rvds "Pocket_PC_2003__ARMV4_\%1/dec_asm_offsets_arm.obj"
|
88
build/arm-wince-vs8/vpx.sln
Normal file
88
build/arm-wince-vs8/vpx.sln
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example.vcproj", "{BA5FE66F-38DD-E034-F542-B1578C5FB950}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obj_int_extract", "obj_int_extract.vcproj", "{E1360C65-D375-4335-8057-7ED99CC3F9B2}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpx", "vpx.vcproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xma", "xma.vcproj", "{A955FC4A-73F1-44F7-135E-30D84D32F022}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Mixed Platforms = Debug|Mixed Platforms
|
||||||
|
Debug|Pocket PC 2003 (ARMV4) = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Mixed Platforms = Release|Mixed Platforms
|
||||||
|
Release|Pocket PC 2003 (ARMV4) = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.Build.0 = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
@@ -17,17 +17,15 @@ for i; do
|
|||||||
on_of=1
|
on_of=1
|
||||||
elif [ "$i" == "-v" ]; then
|
elif [ "$i" == "-v" ]; then
|
||||||
verbose=1
|
verbose=1
|
||||||
elif [ "$i" == "-g" ]; then
|
|
||||||
args="${args} --debug"
|
|
||||||
elif [ "$on_of" == "1" ]; then
|
elif [ "$on_of" == "1" ]; then
|
||||||
outfile=$i
|
outfile=$i
|
||||||
on_of=0
|
on_of=0
|
||||||
elif [ -f "$i" ]; then
|
elif [ -f "$i" ]; then
|
||||||
infiles="$infiles $i"
|
infiles="$infiles $i"
|
||||||
elif [ "${i:0:2}" == "-l" ]; then
|
elif [ "${i:0:2}" == "-l" ]; then
|
||||||
libs="$libs ${i#-l}"
|
libs="$libs ${i#-l}"
|
||||||
elif [ "${i:0:2}" == "-L" ]; then
|
elif [ "${i:0:2}" == "-L" ]; then
|
||||||
libpaths="${libpaths} ${i#-L}"
|
libpaths="${libpaths} ${i#-L}"
|
||||||
else
|
else
|
||||||
args="${args} ${i}"
|
args="${args} ${i}"
|
||||||
fi
|
fi
|
||||||
|
@@ -78,7 +78,6 @@ Build options:
|
|||||||
--log=yes|no|FILE file configure log is written to [config.err]
|
--log=yes|no|FILE file configure log is written to [config.err]
|
||||||
--target=TARGET target platform tuple [generic-gnu]
|
--target=TARGET target platform tuple [generic-gnu]
|
||||||
--cpu=CPU optimize for a specific cpu rather than a family
|
--cpu=CPU optimize for a specific cpu rather than a family
|
||||||
--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS]
|
|
||||||
${toggle_extra_warnings} emit harmless warnings (always non-fatal)
|
${toggle_extra_warnings} emit harmless warnings (always non-fatal)
|
||||||
${toggle_werror} treat warnings as errors, if possible
|
${toggle_werror} treat warnings as errors, if possible
|
||||||
(not available with all compilers)
|
(not available with all compilers)
|
||||||
@@ -443,9 +442,6 @@ process_common_cmdline() {
|
|||||||
;;
|
;;
|
||||||
--cpu=*) tune_cpu="$optval"
|
--cpu=*) tune_cpu="$optval"
|
||||||
;;
|
;;
|
||||||
--extra-cflags=*)
|
|
||||||
extra_cflags="${optval}"
|
|
||||||
;;
|
|
||||||
--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
|
echo "${CMDLINE_SELECT} ${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null || die_unknown $opt
|
||||||
@@ -624,10 +620,6 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Handle Solaris variants. Solaris 10 needs -lposix4
|
# Handle Solaris variants. Solaris 10 needs -lposix4
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
sparc-solaris-*)
|
|
||||||
add_extralibs -lposix4
|
|
||||||
add_cflags "-DMUST_BE_ALIGNED"
|
|
||||||
;;
|
|
||||||
*-solaris-*)
|
*-solaris-*)
|
||||||
add_extralibs -lposix4
|
add_extralibs -lposix4
|
||||||
;;
|
;;
|
||||||
@@ -668,12 +660,12 @@ process_common_toolchain() {
|
|||||||
elif enabled armv7
|
elif enabled armv7
|
||||||
then
|
then
|
||||||
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize
|
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize
|
||||||
check_add_asflags -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-march=armv7-a
|
check_add_asflags -mcpu=cortex-a8 -mfpu=neon -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}
|
||||||
fi
|
fi
|
||||||
enabled debug && add_asflags -g
|
|
||||||
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
|
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
|
||||||
;;
|
;;
|
||||||
rvct)
|
rvct)
|
||||||
@@ -698,24 +690,16 @@ process_common_toolchain() {
|
|||||||
arch_int=${tgt_isa##armv}
|
arch_int=${tgt_isa##armv}
|
||||||
arch_int=${arch_int%%te}
|
arch_int=${arch_int%%te}
|
||||||
check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
|
check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
|
||||||
enabled debug && add_asflags -g
|
|
||||||
add_cflags --gnu
|
|
||||||
add_cflags --enum_is_int
|
|
||||||
add_cflags --wchar32
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case ${tgt_os} in
|
case ${tgt_os} in
|
||||||
none*)
|
|
||||||
disable multithread
|
|
||||||
disable os_support
|
|
||||||
;;
|
|
||||||
darwin*)
|
darwin*)
|
||||||
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
|
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
|
||||||
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-darwin9-gcc-4.2.1
|
||||||
AS=${TOOLCHAIN_PATH}/as
|
AS=${TOOLCHAIN_PATH}/as
|
||||||
STRIP=${TOOLCHAIN_PATH}/strip
|
STRIP=${TOOLCHAIN_PATH}/strip
|
||||||
NM=${TOOLCHAIN_PATH}/nm
|
NM=${TOOLCHAIN_PATH}/nm
|
||||||
@@ -729,14 +713,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 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk"
|
add_cflags "-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk"
|
||||||
|
|
||||||
# This should be overridable
|
# This should be overridable
|
||||||
alt_libc=${SDK_PATH}/SDKs/iPhoneOS4.2.sdk
|
alt_libc=${SDK_PATH}/SDKs/iPhoneOS3.1.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.0/; do
|
# for d in usr/include usr/include/gcc/darwin/4.0/; do
|
||||||
for d in usr/include usr/include/gcc/darwin/4.0/ usr/lib/gcc/arm-apple-darwin10/4.2.1/include/; do
|
for d in usr/include usr/include/gcc/darwin/4.0/ usr/lib/gcc/arm-apple-darwin9/4.0.1/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
|
||||||
@@ -758,9 +742,13 @@ process_common_toolchain() {
|
|||||||
|| die "Must supply --libc when targetting *-linux-rvct"
|
|| die "Must supply --libc when targetting *-linux-rvct"
|
||||||
|
|
||||||
# Set up compiler
|
# Set up compiler
|
||||||
|
add_cflags --gnu
|
||||||
|
add_cflags --enum_is_int
|
||||||
add_cflags --library_interface=aeabi_glibc
|
add_cflags --library_interface=aeabi_glibc
|
||||||
add_cflags --no_hide_all
|
add_cflags --no_hide_all
|
||||||
|
add_cflags --wchar32
|
||||||
add_cflags --dwarf2
|
add_cflags --dwarf2
|
||||||
|
add_cflags --gnu
|
||||||
|
|
||||||
# Set up linker
|
# Set up linker
|
||||||
add_ldflags --sysv --no_startup --no_ref_cpp_init
|
add_ldflags --sysv --no_startup --no_ref_cpp_init
|
||||||
@@ -867,7 +855,7 @@ process_common_toolchain() {
|
|||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
add_cflags -use-msasm -use-asm
|
add_cflags -use-msasm -use-asm
|
||||||
add_ldflags -i-static
|
add_ldflags -i-static
|
||||||
enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE2 -axSSE2
|
enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE3 -axSSE3
|
||||||
enabled x86_64 && AR=xiar
|
enabled x86_64 && AR=xiar
|
||||||
case ${tune_cpu} in
|
case ${tune_cpu} in
|
||||||
atom*)
|
atom*)
|
||||||
@@ -984,12 +972,6 @@ EOF
|
|||||||
add_cflags -D_LARGEFILE_SOURCE
|
add_cflags -D_LARGEFILE_SOURCE
|
||||||
add_cflags -D_FILE_OFFSET_BITS=64
|
add_cflags -D_FILE_OFFSET_BITS=64
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# append any user defined extra cflags
|
|
||||||
if [ -n "${extra_cflags}" ] ; then
|
|
||||||
check_add_cflags ${extra_cflags} || \
|
|
||||||
die "Requested extra CFLAGS '${extra_cflags}' not supported by compiler"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
process_toolchain() {
|
process_toolchain() {
|
||||||
|
@@ -32,7 +32,7 @@ Options:
|
|||||||
--name=project_name Name of the project (required)
|
--name=project_name Name of the project (required)
|
||||||
--proj-guid=GUID GUID to use for the project
|
--proj-guid=GUID GUID to use for the project
|
||||||
--module-def=filename File containing export definitions (for DLLs)
|
--module-def=filename File containing export definitions (for DLLs)
|
||||||
--ver=version Version (7,8,9) of visual studio to generate for
|
--ver=version Version (7,8) of visual studio to generate for
|
||||||
-Ipath/to/include Additional include directories
|
-Ipath/to/include Additional include directories
|
||||||
-DFLAG[=value] Preprocessor macros to define
|
-DFLAG[=value] Preprocessor macros to define
|
||||||
-Lpath/to/lib Additional library search paths
|
-Lpath/to/lib Additional library search paths
|
||||||
@@ -132,7 +132,7 @@ generate_filter() {
|
|||||||
open_tag Filter \
|
open_tag Filter \
|
||||||
Name=$name \
|
Name=$name \
|
||||||
Filter=$pats \
|
Filter=$pats \
|
||||||
UniqueIdentifier=`generate_uuid` \
|
UniqueIdentifier=`generate_uuid`
|
||||||
|
|
||||||
file_list_sz=${#file_list[@]}
|
file_list_sz=${#file_list[@]}
|
||||||
for i in ${!file_list[@]}; do
|
for i in ${!file_list[@]}; do
|
||||||
@@ -145,21 +145,31 @@ generate_filter() {
|
|||||||
if [ "$pat" == "asm" ] && $asm_use_custom_step; then
|
if [ "$pat" == "asm" ] && $asm_use_custom_step; then
|
||||||
for plat in "${platforms[@]}"; do
|
for plat in "${platforms[@]}"; do
|
||||||
for cfg in Debug Release; do
|
for cfg in Debug Release; do
|
||||||
open_tag FileConfiguration \
|
open_tag FileConfiguration \
|
||||||
Name="${cfg}|${plat}" \
|
Name="${cfg}|${plat}"
|
||||||
|
|
||||||
tag Tool \
|
tag Tool \
|
||||||
Name="VCCustomBuildTool" \
|
Name="VCCustomBuildTool" \
|
||||||
Description="Assembling \$(InputFileName)" \
|
Description="Assembling \$(InputFileName)" \
|
||||||
CommandLine="$(eval echo \$asm_${cfg}_cmdline)" \
|
CommandLine="$(eval echo \$asm_${cfg}_cmdline)"\
|
||||||
Outputs="\$(InputName).obj" \
|
Outputs="\$(InputName).obj"
|
||||||
|
|
||||||
close_tag FileConfiguration
|
close_tag FileConfiguration
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
close_tag File
|
if [ "${f##*.}" == "cpp" ]; then
|
||||||
|
for plat in "${platforms[@]}"; do
|
||||||
|
for cfg in Debug Release; do
|
||||||
|
open_tag FileConfiguration \
|
||||||
|
Name="${cfg}|${plat}"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
CompileAs="2"
|
||||||
|
close_tag FileConfiguration
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
close_tag File
|
||||||
|
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@@ -175,61 +185,57 @@ unset target
|
|||||||
for opt in "$@"; do
|
for opt in "$@"; do
|
||||||
optval="${opt#*=}"
|
optval="${opt#*=}"
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
--help|-h) show_help
|
--help|-h) show_help
|
||||||
;;
|
;;
|
||||||
--target=*) target="${optval}"
|
--target=*) target="${optval}"
|
||||||
;;
|
;;
|
||||||
--out=*) outfile="$optval"
|
--out=*) outfile="$optval"
|
||||||
;;
|
;;
|
||||||
--name=*) name="${optval}"
|
--name=*) name="${optval}"
|
||||||
;;
|
;;
|
||||||
--proj-guid=*) guid="${optval}"
|
--proj-guid=*) guid="${optval}"
|
||||||
;;
|
;;
|
||||||
--module-def=*) link_opts="${link_opts} ModuleDefinitionFile=${optval}"
|
--module-def=*)
|
||||||
;;
|
link_opts="${link_opts} ModuleDefinitionFile=${optval}"
|
||||||
--exe) proj_kind="exe"
|
;;
|
||||||
;;
|
--exe) proj_kind="exe"
|
||||||
--lib) proj_kind="lib"
|
;;
|
||||||
;;
|
--lib) proj_kind="lib"
|
||||||
--static-crt) use_static_runtime=true
|
;;
|
||||||
;;
|
--static-crt) use_static_runtime=true
|
||||||
--ver=*)
|
;;
|
||||||
vs_ver="$optval"
|
--ver=*) vs_ver="$optval"
|
||||||
case "$optval" in
|
case $optval in
|
||||||
[789])
|
[789])
|
||||||
;;
|
;;
|
||||||
*) die Unrecognized Visual Studio Version in $opt
|
*) die Unrecognized Visual Studio Version in $opt
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
-I*)
|
-I*) opt="${opt%/}"
|
||||||
opt="${opt%/}"
|
incs="${incs}${incs:+;}"${opt##-I}""
|
||||||
incs="${incs}${incs:+;}"${opt##-I}""
|
yasmincs="${yasmincs} ${opt}"
|
||||||
yasmincs="${yasmincs} ${opt}"
|
;;
|
||||||
;;
|
-D*) defines="${defines}${defines:+;}${opt##-D}"
|
||||||
-D*) defines="${defines}${defines:+;}${opt##-D}"
|
;;
|
||||||
;;
|
-L*) # fudge . to $(OutDir)
|
||||||
-L*) # fudge . to $(OutDir)
|
if [ "${opt##-L}" == "." ]; then
|
||||||
if [ "${opt##-L}" == "." ]; then
|
libdirs="${libdirs}${libdirs:+;}"\$(OutDir)""
|
||||||
libdirs="${libdirs}${libdirs:+;}"\$(OutDir)""
|
else
|
||||||
else
|
# Also try directories for this platform/configuration
|
||||||
# Also try directories for this platform/configuration
|
libdirs="${libdirs}${libdirs:+;}"${opt##-L}""
|
||||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}""
|
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)/\$(ConfigurationName)""
|
||||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)/\$(ConfigurationName)""
|
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)""
|
||||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)""
|
fi
|
||||||
fi
|
;;
|
||||||
;;
|
-l*) libs="${libs}${libs:+ }${opt##-l}.lib"
|
||||||
-l*) libs="${libs}${libs:+ }${opt##-l}.lib"
|
;;
|
||||||
;;
|
-*) die_unknown $opt
|
||||||
-*) die_unknown $opt
|
;;
|
||||||
;;
|
*) file_list[${#file_list[@]}]="$opt"
|
||||||
*)
|
case "$opt" in
|
||||||
file_list[${#file_list[@]}]="$opt"
|
*.asm) uses_asm=true;;
|
||||||
case "$opt" in
|
esac
|
||||||
*.asm) uses_asm=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
outfile=${outfile:-/dev/stdout}
|
outfile=${outfile:-/dev/stdout}
|
||||||
@@ -272,7 +278,11 @@ done
|
|||||||
|
|
||||||
# List Keyword for this target
|
# List Keyword for this target
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) keyword="ManagedCProj"
|
x86*)
|
||||||
|
keyword="ManagedCProj"
|
||||||
|
;;
|
||||||
|
arm*|iwmmx*)
|
||||||
|
keyword="Win32Proj"
|
||||||
;;
|
;;
|
||||||
*) die "Unsupported target $target!"
|
*) die "Unsupported target $target!"
|
||||||
esac
|
esac
|
||||||
@@ -288,186 +298,402 @@ case "$target" in
|
|||||||
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||||
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||||
;;
|
;;
|
||||||
|
arm*|iwmmx*)
|
||||||
|
case "${name}" in
|
||||||
|
obj_int_extract) platforms[0]="Win32"
|
||||||
|
;;
|
||||||
|
*) platforms[0]="Pocket PC 2003 (ARMV4)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
*) die "Unsupported target $target!"
|
*) die "Unsupported target $target!"
|
||||||
|
esac
|
||||||
|
|
||||||
|
# List Command-line Arguments for this target
|
||||||
|
case "$target" in
|
||||||
|
arm*|iwmmx*)
|
||||||
|
if [ "$name" == "example" ];then
|
||||||
|
ARGU="--codec vp6 --flipuv --progress _bnd.vp6"
|
||||||
|
fi
|
||||||
|
if [ "$name" == "xma" ];then
|
||||||
|
ARGU="--codec vp6 -h 240 -w 320 -v"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
generate_vcproj() {
|
generate_vcproj() {
|
||||||
case "$proj_kind" in
|
case "$proj_kind" in
|
||||||
exe) vs_ConfigurationType=1
|
exe) vs_ConfigurationType=1
|
||||||
;;
|
;;
|
||||||
*) vs_ConfigurationType=4
|
*) vs_ConfigurationType=4
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
|
echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
|
||||||
open_tag VisualStudioProject \
|
open_tag VisualStudioProject \
|
||||||
ProjectType="Visual C++" \
|
ProjectType="Visual C++" \
|
||||||
Version="${vs_ver_id}" \
|
Version="${vs_ver_id}" \
|
||||||
Name="${name}" \
|
Name="${name}" \
|
||||||
ProjectGUID="{${guid}}" \
|
ProjectGUID="{${guid}}" \
|
||||||
RootNamespace="${name}" \
|
RootNamespace="${name}" \
|
||||||
Keyword="${keyword}" \
|
Keyword="${keyword}"
|
||||||
|
|
||||||
open_tag Platforms
|
open_tag Platforms
|
||||||
for plat in "${platforms[@]}"; do
|
for plat in "${platforms[@]}"; do
|
||||||
tag Platform Name="$plat"
|
tag Platform Name="$plat"
|
||||||
done
|
done
|
||||||
close_tag Platforms
|
close_tag Platforms
|
||||||
|
|
||||||
open_tag ToolFiles
|
open_tag ToolFiles
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
|
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
|
||||||
;;
|
;;
|
||||||
|
arm*|iwmmx*)
|
||||||
|
if [ "$name" == "vpx" ];then
|
||||||
|
case "$target" in
|
||||||
|
armv5*)
|
||||||
|
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv5.rules"
|
||||||
|
;;
|
||||||
|
armv6*)
|
||||||
|
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv6.rules"
|
||||||
|
;;
|
||||||
|
iwmmxt*)
|
||||||
|
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmxscale.rules"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
close_tag ToolFiles
|
close_tag ToolFiles
|
||||||
|
|
||||||
open_tag Configurations
|
open_tag Configurations
|
||||||
for plat in "${platforms[@]}"; do
|
for plat in "${platforms[@]}"; do
|
||||||
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
|
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
|
||||||
open_tag Configuration \
|
open_tag Configuration \
|
||||||
Name="Debug|$plat" \
|
Name="Debug|$plat" \
|
||||||
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
||||||
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
||||||
ConfigurationType="$vs_ConfigurationType" \
|
ConfigurationType="$vs_ConfigurationType" \
|
||||||
CharacterSet="1" \
|
CharacterSet="1"
|
||||||
|
|
||||||
|
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
||||||
|
case "$name" in
|
||||||
|
vpx) tag Tool \
|
||||||
|
Name="VCPreBuildEventTool" \
|
||||||
|
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCMIDLTool" \
|
||||||
|
TargetEnvironment="1"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
ExecutionBucket="7" \
|
||||||
|
Optimization="0" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
||||||
|
MinimalRebuild="true" \
|
||||||
|
RuntimeLibrary="1" \
|
||||||
|
BufferSecurityCheck="false" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="1" \
|
||||||
|
CompileAs="1"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCResourceCompilerTool" \
|
||||||
|
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
||||||
|
Culture="1033" \
|
||||||
|
AdditionalIncludeDirectories="\$(IntDir)" \
|
||||||
|
;;
|
||||||
|
example|xma) tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
ExecutionBucket="7" \
|
||||||
|
Optimization="0" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
||||||
|
MinimalRebuild="true" \
|
||||||
|
RuntimeLibrary="1" \
|
||||||
|
BufferSecurityCheck="false" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="1" \
|
||||||
|
CompileAs="1"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCResourceCompilerTool" \
|
||||||
|
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
||||||
|
Culture="1033" \
|
||||||
|
AdditionalIncludeDirectories="\$(IntDir)" \
|
||||||
|
;;
|
||||||
|
obj_int_extract) tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
Optimization="0" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE" \
|
||||||
|
RuntimeLibrary="1" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="1" \
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
x86*) tag Tool \
|
||||||
case "$name" in
|
Name="VCCLCompilerTool" \
|
||||||
*)
|
Optimization="0" \
|
||||||
tag Tool \
|
AdditionalIncludeDirectories="$incs" \
|
||||||
Name="VCCLCompilerTool" \
|
PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
||||||
Optimization="0" \
|
RuntimeLibrary="$debug_runtime" \
|
||||||
AdditionalIncludeDirectories="$incs" \
|
UsePrecompiledHeader="0" \
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
WarningLevel="3" \
|
||||||
RuntimeLibrary="$debug_runtime" \
|
DebugInformationFormat="1" \
|
||||||
UsePrecompiledHeader="0" \
|
Detect64BitPortabilityProblems="true" \
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="1" \
|
|
||||||
Detect64BitPortabilityProblems="true" \
|
|
||||||
|
|
||||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="1"
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="1"
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$proj_kind" in
|
case "$proj_kind" in
|
||||||
exe)
|
exe)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
x86*) tag Tool \
|
||||||
|
Name="VCLinkerTool" \
|
||||||
|
AdditionalDependencies="$debug_libs \$(NoInherit)" \
|
||||||
|
AdditionalLibraryDirectories="$libdirs" \
|
||||||
|
GenerateDebugInformation="true" \
|
||||||
|
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
||||||
|
|
||||||
|
;;
|
||||||
|
arm*|iwmmx*)
|
||||||
case "$name" in
|
case "$name" in
|
||||||
*)
|
obj_int_extract) tag Tool \
|
||||||
tag Tool \
|
Name="VCLinkerTool" \
|
||||||
Name="VCLinkerTool" \
|
OutputFile="${name}.exe" \
|
||||||
AdditionalDependencies="$debug_libs \$(NoInherit)" \
|
GenerateDebugInformation="true"
|
||||||
AdditionalLibraryDirectories="$libdirs" \
|
;;
|
||||||
GenerateDebugInformation="true" \
|
*) tag Tool \
|
||||||
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
Name="VCLinkerTool" \
|
||||||
|
AdditionalDependencies="$debug_libs" \
|
||||||
|
OutputFile="\$(OutDir)/${name}.exe" \
|
||||||
|
LinkIncremental="2" \
|
||||||
|
AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
|
||||||
|
DelayLoadDLLs="\$(NOINHERIT)" \
|
||||||
|
GenerateDebugInformation="true" \
|
||||||
|
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
||||||
|
SubSystem="9" \
|
||||||
|
StackReserveSize="65536" \
|
||||||
|
StackCommitSize="4096" \
|
||||||
|
EntryPointSymbol="mainWCRTStartup" \
|
||||||
|
TargetMachine="3"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
lib)
|
lib)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
arm*|iwmmx*) tag Tool \
|
||||||
tag Tool \
|
Name="VCLibrarianTool" \
|
||||||
Name="VCLibrarianTool" \
|
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
|
||||||
OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
|
OutputFile="\$(OutDir)/${name}.lib" \
|
||||||
|
;;
|
||||||
;;
|
*) tag Tool \
|
||||||
|
Name="VCLibrarianTool" \
|
||||||
|
OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
dll)
|
dll) tag Tool \
|
||||||
tag Tool \
|
Name="VCLinkerTool" \
|
||||||
Name="VCLinkerTool" \
|
AdditionalDependencies="\$(NoInherit)" \
|
||||||
AdditionalDependencies="\$(NoInherit)" \
|
LinkIncremental="2" \
|
||||||
LinkIncremental="2" \
|
GenerateDebugInformation="true" \
|
||||||
GenerateDebugInformation="true" \
|
AssemblyDebug="1" \
|
||||||
AssemblyDebug="1" \
|
TargetMachine="1" \
|
||||||
TargetMachine="1" \
|
$link_opts
|
||||||
$link_opts \
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
||||||
|
case "$name" in
|
||||||
|
vpx) tag DeploymentTool \
|
||||||
|
ForceDirty="-1" \
|
||||||
|
RegisterOutput="0"
|
||||||
|
;;
|
||||||
|
example|xma) tag DeploymentTool \
|
||||||
|
ForceDirty="-1" \
|
||||||
|
RegisterOutput="0"
|
||||||
|
tag DebuggerTool \
|
||||||
|
Arguments="${ARGU}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
close_tag Configuration
|
close_tag Configuration
|
||||||
|
|
||||||
open_tag Configuration \
|
open_tag Configuration \
|
||||||
Name="Release|$plat" \
|
Name="Release|$plat" \
|
||||||
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
||||||
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
||||||
ConfigurationType="$vs_ConfigurationType" \
|
ConfigurationType="$vs_ConfigurationType" \
|
||||||
CharacterSet="1" \
|
CharacterSet="1" \
|
||||||
WholeProgramOptimization="0" \
|
WholeProgramOptimization="0"
|
||||||
|
|
||||||
case "$target" in
|
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
||||||
x86*)
|
case "$name" in
|
||||||
case "$name" in
|
vpx) tag Tool \
|
||||||
*)
|
Name="VCPreBuildEventTool" \
|
||||||
tag Tool \
|
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
|
||||||
Name="VCCLCompilerTool" \
|
tag Tool \
|
||||||
AdditionalIncludeDirectories="$incs" \
|
Name="VCMIDLTool" \
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
TargetEnvironment="1"
|
||||||
RuntimeLibrary="$release_runtime" \
|
tag Tool \
|
||||||
UsePrecompiledHeader="0" \
|
Name="VCCLCompilerTool" \
|
||||||
WarningLevel="3" \
|
ExecutionBucket="7" \
|
||||||
DebugInformationFormat="0" \
|
Optimization="2" \
|
||||||
Detect64BitPortabilityProblems="true" \
|
FavorSizeOrSpeed="1" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
||||||
|
RuntimeLibrary="0" \
|
||||||
|
BufferSecurityCheck="false" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="0" \
|
||||||
|
CompileAs="1"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCResourceCompilerTool" \
|
||||||
|
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
||||||
|
Culture="1033" \
|
||||||
|
AdditionalIncludeDirectories="\$(IntDir)" \
|
||||||
|
;;
|
||||||
|
example|xma) tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
ExecutionBucket="7" \
|
||||||
|
Optimization="2" \
|
||||||
|
FavorSizeOrSpeed="1" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
||||||
|
RuntimeLibrary="0" \
|
||||||
|
BufferSecurityCheck="false" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="0" \
|
||||||
|
CompileAs="1"
|
||||||
|
tag Tool \
|
||||||
|
Name="VCResourceCompilerTool" \
|
||||||
|
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
||||||
|
Culture="1033" \
|
||||||
|
AdditionalIncludeDirectories="\$(IntDir)" \
|
||||||
|
;;
|
||||||
|
obj_int_extract) tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" \
|
||||||
|
RuntimeLibrary="0" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
DebugInformationFormat="0" \
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
case "$target" in
|
||||||
;;
|
x86*) tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
||||||
|
RuntimeLibrary="$release_runtime" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="0" \
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
|
||||||
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$proj_kind" in
|
case "$proj_kind" in
|
||||||
exe)
|
exe)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
x86*) tag Tool \
|
||||||
|
Name="VCLinkerTool" \
|
||||||
|
AdditionalDependencies="$libs \$(NoInherit)" \
|
||||||
|
AdditionalLibraryDirectories="$libdirs" \
|
||||||
|
;;
|
||||||
|
arm*|iwmmx*)
|
||||||
case "$name" in
|
case "$name" in
|
||||||
*)
|
obj_int_extract) tag Tool \
|
||||||
tag Tool \
|
Name="VCLinkerTool" \
|
||||||
Name="VCLinkerTool" \
|
OutputFile="${name}.exe" \
|
||||||
AdditionalDependencies="$libs \$(NoInherit)" \
|
LinkIncremental="1" \
|
||||||
AdditionalLibraryDirectories="$libdirs" \
|
GenerateDebugInformation="false" \
|
||||||
|
SubSystem="0" \
|
||||||
|
OptimizeReferences="0" \
|
||||||
|
EnableCOMDATFolding="0" \
|
||||||
|
TargetMachine="0"
|
||||||
|
;;
|
||||||
|
*) tag Tool \
|
||||||
|
Name="VCLinkerTool" \
|
||||||
|
AdditionalDependencies="$libs" \
|
||||||
|
OutputFile="\$(OutDir)/${name}.exe" \
|
||||||
|
LinkIncremental="1" \
|
||||||
|
AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
|
||||||
|
DelayLoadDLLs="\$(NOINHERIT)" \
|
||||||
|
GenerateDebugInformation="true" \
|
||||||
|
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
||||||
|
SubSystem="9" \
|
||||||
|
StackReserveSize="65536" \
|
||||||
|
StackCommitSize="4096" \
|
||||||
|
OptimizeReferences="2" \
|
||||||
|
EnableCOMDATFolding="2" \
|
||||||
|
EntryPointSymbol="mainWCRTStartup" \
|
||||||
|
TargetMachine="3"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
lib)
|
lib)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
arm*|iwmmx*) tag Tool \
|
||||||
tag Tool \
|
Name="VCLibrarianTool" \
|
||||||
Name="VCLibrarianTool" \
|
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
|
||||||
OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
|
OutputFile="\$(OutDir)/${name}.lib" \
|
||||||
|
;;
|
||||||
;;
|
*) tag Tool \
|
||||||
|
Name="VCLibrarianTool" \
|
||||||
|
OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
dll) # note differences to debug version: LinkIncremental, AssemblyDebug
|
dll) # note differences to debug version: LinkIncremental, AssemblyDebug
|
||||||
tag Tool \
|
tag Tool \
|
||||||
Name="VCLinkerTool" \
|
Name="VCLinkerTool" \
|
||||||
AdditionalDependencies="\$(NoInherit)" \
|
AdditionalDependencies="\$(NoInherit)" \
|
||||||
LinkIncremental="1" \
|
LinkIncremental="1" \
|
||||||
GenerateDebugInformation="true" \
|
GenerateDebugInformation="true" \
|
||||||
TargetMachine="1" \
|
TargetMachine="1" \
|
||||||
$link_opts \
|
$link_opts
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
||||||
|
case "$name" in
|
||||||
|
vpx) tag DeploymentTool \
|
||||||
|
ForceDirty="-1" \
|
||||||
|
RegisterOutput="0"
|
||||||
|
;;
|
||||||
|
example|xma) tag DeploymentTool \
|
||||||
|
ForceDirty="-1" \
|
||||||
|
RegisterOutput="0"
|
||||||
|
tag DebuggerTool \
|
||||||
|
Arguments="${ARGU}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
close_tag Configuration
|
close_tag Configuration
|
||||||
done
|
done
|
||||||
close_tag Configurations
|
close_tag Configurations
|
||||||
|
|
||||||
open_tag Files
|
open_tag Files
|
||||||
generate_filter srcs "Source Files" "c;def;odl;idl;hpj;bat;asm;asmx"
|
generate_filter srcs "Source Files" "cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
generate_filter hdrs "Header Files" "h;hm;inl;inc;xsd"
|
generate_filter hdrs "Header Files" "h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
generate_filter resrcs "Build Files" "mk"
|
generate_filter resrcs "Build Files" "mk"
|
||||||
close_tag Files
|
close_tag Files
|
||||||
|
@@ -139,6 +139,9 @@ process_global() {
|
|||||||
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
||||||
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
||||||
|
|
||||||
|
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
||||||
|
echo "${indent}${proj_guid}.${config}.Deploy.0 = ${config}"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
IFS=${IFS_bak}
|
IFS=${IFS_bak}
|
||||||
done
|
done
|
||||||
|
@@ -590,7 +590,7 @@ int parse_coff(unsigned __int8 *buf, size_t sz)
|
|||||||
//log_msg("COFF: Symbol table at offset %u\n", symtab_ptr);
|
//log_msg("COFF: Symbol table at offset %u\n", symtab_ptr);
|
||||||
//log_msg("COFF: raw data pointer ofset for section .data is %u\n", sectionrawdata_ptr);
|
//log_msg("COFF: raw data pointer ofset for section .data is %u\n", sectionrawdata_ptr);
|
||||||
|
|
||||||
fp = fopen("assembly_offsets.asm", "w");
|
fp = fopen("vpx_asm_offsets.asm", "w");
|
||||||
|
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
{
|
{
|
||||||
|
17
configure
vendored
17
configure
vendored
@@ -37,9 +37,11 @@ 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_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
|
||||||
${toggle_small} favor smaller size over speed
|
${toggle_small} favor smaller size over speed
|
||||||
|
${toggle_arm_asm_detok} assembly version of the detokenizer (ARM platforms only)
|
||||||
${toggle_postproc_visualizer} macro block / block level visualizers
|
${toggle_postproc_visualizer} macro block / block level visualizers
|
||||||
|
|
||||||
Codecs:
|
Codecs:
|
||||||
@@ -78,21 +80,22 @@ EOF
|
|||||||
# alphabetically by architecture, generic-gnu last.
|
# alphabetically by architecture, generic-gnu last.
|
||||||
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-symbian-gcc"
|
all_platforms="${all_platforms} armv5te-symbian-gcc"
|
||||||
|
all_platforms="${all_platforms} armv5te-wince-vs8"
|
||||||
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-symbian-gcc"
|
all_platforms="${all_platforms} armv6-symbian-gcc"
|
||||||
|
all_platforms="${all_platforms} armv6-wince-vs8"
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-rvct"
|
all_platforms="${all_platforms} iwmmxt-linux-rvct"
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-gcc"
|
all_platforms="${all_platforms} iwmmxt-linux-gcc"
|
||||||
|
all_platforms="${all_platforms} iwmmxt-wince-vs8"
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
|
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
|
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
|
||||||
|
all_platforms="${all_platforms} iwmmxt2-wince-vs8"
|
||||||
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
|
||||||
all_platforms="${all_platforms} armv7-none-rvct" #neon Cortex-A8
|
|
||||||
all_platforms="${all_platforms} mips32-linux-gcc"
|
all_platforms="${all_platforms} mips32-linux-gcc"
|
||||||
all_platforms="${all_platforms} ppc32-darwin8-gcc"
|
all_platforms="${all_platforms} ppc32-darwin8-gcc"
|
||||||
all_platforms="${all_platforms} ppc32-darwin9-gcc"
|
all_platforms="${all_platforms} ppc32-darwin9-gcc"
|
||||||
@@ -157,7 +160,6 @@ enable fast_unaligned #allow unaligned accesses, if supported by hw
|
|||||||
enable md5
|
enable md5
|
||||||
enable spatial_resampling
|
enable spatial_resampling
|
||||||
enable multithread
|
enable multithread
|
||||||
enable os_support
|
|
||||||
|
|
||||||
[ -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
|
||||||
@@ -248,10 +250,11 @@ CONFIG_LIST="
|
|||||||
static_msvcrt
|
static_msvcrt
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
error_concealment
|
||||||
shared
|
shared
|
||||||
small
|
small
|
||||||
|
arm_asm_detok
|
||||||
postproc_visualizer
|
postproc_visualizer
|
||||||
os_support
|
|
||||||
"
|
"
|
||||||
CMDLINE_SELECT="
|
CMDLINE_SELECT="
|
||||||
extra_warnings
|
extra_warnings
|
||||||
@@ -288,8 +291,10 @@ CMDLINE_SELECT="
|
|||||||
mem_tracker
|
mem_tracker
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
error_concealment
|
||||||
shared
|
shared
|
||||||
small
|
small
|
||||||
|
arm_asm_detok
|
||||||
postproc_visualizer
|
postproc_visualizer
|
||||||
"
|
"
|
||||||
|
|
||||||
@@ -298,7 +303,7 @@ process_cmdline() {
|
|||||||
optval="${opt#*=}"
|
optval="${opt#*=}"
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
||||||
*) process_common_cmdline "$opt"
|
*) process_common_cmdline $opt
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
3
docs.mk
3
docs.mk
@@ -34,8 +34,7 @@ TXT_DOX = $(call enabled,TXT_DOX)
|
|||||||
|
|
||||||
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
|
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
|
||||||
|
|
||||||
doxyfile: $(if $(findstring examples, $(ALL_TARGETS)),examples.doxy)
|
doxyfile: libs.doxy_template libs.doxy examples.doxy
|
||||||
doxyfile: libs.doxy_template libs.doxy
|
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
@cat $^ > $@
|
@cat $^ > $@
|
||||||
@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
|
@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
|
||||||
|
15
examples.mk
15
examples.mk
@@ -77,6 +77,11 @@ GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_drops.c
|
|||||||
endif
|
endif
|
||||||
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
|
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
|
||||||
decode_with_drops.DESCRIPTION = Drops frames while decoding
|
decode_with_drops.DESCRIPTION = Drops frames while decoding
|
||||||
|
ifeq ($(CONFIG_DECODERS),yes)
|
||||||
|
GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_partial_drops.c
|
||||||
|
endif
|
||||||
|
decode_partial_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D27
|
||||||
|
decode_partial_with_drops.DESCRIPTION = Drops parts of frames while decoding
|
||||||
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
|
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
|
||||||
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
|
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
|
||||||
error_resilient.DESCRIPTION = Error Resiliency Feature
|
error_resilient.DESCRIPTION = Error Resiliency Feature
|
||||||
@@ -93,16 +98,8 @@ vp8cx_set_ref.DESCRIPTION = VP8 set encoder reference frame
|
|||||||
|
|
||||||
|
|
||||||
# Handle extra library flags depending on codec configuration
|
# Handle extra library flags depending on codec configuration
|
||||||
|
|
||||||
# We should not link to math library (libm) on RVCT
|
|
||||||
# when building for bare-metal targets
|
|
||||||
ifeq ($(CONFIG_OS_SUPPORT), yes)
|
|
||||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
||||||
else
|
|
||||||
ifeq ($(CONFIG_GCC), yes)
|
|
||||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
#
|
#
|
||||||
# End of specified files. The rest of the build rules should happen
|
# End of specified files. The rest of the build rules should happen
|
||||||
# automagically from here.
|
# automagically from here.
|
||||||
|
213
examples/decode_with_partial_drops.txt
Normal file
213
examples/decode_with_partial_drops.txt
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
@TEMPLATE decoder_tmpl.c
|
||||||
|
Decode With Drops Example
|
||||||
|
=========================
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||||
|
This is an example utility which drops a series of frames, as specified
|
||||||
|
on the command line. This is useful for observing the error recovery
|
||||||
|
features of the codec.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||||
|
#include <time.h>
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||||
|
struct parsed_header
|
||||||
|
{
|
||||||
|
char key_frame;
|
||||||
|
int version;
|
||||||
|
char show_frame;
|
||||||
|
int first_part_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
|
||||||
|
{
|
||||||
|
int size = 0;
|
||||||
|
int remaining = length - pos;
|
||||||
|
/* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
|
||||||
|
int uncomp_part_size = (hdr->key_frame ? 10 : 3);
|
||||||
|
/* number of bytes yet to send from header and the first partition */
|
||||||
|
int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
|
||||||
|
if (remainFirst > 0)
|
||||||
|
{
|
||||||
|
if (remainFirst <= mtu)
|
||||||
|
{
|
||||||
|
size = remainFirst;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size = mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* second partition; just slot it up according to MTU */
|
||||||
|
if (remaining <= mtu)
|
||||||
|
{
|
||||||
|
size = remaining;
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
return mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void throw_packets(unsigned char* frame, int* size, int loss_rate, int* thrown, int* kept)
|
||||||
|
{
|
||||||
|
unsigned char loss_frame[256*1024];
|
||||||
|
int pkg_size = 1;
|
||||||
|
int count = 0;
|
||||||
|
int pos = 0;
|
||||||
|
int loss_pos = 0;
|
||||||
|
struct parsed_header hdr;
|
||||||
|
unsigned int tmp;
|
||||||
|
int mtu = 100;
|
||||||
|
|
||||||
|
if (*size < 3)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
putc('|', stdout);
|
||||||
|
/* parse uncompressed 3 bytes */
|
||||||
|
tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
|
||||||
|
hdr.key_frame = !(tmp & 0x1); /* inverse logic */
|
||||||
|
hdr.version = (tmp >> 1) & 0x7;
|
||||||
|
hdr.show_frame = (tmp >> 4) & 0x1;
|
||||||
|
hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
|
||||||
|
|
||||||
|
/* don't drop key frames */
|
||||||
|
if (hdr.key_frame)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
*kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
|
||||||
|
for (i=0; i < *kept; i++)
|
||||||
|
putc('.', stdout);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
|
||||||
|
{
|
||||||
|
int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
|
||||||
|
if (*thrown == 0 && !loss_event)
|
||||||
|
{
|
||||||
|
memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
|
||||||
|
loss_pos += pkg_size;
|
||||||
|
(*kept)++;
|
||||||
|
putc('.', stdout);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*thrown)++;
|
||||||
|
putc('X', stdout);
|
||||||
|
}
|
||||||
|
pos += pkg_size;
|
||||||
|
}
|
||||||
|
memcpy(frame, loss_frame, loss_pos);
|
||||||
|
memset(frame + loss_pos, 0, *size - loss_pos);
|
||||||
|
*size = loss_pos;
|
||||||
|
}
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
This example adds a single argument to the `simple_decoder` example,
|
||||||
|
which specifies the range or pattern of frames to drop. The parameter is
|
||||||
|
parsed as follows:
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
|
||||||
|
if(argc!=4 && argc != 5)
|
||||||
|
die("Usage: %s <infile> <outfile> <N-M|N/M|L,S>\n", argv[0]);
|
||||||
|
{
|
||||||
|
char *nptr;
|
||||||
|
n = strtol(argv[3], &nptr, 0);
|
||||||
|
mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
|
||||||
|
|
||||||
|
m = strtol(nptr+1, NULL, 0);
|
||||||
|
if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
|
||||||
|
*nptr != '\0' && *nptr != ','))
|
||||||
|
die("Couldn't parse pattern %s\n", argv[3]);
|
||||||
|
}
|
||||||
|
seed = (m > 0) ? m : (unsigned int)time(NULL);
|
||||||
|
srand(seed);thrown_frame = 0;
|
||||||
|
printf("Seed: %u\n", seed);
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
|
||||||
|
|
||||||
|
|
||||||
|
Dropping A Range Of Frames
|
||||||
|
--------------------------
|
||||||
|
To drop a range of frames, specify the starting frame and the ending
|
||||||
|
frame to drop, separated by a dash. The following command will drop
|
||||||
|
frames 5 through 10 (base 1).
|
||||||
|
|
||||||
|
$ ./decode_with_drops in.ivf out.i420 5-10
|
||||||
|
|
||||||
|
|
||||||
|
Dropping A Pattern Of Frames
|
||||||
|
----------------------------
|
||||||
|
To drop a pattern of frames, specify the number of frames to drop and
|
||||||
|
the number of frames after which to repeat the pattern, separated by
|
||||||
|
a forward-slash. The following command will drop 3 of 7 frames.
|
||||||
|
Specifically, it will decode 4 frames, then drop 3 frames, and then
|
||||||
|
repeat.
|
||||||
|
|
||||||
|
$ ./decode_with_drops in.ivf out.i420 3/7
|
||||||
|
|
||||||
|
|
||||||
|
Extra Variables
|
||||||
|
---------------
|
||||||
|
This example maintains the pattern passed on the command line in the
|
||||||
|
`n`, `m`, and `is_range` variables:
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
|
||||||
|
int n, m, mode; //
|
||||||
|
unsigned int seed;
|
||||||
|
int thrown=0, kept=0;
|
||||||
|
int thrown_frame=0, kept_frame=0;
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
|
||||||
|
|
||||||
|
|
||||||
|
Making The Drop Decision
|
||||||
|
------------------------
|
||||||
|
The example decides whether to drop the frame based on the current
|
||||||
|
frame number, immediately before decoding the frame.
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
||||||
|
/* Decide whether to throw parts of the frame or the whole frame
|
||||||
|
depending on the drop mode */
|
||||||
|
thrown_frame = 0;
|
||||||
|
kept_frame = 0;
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (m - (frame_cnt-1)%m <= n)
|
||||||
|
{
|
||||||
|
frame_sz = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (frame_cnt >= n && frame_cnt <= m)
|
||||||
|
{
|
||||||
|
frame_sz = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if (mode < 2)
|
||||||
|
{
|
||||||
|
if (frame_sz == 0)
|
||||||
|
{
|
||||||
|
putc('X', stdout);
|
||||||
|
thrown_frame++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
putc('.', stdout);
|
||||||
|
kept_frame++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thrown += thrown_frame;
|
||||||
|
kept += kept_frame;
|
||||||
|
fflush(stdout);
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
@@ -19,7 +19,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_decoder.h"
|
#include "vpx/vpx_decoder.h"
|
||||||
#include "vpx/vp8dx.h"
|
#include "vpx/vp8dx.h"
|
||||||
#define interface (vpx_codec_vp8_dx())
|
#define interface (&vpx_codec_vp8_dx_algo)
|
||||||
@EXTRA_INCLUDES
|
@EXTRA_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +42,8 @@ static void die(const char *fmt, ...) {
|
|||||||
|
|
||||||
@DIE_CODEC
|
@DIE_CODEC
|
||||||
|
|
||||||
|
@HELPERS
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
FILE *infile, *outfile;
|
FILE *infile, *outfile;
|
||||||
vpx_codec_ctx_t codec;
|
vpx_codec_ctx_t codec;
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_decoder.h"
|
#include "vpx/vpx_decoder.h"
|
||||||
#include "vpx/vp8dx.h"
|
#include "vpx/vp8dx.h"
|
||||||
#define interface (vpx_codec_vp8_dx())
|
#define interface (&vpx_codec_vp8_dx_algo)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_encoder.h"
|
#include "vpx/vpx_encoder.h"
|
||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#define interface (vpx_codec_vp8_cx())
|
#define interface (&vpx_codec_vp8_cx_algo)
|
||||||
#define fourcc 0x30385056
|
#define fourcc 0x30385056
|
||||||
@EXTRA_INCLUDES
|
@EXTRA_INCLUDES
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_encoder.h"
|
#include "vpx/vpx_encoder.h"
|
||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#define interface (vpx_codec_vp8_cx())
|
#define interface (&vpx_codec_vp8_cx_algo)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@ Initializing The Codec
|
|||||||
----------------------
|
----------------------
|
||||||
The decoder is initialized by the following code. This is an example for
|
The decoder is initialized by the following code. This is an example for
|
||||||
the VP8 decoder, but the code is analogous for all algorithms. Replace
|
the VP8 decoder, but the code is analogous for all algorithms. Replace
|
||||||
`vpx_codec_vp8_dx()` with a pointer to the interface exposed by the
|
`&vpx_codec_vp8_dx_algo` with a pointer to the interface exposed by the
|
||||||
algorithm you want to use. The `cfg` argument is left as NULL in this
|
algorithm you want to use. The `cfg` argument is left as NULL in this
|
||||||
example, because we want the algorithm to determine the stream
|
example, because we want the algorithm to determine the stream
|
||||||
configuration (width/height) and allocate memory automatically. This
|
configuration (width/height) and allocate memory automatically. This
|
||||||
|
54
libs.mk
54
libs.mk
@@ -126,6 +126,29 @@ INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
|
|||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
|
|
||||||
|
ifeq ($(ARCH_ARM),yes)
|
||||||
|
ifeq ($(HAVE_ARMV5TE),yes)
|
||||||
|
ARM_ARCH=v5
|
||||||
|
endif
|
||||||
|
ifeq ($(HAVE_ARMV6),yes)
|
||||||
|
ARM_ARCH=v6
|
||||||
|
endif
|
||||||
|
obj_int_extract.vcproj: $(SRC_PATH_BARE)/build/make/obj_int_extract.c
|
||||||
|
@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/obj_int_extract.bat .
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
|
||||||
|
--exe\
|
||||||
|
--target=$(TOOLCHAIN)\
|
||||||
|
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
|
--name=obj_int_extract\
|
||||||
|
--proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2\
|
||||||
|
--out=$@ $^\
|
||||||
|
-I".";"$(SRC_PATH_BARE)"
|
||||||
|
|
||||||
|
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.vcproj
|
||||||
|
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.bat
|
||||||
|
endif
|
||||||
|
|
||||||
vpx.def: $(call enabled,CODEC_EXPORTS)
|
vpx.def: $(call enabled,CODEC_EXPORTS)
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
|
$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
|
||||||
@@ -207,39 +230,10 @@ endif
|
|||||||
#
|
#
|
||||||
# Add assembler dependencies for configuration and offsets
|
# Add assembler dependencies for configuration and offsets
|
||||||
#
|
#
|
||||||
|
#$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(BUILD_PFX)vpx_asm_offsets.asm
|
||||||
$(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
$(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
||||||
$(filter %.asm.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
$(filter %.asm.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
||||||
|
|
||||||
#
|
|
||||||
# Calculate platform- and compiler-specific offsets for hand coded assembly
|
|
||||||
#
|
|
||||||
ifeq ($(ARCH_ARM), yes)
|
|
||||||
asm_com_offsets.asm: obj_int_extract
|
|
||||||
asm_com_offsets.asm: $(VP8_PREFIX)common/asm_com_offsets.c.o
|
|
||||||
./obj_int_extract rvds $< $(ADS2GAS) > $@
|
|
||||||
OBJS-yes += $(VP8_PREFIX)common/asm_com_offsets.c.o
|
|
||||||
CLEAN-OBJS += asm_com_offsets.asm
|
|
||||||
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_com_offsets.asm
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
|
||||||
asm_enc_offsets.asm: obj_int_extract
|
|
||||||
asm_enc_offsets.asm: $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
|
|
||||||
./obj_int_extract rvds $< $(ADS2GAS) > $@
|
|
||||||
OBJS-yes += $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
|
|
||||||
CLEAN-OBJS += asm_enc_offsets.asm
|
|
||||||
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_enc_offsets.asm
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_VP8_DECODER), yes)
|
|
||||||
asm_dec_offsets.asm: obj_int_extract
|
|
||||||
asm_dec_offsets.asm: $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
|
|
||||||
./obj_int_extract rvds $< $(ADS2GAS) > $@
|
|
||||||
OBJS-yes += $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
|
|
||||||
CLEAN-OBJS += asm_dec_offsets.asm
|
|
||||||
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_dec_offsets.asm
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
|
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
|
||||||
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
|
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
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
|
||||||
questions about this SDK, please mail the apps-devel@webmproject.org list.
|
questions about this SDK, please mail the apps-devel@webmproject.org list.
|
||||||
To contribute, see http://www.webmproject.org/code/contribute and mail
|
To contribute, see http://www.webmproject.org/code/contribute and mail
|
||||||
codec-devel@webmproject.org.
|
vpx-devel@webmproject.org.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!\page changelog CHANGELOG
|
/*!\page changelog CHANGELOG
|
||||||
|
@@ -20,6 +20,8 @@
|
|||||||
* Still in the public domain.
|
* Still in the public domain.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h> /* for stupid systems */
|
||||||
|
|
||||||
#include <string.h> /* for memcpy() */
|
#include <string.h> /* for memcpy() */
|
||||||
|
|
||||||
#include "md5_utils.h"
|
#include "md5_utils.h"
|
||||||
|
27
solution.mk
27
solution.mk
@@ -9,6 +9,32 @@
|
|||||||
##
|
##
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(ARCH_ARM),yes)
|
||||||
|
ARM_DEVELOP=no
|
||||||
|
ARM_DEVELOP:=$(if $(filter %vpx.vcproj,$(wildcard *.vcproj)),yes)
|
||||||
|
|
||||||
|
ifeq ($(ARM_DEVELOP),yes)
|
||||||
|
vpx.sln:
|
||||||
|
@echo " [COPY] $@"
|
||||||
|
@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/vpx.sln .
|
||||||
|
PROJECTS-yes += vpx.sln
|
||||||
|
else
|
||||||
|
vpx.sln: $(wildcard *.vcproj)
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
||||||
|
$(if $(filter %vpx.vcproj,$^),--dep=vpxdec:vpx) \
|
||||||
|
$(if $(filter %vpx.vcproj,$^),--dep=xma:vpx) \
|
||||||
|
--ver=$(CONFIG_VS_VERSION)\
|
||||||
|
--target=$(TOOLCHAIN)\
|
||||||
|
--out=$@ $^
|
||||||
|
vpx.sln.mk: vpx.sln
|
||||||
|
@true
|
||||||
|
|
||||||
|
PROJECTS-yes += vpx.sln vpx.sln.mk
|
||||||
|
-include vpx.sln.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
else
|
||||||
vpx.sln: $(wildcard *.vcproj)
|
vpx.sln: $(wildcard *.vcproj)
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
||||||
@@ -22,6 +48,7 @@ vpx.sln.mk: vpx.sln
|
|||||||
|
|
||||||
PROJECTS-yes += vpx.sln vpx.sln.mk
|
PROJECTS-yes += vpx.sln vpx.sln.mk
|
||||||
-include vpx.sln.mk
|
-include vpx.sln.mk
|
||||||
|
endif
|
||||||
|
|
||||||
# Always install this file, as it is an unconditional post-build rule.
|
# Always install this file, as it is an unconditional post-build rule.
|
||||||
INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
|
INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
|
||||||
|
12
usage.dox
12
usage.dox
@@ -25,7 +25,7 @@
|
|||||||
codec may write into to store details about a single instance of that codec.
|
codec may write into to store details about a single instance of that codec.
|
||||||
Most of the context is implementation specific, and thus opaque to the
|
Most of the context is implementation specific, and thus opaque to the
|
||||||
application. The context structure as seen by the application is of fixed
|
application. The context structure as seen by the application is of fixed
|
||||||
size, and thus can be allocated with automatic storage or dynamically
|
size, and thus can be allocated eith with automatic storage or dynamically
|
||||||
on the heap.
|
on the heap.
|
||||||
|
|
||||||
Most operations require an initialized codec context. Codec context
|
Most operations require an initialized codec context. Codec context
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
the ABI is versioned. The ABI version number must be passed at
|
the ABI is versioned. The ABI version number must be passed at
|
||||||
initialization time to ensure the application is using a header file that
|
initialization time to ensure the application is using a header file that
|
||||||
matches the library. The current ABI version number is stored in the
|
matches the library. The current ABI version number is stored in the
|
||||||
preprocessor macros #VPX_CODEC_ABI_VERSION, #VPX_ENCODER_ABI_VERSION, and
|
prepropcessor macros #VPX_CODEC_ABI_VERSION, #VPX_ENCODER_ABI_VERSION, and
|
||||||
#VPX_DECODER_ABI_VERSION. For convenience, each initialization function has
|
#VPX_DECODER_ABI_VERSION. For convenience, each initialization function has
|
||||||
a wrapper macro that inserts the correct version number. These macros are
|
a wrapper macro that inserts the correct version number. These macros are
|
||||||
named like the initialization methods, but without the _ver suffix.
|
named like the initialization methods, but without the _ver suffix.
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
|
|
||||||
The special value <code>0</code> is reserved to represent an infinite
|
The special value <code>0</code> is reserved to represent an infinite
|
||||||
deadline. In this case, the codec will perform as much processing as
|
deadline. In this case, the codec will perform as much processing as
|
||||||
possible to yield the highest quality frame.
|
possible to yeild the highest quality frame.
|
||||||
|
|
||||||
By convention, the value <code>1</code> is used to mean "return as fast as
|
By convention, the value <code>1</code> is used to mean "return as fast as
|
||||||
possible."
|
possible."
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
|
|
||||||
/*! \page usage_xma External Memory Allocation
|
/*! \page usage_xma External Memory Allocation
|
||||||
Applications that wish to have fine grained control over how and where
|
Applications that wish to have fine grained control over how and where
|
||||||
decoders allocate memory \ref MAY make use of the eXternal Memory Allocation
|
decoders allocate memory \ref MAY make use of the e_xternal Memory Allocation
|
||||||
(XMA) interface. Not all codecs support the XMA \ref usage_features.
|
(XMA) interface. Not all codecs support the XMA \ref usage_features.
|
||||||
|
|
||||||
To use a decoder in XMA mode, the decoder \ref MUST be initialized with the
|
To use a decoder in XMA mode, the decoder \ref MUST be initialized with the
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
allocate is heavily dependent on the size of the encoded video frames. The
|
allocate is heavily dependent on the size of the encoded video frames. The
|
||||||
size of the video must be known before requesting the decoder's memory map.
|
size of the video must be known before requesting the decoder's memory map.
|
||||||
This stream information can be obtained with the vpx_codec_peek_stream_info()
|
This stream information can be obtained with the vpx_codec_peek_stream_info()
|
||||||
function, which does not require a constructed decoder context. If the exact
|
function, which does not require a contructed decoder context. If the exact
|
||||||
stream is not known, a stream info structure can be created that reflects
|
stream is not known, a stream info structure can be created that reflects
|
||||||
the maximum size that the decoder instance is required to support.
|
the maximum size that the decoder instance is required to support.
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
\section usage_xma_seg_szalign Segment Size and Alignment
|
\section usage_xma_seg_szalign Segment Size and Alignment
|
||||||
The sz (size) and align (alignment) parameters describe the required size
|
The sz (size) and align (alignment) parameters describe the required size
|
||||||
and alignment of the requested segment. Alignment will always be a power of
|
and alignment of the requested segment. Alignment will always be a power of
|
||||||
two. Applications \ref MUST honor the alignment requested. Failure to do so
|
two. Applications \ref MUST honor the aligment requested. Failure to do so
|
||||||
could result in program crashes or may incur a speed penalty.
|
could result in program crashes or may incur a speed penalty.
|
||||||
|
|
||||||
\section usage_xma_seg_flags Segment Flags
|
\section usage_xma_seg_flags Segment Flags
|
||||||
|
@@ -12,10 +12,12 @@
|
|||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
#include "error_concealment.h"
|
||||||
#include "onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
#include "findnearmv.h"
|
#include "findnearmv.h"
|
||||||
#include "entropymode.h"
|
#include "entropymode.h"
|
||||||
#include "systemdependent.h"
|
#include "systemdependent.h"
|
||||||
|
#include "vpxerrors.h"
|
||||||
|
|
||||||
|
|
||||||
extern void vp8_init_scan_order_mask();
|
extern void vp8_init_scan_order_mask();
|
||||||
@@ -27,6 +29,9 @@ void vp8_update_mode_info_border(MODE_INFO *mi, int rows, int cols)
|
|||||||
|
|
||||||
for (i = 0; i < rows; i++)
|
for (i = 0; i < rows; i++)
|
||||||
{
|
{
|
||||||
|
/* TODO(holmer): Bug? This updates the last element of each row
|
||||||
|
* rather than the border element!
|
||||||
|
*/
|
||||||
vpx_memset(&mi[i*cols-1], 0, sizeof(MODE_INFO));
|
vpx_memset(&mi[i*cols-1], 0, sizeof(MODE_INFO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,9 +48,11 @@ void vp8_de_alloc_frame_buffers(VP8_COMMON *oci)
|
|||||||
|
|
||||||
vpx_free(oci->above_context);
|
vpx_free(oci->above_context);
|
||||||
vpx_free(oci->mip);
|
vpx_free(oci->mip);
|
||||||
|
vpx_free(oci->prev_mip);
|
||||||
|
|
||||||
oci->above_context = 0;
|
oci->above_context = 0;
|
||||||
oci->mip = 0;
|
oci->mip = 0;
|
||||||
|
oci->prev_mip = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +77,7 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height)
|
|||||||
if (vp8_yv12_alloc_frame_buffer(&oci->yv12_fb[i], width, height, VP8BORDERINPIXELS) < 0)
|
if (vp8_yv12_alloc_frame_buffer(&oci->yv12_fb[i], width, height, VP8BORDERINPIXELS) < 0)
|
||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
return 1;
|
return ALLOC_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,13 +94,13 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height)
|
|||||||
if (vp8_yv12_alloc_frame_buffer(&oci->temp_scale_frame, width, 16, VP8BORDERINPIXELS) < 0)
|
if (vp8_yv12_alloc_frame_buffer(&oci->temp_scale_frame, width, 16, VP8BORDERINPIXELS) < 0)
|
||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
return 1;
|
return ALLOC_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 ALLOC_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
oci->mb_rows = height >> 4;
|
oci->mb_rows = height >> 4;
|
||||||
@@ -105,18 +112,28 @@ int vp8_alloc_frame_buffers(VP8_COMMON *oci, int width, int height)
|
|||||||
if (!oci->mip)
|
if (!oci->mip)
|
||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
return 1;
|
return ALLOC_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
oci->mi = oci->mip + oci->mode_info_stride + 1;
|
oci->mi = oci->mip + oci->mode_info_stride + 1;
|
||||||
|
|
||||||
|
/* allocate memory for last frame MODE_INFO array */
|
||||||
|
oci->prev_mip = vpx_calloc((oci->mb_cols + 1) * (oci->mb_rows + 1), sizeof(MODE_INFO));
|
||||||
|
|
||||||
|
if (!oci->prev_mip)
|
||||||
|
{
|
||||||
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
|
return ALLOC_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
oci->prev_mi = oci->prev_mip + oci->mode_info_stride + 1;
|
||||||
|
|
||||||
oci->above_context = vpx_calloc(sizeof(ENTROPY_CONTEXT_PLANES) * oci->mb_cols, 1);
|
oci->above_context = vpx_calloc(sizeof(ENTROPY_CONTEXT_PLANES) * oci->mb_cols, 1);
|
||||||
|
|
||||||
if (!oci->above_context)
|
if (!oci->above_context)
|
||||||
{
|
{
|
||||||
vp8_de_alloc_frame_buffers(oci);
|
vp8_de_alloc_frame_buffers(oci);
|
||||||
return 1;
|
return ALLOC_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
vp8_update_mode_info_border(oci->mi, oci->mb_rows, oci->mb_cols);
|
vp8_update_mode_info_border(oci->mi, oci->mb_rows, oci->mb_cols);
|
||||||
|
@@ -11,13 +11,13 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vpx_ports/arm.h"
|
#include "vpx_ports/arm.h"
|
||||||
#include "vp8/common/g_common.h"
|
#include "g_common.h"
|
||||||
#include "vp8/common/pragmas.h"
|
#include "pragmas.h"
|
||||||
#include "vp8/common/subpixel.h"
|
#include "subpixel.h"
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "loopfilter.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
|
|
||||||
extern void (*vp8_build_intra_predictors_mby_ptr)(MACROBLOCKD *x);
|
extern void (*vp8_build_intra_predictors_mby_ptr)(MACROBLOCKD *x);
|
||||||
extern void vp8_build_intra_predictors_mby(MACROBLOCKD *x);
|
extern void vp8_build_intra_predictors_mby(MACROBLOCKD *x);
|
||||||
|
@@ -15,19 +15,19 @@
|
|||||||
AREA |.text|, CODE, READONLY ; name this block of code
|
AREA |.text|, CODE, READONLY ; name this block of code
|
||||||
|
|
||||||
;-------------------------------------
|
;-------------------------------------
|
||||||
; r0 unsigned char *src_ptr,
|
; r0 unsigned char *src_ptr,
|
||||||
; r1 unsigned short *dst_ptr,
|
; r1 unsigned short *output_ptr,
|
||||||
; r2 unsigned int src_pitch,
|
; r2 unsigned int src_pixels_per_line,
|
||||||
; r3 unsigned int height,
|
; r3 unsigned int output_height,
|
||||||
; stack unsigned int width,
|
; stack unsigned int output_width,
|
||||||
; stack const short *vp8_filter
|
; stack const short *vp8_filter
|
||||||
;-------------------------------------
|
;-------------------------------------
|
||||||
; The output is transposed stroed in output array to make it easy for second pass filtering.
|
; The output is transposed stroed in output array to make it easy for second pass filtering.
|
||||||
|vp8_filter_block2d_bil_first_pass_armv6| PROC
|
|vp8_filter_block2d_bil_first_pass_armv6| PROC
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
ldr r11, [sp, #40] ; vp8_filter address
|
ldr r11, [sp, #40] ; vp8_filter address
|
||||||
ldr r4, [sp, #36] ; width
|
ldr r4, [sp, #36] ; output width
|
||||||
|
|
||||||
mov r12, r3 ; outer-loop counter
|
mov r12, r3 ; outer-loop counter
|
||||||
sub r2, r2, r4 ; src increment for height loop
|
sub r2, r2, r4 ; src increment for height loop
|
||||||
@@ -38,10 +38,10 @@
|
|||||||
|
|
||||||
ldr r5, [r11] ; load up filter coefficients
|
ldr r5, [r11] ; load up filter coefficients
|
||||||
|
|
||||||
mov r3, r3, lsl #1 ; height*2
|
mov r3, r3, lsl #1 ; output_height*2
|
||||||
add r3, r3, #2 ; plus 2 to make output buffer 4-bit aligned since height is actually (height+1)
|
add r3, r3, #2 ; plus 2 to make output buffer 4-bit aligned since height is actually (height+1)
|
||||||
|
|
||||||
mov r11, r1 ; save dst_ptr for each row
|
mov r11, r1 ; save output_ptr for each row
|
||||||
|
|
||||||
cmp r5, #128 ; if filter coef = 128, then skip the filter
|
cmp r5, #128 ; if filter coef = 128, then skip the filter
|
||||||
beq bil_null_1st_filter
|
beq bil_null_1st_filter
|
||||||
@@ -140,17 +140,17 @@
|
|||||||
|
|
||||||
;---------------------------------
|
;---------------------------------
|
||||||
; r0 unsigned short *src_ptr,
|
; r0 unsigned short *src_ptr,
|
||||||
; r1 unsigned char *dst_ptr,
|
; r1 unsigned char *output_ptr,
|
||||||
; r2 int dst_pitch,
|
; r2 int output_pitch,
|
||||||
; r3 unsigned int height,
|
; r3 unsigned int output_height,
|
||||||
; stack unsigned int width,
|
; stack unsigned int output_width,
|
||||||
; stack const short *vp8_filter
|
; stack const short *vp8_filter
|
||||||
;---------------------------------
|
;---------------------------------
|
||||||
|vp8_filter_block2d_bil_second_pass_armv6| PROC
|
|vp8_filter_block2d_bil_second_pass_armv6| PROC
|
||||||
stmdb sp!, {r4 - r11, lr}
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
|
||||||
ldr r11, [sp, #40] ; vp8_filter address
|
ldr r11, [sp, #40] ; vp8_filter address
|
||||||
ldr r4, [sp, #36] ; width
|
ldr r4, [sp, #36] ; output width
|
||||||
|
|
||||||
ldr r5, [r11] ; load up filter coefficients
|
ldr r5, [r11] ; load up filter coefficients
|
||||||
mov r12, r4 ; outer-loop counter = width, since we work on transposed data matrix
|
mov r12, r4 ; outer-loop counter = width, since we work on transposed data matrix
|
||||||
|
@@ -243,6 +243,8 @@ skip_secondpass_hloop
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA subpelfilters8_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
;One word each is reserved. Label filter_coeff can be used to access the data.
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_filter8_coeff_
|
_filter8_coeff_
|
||||||
|
@@ -10,29 +10,128 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vp8/common/filter.h"
|
#include "subpixel.h"
|
||||||
#include "vp8/common/subpixel.h"
|
|
||||||
#include "bilinearfilter_arm.h"
|
#define BLOCK_HEIGHT_WIDTH 4
|
||||||
|
#define VP8_FILTER_WEIGHT 128
|
||||||
|
#define VP8_FILTER_SHIFT 7
|
||||||
|
|
||||||
|
static const short bilinear_filters[8][2] =
|
||||||
|
{
|
||||||
|
{ 128, 0 },
|
||||||
|
{ 112, 16 },
|
||||||
|
{ 96, 32 },
|
||||||
|
{ 80, 48 },
|
||||||
|
{ 64, 64 },
|
||||||
|
{ 48, 80 },
|
||||||
|
{ 32, 96 },
|
||||||
|
{ 16, 112 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern void vp8_filter_block2d_bil_first_pass_armv6
|
||||||
|
(
|
||||||
|
unsigned char *src_ptr,
|
||||||
|
unsigned short *output_ptr,
|
||||||
|
unsigned int src_pixels_per_line,
|
||||||
|
unsigned int output_height,
|
||||||
|
unsigned int output_width,
|
||||||
|
const short *vp8_filter
|
||||||
|
);
|
||||||
|
|
||||||
|
extern void vp8_filter_block2d_bil_second_pass_armv6
|
||||||
|
(
|
||||||
|
unsigned short *src_ptr,
|
||||||
|
unsigned char *output_ptr,
|
||||||
|
int output_pitch,
|
||||||
|
unsigned int output_height,
|
||||||
|
unsigned int output_width,
|
||||||
|
const short *vp8_filter
|
||||||
|
);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void vp8_filter_block2d_bil_first_pass_6
|
||||||
|
(
|
||||||
|
unsigned char *src_ptr,
|
||||||
|
unsigned short *output_ptr,
|
||||||
|
unsigned int src_pixels_per_line,
|
||||||
|
unsigned int output_height,
|
||||||
|
unsigned int output_width,
|
||||||
|
const short *vp8_filter
|
||||||
|
)
|
||||||
|
{
|
||||||
|
unsigned int i, j;
|
||||||
|
|
||||||
|
for ( i=0; i<output_height; i++ )
|
||||||
|
{
|
||||||
|
for ( j=0; j<output_width; j++ )
|
||||||
|
{
|
||||||
|
/* Apply bilinear filter */
|
||||||
|
output_ptr[j] = ( ( (int)src_ptr[0] * vp8_filter[0]) +
|
||||||
|
((int)src_ptr[1] * vp8_filter[1]) +
|
||||||
|
(VP8_FILTER_WEIGHT/2) ) >> VP8_FILTER_SHIFT;
|
||||||
|
src_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next row... */
|
||||||
|
src_ptr += src_pixels_per_line - output_width;
|
||||||
|
output_ptr += output_width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void vp8_filter_block2d_bil_second_pass_6
|
||||||
|
(
|
||||||
|
unsigned short *src_ptr,
|
||||||
|
unsigned char *output_ptr,
|
||||||
|
int output_pitch,
|
||||||
|
unsigned int output_height,
|
||||||
|
unsigned int output_width,
|
||||||
|
const short *vp8_filter
|
||||||
|
)
|
||||||
|
{
|
||||||
|
unsigned int i,j;
|
||||||
|
int Temp;
|
||||||
|
|
||||||
|
for ( i=0; i<output_height; i++ )
|
||||||
|
{
|
||||||
|
for ( j=0; j<output_width; j++ )
|
||||||
|
{
|
||||||
|
/* Apply filter */
|
||||||
|
Temp = ((int)src_ptr[0] * vp8_filter[0]) +
|
||||||
|
((int)src_ptr[output_width] * vp8_filter[1]) +
|
||||||
|
(VP8_FILTER_WEIGHT/2);
|
||||||
|
output_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT);
|
||||||
|
src_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next row... */
|
||||||
|
/*src_ptr += src_pixels_per_line - output_width;*/
|
||||||
|
output_ptr += output_pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void vp8_filter_block2d_bil_armv6
|
void vp8_filter_block2d_bil_armv6
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
unsigned char *dst_ptr,
|
unsigned char *output_ptr,
|
||||||
unsigned int src_pitch,
|
unsigned int src_pixels_per_line,
|
||||||
unsigned int dst_pitch,
|
unsigned int dst_pitch,
|
||||||
const short *HFilter,
|
const short *HFilter,
|
||||||
const short *VFilter,
|
const short *VFilter,
|
||||||
int Width,
|
int Width,
|
||||||
int Height
|
int Height
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned short FData[36*16]; /* Temp data buffer used in filtering */
|
|
||||||
|
unsigned short FData[36*16]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_bil_first_pass_armv6(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
|
/* pixel_step = 1; */
|
||||||
|
vp8_filter_block2d_bil_first_pass_armv6(src_ptr, FData, src_pixels_per_line, Height + 1, Width, HFilter);
|
||||||
|
|
||||||
/* then 1-D vertically... */
|
/* then 1-D vertically... */
|
||||||
vp8_filter_block2d_bil_second_pass_armv6(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
|
vp8_filter_block2d_bil_second_pass_armv6(FData, output_ptr, dst_pitch, Height, Width, VFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -49,8 +148,8 @@ void vp8_bilinear_predict4x4_armv6
|
|||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 4, 4);
|
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 4, 4);
|
||||||
}
|
}
|
||||||
@@ -68,8 +167,8 @@ void vp8_bilinear_predict8x8_armv6
|
|||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
|
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
|
||||||
}
|
}
|
||||||
@@ -87,8 +186,8 @@ void vp8_bilinear_predict8x4_armv6
|
|||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
|
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
|
||||||
}
|
}
|
||||||
@@ -106,8 +205,8 @@ void vp8_bilinear_predict16x16_armv6
|
|||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
|
vp8_filter_block2d_bil_armv6(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
|
||||||
}
|
}
|
||||||
|
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef BILINEARFILTER_ARM_H
|
|
||||||
#define BILINEARFILTER_ARM_H
|
|
||||||
|
|
||||||
extern void vp8_filter_block2d_bil_first_pass_armv6
|
|
||||||
(
|
|
||||||
const unsigned char *src_ptr,
|
|
||||||
unsigned short *dst_ptr,
|
|
||||||
unsigned int src_pitch,
|
|
||||||
unsigned int height,
|
|
||||||
unsigned int width,
|
|
||||||
const short *vp8_filter
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void vp8_filter_block2d_bil_second_pass_armv6
|
|
||||||
(
|
|
||||||
const unsigned short *src_ptr,
|
|
||||||
unsigned char *dst_ptr,
|
|
||||||
int dst_pitch,
|
|
||||||
unsigned int height,
|
|
||||||
unsigned int width,
|
|
||||||
const short *vp8_filter
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* BILINEARFILTER_ARM_H */
|
|
@@ -11,10 +11,26 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vp8/common/filter.h"
|
#include "subpixel.h"
|
||||||
#include "vp8/common/subpixel.h"
|
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
|
#define BLOCK_HEIGHT_WIDTH 4
|
||||||
|
#define VP8_FILTER_WEIGHT 128
|
||||||
|
#define VP8_FILTER_SHIFT 7
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, static const short, sub_pel_filters[8][6]) =
|
||||||
|
{
|
||||||
|
{ 0, 0, 128, 0, 0, 0 }, /* note that 1/8 pel positions are just as per alpha -0.5 bicubic */
|
||||||
|
{ 0, -6, 123, 12, -1, 0 },
|
||||||
|
{ 2, -11, 108, 36, -8, 1 }, /* New 1/4 pel 6 tap filter */
|
||||||
|
{ 0, -9, 93, 50, -6, 0 },
|
||||||
|
{ 3, -16, 77, 77, -16, 3 }, /* New 1/2 pel 6 tap filter */
|
||||||
|
{ 0, -6, 50, 93, -9, 0 },
|
||||||
|
{ 1, -8, 36, 108, -11, 2 }, /* New 1/4 pel 6 tap filter */
|
||||||
|
{ 0, -1, 12, 123, -6, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
extern void vp8_filter_block2d_first_pass_armv6
|
extern void vp8_filter_block2d_first_pass_armv6
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
@@ -77,11 +93,11 @@ void vp8_sixtap_predict_armv6
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
DECLARE_ALIGNED_ARRAY(4, short, FData, 12*4); /* Temp data buffer used in filtering */
|
DECLARE_ALIGNED_ARRAY(4, short, FData, 12*4); /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
/* Vfilter is null. First pass only */
|
/* Vfilter is null. First pass only */
|
||||||
if (xoffset && !yoffset)
|
if (xoffset && !yoffset)
|
||||||
@@ -113,6 +129,47 @@ void vp8_sixtap_predict_armv6
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void vp8_sixtap_predict8x4_armv6
|
||||||
|
(
|
||||||
|
unsigned char *src_ptr,
|
||||||
|
int src_pixels_per_line,
|
||||||
|
int xoffset,
|
||||||
|
int yoffset,
|
||||||
|
unsigned char *dst_ptr,
|
||||||
|
int dst_pitch
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const short *HFilter;
|
||||||
|
const short *VFilter;
|
||||||
|
DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
|
|
||||||
|
/*if (xoffset && !yoffset)
|
||||||
|
{
|
||||||
|
vp8_filter_block2d_first_pass_only_armv6 ( src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, HFilter );
|
||||||
|
}*/
|
||||||
|
/* Hfilter is null. Second pass only */
|
||||||
|
/*else if (!xoffset && yoffset)
|
||||||
|
{
|
||||||
|
vp8_filter_block2d_second_pass_only_armv6 ( src_ptr, dst_ptr, src_pixels_per_line, 8, dst_pitch, VFilter );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (yoffset & 0x1)
|
||||||
|
vp8_filter_block2d_first_pass_armv6 ( src_ptr-src_pixels_per_line, FData+1, src_pixels_per_line, 8, 7, HFilter );
|
||||||
|
else*/
|
||||||
|
|
||||||
|
vp8_filter_block2d_first_pass_armv6 ( src_ptr-(2*src_pixels_per_line), FData, src_pixels_per_line, 8, 9, HFilter );
|
||||||
|
|
||||||
|
vp8_filter_block2d_second_pass_armv6 ( FData+2, dst_ptr, dst_pitch, 4, 8, VFilter );
|
||||||
|
/*}*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void vp8_sixtap_predict8x8_armv6
|
void vp8_sixtap_predict8x8_armv6
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
@@ -125,10 +182,10 @@ void vp8_sixtap_predict8x8_armv6
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data buffer used in filtering */
|
DECLARE_ALIGNED_ARRAY(4, short, FData, 16*8); /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
if (xoffset && !yoffset)
|
if (xoffset && !yoffset)
|
||||||
{
|
{
|
||||||
@@ -167,10 +224,10 @@ void vp8_sixtap_predict16x16_armv6
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
DECLARE_ALIGNED_ARRAY(4, short, FData, 24*16); /* Temp data buffer used in filtering */
|
DECLARE_ALIGNED_ARRAY(4, short, FData, 24*16); /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
if (xoffset && !yoffset)
|
if (xoffset && !yoffset)
|
||||||
{
|
{
|
||||||
|
@@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "loopfilter.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
|
|
||||||
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);
|
||||||
@@ -41,13 +41,13 @@ void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -57,7 +57,7 @@ void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsi
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vertical MB Filtering */
|
/* Vertical MB Filtering */
|
||||||
@@ -65,13 +65,13 @@ void vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -81,7 +81,7 @@ void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsi
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Horizontal B Filtering */
|
/* Horizontal B Filtering */
|
||||||
@@ -94,10 +94,10 @@ void vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -122,10 +122,10 @@ void vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -148,10 +148,10 @@ void vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, v_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -161,7 +161,7 @@ void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vertical MB Filtering */
|
/* Vertical MB Filtering */
|
||||||
@@ -169,10 +169,10 @@ void vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, v_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -182,7 +182,7 @@ void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Horizontal B Filtering */
|
/* Horizontal B Filtering */
|
||||||
@@ -195,7 +195,7 @@ void vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4 * uv_stride);
|
vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, v_ptr + 4 * uv_stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -220,7 +220,7 @@ void vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4);
|
vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, v_ptr + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
|
@@ -350,7 +350,10 @@ filt_blk2d_spo16x16_loop_neon
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA bifilters16_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_bifilter16_coeff_
|
_bifilter16_coeff_
|
||||||
DCD bifilter16_coeff
|
DCD bifilter16_coeff
|
||||||
bifilter16_coeff
|
bifilter16_coeff
|
||||||
|
@@ -123,7 +123,10 @@ skip_secondpass_filter
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA bilinearfilters4_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_bifilter4_coeff_
|
_bifilter4_coeff_
|
||||||
DCD bifilter4_coeff
|
DCD bifilter4_coeff
|
||||||
bifilter4_coeff
|
bifilter4_coeff
|
||||||
|
@@ -128,7 +128,10 @@ skip_secondpass_filter
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA bifilters8x4_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_bifilter8x4_coeff_
|
_bifilter8x4_coeff_
|
||||||
DCD bifilter8x4_coeff
|
DCD bifilter8x4_coeff
|
||||||
bifilter8x4_coeff
|
bifilter8x4_coeff
|
||||||
|
@@ -176,7 +176,10 @@ skip_secondpass_filter
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA bifilters8_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_bifilter8_coeff_
|
_bifilter8_coeff_
|
||||||
DCD bifilter8_coeff
|
DCD bifilter8_coeff
|
||||||
bifilter8_coeff
|
bifilter8_coeff
|
||||||
|
@@ -397,8 +397,7 @@
|
|||||||
bx lr
|
bx lr
|
||||||
ENDP ; |vp8_loop_filter_horizontal_edge_y_neon|
|
ENDP ; |vp8_loop_filter_horizontal_edge_y_neon|
|
||||||
|
|
||||||
;-----------------
|
AREA loopfilter_dat, DATA, READONLY
|
||||||
|
|
||||||
_lf_coeff_
|
_lf_coeff_
|
||||||
DCD lf_coeff
|
DCD lf_coeff
|
||||||
lf_coeff
|
lf_coeff
|
||||||
|
@@ -104,7 +104,10 @@
|
|||||||
ENDP ; |vp8_loop_filter_simple_horizontal_edge_neon|
|
ENDP ; |vp8_loop_filter_simple_horizontal_edge_neon|
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA hloopfiltery_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 16 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_lfhy_coeff_
|
_lfhy_coeff_
|
||||||
DCD lfhy_coeff
|
DCD lfhy_coeff
|
||||||
lfhy_coeff
|
lfhy_coeff
|
||||||
|
@@ -145,7 +145,10 @@
|
|||||||
ENDP ; |vp8_loop_filter_simple_vertical_edge_neon|
|
ENDP ; |vp8_loop_filter_simple_vertical_edge_neon|
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA vloopfiltery_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 16 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_vlfy_coeff_
|
_vlfy_coeff_
|
||||||
DCD vlfy_coeff
|
DCD vlfy_coeff
|
||||||
vlfy_coeff
|
vlfy_coeff
|
||||||
|
@@ -505,8 +505,7 @@
|
|||||||
bx lr
|
bx lr
|
||||||
ENDP ; |vp8_mbloop_filter_neon|
|
ENDP ; |vp8_mbloop_filter_neon|
|
||||||
|
|
||||||
;-----------------
|
AREA mbloopfilter_dat, DATA, READONLY
|
||||||
|
|
||||||
_mblf_coeff_
|
_mblf_coeff_
|
||||||
DCD mblf_coeff
|
DCD mblf_coeff
|
||||||
mblf_coeff
|
mblf_coeff
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "blockd.h"
|
||||||
|
|
||||||
extern void vp8_recon16x16mb_neon(unsigned char *pred_ptr, short *diff_ptr, unsigned char *dst_ptr, int ystride, unsigned char *udst_ptr, unsigned char *vdst_ptr);
|
extern void vp8_recon16x16mb_neon(unsigned char *pred_ptr, short *diff_ptr, unsigned char *dst_ptr, int ystride, unsigned char *udst_ptr, unsigned char *vdst_ptr);
|
||||||
|
|
||||||
|
@@ -113,7 +113,10 @@
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA idct4x4_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_idct_coeff_
|
_idct_coeff_
|
||||||
DCD idct_coeff
|
DCD idct_coeff
|
||||||
idct_coeff
|
idct_coeff
|
||||||
|
@@ -476,7 +476,10 @@ secondpass_only_inner_loop_neon
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA subpelfilters16_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_filter16_coeff_
|
_filter16_coeff_
|
||||||
DCD filter16_coeff
|
DCD filter16_coeff
|
||||||
filter16_coeff
|
filter16_coeff
|
||||||
|
@@ -407,7 +407,10 @@ secondpass_filter4x4_only
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA subpelfilters4_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_filter4_coeff_
|
_filter4_coeff_
|
||||||
DCD filter4_coeff
|
DCD filter4_coeff
|
||||||
filter4_coeff
|
filter4_coeff
|
||||||
|
@@ -458,7 +458,10 @@ secondpass_filter8x4_only
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA subpelfilters8_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_filter8_coeff_
|
_filter8_coeff_
|
||||||
DCD filter8_coeff
|
DCD filter8_coeff
|
||||||
filter8_coeff
|
filter8_coeff
|
||||||
|
@@ -509,7 +509,10 @@ filt_blk2d_spo8x8_loop_neon
|
|||||||
ENDP
|
ENDP
|
||||||
|
|
||||||
;-----------------
|
;-----------------
|
||||||
|
AREA subpelfilters8_dat, DATA, READWRITE ;read/write by default
|
||||||
|
;Data section with name data_area is specified. DCD reserves space in memory for 48 data.
|
||||||
|
;One word each is reserved. Label filter_coeff can be used to access the data.
|
||||||
|
;Data address: filter_coeff, filter_coeff+4, filter_coeff+8 ...
|
||||||
_filter8_coeff_
|
_filter8_coeff_
|
||||||
DCD filter8_coeff
|
DCD filter8_coeff
|
||||||
filter8_coeff
|
filter8_coeff
|
||||||
|
@@ -10,10 +10,10 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "blockd.h"
|
||||||
#include "vp8/common/reconintra.h"
|
#include "reconintra.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_ARMV7
|
||||||
extern void vp8_build_intra_predictors_mby_neon_func(
|
extern void vp8_build_intra_predictors_mby_neon_func(
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@@ -12,7 +12,13 @@
|
|||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#if CONFIG_VP8_ENCODER
|
||||||
|
#include "vpx_scale/yv12config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
#include "onyxd_int.h"
|
#include "onyxd_int.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFINE(sym, val) int sym = val;
|
#define DEFINE(sym, val) int sym = val;
|
||||||
|
|
||||||
@@ -25,6 +31,29 @@
|
|||||||
* {
|
* {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if CONFIG_VP8_DECODER || CONFIG_VP8_ENCODER
|
||||||
|
DEFINE(yv12_buffer_config_y_width, offsetof(YV12_BUFFER_CONFIG, y_width));
|
||||||
|
DEFINE(yv12_buffer_config_y_height, offsetof(YV12_BUFFER_CONFIG, y_height));
|
||||||
|
DEFINE(yv12_buffer_config_y_stride, offsetof(YV12_BUFFER_CONFIG, y_stride));
|
||||||
|
DEFINE(yv12_buffer_config_uv_width, offsetof(YV12_BUFFER_CONFIG, uv_width));
|
||||||
|
DEFINE(yv12_buffer_config_uv_height, offsetof(YV12_BUFFER_CONFIG, uv_height));
|
||||||
|
DEFINE(yv12_buffer_config_uv_stride, offsetof(YV12_BUFFER_CONFIG, uv_stride));
|
||||||
|
DEFINE(yv12_buffer_config_y_buffer, offsetof(YV12_BUFFER_CONFIG, y_buffer));
|
||||||
|
DEFINE(yv12_buffer_config_u_buffer, offsetof(YV12_BUFFER_CONFIG, u_buffer));
|
||||||
|
DEFINE(yv12_buffer_config_v_buffer, offsetof(YV12_BUFFER_CONFIG, v_buffer));
|
||||||
|
DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
DEFINE(mb_diff, offsetof(MACROBLOCKD, diff));
|
||||||
|
DEFINE(mb_predictor, offsetof(MACROBLOCKD, predictor));
|
||||||
|
DEFINE(mb_dst_y_stride, offsetof(MACROBLOCKD, dst.y_stride));
|
||||||
|
DEFINE(mb_dst_y_buffer, offsetof(MACROBLOCKD, dst.y_buffer));
|
||||||
|
DEFINE(mb_dst_u_buffer, offsetof(MACROBLOCKD, dst.u_buffer));
|
||||||
|
DEFINE(mb_dst_v_buffer, offsetof(MACROBLOCKD, dst.v_buffer));
|
||||||
|
DEFINE(mb_up_available, offsetof(MACROBLOCKD, up_available));
|
||||||
|
DEFINE(mb_left_available, offsetof(MACROBLOCKD, left_available));
|
||||||
|
|
||||||
DEFINE(detok_scan, offsetof(DETOK, scan));
|
DEFINE(detok_scan, offsetof(DETOK, scan));
|
||||||
DEFINE(detok_ptr_block2leftabove, offsetof(DETOK, ptr_block2leftabove));
|
DEFINE(detok_ptr_block2leftabove, offsetof(DETOK, ptr_block2leftabove));
|
||||||
DEFINE(detok_coef_tree_ptr, offsetof(DETOK, vp8_coef_tree_ptr));
|
DEFINE(detok_coef_tree_ptr, offsetof(DETOK, vp8_coef_tree_ptr));
|
||||||
@@ -48,6 +77,7 @@ DEFINE(bool_decoder_range, offsetof(BOOL_DECODER, range));
|
|||||||
|
|
||||||
DEFINE(tokenextrabits_min_val, offsetof(TOKENEXTRABITS, min_val));
|
DEFINE(tokenextrabits_min_val, offsetof(TOKENEXTRABITS, min_val));
|
||||||
DEFINE(tokenextrabits_length, offsetof(TOKENEXTRABITS, Length));
|
DEFINE(tokenextrabits_length, offsetof(TOKENEXTRABITS, Length));
|
||||||
|
#endif
|
||||||
|
|
||||||
//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
|
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "vpx_scale/yv12config.h"
|
|
||||||
|
|
||||||
#define ct_assert(name,cond) \
|
|
||||||
static void assert_##name(void) UNUSED;\
|
|
||||||
static void assert_##name(void) {switch(0){case 0:case !!(cond):;}}
|
|
||||||
|
|
||||||
#define DEFINE(sym, val) int sym = val;
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define BLANK() asm volatile("\n->" : : )
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* int main(void)
|
|
||||||
* {
|
|
||||||
*/
|
|
||||||
|
|
||||||
//vpx_scale
|
|
||||||
DEFINE(yv12_buffer_config_y_width, offsetof(YV12_BUFFER_CONFIG, y_width));
|
|
||||||
DEFINE(yv12_buffer_config_y_height, offsetof(YV12_BUFFER_CONFIG, y_height));
|
|
||||||
DEFINE(yv12_buffer_config_y_stride, offsetof(YV12_BUFFER_CONFIG, y_stride));
|
|
||||||
DEFINE(yv12_buffer_config_uv_width, offsetof(YV12_BUFFER_CONFIG, uv_width));
|
|
||||||
DEFINE(yv12_buffer_config_uv_height, offsetof(YV12_BUFFER_CONFIG, uv_height));
|
|
||||||
DEFINE(yv12_buffer_config_uv_stride, offsetof(YV12_BUFFER_CONFIG, uv_stride));
|
|
||||||
DEFINE(yv12_buffer_config_y_buffer, offsetof(YV12_BUFFER_CONFIG, y_buffer));
|
|
||||||
DEFINE(yv12_buffer_config_u_buffer, offsetof(YV12_BUFFER_CONFIG, u_buffer));
|
|
||||||
DEFINE(yv12_buffer_config_v_buffer, offsetof(YV12_BUFFER_CONFIG, v_buffer));
|
|
||||||
DEFINE(yv12_buffer_config_border, offsetof(YV12_BUFFER_CONFIG, border));
|
|
||||||
|
|
||||||
//add asserts for any offset that is not supported by assembly code
|
|
||||||
//add asserts for any size that is not supported by assembly code
|
|
||||||
/*
|
|
||||||
* return 0;
|
|
||||||
* }
|
|
||||||
*/
|
|
@@ -12,6 +12,8 @@
|
|||||||
#include "blockd.h"
|
#include "blockd.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
|
const int vp8_block2type[25] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1};
|
||||||
|
|
||||||
const unsigned char vp8_block2left[25] =
|
const unsigned char vp8_block2left[25] =
|
||||||
{
|
{
|
||||||
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8
|
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8
|
||||||
|
@@ -28,6 +28,11 @@ void vpx_log(const char *format, ...);
|
|||||||
#define DCPREDSIMTHRESH 0
|
#define DCPREDSIMTHRESH 0
|
||||||
#define DCPREDCNTTHRESH 3
|
#define DCPREDCNTTHRESH 3
|
||||||
|
|
||||||
|
#define Y1CONTEXT 0
|
||||||
|
#define UCONTEXT 1
|
||||||
|
#define VCONTEXT 2
|
||||||
|
#define Y2CONTEXT 3
|
||||||
|
|
||||||
#define MB_FEATURE_TREE_PROBS 3
|
#define MB_FEATURE_TREE_PROBS 3
|
||||||
#define MAX_MB_SEGMENTS 4
|
#define MAX_MB_SEGMENTS 4
|
||||||
|
|
||||||
@@ -43,11 +48,6 @@ typedef struct
|
|||||||
int r, c;
|
int r, c;
|
||||||
} POS;
|
} POS;
|
||||||
|
|
||||||
#define PLANE_TYPE_Y_NO_DC 0
|
|
||||||
#define PLANE_TYPE_Y2 1
|
|
||||||
#define PLANE_TYPE_UV 2
|
|
||||||
#define PLANE_TYPE_Y_WITH_DC 3
|
|
||||||
|
|
||||||
|
|
||||||
typedef char ENTROPY_CONTEXT;
|
typedef char ENTROPY_CONTEXT;
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -58,6 +58,8 @@ typedef struct
|
|||||||
ENTROPY_CONTEXT y2;
|
ENTROPY_CONTEXT y2;
|
||||||
} ENTROPY_CONTEXT_PLANES;
|
} ENTROPY_CONTEXT_PLANES;
|
||||||
|
|
||||||
|
extern const int vp8_block2type[25];
|
||||||
|
|
||||||
extern const unsigned char vp8_block2left[25];
|
extern const unsigned char vp8_block2left[25];
|
||||||
extern const unsigned char vp8_block2above[25];
|
extern const unsigned char vp8_block2above[25];
|
||||||
|
|
||||||
|
570
vp8/common/boolcoder.h
Normal file
570
vp8/common/boolcoder.h
Normal file
@@ -0,0 +1,570 @@
|
|||||||
|
/*
|
||||||
|
* 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 bool_coder_h
|
||||||
|
#define bool_coder_h 1
|
||||||
|
|
||||||
|
/* Arithmetic bool coder with largish probability range.
|
||||||
|
Timothy S Murphy 6 August 2004 */
|
||||||
|
|
||||||
|
/* So as not to force users to drag in too much of my idiosyncratic C++ world,
|
||||||
|
I avoid fancy storage management. */
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef unsigned char vp8bc_index_t; // probability index
|
||||||
|
|
||||||
|
/* There are a couple of slight variants in the details of finite-precision
|
||||||
|
arithmetic coding. May be safely ignored by most users. */
|
||||||
|
|
||||||
|
enum vp8bc_rounding
|
||||||
|
{
|
||||||
|
vp8bc_down = 0, // just like VP8
|
||||||
|
vp8bc_down_full = 1, // handles minimum probability correctly
|
||||||
|
vp8bc_up = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
#if _MSC_VER
|
||||||
|
|
||||||
|
/* Note that msvc by default does not inline _anything_ (regardless of the
|
||||||
|
setting of inline_depth) and that a command-line option (-Ob1 or -Ob2)
|
||||||
|
is required to inline even the smallest functions. */
|
||||||
|
|
||||||
|
# pragma inline_depth( 255) // I mean it when I inline something
|
||||||
|
# pragma warning( disable : 4099) // No class vs. struct harassment
|
||||||
|
# pragma warning( disable : 4250) // dominance complaints
|
||||||
|
# pragma warning( disable : 4284) // operator-> in templates
|
||||||
|
# pragma warning( disable : 4800) // bool conversion
|
||||||
|
|
||||||
|
// don't let prefix ++,-- stand in for postfix, disaster would ensue
|
||||||
|
|
||||||
|
# pragma warning( error : 4620 4621)
|
||||||
|
|
||||||
|
#endif // _MSC_VER
|
||||||
|
|
||||||
|
|
||||||
|
#if __cplusplus
|
||||||
|
|
||||||
|
// Sometimes one wishes to be definite about integer lengths.
|
||||||
|
|
||||||
|
struct int_types
|
||||||
|
{
|
||||||
|
typedef const bool cbool;
|
||||||
|
typedef const signed char cchar;
|
||||||
|
typedef const short cshort;
|
||||||
|
typedef const int cint;
|
||||||
|
typedef const int clong;
|
||||||
|
|
||||||
|
typedef const double cdouble;
|
||||||
|
typedef const size_t csize_t;
|
||||||
|
|
||||||
|
typedef unsigned char uchar; // 8 bits
|
||||||
|
typedef const uchar cuchar;
|
||||||
|
|
||||||
|
typedef short int16;
|
||||||
|
typedef unsigned short uint16;
|
||||||
|
typedef const int16 cint16;
|
||||||
|
typedef const uint16 cuint16;
|
||||||
|
|
||||||
|
typedef int int32;
|
||||||
|
typedef unsigned int uint32;
|
||||||
|
typedef const int32 cint32;
|
||||||
|
typedef const uint32 cuint32;
|
||||||
|
|
||||||
|
typedef unsigned int uint;
|
||||||
|
typedef unsigned int ulong;
|
||||||
|
typedef const uint cuint;
|
||||||
|
typedef const ulong culong;
|
||||||
|
|
||||||
|
|
||||||
|
// All structs consume space, may as well have a vptr.
|
||||||
|
|
||||||
|
virtual ~int_types();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct bool_coder_spec;
|
||||||
|
struct bool_coder;
|
||||||
|
struct bool_writer;
|
||||||
|
struct bool_reader;
|
||||||
|
|
||||||
|
|
||||||
|
struct bool_coder_namespace : int_types
|
||||||
|
{
|
||||||
|
typedef vp8bc_index_t Index;
|
||||||
|
typedef bool_coder_spec Spec;
|
||||||
|
typedef const Spec c_spec;
|
||||||
|
|
||||||
|
enum Rounding
|
||||||
|
{
|
||||||
|
Down = vp8bc_down,
|
||||||
|
down_full = vp8bc_down_full,
|
||||||
|
Up = vp8bc_up
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Archivable specification of a bool coder includes rounding spec
|
||||||
|
// and probability mapping table. The latter replaces a uchar j
|
||||||
|
// (0 <= j < 256) with an arbitrary uint16 tbl[j] = p.
|
||||||
|
// p/65536 is then the probability of a zero.
|
||||||
|
|
||||||
|
struct bool_coder_spec : bool_coder_namespace
|
||||||
|
{
|
||||||
|
friend struct bool_coder;
|
||||||
|
friend struct bool_writer;
|
||||||
|
friend struct bool_reader;
|
||||||
|
friend struct bool_coder_spec_float;
|
||||||
|
friend struct bool_coder_spec_explicit_table;
|
||||||
|
friend struct bool_coder_spec_exponential_table;
|
||||||
|
friend struct BPsrc;
|
||||||
|
private:
|
||||||
|
uint w; // precision
|
||||||
|
Rounding r;
|
||||||
|
|
||||||
|
uint ebits, mbits, ebias;
|
||||||
|
uint32 mmask;
|
||||||
|
|
||||||
|
Index max_index, half_index;
|
||||||
|
|
||||||
|
uint32 mantissa(Index i) const
|
||||||
|
{
|
||||||
|
assert(i < half_index);
|
||||||
|
return (1 << mbits) + (i & mmask);
|
||||||
|
}
|
||||||
|
uint exponent(Index i) const
|
||||||
|
{
|
||||||
|
assert(i < half_index);
|
||||||
|
return ebias - (i >> mbits);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 Ptbl[256]; // kinda clunky, but so is storage management.
|
||||||
|
|
||||||
|
/* Cost in bits of encoding a zero at every probability, scaled by 2^20.
|
||||||
|
Assumes that index is at most 8 bits wide. */
|
||||||
|
|
||||||
|
uint32 Ctbl[256];
|
||||||
|
|
||||||
|
uint32 split(Index i, uint32 R) const // 1 <= split <= max( 1, R-1)
|
||||||
|
{
|
||||||
|
if (!ebias)
|
||||||
|
return 1 + (((R - 1) * Ptbl[i]) >> 16);
|
||||||
|
|
||||||
|
if (i >= half_index)
|
||||||
|
return R - split(max_index - i, R);
|
||||||
|
|
||||||
|
return 1 + (((R - 1) * mantissa(i)) >> exponent(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 max_range() const
|
||||||
|
{
|
||||||
|
return (1 << w) - (r == down_full ? 0 : 1);
|
||||||
|
}
|
||||||
|
uint32 min_range() const
|
||||||
|
{
|
||||||
|
return (1 << (w - 1)) + (r == down_full ? 1 : 0);
|
||||||
|
}
|
||||||
|
uint32 Rinc() const
|
||||||
|
{
|
||||||
|
return r == Up ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_prec() const;
|
||||||
|
|
||||||
|
bool float_init(uint Ebits, uint Mbits);
|
||||||
|
|
||||||
|
void cost_init();
|
||||||
|
|
||||||
|
bool_coder_spec(
|
||||||
|
uint prec, Rounding rr, uint Ebits = 0, uint Mbits = 0
|
||||||
|
)
|
||||||
|
: w(prec), r(rr)
|
||||||
|
{
|
||||||
|
float_init(Ebits, Mbits);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
// Read complete spec from file.
|
||||||
|
bool_coder_spec(FILE *);
|
||||||
|
|
||||||
|
// Write spec to file.
|
||||||
|
void dump(FILE *) const;
|
||||||
|
|
||||||
|
// return probability index best approximating prob.
|
||||||
|
Index operator()(double prob) const;
|
||||||
|
|
||||||
|
// probability corresponding to index
|
||||||
|
double operator()(Index i) const;
|
||||||
|
|
||||||
|
Index complement(Index i) const
|
||||||
|
{
|
||||||
|
return max_index - i;
|
||||||
|
}
|
||||||
|
|
||||||
|
Index max_index() const
|
||||||
|
{
|
||||||
|
return max_index;
|
||||||
|
}
|
||||||
|
Index half_index() const
|
||||||
|
{
|
||||||
|
return half_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 cost_zero(Index i) const
|
||||||
|
{
|
||||||
|
return Ctbl[i];
|
||||||
|
}
|
||||||
|
uint32 cost_one(Index i) const
|
||||||
|
{
|
||||||
|
return Ctbl[ max_index - i];
|
||||||
|
}
|
||||||
|
uint32 cost_bit(Index i, bool b) const
|
||||||
|
{
|
||||||
|
return Ctbl[b? max_index-i:i];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Pseudo floating-point probability specification.
|
||||||
|
|
||||||
|
At least one of Ebits and Mbits must be nonzero.
|
||||||
|
|
||||||
|
Since all arithmetic is done at 32 bits, Ebits is at most 5.
|
||||||
|
|
||||||
|
Total significant bits in index is Ebits + Mbits + 1.
|
||||||
|
|
||||||
|
Below the halfway point (i.e. when the top significant bit is 0),
|
||||||
|
the index is (e << Mbits) + m.
|
||||||
|
|
||||||
|
The exponent e is between 0 and (2**Ebits) - 1,
|
||||||
|
the mantissa m is between 0 and (2**Mbits) - 1.
|
||||||
|
|
||||||
|
Prepending an implicit 1 to the mantissa, the probability is then
|
||||||
|
|
||||||
|
(2**Mbits + m) >> (e - 2**Ebits - 1 - Mbits),
|
||||||
|
|
||||||
|
which has (1/2)**(2**Ebits + 1) as a minimum
|
||||||
|
and (1/2) * [1 - 2**(Mbits + 1)] as a maximum.
|
||||||
|
|
||||||
|
When the index is above the halfway point, the probability is the
|
||||||
|
complement of the probability associated to the complement of the index.
|
||||||
|
|
||||||
|
Note that the probability increases with the index and that, because of
|
||||||
|
the symmetry, we cannot encode probability exactly 1/2; though we
|
||||||
|
can get as close to 1/2 as we like, provided we have enough Mbits.
|
||||||
|
|
||||||
|
The latter is of course not a problem in practice, one never has
|
||||||
|
exact probabilities and entropy errors are second order, that is, the
|
||||||
|
"overcoding" of a zero will be largely compensated for by the
|
||||||
|
"undercoding" of a one (or vice-versa).
|
||||||
|
|
||||||
|
Compared to arithmetic probability specs (a la VP8), this will do better
|
||||||
|
at very high and low probabilities and worse at probabilities near 1/2,
|
||||||
|
as well as facilitating the usage of wider or narrower probability indices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct bool_coder_spec_float : bool_coder_spec
|
||||||
|
{
|
||||||
|
bool_coder_spec_float(
|
||||||
|
uint Ebits = 3, uint Mbits = 4, Rounding rr = down_full, uint prec = 12
|
||||||
|
)
|
||||||
|
: bool_coder_spec(prec, rr, Ebits, Mbits)
|
||||||
|
{
|
||||||
|
cost_init();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct bool_coder_spec_explicit_table : bool_coder_spec
|
||||||
|
{
|
||||||
|
bool_coder_spec_explicit_table(
|
||||||
|
cuint16 probability_table[256] = 0, // default is tbl[i] = i << 8.
|
||||||
|
Rounding = down_full,
|
||||||
|
uint precision = 16
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Contruct table via multiplicative interpolation between
|
||||||
|
// p[128] = 1/2 and p[0] = (1/2)^x.
|
||||||
|
// Since we are working with 16-bit precision, x is at most 16.
|
||||||
|
// For probabilities to increase with i, we must have x > 1.
|
||||||
|
// For 0 <= i <= 128, p[i] = (1/2)^{ 1 + [1 - (i/128)]*[x-1] }.
|
||||||
|
// Finally, p[128+i] = 1 - p[128 - i].
|
||||||
|
|
||||||
|
struct bool_coder_spec_exponential_table : bool_coder_spec
|
||||||
|
{
|
||||||
|
bool_coder_spec_exponential_table(uint x, Rounding = down_full, uint prec = 16);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Commonalities between writer and reader.
|
||||||
|
|
||||||
|
struct bool_coder : bool_coder_namespace
|
||||||
|
{
|
||||||
|
friend struct bool_writer;
|
||||||
|
friend struct bool_reader;
|
||||||
|
friend struct BPsrc;
|
||||||
|
private:
|
||||||
|
uint32 Low, Range;
|
||||||
|
cuint32 min_range;
|
||||||
|
cuint32 rinc;
|
||||||
|
c_spec spec;
|
||||||
|
|
||||||
|
void _reset()
|
||||||
|
{
|
||||||
|
Low = 0;
|
||||||
|
Range = spec.max_range();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_coder(c_spec &s)
|
||||||
|
: min_range(s.min_range()),
|
||||||
|
rinc(s.Rinc()),
|
||||||
|
spec(s)
|
||||||
|
{
|
||||||
|
_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 half() const
|
||||||
|
{
|
||||||
|
return 1 + ((Range - 1) >> 1);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
c_spec &Spec() const
|
||||||
|
{
|
||||||
|
return spec;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct bool_writer : bool_coder
|
||||||
|
{
|
||||||
|
friend struct BPsrc;
|
||||||
|
private:
|
||||||
|
uchar *Bstart, *Bend, *B;
|
||||||
|
int bit_lag;
|
||||||
|
bool is_toast;
|
||||||
|
void carry();
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
_reset();
|
||||||
|
bit_lag = 32 - spec.w;
|
||||||
|
is_toast = 0;
|
||||||
|
}
|
||||||
|
void raw(bool value, uint32 split);
|
||||||
|
public:
|
||||||
|
bool_writer(c_spec &, uchar *Dest, size_t Len);
|
||||||
|
virtual ~bool_writer();
|
||||||
|
|
||||||
|
void operator()(Index p, bool v)
|
||||||
|
{
|
||||||
|
raw(v, spec.split(p, Range));
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar *buf() const
|
||||||
|
{
|
||||||
|
return Bstart;
|
||||||
|
}
|
||||||
|
size_t bytes_written() const
|
||||||
|
{
|
||||||
|
return B - Bstart;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call when done with input, flushes internal state.
|
||||||
|
// DO NOT write any more data after calling this.
|
||||||
|
|
||||||
|
bool_writer &flush();
|
||||||
|
|
||||||
|
void write_bits(int n, uint val)
|
||||||
|
{
|
||||||
|
if (n)
|
||||||
|
{
|
||||||
|
uint m = 1 << (n - 1);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
raw((bool)(val & m), half());
|
||||||
|
}
|
||||||
|
while (m >>= 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# if 0
|
||||||
|
// We are agnostic about storage management.
|
||||||
|
// By default, overflows throw an assert but user can
|
||||||
|
// override to provide an expanding buffer using ...
|
||||||
|
|
||||||
|
virtual void overflow(uint Len) const;
|
||||||
|
|
||||||
|
// ... this function copies already-written data into new buffer
|
||||||
|
// and retains new buffer location.
|
||||||
|
|
||||||
|
void new_buffer(uchar *dest, uint Len);
|
||||||
|
|
||||||
|
// Note that storage management is the user's responsibility.
|
||||||
|
# endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// This could be adjusted to use a little less lookahead.
|
||||||
|
|
||||||
|
struct bool_reader : bool_coder
|
||||||
|
{
|
||||||
|
friend struct BPsrc;
|
||||||
|
private:
|
||||||
|
cuchar *const Bstart; // for debugging
|
||||||
|
cuchar *B;
|
||||||
|
cuchar *const Bend;
|
||||||
|
cuint shf;
|
||||||
|
uint bct;
|
||||||
|
bool raw(uint32 split);
|
||||||
|
public:
|
||||||
|
bool_reader(c_spec &s, cuchar *src, size_t Len);
|
||||||
|
|
||||||
|
bool operator()(Index p)
|
||||||
|
{
|
||||||
|
return raw(spec.split(p, Range));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint read_bits(int num_bits)
|
||||||
|
{
|
||||||
|
uint v = 0;
|
||||||
|
|
||||||
|
while (--num_bits >= 0)
|
||||||
|
v += v + (raw(half()) ? 1 : 0);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
|
/* C interface */
|
||||||
|
|
||||||
|
typedef struct bool_coder_spec bool_coder_spec;
|
||||||
|
typedef struct bool_writer bool_writer;
|
||||||
|
typedef struct bool_reader bool_reader;
|
||||||
|
|
||||||
|
typedef const bool_coder_spec c_bool_coder_spec;
|
||||||
|
typedef const bool_writer c_bool_writer;
|
||||||
|
typedef const bool_reader c_bool_reader;
|
||||||
|
|
||||||
|
|
||||||
|
/* Optionally override default precision when constructing coder_specs.
|
||||||
|
Just pass a zero pointer if you don't care.
|
||||||
|
Precision is at most 16 bits for table specs, at most 23 otherwise. */
|
||||||
|
|
||||||
|
struct vp8bc_prec
|
||||||
|
{
|
||||||
|
enum vp8bc_rounding r; /* see top header file for def */
|
||||||
|
unsigned int prec; /* range precision in bits */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef const struct vp8bc_prec vp8bc_c_prec;
|
||||||
|
|
||||||
|
/* bool_coder_spec contains mapping of uchars to actual probabilities
|
||||||
|
(16 bit uints) as well as (usually immaterial) selection of
|
||||||
|
exact finite-precision algorithm used (for now, the latter can only
|
||||||
|
be overridden using the C++ interface).
|
||||||
|
See comments above the corresponding C++ constructors for discussion,
|
||||||
|
especially of exponential probability table generation. */
|
||||||
|
|
||||||
|
bool_coder_spec *vp8bc_vp8spec(); // just like vp8
|
||||||
|
|
||||||
|
bool_coder_spec *vp8bc_literal_spec(
|
||||||
|
const unsigned short prob_map[256], // 0 is like vp8 w/more precision
|
||||||
|
vp8bc_c_prec*
|
||||||
|
);
|
||||||
|
|
||||||
|
bool_coder_spec *vp8bc_float_spec(
|
||||||
|
unsigned int exponent_bits, unsigned int mantissa_bits, vp8bc_c_prec*
|
||||||
|
);
|
||||||
|
|
||||||
|
bool_coder_spec *vp8bc_exponential_spec(unsigned int min_exp, vp8bc_c_prec *);
|
||||||
|
|
||||||
|
bool_coder_spec *vp8bc_spec_from_file(FILE *);
|
||||||
|
|
||||||
|
|
||||||
|
void vp8bc_destroy_spec(c_bool_coder_spec *);
|
||||||
|
|
||||||
|
void vp8bc_spec_to_file(c_bool_coder_spec *, FILE *);
|
||||||
|
|
||||||
|
|
||||||
|
/* Nearest index to supplied probability of zero, 0 <= prob <= 1. */
|
||||||
|
|
||||||
|
vp8bc_index_t vp8bc_index(c_bool_coder_spec *, double prob);
|
||||||
|
|
||||||
|
vp8bc_index_t vp8bc_index_from_counts(
|
||||||
|
c_bool_coder_spec *p, unsigned int zero_ct, unsigned int one_ct
|
||||||
|
);
|
||||||
|
|
||||||
|
/* In case you want to look */
|
||||||
|
|
||||||
|
double vp8bc_probability(c_bool_coder_spec *, vp8bc_index_t);
|
||||||
|
|
||||||
|
/* Opposite index */
|
||||||
|
|
||||||
|
vp8bc_index_t vp8bc_complement(c_bool_coder_spec *, vp8bc_index_t);
|
||||||
|
|
||||||
|
/* Cost in bits of encoding a zero at given probability, scaled by 2^20.
|
||||||
|
(assumes that an int holds at least 32 bits). */
|
||||||
|
|
||||||
|
unsigned int vp8bc_cost_zero(c_bool_coder_spec *, vp8bc_index_t);
|
||||||
|
|
||||||
|
unsigned int vp8bc_cost_one(c_bool_coder_spec *, vp8bc_index_t);
|
||||||
|
unsigned int vp8bc_cost_bit(c_bool_coder_spec *, vp8bc_index_t, int);
|
||||||
|
|
||||||
|
|
||||||
|
/* bool_writer interface */
|
||||||
|
|
||||||
|
/* Length = 0 disables checking for writes beyond buffer end. */
|
||||||
|
|
||||||
|
bool_writer *vp8bc_create_writer(
|
||||||
|
c_bool_coder_spec *, unsigned char *Destination, size_t Length
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Flushes out any buffered data and returns total # of bytes written. */
|
||||||
|
|
||||||
|
size_t vp8bc_destroy_writer(bool_writer *);
|
||||||
|
|
||||||
|
void vp8bc_write_bool(bool_writer *, int boolean_val, vp8bc_index_t false_prob);
|
||||||
|
|
||||||
|
void vp8bc_write_bits(
|
||||||
|
bool_writer *, unsigned int integer_value, int number_of_bits
|
||||||
|
);
|
||||||
|
|
||||||
|
c_bool_coder_spec *vp8bc_writer_spec(c_bool_writer *);
|
||||||
|
|
||||||
|
|
||||||
|
/* bool_reader interface */
|
||||||
|
|
||||||
|
/* Length = 0 disables checking for reads beyond buffer end. */
|
||||||
|
|
||||||
|
bool_reader *vp8bc_create_reader(
|
||||||
|
c_bool_coder_spec *, const unsigned char *Source, size_t Length
|
||||||
|
);
|
||||||
|
void vp8bc_destroy_reader(bool_reader *);
|
||||||
|
|
||||||
|
int vp8bc_read_bool(bool_reader *, vp8bc_index_t false_prob);
|
||||||
|
|
||||||
|
unsigned int vp8bc_read_bits(bool_reader *, int number_of_bits);
|
||||||
|
|
||||||
|
c_bool_coder_spec *vp8bc_reader_spec(c_bool_reader *);
|
||||||
|
|
||||||
|
#if __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* bool_coder_h */
|
93
vp8/common/codec_common_interface.h
Normal file
93
vp8/common/codec_common_interface.h
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* 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 CODEC_COMMON_INTERFACE_H
|
||||||
|
#define CODEC_COMMON_INTERFACE_H
|
||||||
|
|
||||||
|
#define __export
|
||||||
|
#define _export
|
||||||
|
#define dll_export __declspec( dllexport )
|
||||||
|
#define dll_import __declspec( dllimport )
|
||||||
|
|
||||||
|
// Playback ERROR Codes.
|
||||||
|
#define NO_DECODER_ERROR 0
|
||||||
|
#define REMOTE_DECODER_ERROR -1
|
||||||
|
|
||||||
|
#define DFR_BAD_DCT_COEFF -100
|
||||||
|
#define DFR_ZERO_LENGTH_FRAME -101
|
||||||
|
#define DFR_FRAME_SIZE_INVALID -102
|
||||||
|
#define DFR_OUTPUT_BUFFER_OVERFLOW -103
|
||||||
|
#define DFR_INVALID_FRAME_HEADER -104
|
||||||
|
#define FR_INVALID_MODE_TOKEN -110
|
||||||
|
#define ETR_ALLOCATION_ERROR -200
|
||||||
|
#define ETR_INVALID_ROOT_PTR -201
|
||||||
|
#define SYNCH_ERROR -400
|
||||||
|
#define BUFFER_UNDERFLOW_ERROR -500
|
||||||
|
#define PB_IB_OVERFLOW_ERROR -501
|
||||||
|
|
||||||
|
// External error triggers
|
||||||
|
#define PB_HEADER_CHECKSUM_ERROR -601
|
||||||
|
#define PB_DATA_CHECKSUM_ERROR -602
|
||||||
|
|
||||||
|
// DCT Error Codes
|
||||||
|
#define DDCT_EXPANSION_ERROR -700
|
||||||
|
#define DDCT_INVALID_TOKEN_ERROR -701
|
||||||
|
|
||||||
|
// exception_errors
|
||||||
|
#define GEN_EXCEPTIONS -800
|
||||||
|
#define EX_UNQUAL_ERROR -801
|
||||||
|
|
||||||
|
// Unrecoverable error codes
|
||||||
|
#define FATAL_PLAYBACK_ERROR -1000
|
||||||
|
#define GEN_ERROR_CREATING_CDC -1001
|
||||||
|
#define GEN_THREAD_CREATION_ERROR -1002
|
||||||
|
#define DFR_CREATE_BMP_FAILED -1003
|
||||||
|
|
||||||
|
// YUV buffer configuration structure
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int y_width;
|
||||||
|
int y_height;
|
||||||
|
int y_stride;
|
||||||
|
|
||||||
|
int uv_width;
|
||||||
|
int uv_height;
|
||||||
|
int uv_stride;
|
||||||
|
|
||||||
|
unsigned char *y_buffer;
|
||||||
|
unsigned char *u_buffer;
|
||||||
|
unsigned char *v_buffer;
|
||||||
|
|
||||||
|
} YUV_BUFFER_CONFIG;
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
C_SET_KEY_FRAME,
|
||||||
|
C_SET_FIXED_Q,
|
||||||
|
C_SET_FIRSTPASS_FILE,
|
||||||
|
C_SET_EXPERIMENTAL_MIN,
|
||||||
|
C_SET_EXPERIMENTAL_MAX = C_SET_EXPERIMENTAL_MIN + 255,
|
||||||
|
C_SET_CHECKPROTECT,
|
||||||
|
C_SET_TESTMODE,
|
||||||
|
C_SET_INTERNAL_SIZE,
|
||||||
|
C_SET_RECOVERY_FRAME,
|
||||||
|
C_SET_REFERENCEFRAME,
|
||||||
|
C_SET_GOLDENFRAME
|
||||||
|
|
||||||
|
#ifndef VP50_COMP_INTERFACE
|
||||||
|
// Specialist test facilities.
|
||||||
|
// C_VCAP_PARAMS, // DO NOT USE FOR NOW WITH VFW CODEC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} C_SETTING;
|
||||||
|
|
||||||
|
typedef unsigned long C_SET_VALUE;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@@ -10,10 +10,13 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "filter.h"
|
|
||||||
#include "vpx_ports/mem.h"
|
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const short, vp8_bilinear_filters[8][2]) =
|
#define BLOCK_HEIGHT_WIDTH 4
|
||||||
|
#define VP8_FILTER_WEIGHT 128
|
||||||
|
#define VP8_FILTER_SHIFT 7
|
||||||
|
|
||||||
|
|
||||||
|
static const int bilinear_filters[8][2] =
|
||||||
{
|
{
|
||||||
{ 128, 0 },
|
{ 128, 0 },
|
||||||
{ 112, 16 },
|
{ 112, 16 },
|
||||||
@@ -25,7 +28,8 @@ DECLARE_ALIGNED(16, const short, vp8_bilinear_filters[8][2]) =
|
|||||||
{ 16, 112 }
|
{ 16, 112 }
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[8][6]) =
|
|
||||||
|
static const short sub_pel_filters[8][6] =
|
||||||
{
|
{
|
||||||
|
|
||||||
{ 0, 0, 128, 0, 0, 0 }, /* note that 1/8 pel positions are just as per alpha -0.5 bicubic */
|
{ 0, 0, 128, 0, 0, 0 }, /* note that 1/8 pel positions are just as per alpha -0.5 bicubic */
|
||||||
@@ -36,6 +40,9 @@ DECLARE_ALIGNED(16, const short, vp8_sub_pel_filters[8][6]) =
|
|||||||
{ 0, -6, 50, 93, -9, 0 },
|
{ 0, -6, 50, 93, -9, 0 },
|
||||||
{ 1, -8, 36, 108, -11, 2 }, /* New 1/4 pel 6 tap filter */
|
{ 1, -8, 36, 108, -11, 2 }, /* New 1/4 pel 6 tap filter */
|
||||||
{ 0, -1, 12, 123, -6, 0 },
|
{ 0, -1, 12, 123, -6, 0 },
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void vp8_filter_block2d_first_pass
|
void vp8_filter_block2d_first_pass
|
||||||
@@ -139,7 +146,7 @@ void vp8_filter_block2d
|
|||||||
const short *VFilter
|
const short *VFilter
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int FData[9*4]; /* Temp data buffer used in filtering */
|
int FData[9*4]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 4, HFilter);
|
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 4, HFilter);
|
||||||
@@ -188,8 +195,8 @@ void vp8_sixtap_predict_c
|
|||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
vp8_filter_block2d(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter);
|
vp8_filter_block2d(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter);
|
||||||
}
|
}
|
||||||
@@ -205,10 +212,10 @@ void vp8_sixtap_predict8x8_c
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
int FData[13*16]; /* Temp data buffer used in filtering */
|
int FData[13*16]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 13, 8, HFilter);
|
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 13, 8, HFilter);
|
||||||
@@ -231,10 +238,10 @@ void vp8_sixtap_predict8x4_c
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
int FData[13*16]; /* Temp data buffer used in filtering */
|
int FData[13*16]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 8, HFilter);
|
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 9, 8, HFilter);
|
||||||
@@ -257,11 +264,11 @@ void vp8_sixtap_predict16x16_c
|
|||||||
{
|
{
|
||||||
const short *HFilter;
|
const short *HFilter;
|
||||||
const short *VFilter;
|
const short *VFilter;
|
||||||
int FData[21*24]; /* Temp data buffer used in filtering */
|
int FData[21*24]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
|
|
||||||
HFilter = vp8_sub_pel_filters[xoffset]; /* 6 tap */
|
HFilter = sub_pel_filters[xoffset]; /* 6 tap */
|
||||||
VFilter = vp8_sub_pel_filters[yoffset]; /* 6 tap */
|
VFilter = sub_pel_filters[yoffset]; /* 6 tap */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 21, 16, HFilter);
|
vp8_filter_block2d_first_pass(src_ptr - (2 * src_pixels_per_line), FData, src_pixels_per_line, 1, 21, 16, HFilter);
|
||||||
@@ -276,50 +283,57 @@ void vp8_sixtap_predict16x16_c
|
|||||||
*
|
*
|
||||||
* ROUTINE : filter_block2d_bil_first_pass
|
* ROUTINE : filter_block2d_bil_first_pass
|
||||||
*
|
*
|
||||||
* INPUTS : UINT8 *src_ptr : Pointer to source block.
|
* INPUTS : UINT8 *src_ptr : Pointer to source block.
|
||||||
* UINT32 src_stride : Stride of source block.
|
* UINT32 src_pixels_per_line : Stride of input block.
|
||||||
* UINT32 height : Block height.
|
* UINT32 pixel_step : Offset between filter input samples (see notes).
|
||||||
* UINT32 width : Block width.
|
* UINT32 output_height : Input block height.
|
||||||
* INT32 *vp8_filter : Array of 2 bi-linear filter taps.
|
* UINT32 output_width : Input block width.
|
||||||
|
* INT32 *vp8_filter : Array of 2 bi-linear filter taps.
|
||||||
*
|
*
|
||||||
* OUTPUTS : INT32 *dst_ptr : Pointer to filtered block.
|
* OUTPUTS : INT32 *output_ptr : Pointer to filtered block.
|
||||||
*
|
*
|
||||||
* RETURNS : void
|
* RETURNS : void
|
||||||
*
|
*
|
||||||
* FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block
|
* FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in
|
||||||
* in the horizontal direction to produce the filtered output
|
* either horizontal or vertical direction to produce the
|
||||||
* block. Used to implement first-pass of 2-D separable filter.
|
* filtered output block. Used to implement first-pass
|
||||||
|
* of 2-D separable filter.
|
||||||
*
|
*
|
||||||
* SPECIAL NOTES : Produces INT32 output to retain precision for next pass.
|
* SPECIAL NOTES : Produces INT32 output to retain precision for next pass.
|
||||||
* Two filter taps should sum to VP8_FILTER_WEIGHT.
|
* Two filter taps should sum to VP8_FILTER_WEIGHT.
|
||||||
|
* pixel_step defines whether the filter is applied
|
||||||
|
* horizontally (pixel_step=1) or vertically (pixel_step=stride).
|
||||||
|
* It defines the offset required to move from one input
|
||||||
|
* to the next.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void vp8_filter_block2d_bil_first_pass
|
void vp8_filter_block2d_bil_first_pass
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
unsigned short *dst_ptr,
|
unsigned short *output_ptr,
|
||||||
unsigned int src_stride,
|
unsigned int src_pixels_per_line,
|
||||||
unsigned int height,
|
int pixel_step,
|
||||||
unsigned int width,
|
unsigned int output_height,
|
||||||
const short *vp8_filter
|
unsigned int output_width,
|
||||||
|
const int *vp8_filter
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
for (i = 0; i < height; i++)
|
for (i = 0; i < output_height; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < width; j++)
|
for (j = 0; j < output_width; j++)
|
||||||
{
|
{
|
||||||
/* Apply bilinear filter */
|
/* Apply bilinear filter */
|
||||||
dst_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) +
|
output_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) +
|
||||||
((int)src_ptr[1] * vp8_filter[1]) +
|
((int)src_ptr[pixel_step] * vp8_filter[1]) +
|
||||||
(VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT;
|
(VP8_FILTER_WEIGHT / 2)) >> VP8_FILTER_SHIFT;
|
||||||
src_ptr++;
|
src_ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Next row... */
|
/* Next row... */
|
||||||
src_ptr += src_stride - width;
|
src_ptr += src_pixels_per_line - output_width;
|
||||||
dst_ptr += width;
|
output_ptr += output_width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,51 +341,60 @@ void vp8_filter_block2d_bil_first_pass
|
|||||||
*
|
*
|
||||||
* ROUTINE : filter_block2d_bil_second_pass
|
* ROUTINE : filter_block2d_bil_second_pass
|
||||||
*
|
*
|
||||||
* INPUTS : INT32 *src_ptr : Pointer to source block.
|
* INPUTS : INT32 *src_ptr : Pointer to source block.
|
||||||
* UINT32 dst_pitch : Destination block pitch.
|
* UINT32 src_pixels_per_line : Stride of input block.
|
||||||
* UINT32 height : Block height.
|
* UINT32 pixel_step : Offset between filter input samples (see notes).
|
||||||
* UINT32 width : Block width.
|
* UINT32 output_height : Input block height.
|
||||||
* INT32 *vp8_filter : Array of 2 bi-linear filter taps.
|
* UINT32 output_width : Input block width.
|
||||||
|
* INT32 *vp8_filter : Array of 2 bi-linear filter taps.
|
||||||
*
|
*
|
||||||
* OUTPUTS : UINT16 *dst_ptr : Pointer to filtered block.
|
* OUTPUTS : UINT16 *output_ptr : Pointer to filtered block.
|
||||||
*
|
*
|
||||||
* RETURNS : void
|
* RETURNS : void
|
||||||
*
|
*
|
||||||
* FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block
|
* FUNCTION : Applies a 1-D 2-tap bi-linear filter to the source block in
|
||||||
* in the vertical direction to produce the filtered output
|
* either horizontal or vertical direction to produce the
|
||||||
* block. Used to implement second-pass of 2-D separable filter.
|
* filtered output block. Used to implement second-pass
|
||||||
|
* of 2-D separable filter.
|
||||||
*
|
*
|
||||||
* SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass.
|
* SPECIAL NOTES : Requires 32-bit input as produced by filter_block2d_bil_first_pass.
|
||||||
* Two filter taps should sum to VP8_FILTER_WEIGHT.
|
* Two filter taps should sum to VP8_FILTER_WEIGHT.
|
||||||
|
* pixel_step defines whether the filter is applied
|
||||||
|
* horizontally (pixel_step=1) or vertically (pixel_step=stride).
|
||||||
|
* It defines the offset required to move from one input
|
||||||
|
* to the next.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void vp8_filter_block2d_bil_second_pass
|
void vp8_filter_block2d_bil_second_pass
|
||||||
(
|
(
|
||||||
unsigned short *src_ptr,
|
unsigned short *src_ptr,
|
||||||
unsigned char *dst_ptr,
|
unsigned char *output_ptr,
|
||||||
int dst_pitch,
|
int output_pitch,
|
||||||
unsigned int height,
|
unsigned int src_pixels_per_line,
|
||||||
unsigned int width,
|
unsigned int pixel_step,
|
||||||
const short *vp8_filter
|
unsigned int output_height,
|
||||||
|
unsigned int output_width,
|
||||||
|
const int *vp8_filter
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
int Temp;
|
int Temp;
|
||||||
|
|
||||||
for (i = 0; i < height; i++)
|
for (i = 0; i < output_height; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < width; j++)
|
for (j = 0; j < output_width; j++)
|
||||||
{
|
{
|
||||||
/* Apply filter */
|
/* Apply filter */
|
||||||
Temp = ((int)src_ptr[0] * vp8_filter[0]) +
|
Temp = ((int)src_ptr[0] * vp8_filter[0]) +
|
||||||
((int)src_ptr[width] * vp8_filter[1]) +
|
((int)src_ptr[pixel_step] * vp8_filter[1]) +
|
||||||
(VP8_FILTER_WEIGHT / 2);
|
(VP8_FILTER_WEIGHT / 2);
|
||||||
dst_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT);
|
output_ptr[j] = (unsigned int)(Temp >> VP8_FILTER_SHIFT);
|
||||||
src_ptr++;
|
src_ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Next row... */
|
/* Next row... */
|
||||||
dst_ptr += dst_pitch;
|
src_ptr += src_pixels_per_line - output_width;
|
||||||
|
output_ptr += output_pitch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,14 +404,11 @@ void vp8_filter_block2d_bil_second_pass
|
|||||||
* ROUTINE : filter_block2d_bil
|
* ROUTINE : filter_block2d_bil
|
||||||
*
|
*
|
||||||
* INPUTS : UINT8 *src_ptr : Pointer to source block.
|
* INPUTS : UINT8 *src_ptr : Pointer to source block.
|
||||||
* UINT32 src_pitch : Stride of source block.
|
* UINT32 src_pixels_per_line : Stride of input block.
|
||||||
* UINT32 dst_pitch : Stride of destination block.
|
* INT32 *HFilter : Array of 2 horizontal filter taps.
|
||||||
* INT32 *HFilter : Array of 2 horizontal filter taps.
|
* INT32 *VFilter : Array of 2 vertical filter taps.
|
||||||
* INT32 *VFilter : Array of 2 vertical filter taps.
|
|
||||||
* INT32 Width : Block width
|
|
||||||
* INT32 Height : Block height
|
|
||||||
*
|
*
|
||||||
* OUTPUTS : UINT16 *dst_ptr : Pointer to filtered block.
|
* OUTPUTS : UINT16 *output_ptr : Pointer to filtered block.
|
||||||
*
|
*
|
||||||
* RETURNS : void
|
* RETURNS : void
|
||||||
*
|
*
|
||||||
@@ -402,23 +422,23 @@ void vp8_filter_block2d_bil_second_pass
|
|||||||
void vp8_filter_block2d_bil
|
void vp8_filter_block2d_bil
|
||||||
(
|
(
|
||||||
unsigned char *src_ptr,
|
unsigned char *src_ptr,
|
||||||
unsigned char *dst_ptr,
|
unsigned char *output_ptr,
|
||||||
unsigned int src_pitch,
|
unsigned int src_pixels_per_line,
|
||||||
unsigned int dst_pitch,
|
unsigned int dst_pitch,
|
||||||
const short *HFilter,
|
const int *HFilter,
|
||||||
const short *VFilter,
|
const int *VFilter,
|
||||||
int Width,
|
int Width,
|
||||||
int Height
|
int Height
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned short FData[17*16]; /* Temp data buffer used in filtering */
|
unsigned short FData[17*16]; /* Temp data bufffer used in filtering */
|
||||||
|
|
||||||
/* First filter 1-D horizontally... */
|
/* First filter 1-D horizontally... */
|
||||||
vp8_filter_block2d_bil_first_pass(src_ptr, FData, src_pitch, Height + 1, Width, HFilter);
|
vp8_filter_block2d_bil_first_pass(src_ptr, FData, src_pixels_per_line, 1, Height + 1, Width, HFilter);
|
||||||
|
|
||||||
/* then 1-D vertically... */
|
/* then 1-D vertically... */
|
||||||
vp8_filter_block2d_bil_second_pass(FData, dst_ptr, dst_pitch, Height, Width, VFilter);
|
vp8_filter_block2d_bil_second_pass(FData, output_ptr, dst_pitch, Width, Width, Height, Width, VFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -432,11 +452,11 @@ void vp8_bilinear_predict4x4_c
|
|||||||
int dst_pitch
|
int dst_pitch
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const short *HFilter;
|
const int *HFilter;
|
||||||
const short *VFilter;
|
const int *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
#if 0
|
#if 0
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -470,11 +490,11 @@ void vp8_bilinear_predict8x8_c
|
|||||||
int dst_pitch
|
int dst_pitch
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const short *HFilter;
|
const int *HFilter;
|
||||||
const short *VFilter;
|
const int *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
|
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 8);
|
||||||
|
|
||||||
@@ -490,11 +510,11 @@ void vp8_bilinear_predict8x4_c
|
|||||||
int dst_pitch
|
int dst_pitch
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const short *HFilter;
|
const int *HFilter;
|
||||||
const short *VFilter;
|
const int *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
|
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 8, 4);
|
||||||
|
|
||||||
@@ -510,11 +530,11 @@ void vp8_bilinear_predict16x16_c
|
|||||||
int dst_pitch
|
int dst_pitch
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const short *HFilter;
|
const int *HFilter;
|
||||||
const short *VFilter;
|
const int *VFilter;
|
||||||
|
|
||||||
HFilter = vp8_bilinear_filters[xoffset];
|
HFilter = bilinear_filters[xoffset];
|
||||||
VFilter = vp8_bilinear_filters[yoffset];
|
VFilter = bilinear_filters[yoffset];
|
||||||
|
|
||||||
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
|
vp8_filter_block2d_bil(src_ptr, dst_ptr, src_pixels_per_line, dst_pitch, HFilter, VFilter, 16, 16);
|
||||||
}
|
}
|
@@ -11,9 +11,47 @@
|
|||||||
|
|
||||||
#include "findnearmv.h"
|
#include "findnearmv.h"
|
||||||
|
|
||||||
|
#define FINDNEAR_SEARCH_SITES 3
|
||||||
|
|
||||||
/* Predict motion vectors using those from already-decoded nearby blocks.
|
/* Predict motion vectors using those from already-decoded nearby blocks.
|
||||||
Note that we only consider one 4x4 subblock from each candidate 16x16
|
Note that we only consider one 4x4 subblock from each candidate 16x16
|
||||||
macroblock. */
|
macroblock. */
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
unsigned int as_int;
|
||||||
|
MV as_mv;
|
||||||
|
} int_mv; /* facilitates rapid equality tests */
|
||||||
|
|
||||||
|
static void mv_bias(const MODE_INFO *x, int refframe, int_mv *mvp, const int *ref_frame_sign_bias)
|
||||||
|
{
|
||||||
|
MV xmv;
|
||||||
|
xmv = x->mbmi.mv.as_mv;
|
||||||
|
|
||||||
|
if (ref_frame_sign_bias[x->mbmi.ref_frame] != ref_frame_sign_bias[refframe])
|
||||||
|
{
|
||||||
|
xmv.row *= -1;
|
||||||
|
xmv.col *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mvp->as_mv = xmv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vp8_clamp_mv(MV *mv, const MACROBLOCKD *xd)
|
||||||
|
{
|
||||||
|
if (mv->col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN))
|
||||||
|
mv->col = xd->mb_to_left_edge - LEFT_TOP_MARGIN;
|
||||||
|
else if (mv->col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN)
|
||||||
|
mv->col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN;
|
||||||
|
|
||||||
|
if (mv->row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN))
|
||||||
|
mv->row = xd->mb_to_top_edge - LEFT_TOP_MARGIN;
|
||||||
|
else if (mv->row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN)
|
||||||
|
mv->row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void vp8_find_near_mvs
|
void vp8_find_near_mvs
|
||||||
(
|
(
|
||||||
MACROBLOCKD *xd,
|
MACROBLOCKD *xd,
|
||||||
@@ -44,7 +82,7 @@ void vp8_find_near_mvs
|
|||||||
if (above->mbmi.mv.as_int)
|
if (above->mbmi.mv.as_int)
|
||||||
{
|
{
|
||||||
(++mv)->as_int = above->mbmi.mv.as_int;
|
(++mv)->as_int = above->mbmi.mv.as_int;
|
||||||
mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, mv, ref_frame_sign_bias);
|
mv_bias(above, refframe, mv, ref_frame_sign_bias);
|
||||||
++cntx;
|
++cntx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +97,7 @@ void vp8_find_near_mvs
|
|||||||
int_mv this_mv;
|
int_mv this_mv;
|
||||||
|
|
||||||
this_mv.as_int = left->mbmi.mv.as_int;
|
this_mv.as_int = left->mbmi.mv.as_int;
|
||||||
mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias);
|
mv_bias(left, refframe, &this_mv, ref_frame_sign_bias);
|
||||||
|
|
||||||
if (this_mv.as_int != mv->as_int)
|
if (this_mv.as_int != mv->as_int)
|
||||||
{
|
{
|
||||||
@@ -81,7 +119,7 @@ void vp8_find_near_mvs
|
|||||||
int_mv this_mv;
|
int_mv this_mv;
|
||||||
|
|
||||||
this_mv.as_int = aboveleft->mbmi.mv.as_int;
|
this_mv.as_int = aboveleft->mbmi.mv.as_int;
|
||||||
mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias);
|
mv_bias(aboveleft, refframe, &this_mv, ref_frame_sign_bias);
|
||||||
|
|
||||||
if (this_mv.as_int != mv->as_int)
|
if (this_mv.as_int != mv->as_int)
|
||||||
{
|
{
|
||||||
|
@@ -17,41 +17,6 @@
|
|||||||
#include "modecont.h"
|
#include "modecont.h"
|
||||||
#include "treecoder.h"
|
#include "treecoder.h"
|
||||||
|
|
||||||
typedef union
|
|
||||||
{
|
|
||||||
unsigned int as_int;
|
|
||||||
MV as_mv;
|
|
||||||
} int_mv; /* facilitates rapid equality tests */
|
|
||||||
|
|
||||||
static void mv_bias(int refmb_ref_frame_sign_bias, int refframe, int_mv *mvp, const int *ref_frame_sign_bias)
|
|
||||||
{
|
|
||||||
MV xmv;
|
|
||||||
xmv = mvp->as_mv;
|
|
||||||
|
|
||||||
if (refmb_ref_frame_sign_bias != ref_frame_sign_bias[refframe])
|
|
||||||
{
|
|
||||||
xmv.row *= -1;
|
|
||||||
xmv.col *= -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
mvp->as_mv = xmv;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LEFT_TOP_MARGIN (16 << 3)
|
|
||||||
#define RIGHT_BOTTOM_MARGIN (16 << 3)
|
|
||||||
static void vp8_clamp_mv(MV *mv, const MACROBLOCKD *xd)
|
|
||||||
{
|
|
||||||
if (mv->col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN))
|
|
||||||
mv->col = xd->mb_to_left_edge - LEFT_TOP_MARGIN;
|
|
||||||
else if (mv->col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN)
|
|
||||||
mv->col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN;
|
|
||||||
|
|
||||||
if (mv->row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN))
|
|
||||||
mv->row = xd->mb_to_top_edge - LEFT_TOP_MARGIN;
|
|
||||||
else if (mv->row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN)
|
|
||||||
mv->row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_find_near_mvs
|
void vp8_find_near_mvs
|
||||||
(
|
(
|
||||||
MACROBLOCKD *xd,
|
MACROBLOCKD *xd,
|
||||||
@@ -70,4 +35,8 @@ const B_MODE_INFO *vp8_left_bmi(const MODE_INFO *cur_mb, int b);
|
|||||||
|
|
||||||
const B_MODE_INFO *vp8_above_bmi(const MODE_INFO *cur_mb, int b, int mi_stride);
|
const B_MODE_INFO *vp8_above_bmi(const MODE_INFO *cur_mb, int b, int mi_stride);
|
||||||
|
|
||||||
|
#define LEFT_TOP_MARGIN (16 << 3)
|
||||||
|
#define RIGHT_BOTTOM_MARGIN (16 << 3)
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
121
vp8/common/fourcc.hpp
Normal file
121
vp8/common/fourcc.hpp
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* 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 FOURCC_HPP
|
||||||
|
#define FOURCC_HPP
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__POWERPC__) || defined(__APPLE__) || defined(__MERKS__)
|
||||||
|
using namespace std;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class four_cc
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
four_cc();
|
||||||
|
four_cc(const char*);
|
||||||
|
explicit four_cc(unsigned long);
|
||||||
|
|
||||||
|
bool operator==(const four_cc&) const;
|
||||||
|
bool operator!=(const four_cc&) const;
|
||||||
|
|
||||||
|
bool operator==(const char*) const;
|
||||||
|
bool operator!=(const char*) const;
|
||||||
|
|
||||||
|
operator unsigned long() const;
|
||||||
|
unsigned long as_long() const;
|
||||||
|
|
||||||
|
four_cc& operator=(unsigned long);
|
||||||
|
|
||||||
|
char operator[](int) const;
|
||||||
|
|
||||||
|
std::ostream& put(std::ostream&) const;
|
||||||
|
|
||||||
|
bool printable() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
char code[4];
|
||||||
|
unsigned long code_as_long;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline four_cc::four_cc()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline four_cc::four_cc(unsigned long x)
|
||||||
|
: code_as_long(x)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline four_cc::four_cc(const char* str)
|
||||||
|
{
|
||||||
|
memcpy(code, str, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool four_cc::operator==(const four_cc& rhs) const
|
||||||
|
{
|
||||||
|
return code_as_long == rhs.code_as_long;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool four_cc::operator!=(const four_cc& rhs) const
|
||||||
|
{
|
||||||
|
return !operator==(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool four_cc::operator==(const char* rhs) const
|
||||||
|
{
|
||||||
|
return (memcmp(code, rhs, 4) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool four_cc::operator!=(const char* rhs) const
|
||||||
|
{
|
||||||
|
return !operator==(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline four_cc::operator unsigned long() const
|
||||||
|
{
|
||||||
|
return code_as_long;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline unsigned long four_cc::as_long() const
|
||||||
|
{
|
||||||
|
return code_as_long;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline char four_cc::operator[](int i) const
|
||||||
|
{
|
||||||
|
return code[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline four_cc& four_cc::operator=(unsigned long val)
|
||||||
|
{
|
||||||
|
code_as_long = val;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::ostream& operator<<(std::ostream& os, const four_cc& rhs)
|
||||||
|
{
|
||||||
|
return rhs.put(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/g_common.h"
|
#include "g_common.h"
|
||||||
#include "vp8/common/subpixel.h"
|
#include "subpixel.h"
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "loopfilter.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
|
|
||||||
extern void vp8_arch_x86_common_init(VP8_COMMON *ctx);
|
extern void vp8_arch_x86_common_init(VP8_COMMON *ctx);
|
||||||
extern void vp8_arch_arm_common_init(VP8_COMMON *ctx);
|
extern void vp8_arch_arm_common_init(VP8_COMMON *ctx);
|
||||||
|
@@ -28,13 +28,13 @@ void vp8_loop_filter_mbh_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_horizontal_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_horizontal_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_c(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_c(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_c(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_c(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbhs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbhs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -44,7 +44,7 @@ void vp8_loop_filter_mbhs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_horizontal_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_horizontal_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vertical MB Filtering */
|
/* Vertical MB Filtering */
|
||||||
@@ -52,13 +52,13 @@ void vp8_loop_filter_mbv_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_vertical_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_vertical_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_c(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_c(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_c(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_c(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_mbvs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_mbvs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -68,7 +68,7 @@ void vp8_loop_filter_mbvs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_vertical_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_vertical_edge_c(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Horizontal B Filtering */
|
/* Horizontal B Filtering */
|
||||||
@@ -81,10 +81,10 @@ void vp8_loop_filter_bh_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned c
|
|||||||
vp8_loop_filter_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_horizontal_edge_c(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_c(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_c(u_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_c(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_c(v_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bhs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bhs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -109,10 +109,10 @@ void vp8_loop_filter_bv_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned c
|
|||||||
vp8_loop_filter_vertical_edge_c(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_vertical_edge_c(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_vertical_edge_c(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_c(u_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_vertical_edge_c(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_c(v_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_loop_filter_bvs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void vp8_loop_filter_bvs_c(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -137,6 +137,8 @@ void vp8_init_loop_filter(VP8_COMMON *cm)
|
|||||||
|
|
||||||
int block_inside_limit = 0;
|
int block_inside_limit = 0;
|
||||||
int HEVThresh;
|
int HEVThresh;
|
||||||
|
const int yhedge_boost = 2;
|
||||||
|
const int uvhedge_boost = 2;
|
||||||
|
|
||||||
/* For each possible value for the loop filter fill out a "loop_filter_info" entry. */
|
/* For each possible value for the loop filter fill out a "loop_filter_info" entry. */
|
||||||
for (i = 0; i <= MAX_LOOP_FILTER; i++)
|
for (i = 0; i <= MAX_LOOP_FILTER; i++)
|
||||||
@@ -180,9 +182,15 @@ void vp8_init_loop_filter(VP8_COMMON *cm)
|
|||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
lfi[i].lim[j] = block_inside_limit;
|
lfi[i].lim[j] = block_inside_limit;
|
||||||
lfi[i].mbflim[j] = filt_lvl + 2;
|
lfi[i].mbflim[j] = filt_lvl + yhedge_boost;
|
||||||
|
lfi[i].mbthr[j] = HEVThresh;
|
||||||
lfi[i].flim[j] = filt_lvl;
|
lfi[i].flim[j] = filt_lvl;
|
||||||
lfi[i].thr[j] = HEVThresh;
|
lfi[i].thr[j] = HEVThresh;
|
||||||
|
lfi[i].uvlim[j] = block_inside_limit;
|
||||||
|
lfi[i].uvmbflim[j] = filt_lvl + uvhedge_boost;
|
||||||
|
lfi[i].uvmbthr[j] = HEVThresh;
|
||||||
|
lfi[i].uvflim[j] = filt_lvl;
|
||||||
|
lfi[i].uvthr[j] = HEVThresh;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -241,52 +249,57 @@ void vp8_frame_init_loop_filter(loop_filter_info *lfi, int frame_type)
|
|||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++)
|
||||||
{
|
{
|
||||||
/*lfi[i].lim[j] = block_inside_limit;
|
/*lfi[i].lim[j] = block_inside_limit;
|
||||||
lfi[i].mbflim[j] = filt_lvl+2;*/
|
lfi[i].mbflim[j] = filt_lvl+yhedge_boost;*/
|
||||||
|
lfi[i].mbthr[j] = HEVThresh;
|
||||||
/*lfi[i].flim[j] = filt_lvl;*/
|
/*lfi[i].flim[j] = filt_lvl;*/
|
||||||
lfi[i].thr[j] = HEVThresh;
|
lfi[i].thr[j] = HEVThresh;
|
||||||
|
/*lfi[i].uvlim[j] = block_inside_limit;
|
||||||
|
lfi[i].uvmbflim[j] = filt_lvl+uvhedge_boost;*/
|
||||||
|
lfi[i].uvmbthr[j] = HEVThresh;
|
||||||
|
/*lfi[i].uvflim[j] = filt_lvl;*/
|
||||||
|
lfi[i].uvthr[j] = HEVThresh;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int vp8_adjust_mb_lf_value(MACROBLOCKD *mbd, int filter_level)
|
void vp8_adjust_mb_lf_value(MACROBLOCKD *mbd, int *filter_level)
|
||||||
{
|
{
|
||||||
MB_MODE_INFO *mbmi = &mbd->mode_info_context->mbmi;
|
MB_MODE_INFO *mbmi = &mbd->mode_info_context->mbmi;
|
||||||
|
|
||||||
if (mbd->mode_ref_lf_delta_enabled)
|
if (mbd->mode_ref_lf_delta_enabled)
|
||||||
{
|
{
|
||||||
/* Apply delta for reference frame */
|
/* Apply delta for reference frame */
|
||||||
filter_level += mbd->ref_lf_deltas[mbmi->ref_frame];
|
*filter_level += mbd->ref_lf_deltas[mbmi->ref_frame];
|
||||||
|
|
||||||
/* Apply delta for mode */
|
/* Apply delta for mode */
|
||||||
if (mbmi->ref_frame == INTRA_FRAME)
|
if (mbmi->ref_frame == INTRA_FRAME)
|
||||||
{
|
{
|
||||||
/* Only the split mode BPRED has a further special case */
|
/* Only the split mode BPRED has a further special case */
|
||||||
if (mbmi->mode == B_PRED)
|
if (mbmi->mode == B_PRED)
|
||||||
filter_level += mbd->mode_lf_deltas[0];
|
*filter_level += mbd->mode_lf_deltas[0];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Zero motion mode */
|
/* Zero motion mode */
|
||||||
if (mbmi->mode == ZEROMV)
|
if (mbmi->mode == ZEROMV)
|
||||||
filter_level += mbd->mode_lf_deltas[1];
|
*filter_level += mbd->mode_lf_deltas[1];
|
||||||
|
|
||||||
/* Split MB motion mode */
|
/* Split MB motion mode */
|
||||||
else if (mbmi->mode == SPLITMV)
|
else if (mbmi->mode == SPLITMV)
|
||||||
filter_level += mbd->mode_lf_deltas[3];
|
*filter_level += mbd->mode_lf_deltas[3];
|
||||||
|
|
||||||
/* All other inter motion modes (Nearest, Near, New) */
|
/* All other inter motion modes (Nearest, Near, New) */
|
||||||
else
|
else
|
||||||
filter_level += mbd->mode_lf_deltas[2];
|
*filter_level += mbd->mode_lf_deltas[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Range check */
|
/* Range check */
|
||||||
if (filter_level > MAX_LOOP_FILTER)
|
if (*filter_level > MAX_LOOP_FILTER)
|
||||||
filter_level = MAX_LOOP_FILTER;
|
*filter_level = MAX_LOOP_FILTER;
|
||||||
else if (filter_level < 0)
|
else if (*filter_level < 0)
|
||||||
filter_level = 0;
|
*filter_level = 0;
|
||||||
}
|
}
|
||||||
return filter_level;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -360,7 +373,7 @@ void vp8_loop_filter_frame
|
|||||||
* These specified to 8th pel as they are always compared to values that are in 1/8th pel units
|
* These specified to 8th pel as they are always compared to values that are in 1/8th pel units
|
||||||
* Apply any context driven MB level adjustment
|
* Apply any context driven MB level adjustment
|
||||||
*/
|
*/
|
||||||
filter_level = vp8_adjust_mb_lf_value(mbd, filter_level);
|
vp8_adjust_mb_lf_value(mbd, &filter_level);
|
||||||
|
|
||||||
if (filter_level)
|
if (filter_level)
|
||||||
{
|
{
|
||||||
@@ -460,7 +473,7 @@ void vp8_loop_filter_frame_yonly
|
|||||||
filter_level = baseline_filter_level[Segment];
|
filter_level = baseline_filter_level[Segment];
|
||||||
|
|
||||||
/* Apply any context driven MB level adjustment */
|
/* Apply any context driven MB level adjustment */
|
||||||
filter_level = vp8_adjust_mb_lf_value(mbd, filter_level);
|
vp8_adjust_mb_lf_value(mbd, &filter_level);
|
||||||
|
|
||||||
if (filter_level)
|
if (filter_level)
|
||||||
{
|
{
|
||||||
|
@@ -32,6 +32,12 @@ typedef struct
|
|||||||
DECLARE_ALIGNED(16, signed char, flim[16]);
|
DECLARE_ALIGNED(16, signed char, flim[16]);
|
||||||
DECLARE_ALIGNED(16, signed char, thr[16]);
|
DECLARE_ALIGNED(16, signed char, thr[16]);
|
||||||
DECLARE_ALIGNED(16, signed char, mbflim[16]);
|
DECLARE_ALIGNED(16, signed char, mbflim[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, mbthr[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, uvlim[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, uvflim[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, uvthr[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, uvmbflim[16]);
|
||||||
|
DECLARE_ALIGNED(16, signed char, uvmbthr[16]);
|
||||||
} loop_filter_info;
|
} loop_filter_info;
|
||||||
|
|
||||||
|
|
||||||
|
31
vp8/common/mac_specs.h
Normal file
31
vp8/common/mac_specs.h
Normal 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(_mac_specs_h)
|
||||||
|
#define _mac_specs_h
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern unsigned int vp8_read_tsc();
|
||||||
|
|
||||||
|
extern unsigned int vp8_get_processor_freq();
|
||||||
|
|
||||||
|
extern unsigned int vpx_has_altivec();
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@@ -140,6 +140,8 @@ typedef struct VP8Common
|
|||||||
|
|
||||||
MODE_INFO *mip; /* Base of allocated array */
|
MODE_INFO *mip; /* Base of allocated array */
|
||||||
MODE_INFO *mi; /* Corresponds to upper left visible macroblock */
|
MODE_INFO *mi; /* Corresponds to upper left visible macroblock */
|
||||||
|
MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */
|
||||||
|
MODE_INFO *prev_mi; /* 'mi' from last frame (points into prev_mip) */
|
||||||
|
|
||||||
|
|
||||||
INTERPOLATIONFILTERTYPE mcomp_filter_type;
|
INTERPOLATIONFILTERTYPE mcomp_filter_type;
|
||||||
@@ -200,7 +202,7 @@ typedef struct VP8Common
|
|||||||
} VP8_COMMON;
|
} VP8_COMMON;
|
||||||
|
|
||||||
|
|
||||||
int vp8_adjust_mb_lf_value(MACROBLOCKD *mbd, int filter_level);
|
void vp8_adjust_mb_lf_value(MACROBLOCKD *mbd, int *filter_level);
|
||||||
void vp8_init_loop_filter(VP8_COMMON *cm);
|
void vp8_init_loop_filter(VP8_COMMON *cm);
|
||||||
void vp8_frame_init_loop_filter(loop_filter_info *lfi, int frame_type);
|
void vp8_frame_init_loop_filter(loop_filter_info *lfi, int frame_type);
|
||||||
extern void vp8_loop_filter_frame(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val);
|
extern void vp8_loop_filter_frame(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@@ -9,14 +9,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef FILTER_H
|
#ifndef __INC_PARTIALGFUPDATE_H
|
||||||
#define FILTER_H
|
#define __INC_PARTIALGFUPDATE_H
|
||||||
|
|
||||||
#define BLOCK_HEIGHT_WIDTH 4
|
#include "onyxc_int.h"
|
||||||
#define VP8_FILTER_WEIGHT 128
|
|
||||||
#define VP8_FILTER_SHIFT 7
|
|
||||||
|
|
||||||
extern const short vp8_bilinear_filters[8][2];
|
extern void update_gf_selective(ONYX_COMMON *cm, MACROBLOCKD *x);
|
||||||
extern const short vp8_sub_pel_filters[8][6];
|
|
||||||
|
|
||||||
#endif //FILTER_H
|
#endif
|
@@ -56,10 +56,10 @@ void loop_filter_mbh_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned ch
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void)simpler_lpf;
|
(void)simpler_lpf;
|
||||||
mbloop_filter_horizontal_edge_y_ppc(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr);
|
mbloop_filter_horizontal_edge_y_ppc(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
mbloop_filter_horizontal_edge_uv_ppc(u_ptr, v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr);
|
mbloop_filter_horizontal_edge_uv_ppc(u_ptr, v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop_filter_mbhs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void loop_filter_mbhs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -77,10 +77,10 @@ void loop_filter_mbv_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned ch
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void)simpler_lpf;
|
(void)simpler_lpf;
|
||||||
mbloop_filter_vertical_edge_y_ppc(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr);
|
mbloop_filter_vertical_edge_y_ppc(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
mbloop_filter_vertical_edge_uv_ppc(u_ptr, v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr);
|
mbloop_filter_vertical_edge_uv_ppc(u_ptr, v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop_filter_mbvs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void loop_filter_mbvs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -104,7 +104,7 @@ void loop_filter_bh_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned cha
|
|||||||
loop_filter_horizontal_edge_y_ppc(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr);
|
loop_filter_horizontal_edge_y_ppc(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
loop_filter_horizontal_edge_uv_ppc(u_ptr + 4 * uv_stride, v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr);
|
loop_filter_horizontal_edge_uv_ppc(u_ptr + 4 * uv_stride, v_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop_filter_bhs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void loop_filter_bhs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
@@ -127,7 +127,7 @@ void loop_filter_bv_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned cha
|
|||||||
loop_filter_vertical_edge_y_ppc(y_ptr, y_stride, lfi->flim, lfi->lim, lfi->thr);
|
loop_filter_vertical_edge_y_ppc(y_ptr, y_stride, lfi->flim, lfi->lim, lfi->thr);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
loop_filter_vertical_edge_uv_ppc(u_ptr + 4, v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr);
|
loop_filter_vertical_edge_uv_ppc(u_ptr + 4, v_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop_filter_bvs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
void loop_filter_bvs_ppc(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
||||||
|
44
vp8/common/predictdc.c
Normal file
44
vp8/common/predictdc.c
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "blockd.h"
|
||||||
|
|
||||||
|
|
||||||
|
void vp8_predict_dc(short *lastdc, short *thisdc, short quant, short *cons)
|
||||||
|
{
|
||||||
|
int diff;
|
||||||
|
int sign;
|
||||||
|
int last_dc = *lastdc;
|
||||||
|
int this_dc = *thisdc;
|
||||||
|
|
||||||
|
if (*cons > DCPREDCNTTHRESH)
|
||||||
|
{
|
||||||
|
this_dc += last_dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff = abs(last_dc - this_dc);
|
||||||
|
sign = (last_dc >> 31) ^(this_dc >> 31);
|
||||||
|
sign |= (!last_dc | !this_dc);
|
||||||
|
|
||||||
|
if (sign)
|
||||||
|
{
|
||||||
|
*cons = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (diff <= DCPREDSIMTHRESH * quant)
|
||||||
|
(*cons)++ ;
|
||||||
|
}
|
||||||
|
|
||||||
|
*thisdc = this_dc;
|
||||||
|
*lastdc = this_dc;
|
||||||
|
}
|
18
vp8/common/predictdc.h
Normal file
18
vp8/common/predictdc.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* 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 __PREDICTDC_H
|
||||||
|
#define __PREDICTDC_H
|
||||||
|
|
||||||
|
void uvvp8_predict_dc(short *lastdc, short *thisdc, short quant, short *cons);
|
||||||
|
void vp8_predict_dc(short *lastdc, short *thisdc, short quant, short *cons);
|
||||||
|
|
||||||
|
#endif
|
71
vp8/common/proposed.h
Normal file
71
vp8/common/proposed.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct core_codec *codec_ptr;
|
||||||
|
typedef struct interface_table *interface_ptr;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
void (*Initialize)();
|
||||||
|
void (*Shutdown)();
|
||||||
|
codec_ptr(*Create)();
|
||||||
|
int (*compress_frame)(codec_ptr, unsigned int *frame_flags, YV12_BUFFER_CONFIG *sd, unsigned long *size, char *dest, INT64 time_stamp);
|
||||||
|
int (*show_frame)(codec_ptr , YV12_BUFFER_CONFIG *dest, int deblock_level, int noise_level, int flags);
|
||||||
|
void (*Remove)(codec_ptr *comp);
|
||||||
|
interface_ptr(*get_interface)(unsigned int id);
|
||||||
|
|
||||||
|
} core_codec;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int (*set_bitrate)(codec_ptr, END_USAGE usage, int Datarate);
|
||||||
|
int (*get_bitrate)(codec_ptr, END_USAGE *usage, int *Datarate);
|
||||||
|
int (*set_mode)(codec_ptr, MODE mode, int Speed, char *File);
|
||||||
|
int (*get_mode)(codec_ptr, MODE *mode, int *Speed, char **File);
|
||||||
|
} codec_settings_basic;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int (*set_bitrate)(codec_ptr, END_USAGE usage, int Datarate);
|
||||||
|
int (*get_bitrate)(codec_ptr, END_USAGE *usage, int *Datarate);
|
||||||
|
int (*set_mode)(codec_ptr, MODE mode, int Speed, char *File);
|
||||||
|
int (*get_mode)(codec_ptr, MODE *mode, int *Speed, char **File);
|
||||||
|
int (*set_denoise)(codec_ptr, int Level);
|
||||||
|
int (*get_denoise)(codec_ptr, int *Level);
|
||||||
|
int (*set_sharpness)(codec_ptr, int sharpness);
|
||||||
|
int (*get_sharpness)(codec_ptr, int *sharpness);
|
||||||
|
int (*set_keyframing)(codec_ptr, int Auto, int max_distance);
|
||||||
|
int (*get_keyframing)(codec_ptr, int *Auto, int *max_distance);
|
||||||
|
int (*set_buffering)(codec_ptr, int buffer_level, int max_buffer_level);
|
||||||
|
int (*get_buffering)(codec_ptr, int *buffer_level, int *max_buffer_level);
|
||||||
|
int (*set_adjust_frame_rate)(codec_ptr, int Allowed, int at_buffer_level_pct);
|
||||||
|
int (*get_adjust_frame_rate)(codec_ptr, int *Allowed, int *at_buffer_level_pct);
|
||||||
|
int (*set_adjust_frame_size)(codec_ptr, int Allowed, int down_at_buffer_level_pct, int up_at_buffer_level_pct);
|
||||||
|
int (*get_adjust_frame_size)(codec_ptr, int *Allowed, int *down_at_buffer_level_pct, int *up_at_buffer_level_pct);
|
||||||
|
int (*set_adjust_quality)(codec_ptr, int Allowed, int min_quantizer, int max_quantizer);
|
||||||
|
int (*get_adjust_quality)(codec_ptr, int *Allowed, int *min_quantizer, int *max_quantizer);
|
||||||
|
int (*set_vbrparms)(codec_ptr, int Bias, int Min, int Max);
|
||||||
|
int (*get_vbrparms)(codec_ptr, int *Bias, int *Min, int *Max);
|
||||||
|
|
||||||
|
} codec_settings_v1;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int (*request_recovery)(codec_ptr);
|
||||||
|
int (*request_droppable)(codec_ptr);
|
||||||
|
int (*internal_size)(codec_ptr, VPX_SCALING Vertical, VPX_SCALING Horizontal);
|
||||||
|
int (*update_last)(codec_ptr);
|
||||||
|
int (*update_gold)(codec_ptr);
|
||||||
|
int (*use_only_last)(codec_ptr);
|
||||||
|
int (*use_only_gold)(codec_ptr);
|
||||||
|
int (*update_entropy)(codec_ptr);
|
||||||
|
|
||||||
|
} codec_realtime_requests;
|
@@ -94,5 +94,6 @@ typedef struct vp8_recon_rtcd_vtable
|
|||||||
#define RECON_INVOKE(ctx,fn) vp8_recon_##fn
|
#define RECON_INVOKE(ctx,fn) vp8_recon_##fn
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void vp8_recon_intra4x4mb(const vp8_recon_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
||||||
void vp8_recon_intra_mbuv(const vp8_recon_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
void vp8_recon_intra_mbuv(const vp8_recon_rtcd_vtable_t *rtcd, MACROBLOCKD *x);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -313,3 +313,89 @@ void vp8_intra_prediction_down_copy(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vp8_recon_intra4x4mb(const vp8_recon_rtcd_vtable_t *rtcd, MACROBLOCKD *x)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
vp8_intra_prediction_down_copy(x);
|
||||||
|
|
||||||
|
#if ARCH_ARM
|
||||||
|
{
|
||||||
|
BLOCKD *b = &x->block[0];
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
b += 1;
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, b->bmi.mode, b->predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
BLOCKD *b = &x->block[i];
|
||||||
|
|
||||||
|
vp8_predict_intra4x4(b, x->block[i].bmi.mode, x->block[i].predictor);
|
||||||
|
RECON_INVOKE(rtcd, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vp8_recon_intra_mbuv(rtcd, x);
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -14,8 +14,6 @@
|
|||||||
|
|
||||||
#define VPXINFINITE 10000 /* 10second. */
|
#define VPXINFINITE 10000 /* 10second. */
|
||||||
|
|
||||||
#if CONFIG_OS_SUPPORT && CONFIG_MULTITHREAD
|
|
||||||
|
|
||||||
/* Thread management macros */
|
/* Thread management macros */
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* Win32 */
|
/* Win32 */
|
||||||
@@ -90,6 +88,4 @@
|
|||||||
#define x86_pause_hint()
|
#define x86_pause_hint()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_OS_SUPPORT && CONFIG_MULTITHREAD */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
76
vp8/common/vfwsetting.hpp
Normal file
76
vp8/common/vfwsetting.hpp
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(VFWSETTING_HPP)
|
||||||
|
#define VFWSETTING_HPP
|
||||||
|
//______________________________________________________________________________
|
||||||
|
//
|
||||||
|
// VFWSetting.hpp
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "four_cc.hpp"
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
namespace vpxvp
|
||||||
|
{
|
||||||
|
|
||||||
|
//--------------------------------------
|
||||||
|
class VFWSetting
|
||||||
|
{
|
||||||
|
friend std::ostream& operator<<(std::ostream& os, const VFWSetting& vfws);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum Mode
|
||||||
|
{
|
||||||
|
m_setting,
|
||||||
|
m_config
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
header_size = 8,
|
||||||
|
Size = 16
|
||||||
|
};
|
||||||
|
|
||||||
|
VFWSetting(four_cc fcc);
|
||||||
|
~VFWSetting();
|
||||||
|
|
||||||
|
four_cc fcc() const;
|
||||||
|
Mode mode() const;
|
||||||
|
|
||||||
|
int setting() const;
|
||||||
|
int value() const;
|
||||||
|
void setting_value(int i_setting, int i_value); // Sets mode to m_setting
|
||||||
|
|
||||||
|
long size() const;
|
||||||
|
const void* data() const;
|
||||||
|
int data(const void* p_data, unsigned long ul_size);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
VFWSetting(const VFWSetting& vfws); // Not implemented
|
||||||
|
VFWSetting& operator=(const VFWSetting& vfws); // Not implemented
|
||||||
|
|
||||||
|
int extract_(const void* p_data, unsigned long ul_size);
|
||||||
|
void update_() const;
|
||||||
|
|
||||||
|
four_cc m_fcc;
|
||||||
|
Mode m_mode;
|
||||||
|
int m_i_setting;
|
||||||
|
int m_i_value;
|
||||||
|
|
||||||
|
mutable unsigned char m_p_data[Size];
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace vpxvp
|
||||||
|
|
||||||
|
#endif // VFWSETTING_HPP
|
24
vp8/common/vpx_ref_build_prefix.h
Normal file
24
vp8/common/vpx_ref_build_prefix.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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 _VPX_REF_BUILD_PREFIX_h
|
||||||
|
#define _VPX_REF_BUILD_PREFIX_h
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* include guards */
|
112
vp8/common/vpxblit.h
Normal file
112
vp8/common/vpxblit.h
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* 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 VPXBLIT_H_INCL
|
||||||
|
#define VPXBLIT_H_INCL
|
||||||
|
/*==============================================================================
|
||||||
|
Includes
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Defines
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VPX_BIG_ENDIAN
|
||||||
|
#define BYTE_ZERO(X) ((X & 0xFF000000) >> (24 - 2) )
|
||||||
|
#define BYTE_ONE(X) ((X & 0x00FF0000) >> (16 - 2) )
|
||||||
|
#define BYTE_TWO(X) ((X & 0x0000FF00) >> (8 - 2) )
|
||||||
|
#define BYTE_THREE(X) ((X & 0x000000FF) << (0 + 2) )
|
||||||
|
|
||||||
|
#define BYTE_ZERO_UV(X) ((X & 0x0000FF00) >> (8 - 2) )
|
||||||
|
#define BYTE_ONE_UV(X) ((X & 0x000000FF) << (0 + 2) )
|
||||||
|
|
||||||
|
#define REREFERENCE(X) (*((int *) &(X)))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define BYTE_THREE(X) ((X & 0xFF000000) >> (24 - 2) )
|
||||||
|
#define BYTE_TWO(X) ((X & 0x00FF0000) >> (16 - 2) )
|
||||||
|
#define BYTE_ONE(X) ((X & 0x0000FF00) >> (8 - 2) )
|
||||||
|
#define BYTE_ZERO(X) ((X & 0x000000FF) << (0 + 2) )
|
||||||
|
|
||||||
|
#define BYTE_ONE_UV(X) ((X & 0x0000FF00) >> (8 - 2) )
|
||||||
|
#define BYTE_ZERO_UV(X) ((X & 0x000000FF) << (0 + 2) )
|
||||||
|
|
||||||
|
#define REREFERENCE(X) (*((int *) &(X)))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Type Definitions
|
||||||
|
==============================================================================*/
|
||||||
|
typedef struct // YUV buffer configuration structure
|
||||||
|
{
|
||||||
|
int y_width;
|
||||||
|
int y_height;
|
||||||
|
int y_stride;
|
||||||
|
|
||||||
|
int uv_width;
|
||||||
|
int uv_height;
|
||||||
|
int uv_stride;
|
||||||
|
|
||||||
|
char *y_buffer;
|
||||||
|
char *u_buffer;
|
||||||
|
char *v_buffer;
|
||||||
|
|
||||||
|
char *uv_start;
|
||||||
|
int uv_dst_area;
|
||||||
|
int uv_used_area;
|
||||||
|
|
||||||
|
} VPX_BLIT_CONFIG;
|
||||||
|
|
||||||
|
typedef struct tx86_params
|
||||||
|
{
|
||||||
|
unsigned int pushed_registers[6];
|
||||||
|
unsigned int return_address;
|
||||||
|
unsigned int dst;
|
||||||
|
unsigned int scrn_pitch;
|
||||||
|
VPX_BLIT_CONFIG *buff_config;
|
||||||
|
} x86_params;
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Enums
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Structures
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Constants
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Variables
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Function Protoypes/MICROS
|
||||||
|
==============================================================================*/
|
||||||
|
int vpx_get_size_of_pixel(unsigned int bd);
|
||||||
|
void *vpx_get_blitter(unsigned int bd);
|
||||||
|
void vpx_set_blit(void);
|
||||||
|
void vpx_destroy_blit(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //VPXBLIT_H_INCL
|
48
vp8/common/vpxblit_c64.h
Normal file
48
vp8/common/vpxblit_c64.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* 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 _VPX_BLIT_C64_h
|
||||||
|
#define _VPX_BLIT_C64_h
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Typedefs
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct // YUV buffer configuration structure
|
||||||
|
{
|
||||||
|
int y_width;
|
||||||
|
int y_height;
|
||||||
|
int y_stride;
|
||||||
|
|
||||||
|
int uv_width;
|
||||||
|
int uv_height;
|
||||||
|
int uv_stride;
|
||||||
|
|
||||||
|
unsigned char *y_buffer;
|
||||||
|
unsigned char *u_buffer;
|
||||||
|
unsigned char *v_buffer;
|
||||||
|
|
||||||
|
unsigned char *y_ptr_scrn;
|
||||||
|
unsigned char *u_ptr_scrn;
|
||||||
|
unsigned char *v_ptr_scrn;
|
||||||
|
|
||||||
|
} DXV_YUV_BUFFER_CONFIG;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char *rgbptr_scrn;
|
||||||
|
unsigned char *y_ptr_scrn;
|
||||||
|
unsigned char *u_ptr_scrn;
|
||||||
|
unsigned char *v_ptr_scrn;
|
||||||
|
unsigned char *rgbptr_scrn2;
|
||||||
|
} DXV_FINAL_VIDEO;
|
||||||
|
|
||||||
|
#endif /* include guards */
|
13
vp8/common/vpxerrors.h
Normal file
13
vp8/common/vpxerrors.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define ALLOC_FAILURE -2
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "loopfilter.h"
|
||||||
|
|
||||||
prototype_loopfilter(vp8_loop_filter_horizontal_edge_c);
|
prototype_loopfilter(vp8_loop_filter_horizontal_edge_c);
|
||||||
prototype_loopfilter(vp8_loop_filter_vertical_edge_c);
|
prototype_loopfilter(vp8_loop_filter_vertical_edge_c);
|
||||||
@@ -45,13 +45,13 @@ void vp8_loop_filter_mbh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_horizontal_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_horizontal_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_mmx(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_mmx(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_mmx(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_horizontal_edge_mmx(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ void vp8_loop_filter_mbhs_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_horizontal_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_horizontal_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -71,13 +71,13 @@ void vp8_loop_filter_mbv_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_vertical_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_vertical_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_mmx(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_mmx(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_mmx(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
vp8_mbloop_filter_vertical_edge_mmx(v_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ void vp8_loop_filter_mbvs_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_vertical_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_vertical_edge_mmx(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -102,10 +102,10 @@ void vp8_loop_filter_bh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
vp8_loop_filter_horizontal_edge_mmx(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_horizontal_edge_mmx(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_mmx(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_mmx(u_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_mmx(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_horizontal_edge_mmx(v_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -132,10 +132,10 @@ void vp8_loop_filter_bv_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned
|
|||||||
vp8_loop_filter_vertical_edge_mmx(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_vertical_edge_mmx(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_vertical_edge_mmx(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_mmx(u_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
|
|
||||||
if (v_ptr)
|
if (v_ptr)
|
||||||
vp8_loop_filter_vertical_edge_mmx(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
vp8_loop_filter_vertical_edge_mmx(v_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -159,10 +159,10 @@ void vp8_loop_filter_mbh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_horizontal_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_horizontal_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_horizontal_edge_uv_sse2(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
vp8_mbloop_filter_horizontal_edge_uv_sse2(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, v_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ void vp8_loop_filter_mbhs_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_horizontal_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_horizontal_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -182,10 +182,10 @@ void vp8_loop_filter_mbv_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsign
|
|||||||
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
||||||
{
|
{
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_mbloop_filter_vertical_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_mbloop_filter_vertical_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_mbloop_filter_vertical_edge_uv_sse2(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
vp8_mbloop_filter_vertical_edge_uv_sse2(u_ptr, uv_stride, lfi->uvmbflim, lfi->uvlim, lfi->uvmbthr, v_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ void vp8_loop_filter_mbvs_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsig
|
|||||||
(void) v_ptr;
|
(void) v_ptr;
|
||||||
(void) uv_stride;
|
(void) uv_stride;
|
||||||
(void) simpler_lpf;
|
(void) simpler_lpf;
|
||||||
vp8_loop_filter_simple_vertical_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_simple_vertical_edge_sse2(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->mbthr, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -210,7 +210,7 @@ void vp8_loop_filter_bh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
vp8_loop_filter_horizontal_edge_sse2(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_horizontal_edge_sse2(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_horizontal_edge_uv_sse2(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4 * uv_stride);
|
vp8_loop_filter_horizontal_edge_uv_sse2(u_ptr + 4 * uv_stride, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, v_ptr + 4 * uv_stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -237,7 +237,7 @@ void vp8_loop_filter_bv_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigne
|
|||||||
vp8_loop_filter_vertical_edge_sse2(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
vp8_loop_filter_vertical_edge_sse2(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
||||||
|
|
||||||
if (u_ptr)
|
if (u_ptr)
|
||||||
vp8_loop_filter_vertical_edge_uv_sse2(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4);
|
vp8_loop_filter_vertical_edge_uv_sse2(u_ptr + 4, uv_stride, lfi->uvflim, lfi->uvlim, lfi->uvthr, v_ptr + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
#include "vp8/common/subpixel.h"
|
#include "subpixel.h"
|
||||||
|
|
||||||
extern const short vp8_six_tap_mmx[8][6*8];
|
extern const short vp8_six_tap_mmx[8][6*8];
|
||||||
extern const short vp8_bilinear_filters_mmx[8][2*8];
|
extern const short vp8_bilinear_filters_mmx[8][2*8];
|
||||||
|
@@ -11,13 +11,13 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vpx_ports/x86.h"
|
#include "vpx_ports/x86.h"
|
||||||
#include "vp8/common/g_common.h"
|
#include "g_common.h"
|
||||||
#include "vp8/common/subpixel.h"
|
#include "subpixel.h"
|
||||||
#include "vp8/common/loopfilter.h"
|
#include "loopfilter.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "vp8/common/pragmas.h"
|
#include "pragmas.h"
|
||||||
#include "vp8/common/onyxc_int.h"
|
#include "onyxc_int.h"
|
||||||
|
|
||||||
void vp8_arch_x86_common_init(VP8_COMMON *ctx)
|
void vp8_arch_x86_common_init(VP8_COMMON *ctx)
|
||||||
{
|
{
|
||||||
|
@@ -11,11 +11,12 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vpx_ports/arm.h"
|
#include "vpx_ports/arm.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "blockd.h"
|
||||||
#include "vp8/common/pragmas.h"
|
#include "pragmas.h"
|
||||||
#include "vp8/common/postproc.h"
|
#include "postproc.h"
|
||||||
#include "vp8/decoder/dequantize.h"
|
#include "dboolhuff.h"
|
||||||
#include "vp8/decoder/onyxd_int.h"
|
#include "dequantize.h"
|
||||||
|
#include "onyxd_int.h"
|
||||||
|
|
||||||
void vp8_arch_arm_decode_init(VP8D_COMP *pbi)
|
void vp8_arch_arm_decode_init(VP8D_COMP *pbi)
|
||||||
{
|
{
|
||||||
@@ -34,6 +35,12 @@ void vp8_arch_arm_decode_init(VP8D_COMP *pbi)
|
|||||||
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_v6;
|
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_v6;
|
||||||
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_v6;
|
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_v6;
|
||||||
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_v6;
|
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_v6;
|
||||||
|
#if 0 /*For use with RTCD, when implemented*/
|
||||||
|
pbi->dboolhuff.start = vp8dx_start_decode_c;
|
||||||
|
pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c;
|
||||||
|
pbi->dboolhuff.debool = vp8dx_decode_bool_c;
|
||||||
|
pbi->dboolhuff.devalue = vp8dx_decode_value_c;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -47,6 +54,12 @@ void vp8_arch_arm_decode_init(VP8D_COMP *pbi)
|
|||||||
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_neon;
|
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_neon;
|
||||||
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_neon;
|
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_neon;
|
||||||
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_neon;
|
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_neon;
|
||||||
|
#if 0 /*For use with RTCD, when implemented*/
|
||||||
|
pbi->dboolhuff.start = vp8dx_start_decode_c;
|
||||||
|
pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c;
|
||||||
|
pbi->dboolhuff.debool = vp8dx_decode_bool_c;
|
||||||
|
pbi->dboolhuff.devalue = vp8dx_decode_value_c;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
163
vp8/decoder/arm/armv6/dboolhuff_v6.asm
Normal file
163
vp8/decoder/arm/armv6/dboolhuff_v6.asm
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
;
|
||||||
|
; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
;
|
||||||
|
; Use of this source code is governed by a BSD-style license
|
||||||
|
; that can be found in the LICENSE file in the root of the source
|
||||||
|
; tree. An additional intellectual property rights grant can be found
|
||||||
|
; in the file PATENTS. All contributing project authors may
|
||||||
|
; be found in the AUTHORS file in the root of the source tree.
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT |vp8_decode_value_v6|
|
||||||
|
EXPORT |vp8dx_start_decode_v6|
|
||||||
|
EXPORT |vp8dx_stop_decode_v6|
|
||||||
|
EXPORT |vp8dx_decode_bool_v6|
|
||||||
|
|
||||||
|
ARM
|
||||||
|
REQUIRE8
|
||||||
|
PRESERVE8
|
||||||
|
|
||||||
|
INCLUDE vpx_asm_offsets.asm
|
||||||
|
|
||||||
|
br RN r0
|
||||||
|
prob RN r1
|
||||||
|
bits RN r1
|
||||||
|
AREA |.text|, CODE, READONLY ; name this block of code
|
||||||
|
|
||||||
|
; int z = 0;
|
||||||
|
; int bit;
|
||||||
|
; for ( bit=bits-1; bit>=0; bit-- )
|
||||||
|
; {
|
||||||
|
; z |= (vp8dx_decode_bool(br, 0x80)<<bit);
|
||||||
|
; }
|
||||||
|
; return z;
|
||||||
|
|
||||||
|
;int vp8_decode_value_v6 ( BOOL_DECODER *br, int bits )
|
||||||
|
|vp8_decode_value_v6| PROC
|
||||||
|
stmdb sp!, {r4 - r6, lr}
|
||||||
|
mov r4, br
|
||||||
|
mov r5, bits
|
||||||
|
mov r6, #0
|
||||||
|
|
||||||
|
subs r5, r5, #1
|
||||||
|
bmi decode_value_exit
|
||||||
|
|
||||||
|
decode_value_loop
|
||||||
|
mov prob, #0x80
|
||||||
|
mov br, r4
|
||||||
|
bl vp8dx_decode_bool_v6_internal ; needed for conversion to s file
|
||||||
|
orr r6, r6, r0, lsl r5
|
||||||
|
subs r5, r5, #1
|
||||||
|
bpl decode_value_loop
|
||||||
|
|
||||||
|
decode_value_exit
|
||||||
|
mov r0, r6
|
||||||
|
ldmia sp!, {r4 - r6, pc}
|
||||||
|
ENDP ; |vp8_decode_value_v6|
|
||||||
|
|
||||||
|
|
||||||
|
;void vp8dx_start_decode_v6 ( BOOL_DECODER *br, unsigned char *source )
|
||||||
|
|vp8dx_start_decode_v6| PROC
|
||||||
|
stmdb sp!, {r4 - r5, lr}
|
||||||
|
mov r2, #0
|
||||||
|
mov r3, #255
|
||||||
|
|
||||||
|
str r2, [br, #bool_decoder_lowvalue]
|
||||||
|
str r3, [br, #bool_decoder_range]
|
||||||
|
str r1, [br, #bool_decoder_buffer]
|
||||||
|
|
||||||
|
mov r3, #8
|
||||||
|
mov r2, #4
|
||||||
|
str r3, [br, #bool_decoder_count]
|
||||||
|
str r2, [br, #bool_decoder_pos]
|
||||||
|
|
||||||
|
ldrb r2, [r1, #3]
|
||||||
|
ldrb r3, [r1, #2]
|
||||||
|
ldrb r4, [r1, #1]
|
||||||
|
ldrb r5, [r1]
|
||||||
|
|
||||||
|
orr r1, r2, r3, lsl #8
|
||||||
|
orr r1, r1, r4, lsl #16
|
||||||
|
orr r1, r1, r5, lsl #24
|
||||||
|
|
||||||
|
str r1, [br, #bool_decoder_value]
|
||||||
|
|
||||||
|
ldmia sp!, {r4 - r5, pc}
|
||||||
|
ENDP ; |vp8dx_start_decode_v6|
|
||||||
|
|
||||||
|
|
||||||
|
;void vp8dx_stop_decode_v6 ( BOOL_DECODER *bc );
|
||||||
|
|vp8dx_stop_decode_v6| PROC
|
||||||
|
mov pc, lr
|
||||||
|
ENDP ; |vp8dx_stop_decode_v6|
|
||||||
|
|
||||||
|
|
||||||
|
; bigsplit RN r1
|
||||||
|
; buffer_v RN r1
|
||||||
|
; count_v RN r4
|
||||||
|
; range_v RN r2
|
||||||
|
; value_v RN r3
|
||||||
|
; pos_v RN r5
|
||||||
|
; split RN r6
|
||||||
|
; bit RN lr
|
||||||
|
;int vp8dx_decode_bool_v6 ( BOOL_DECODER *br, int probability )
|
||||||
|
|vp8dx_decode_bool_v6| PROC
|
||||||
|
vp8dx_decode_bool_v6_internal
|
||||||
|
stmdb sp!, {r4 - r6, lr}
|
||||||
|
|
||||||
|
ldr r2, [br, #bool_decoder_range]
|
||||||
|
ldr r3, [br, #bool_decoder_value]
|
||||||
|
|
||||||
|
mov r6, r2, lsl #8
|
||||||
|
sub r6, r6, #256 ; split = 1 + (((range-1) * probability) >> 8)
|
||||||
|
mov r12, #1
|
||||||
|
smlawb r6, r6, prob, r12
|
||||||
|
|
||||||
|
mov lr, #0
|
||||||
|
subs r5, r3, r6, lsl #24
|
||||||
|
|
||||||
|
;cmp r3, r1
|
||||||
|
movhs lr, #1
|
||||||
|
movhs r3, r5
|
||||||
|
subhs r2, r2, r6
|
||||||
|
movlo r2, r6
|
||||||
|
|
||||||
|
cmp r2, #0x80
|
||||||
|
blt range_less_0x80
|
||||||
|
;strd r2, r3, [br, #bool_decoder_range]
|
||||||
|
str r2, [br, #bool_decoder_range]
|
||||||
|
str r3, [br, #bool_decoder_value]
|
||||||
|
mov r0, lr
|
||||||
|
ldmia sp!, {r4 - r6, pc}
|
||||||
|
|
||||||
|
range_less_0x80
|
||||||
|
ldr r5, [br, #bool_decoder_pos]
|
||||||
|
ldr r1, [br, #bool_decoder_buffer]
|
||||||
|
ldr r4, [br, #bool_decoder_count]
|
||||||
|
add r1, r1, r5
|
||||||
|
|
||||||
|
clz r12, r2
|
||||||
|
sub r12, r12, #24
|
||||||
|
subs r4, r4, r12
|
||||||
|
ldrleb r6, [r1], #1
|
||||||
|
mov r2, r2, lsl r12
|
||||||
|
mov r3, r3, lsl r12
|
||||||
|
addle r4, r4, #8
|
||||||
|
rsble r12, r4, #8
|
||||||
|
addle r5, r5, #1
|
||||||
|
orrle r3, r3, r6, lsl r12
|
||||||
|
|
||||||
|
;strd r2, r3, [br, #bool_decoder_range]
|
||||||
|
;strd r4, r5, [br, #bool_decoder_count]
|
||||||
|
str r2, [br, #bool_decoder_range]
|
||||||
|
str r3, [br, #bool_decoder_value]
|
||||||
|
str r4, [br, #bool_decoder_count]
|
||||||
|
str r5, [br, #bool_decoder_pos]
|
||||||
|
|
||||||
|
mov r0, lr
|
||||||
|
|
||||||
|
ldmia sp!, {r4 - r6, pc}
|
||||||
|
ENDP ; |vp8dx_decode_bool_v6|
|
||||||
|
|
||||||
|
END
|
@@ -9,8 +9,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "vp8/decoder/dequantize.h"
|
#include "dequantize.h"
|
||||||
|
|
||||||
void vp8_dequant_dc_idct_add_y_block_v6
|
void vp8_dequant_dc_idct_add_y_block_v6
|
||||||
(short *q, short *dq, unsigned char *pre,
|
(short *q, short *dq, unsigned char *pre,
|
||||||
|
43
vp8/decoder/arm/dboolhuff_arm.h
Normal file
43
vp8/decoder/arm/dboolhuff_arm.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef DBOOLHUFF_ARM_H
|
||||||
|
#define DBOOLHUFF_ARM_H
|
||||||
|
|
||||||
|
/* JLK
|
||||||
|
* There are currently no arm-optimized versions of
|
||||||
|
* these functions. As they are implemented, they
|
||||||
|
* can be uncommented below and added to
|
||||||
|
* arm/dsystemdependent.c
|
||||||
|
*
|
||||||
|
* The existing asm code is likely so different as
|
||||||
|
* to be useless. However, its been left (for now)
|
||||||
|
* for reference.
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
|
#if HAVE_ARMV6
|
||||||
|
#undef vp8_dbool_start
|
||||||
|
#define vp8_dbool_start vp8dx_start_decode_v6
|
||||||
|
|
||||||
|
#undef vp8_dbool_fill
|
||||||
|
#define vp8_dbool_fill vp8_bool_decoder_fill_v6
|
||||||
|
|
||||||
|
#undef vp8_dbool_debool
|
||||||
|
#define vp8_dbool_debool vp8_decode_bool_v6
|
||||||
|
|
||||||
|
#undef vp8_dbool_devalue
|
||||||
|
#define vp8_dbool_devalue vp8_decode_value_v6
|
||||||
|
#endif /* HAVE_ARMV6 */
|
||||||
|
|
||||||
|
#if HAVE_ARMV7
|
||||||
|
#undef vp8_dbool_start
|
||||||
|
#define vp8_dbool_start vp8dx_start_decode_neon
|
||||||
|
|
||||||
|
#undef vp8_dbool_fill
|
||||||
|
#define vp8_dbool_fill vp8_bool_decoder_fill_neon
|
||||||
|
|
||||||
|
#undef vp8_dbool_debool
|
||||||
|
#define vp8_dbool_debool vp8_decode_bool_neon
|
||||||
|
|
||||||
|
#undef vp8_dbool_devalue
|
||||||
|
#define vp8_dbool_devalue vp8_decode_value_neon
|
||||||
|
#endif /* HAVE_ARMV7 */
|
||||||
|
#endif
|
||||||
|
#endif /* DBOOLHUFF_ARM_H */
|
@@ -10,8 +10,9 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/decoder/dequantize.h"
|
#include "dequantize.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "predictdc.h"
|
||||||
|
#include "idct.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
#if HAVE_ARMV7
|
#if HAVE_ARMV7
|
||||||
|
320
vp8/decoder/arm/detokenize.asm
Normal file
320
vp8/decoder/arm/detokenize.asm
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
;
|
||||||
|
; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
;
|
||||||
|
; Use of this source code is governed by a BSD-style license
|
||||||
|
; that can be found in the LICENSE file in the root of the source
|
||||||
|
; tree. An additional intellectual property rights grant can be found
|
||||||
|
; in the file PATENTS. All contributing project authors may
|
||||||
|
; be found in the AUTHORS file in the root of the source tree.
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT |vp8_decode_mb_tokens_v6|
|
||||||
|
|
||||||
|
AREA |.text|, CODE, READONLY ; name this block of code
|
||||||
|
|
||||||
|
INCLUDE vpx_asm_offsets.asm
|
||||||
|
|
||||||
|
l_qcoeff EQU 0
|
||||||
|
l_i EQU 4
|
||||||
|
l_type EQU 8
|
||||||
|
l_stop EQU 12
|
||||||
|
l_c EQU 16
|
||||||
|
l_l_ptr EQU 20
|
||||||
|
l_a_ptr EQU 24
|
||||||
|
l_bc EQU 28
|
||||||
|
l_coef_ptr EQU 32
|
||||||
|
l_stacksize EQU 64
|
||||||
|
|
||||||
|
|
||||||
|
;; constant offsets -- these should be created at build time
|
||||||
|
c_block2above_offset EQU 25
|
||||||
|
c_entropy_nodes EQU 11
|
||||||
|
c_dct_eob_token EQU 11
|
||||||
|
|
||||||
|
|vp8_decode_mb_tokens_v6| PROC
|
||||||
|
stmdb sp!, {r4 - r11, lr}
|
||||||
|
sub sp, sp, #l_stacksize
|
||||||
|
mov r7, r1 ; type
|
||||||
|
mov r9, r0 ; detoken
|
||||||
|
|
||||||
|
ldr r1, [r9, #detok_current_bc]
|
||||||
|
ldr r0, [r9, #detok_qcoeff_start_ptr]
|
||||||
|
mov r11, #0 ; i
|
||||||
|
mov r3, #16 ; stop
|
||||||
|
|
||||||
|
cmp r7, #1 ; type ?= 1
|
||||||
|
addeq r11, r11, #24 ; i = 24
|
||||||
|
addeq r3, r3, #8 ; stop = 24
|
||||||
|
addeq r0, r0, #3, 24 ; qcoefptr += 24*16
|
||||||
|
|
||||||
|
str r0, [sp, #l_qcoeff]
|
||||||
|
str r11, [sp, #l_i]
|
||||||
|
str r7, [sp, #l_type]
|
||||||
|
str r3, [sp, #l_stop]
|
||||||
|
str r1, [sp, #l_bc]
|
||||||
|
|
||||||
|
add lr, r9, r7, lsl #2 ; detoken + type*4
|
||||||
|
|
||||||
|
ldr r8, [r1, #bool_decoder_user_buffer]
|
||||||
|
|
||||||
|
ldr r10, [lr, #detok_coef_probs]
|
||||||
|
ldr r5, [r1, #bool_decoder_count]
|
||||||
|
ldr r6, [r1, #bool_decoder_range]
|
||||||
|
ldr r4, [r1, #bool_decoder_value]
|
||||||
|
|
||||||
|
str r10, [sp, #l_coef_ptr]
|
||||||
|
|
||||||
|
BLOCK_LOOP
|
||||||
|
ldr r3, [r9, #detok_ptr_block2leftabove]
|
||||||
|
ldr r1, [r9, #detok_L]
|
||||||
|
ldr r2, [r9, #detok_A]
|
||||||
|
ldrb r12, [r3, r11]! ; block2left[i]
|
||||||
|
ldrb r3, [r3, #c_block2above_offset]; block2above[i]
|
||||||
|
|
||||||
|
cmp r7, #0 ; c = !type
|
||||||
|
moveq r7, #1
|
||||||
|
movne r7, #0
|
||||||
|
|
||||||
|
ldrb r0, [r1, r12]! ; *(L += block2left[i])
|
||||||
|
ldrb r3, [r2, r3]! ; *(A += block2above[i])
|
||||||
|
mov lr, #c_entropy_nodes ; ENTROPY_NODES = 11
|
||||||
|
|
||||||
|
; VP8_COMBINEENTROPYCONTETEXTS(t, *a, *l) => t = ((*a) != 0) + ((*l) !=0)
|
||||||
|
cmp r0, #0 ; *l ?= 0
|
||||||
|
movne r0, #1
|
||||||
|
cmp r3, #0 ; *a ?= 0
|
||||||
|
addne r0, r0, #1 ; t
|
||||||
|
|
||||||
|
str r1, [sp, #l_l_ptr] ; save &l
|
||||||
|
str r2, [sp, #l_a_ptr] ; save &a
|
||||||
|
smlabb r0, r0, lr, r10 ; Prob = coef_probs + (t * ENTROPY_NODES)
|
||||||
|
mov r1, #0 ; t = 0
|
||||||
|
str r7, [sp, #l_c]
|
||||||
|
|
||||||
|
;align 4
|
||||||
|
COEFF_LOOP
|
||||||
|
ldr r3, [r9, #detok_ptr_coef_bands_x]
|
||||||
|
ldr lr, [r9, #detok_coef_tree_ptr]
|
||||||
|
;STALL
|
||||||
|
ldrb r3, [r3, r7] ; coef_bands_x[c]
|
||||||
|
;STALL
|
||||||
|
;STALL
|
||||||
|
add r0, r0, r3 ; Prob += coef_bands_x[c]
|
||||||
|
|
||||||
|
get_token_loop
|
||||||
|
ldrb r2, [r0, +r1, asr #1] ; Prob[t >> 1]
|
||||||
|
mov r3, r6, lsl #8 ; range << 8
|
||||||
|
sub r3, r3, #256 ; (range << 8) - (1 << 8)
|
||||||
|
mov r10, #1 ; 1
|
||||||
|
|
||||||
|
smlawb r2, r3, r2, r10 ; split = 1 + (((range-1) * probability) >> 8)
|
||||||
|
|
||||||
|
ldrb r12, [r8] ; load cx data byte in stall slot : r8 = bufptr
|
||||||
|
;++
|
||||||
|
|
||||||
|
subs r3, r4, r2, lsl #24 ; value-(split<<24): used later to calculate shift for NORMALIZE
|
||||||
|
addhs r1, r1, #1 ; t += 1
|
||||||
|
movhs r4, r3 ; value -= bigsplit (split << 24)
|
||||||
|
subhs r2, r6, r2 ; range -= split
|
||||||
|
; movlo r6, r2 ; range = split
|
||||||
|
|
||||||
|
ldrsb r1, [lr, r1] ; t = onyx_coef_tree_ptr[t]
|
||||||
|
|
||||||
|
; NORMALIZE
|
||||||
|
clz r3, r2 ; vp8dx_bitreader_norm[range] + 24
|
||||||
|
sub r3, r3, #24 ; vp8dx_bitreader_norm[range]
|
||||||
|
subs r5, r5, r3 ; count -= shift
|
||||||
|
mov r6, r2, lsl r3 ; range <<= shift
|
||||||
|
mov r4, r4, lsl r3 ; value <<= shift
|
||||||
|
|
||||||
|
; if count <= 0, += BR_COUNT; value |= *bufptr++ << (BR_COUNT-count); BR_COUNT = 8, but need to upshift values by +16
|
||||||
|
addle r5, r5, #8 ; count += 8
|
||||||
|
rsble r3, r5, #24 ; 24 - count
|
||||||
|
addle r8, r8, #1 ; bufptr++
|
||||||
|
orrle r4, r4, r12, lsl r3 ; value |= *bufptr << shift + 16
|
||||||
|
|
||||||
|
cmp r1, #0 ; t ?= 0
|
||||||
|
bgt get_token_loop ; while (t > 0)
|
||||||
|
|
||||||
|
cmn r1, #c_dct_eob_token ; if(t == -DCT_EOB_TOKEN)
|
||||||
|
beq END_OF_BLOCK ; break
|
||||||
|
|
||||||
|
rsb lr, r1, #0 ; v = -t;
|
||||||
|
|
||||||
|
cmp lr, #4 ; if(v > FOUR_TOKEN)
|
||||||
|
ble SKIP_EXTRABITS
|
||||||
|
|
||||||
|
ldr r3, [r9, #detok_teb_base_ptr]
|
||||||
|
mov r11, #1 ; 1 in split = 1 + ... nope, v+= 1 << bits_count
|
||||||
|
add r7, r3, lr, lsl #4 ; detok_teb_base_ptr + (v << 4)
|
||||||
|
|
||||||
|
ldrsh lr, [r7, #tokenextrabits_min_val] ; v = teb_ptr->min_val
|
||||||
|
ldrsh r0, [r7, #tokenextrabits_length] ; bits_count = teb_ptr->Length
|
||||||
|
|
||||||
|
extrabits_loop
|
||||||
|
add r3, r0, r7 ; &teb_ptr->Probs[bits_count]
|
||||||
|
|
||||||
|
ldrb r2, [r3, #4] ; probability. why +4?
|
||||||
|
mov r3, r6, lsl #8 ; range << 8
|
||||||
|
sub r3, r3, #256 ; range << 8 + 1 << 8
|
||||||
|
|
||||||
|
smlawb r2, r3, r2, r11 ; split = 1 + (((range-1) * probability) >> 8)
|
||||||
|
|
||||||
|
ldrb r12, [r8] ; *bufptr
|
||||||
|
;++
|
||||||
|
|
||||||
|
subs r10, r4, r2, lsl #24 ; value - (split<<24)
|
||||||
|
movhs r4, r10 ; value = value - (split << 24)
|
||||||
|
subhs r2, r6, r2 ; range = range - split
|
||||||
|
addhs lr, lr, r11, lsl r0 ; v += ((UINT16)1<<bits_count)
|
||||||
|
|
||||||
|
; NORMALIZE
|
||||||
|
clz r3, r2 ; shift - leading zeros in split
|
||||||
|
sub r3, r3, #24 ; don't count first 3 bytes
|
||||||
|
subs r5, r5, r3 ; count -= shift
|
||||||
|
mov r6, r2, lsl r3 ; range = range << shift
|
||||||
|
mov r4, r4, lsl r3 ; value <<= shift
|
||||||
|
|
||||||
|
addle r5, r5, #8 ; count += BR_COUNT
|
||||||
|
addle r8, r8, #1 ; bufptr++
|
||||||
|
rsble r3, r5, #24 ; BR_COUNT - count
|
||||||
|
orrle r4, r4, r12, lsl r3 ; value |= *bufptr << (BR_COUNT - count)
|
||||||
|
|
||||||
|
subs r0, r0, #1 ; bits_count --
|
||||||
|
bpl extrabits_loop
|
||||||
|
|
||||||
|
|
||||||
|
SKIP_EXTRABITS
|
||||||
|
ldr r11, [sp, #l_qcoeff]
|
||||||
|
ldr r0, [sp, #l_coef_ptr] ; Prob = coef_probs
|
||||||
|
|
||||||
|
cmp r1, #0 ; check for nonzero token - if (t)
|
||||||
|
beq SKIP_EOB_CHECK ; if t is zero, we will skip the eob table chec
|
||||||
|
|
||||||
|
add r3, r6, #1 ; range + 1
|
||||||
|
mov r2, r3, lsr #1 ; split = (range + 1) >> 1
|
||||||
|
|
||||||
|
subs r3, r4, r2, lsl #24 ; value - (split<<24)
|
||||||
|
movhs r4, r3 ; value -= (split << 24)
|
||||||
|
subhs r2, r6, r2 ; range -= split
|
||||||
|
mvnhs r3, lr ; -v
|
||||||
|
addhs lr, r3, #1 ; v = (v ^ -1) + 1
|
||||||
|
|
||||||
|
; NORMALIZE
|
||||||
|
clz r3, r2 ; leading 0s in split
|
||||||
|
sub r3, r3, #24 ; shift
|
||||||
|
subs r5, r5, r3 ; count -= shift
|
||||||
|
mov r6, r2, lsl r3 ; range <<= shift
|
||||||
|
mov r4, r4, lsl r3 ; value <<= shift
|
||||||
|
ldrleb r2, [r8], #1 ; *(bufptr++)
|
||||||
|
addle r5, r5, #8 ; count += 8
|
||||||
|
rsble r3, r5, #24 ; BR_COUNT - count
|
||||||
|
orrle r4, r4, r2, lsl r3 ; value |= *bufptr << (BR_COUNT - count)
|
||||||
|
|
||||||
|
add r0, r0, #11 ; Prob += ENTROPY_NODES (11)
|
||||||
|
|
||||||
|
cmn r1, #1 ; t < -ONE_TOKEN
|
||||||
|
|
||||||
|
addlt r0, r0, #11 ; Prob += ENTROPY_NODES (11)
|
||||||
|
|
||||||
|
mvn r1, #1 ; t = -1 ???? C is -2
|
||||||
|
|
||||||
|
SKIP_EOB_CHECK
|
||||||
|
ldr r7, [sp, #l_c] ; c
|
||||||
|
ldr r3, [r9, #detok_scan]
|
||||||
|
add r1, r1, #2 ; t+= 2
|
||||||
|
cmp r7, #15 ; c should will be one higher
|
||||||
|
|
||||||
|
ldr r3, [r3, +r7, lsl #2] ; scan[c] this needs pre-inc c value
|
||||||
|
add r7, r7, #1 ; c++
|
||||||
|
add r3, r11, r3, lsl #1 ; qcoeff + scan[c]
|
||||||
|
|
||||||
|
str r7, [sp, #l_c] ; store c
|
||||||
|
strh lr, [r3] ; qcoef_ptr[scan[c]] = v
|
||||||
|
|
||||||
|
blt COEFF_LOOP
|
||||||
|
|
||||||
|
sub r7, r7, #1 ; if(t != -DCT_EOB_TOKEN) --c
|
||||||
|
|
||||||
|
END_OF_BLOCK
|
||||||
|
ldr r3, [sp, #l_type] ; type
|
||||||
|
ldr r10, [sp, #l_coef_ptr] ; coef_ptr
|
||||||
|
ldr r0, [sp, #l_qcoeff] ; qcoeff
|
||||||
|
ldr r11, [sp, #l_i] ; i
|
||||||
|
ldr r12, [sp, #l_stop] ; stop
|
||||||
|
|
||||||
|
cmp r3, #0 ; type ?= 0
|
||||||
|
moveq r1, #1
|
||||||
|
movne r1, #0
|
||||||
|
add r3, r11, r9 ; detok + i
|
||||||
|
|
||||||
|
cmp r7, r1 ; c ?= !type
|
||||||
|
strb r7, [r3, #detok_eob] ; eob[i] = c
|
||||||
|
|
||||||
|
ldr r7, [sp, #l_l_ptr] ; l
|
||||||
|
ldr r2, [sp, #l_a_ptr] ; a
|
||||||
|
movne r3, #1 ; t
|
||||||
|
moveq r3, #0
|
||||||
|
|
||||||
|
add r0, r0, #32 ; qcoeff += 32 (16 * 2?)
|
||||||
|
add r11, r11, #1 ; i++
|
||||||
|
strb r3, [r7] ; *l = t
|
||||||
|
strb r3, [r2] ; *a = t
|
||||||
|
str r0, [sp, #l_qcoeff] ; qcoeff
|
||||||
|
str r11, [sp, #l_i] ; i
|
||||||
|
|
||||||
|
cmp r11, r12 ; i < stop
|
||||||
|
ldr r7, [sp, #l_type] ; type
|
||||||
|
|
||||||
|
blt BLOCK_LOOP
|
||||||
|
|
||||||
|
cmp r11, #25 ; i ?= 25
|
||||||
|
bne ln2_decode_mb_to
|
||||||
|
|
||||||
|
ldr r12, [r9, #detok_qcoeff_start_ptr]
|
||||||
|
ldr r10, [r9, #detok_coef_probs]
|
||||||
|
mov r7, #0 ; type/i = 0
|
||||||
|
mov r3, #16 ; stop = 16
|
||||||
|
str r12, [sp, #l_qcoeff] ; qcoeff_ptr = qcoeff_start_ptr
|
||||||
|
str r7, [sp, #l_i]
|
||||||
|
str r7, [sp, #l_type]
|
||||||
|
str r3, [sp, #l_stop]
|
||||||
|
|
||||||
|
str r10, [sp, #l_coef_ptr] ; coef_probs = coef_probs[type=0]
|
||||||
|
|
||||||
|
b BLOCK_LOOP
|
||||||
|
|
||||||
|
ln2_decode_mb_to
|
||||||
|
cmp r11, #16 ; i ?= 16
|
||||||
|
bne ln1_decode_mb_to
|
||||||
|
|
||||||
|
mov r10, #detok_coef_probs
|
||||||
|
add r10, r10, #2*4 ; coef_probs[type]
|
||||||
|
ldr r10, [r9, r10] ; detok + detok_coef_probs[type]
|
||||||
|
|
||||||
|
mov r7, #2 ; type = 2
|
||||||
|
mov r3, #24 ; stop = 24
|
||||||
|
|
||||||
|
str r7, [sp, #l_type]
|
||||||
|
str r3, [sp, #l_stop]
|
||||||
|
|
||||||
|
str r10, [sp, #l_coef_ptr] ; coef_probs = coef_probs[type]
|
||||||
|
b BLOCK_LOOP
|
||||||
|
|
||||||
|
ln1_decode_mb_to
|
||||||
|
ldr r2, [sp, #l_bc]
|
||||||
|
mov r0, #0
|
||||||
|
nop
|
||||||
|
|
||||||
|
str r8, [r2, #bool_decoder_user_buffer]
|
||||||
|
str r5, [r2, #bool_decoder_count]
|
||||||
|
str r4, [r2, #bool_decoder_value]
|
||||||
|
str r6, [r2, #bool_decoder_range]
|
||||||
|
|
||||||
|
add sp, sp, #l_stacksize
|
||||||
|
ldmia sp!, {r4 - r11, pc}
|
||||||
|
|
||||||
|
ENDP ; |vp8_decode_mb_tokens_v6|
|
||||||
|
|
||||||
|
END
|
22
vp8/decoder/arm/detokenize_arm.h
Normal file
22
vp8/decoder/arm/detokenize_arm.h
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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 DETOKENIZE_ARM_H
|
||||||
|
#define DETOKENIZE_ARM_H
|
||||||
|
|
||||||
|
#if HAVE_ARMV6
|
||||||
|
#if CONFIG_ARM_ASM_DETOK
|
||||||
|
void vp8_init_detokenizer(VP8D_COMP *dx);
|
||||||
|
void vp8_decode_mb_tokens_v6(DETOK *detoken, int type);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
160
vp8/decoder/arm/neon/dboolhuff_neon.asm
Normal file
160
vp8/decoder/arm/neon/dboolhuff_neon.asm
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
;
|
||||||
|
; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
;
|
||||||
|
; Use of this source code is governed by a BSD-style license
|
||||||
|
; that can be found in the LICENSE file in the root of the source
|
||||||
|
; tree. An additional intellectual property rights grant can be found
|
||||||
|
; in the file PATENTS. All contributing project authors may
|
||||||
|
; be found in the AUTHORS file in the root of the source tree.
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
EXPORT |vp8_decode_value_neon|
|
||||||
|
EXPORT |vp8dx_start_decode_neon|
|
||||||
|
EXPORT |vp8dx_stop_decode_neon|
|
||||||
|
EXPORT |vp8dx_decode_bool_neon|
|
||||||
|
|
||||||
|
ARM
|
||||||
|
REQUIRE8
|
||||||
|
PRESERVE8
|
||||||
|
|
||||||
|
INCLUDE vpx_asm_offsets.asm
|
||||||
|
|
||||||
|
AREA |.text|, CODE, READONLY ; name this block of code
|
||||||
|
|
||||||
|
; int z = 0;
|
||||||
|
; int bit;
|
||||||
|
; for ( bit=bits-1; bit>=0; bit-- )
|
||||||
|
; {
|
||||||
|
; z |= (vp8dx_decode_bool(br, 0x80)<<bit);
|
||||||
|
; }
|
||||||
|
; return z;
|
||||||
|
|
||||||
|
;int vp8_decode_value_neon ( BOOL_DECODER *br, int bits )
|
||||||
|
|vp8_decode_value_neon| PROC
|
||||||
|
stmdb sp!, {r4 - r6, lr}
|
||||||
|
mov r4, r0
|
||||||
|
mov r5, r1
|
||||||
|
mov r6, #0
|
||||||
|
|
||||||
|
subs r5, r5, #1
|
||||||
|
bmi decode_value_exit
|
||||||
|
|
||||||
|
decode_value_loop
|
||||||
|
mov r1, #0x80
|
||||||
|
mov r0, r4
|
||||||
|
bl vp8dx_decode_bool_neon_internal ; needed for conversion to s file
|
||||||
|
orr r6, r6, r0, lsl r5
|
||||||
|
subs r5, r5, #1
|
||||||
|
bpl decode_value_loop
|
||||||
|
|
||||||
|
decode_value_exit
|
||||||
|
mov r0, r6
|
||||||
|
ldmia sp!, {r4 - r6, pc}
|
||||||
|
ENDP ; |vp8_decode_value_neon|
|
||||||
|
|
||||||
|
|
||||||
|
;void vp8dx_start_decode_neon ( BOOL_DECODER *br, unsigned char *source )
|
||||||
|
|vp8dx_start_decode_neon| PROC
|
||||||
|
stmdb sp!, {r4 - r5, lr}
|
||||||
|
mov r2, #0
|
||||||
|
mov r3, #255
|
||||||
|
|
||||||
|
str r2, [r0, #bool_decoder_lowvalue]
|
||||||
|
str r3, [r0, #bool_decoder_range]
|
||||||
|
str r1, [r0, #bool_decoder_buffer]
|
||||||
|
|
||||||
|
mov r3, #8
|
||||||
|
mov r2, #4
|
||||||
|
str r3, [r0, #bool_decoder_count]
|
||||||
|
str r2, [r0, #bool_decoder_pos]
|
||||||
|
|
||||||
|
ldrb r2, [r1, #3]
|
||||||
|
ldrb r3, [r1, #2]
|
||||||
|
ldrb r4, [r1, #1]
|
||||||
|
ldrb r5, [r1]
|
||||||
|
|
||||||
|
orr r1, r2, r3, lsl #8
|
||||||
|
orr r1, r1, r4, lsl #16
|
||||||
|
orr r1, r1, r5, lsl #24
|
||||||
|
|
||||||
|
str r1, [r0, #bool_decoder_value]
|
||||||
|
|
||||||
|
ldmia sp!, {r4 - r5, pc}
|
||||||
|
ENDP ; |vp8dx_start_decode_neon|
|
||||||
|
|
||||||
|
|
||||||
|
;void vp8dx_stop_decode_neon ( BOOL_DECODER *bc );
|
||||||
|
|vp8dx_stop_decode_neon| PROC
|
||||||
|
mov pc, lr
|
||||||
|
ENDP ; |vp8dx_stop_decode_neon|
|
||||||
|
|
||||||
|
|
||||||
|
; bigsplit RN r1
|
||||||
|
; buffer_v RN r1
|
||||||
|
; count_v RN r4
|
||||||
|
; range_v RN r2
|
||||||
|
; value_v RN r3
|
||||||
|
; pos_v RN r5
|
||||||
|
; split RN r6
|
||||||
|
; bit RN lr
|
||||||
|
;int vp8dx_decode_bool_neon ( BOOL_DECODER *br, int probability )
|
||||||
|
|vp8dx_decode_bool_neon| PROC
|
||||||
|
vp8dx_decode_bool_neon_internal
|
||||||
|
;LDRD and STRD doubleword data transfers must be eight-byte aligned. Use ALIGN 8
|
||||||
|
;before memory allocation
|
||||||
|
stmdb sp!, {r4 - r5, lr}
|
||||||
|
|
||||||
|
ldr r2, [r0, #bool_decoder_range] ;load range (r2), value(r3)
|
||||||
|
ldr r3, [r0, #bool_decoder_value]
|
||||||
|
;ldrd r2, r3, [r0, #bool_decoder_range] ;ldrd costs 2 cycles
|
||||||
|
;
|
||||||
|
|
||||||
|
mov r4, r2, lsl #8
|
||||||
|
sub r4, r4, #256
|
||||||
|
mov r12, #1
|
||||||
|
|
||||||
|
smlawb r4, r4, r1, r12 ;split = 1 + (((range-1) * probability) >> 8)
|
||||||
|
|
||||||
|
mov lr, r0
|
||||||
|
mov r0, #0 ;bit = 0
|
||||||
|
;
|
||||||
|
subs r5, r3, r4, lsl #24
|
||||||
|
|
||||||
|
subhs r2, r2, r4 ;range = br->range-split
|
||||||
|
movlo r2, r4 ;range = split
|
||||||
|
movhs r0, #1 ;bit = 1
|
||||||
|
movhs r3, r5 ;value = value-bigsplit
|
||||||
|
|
||||||
|
cmp r2, #0x80
|
||||||
|
blt range_less_0x80
|
||||||
|
strd r2, r3, [lr, #bool_decoder_range] ;store result
|
||||||
|
|
||||||
|
ldmia sp!, {r4 - r5, pc}
|
||||||
|
|
||||||
|
range_less_0x80
|
||||||
|
|
||||||
|
ldrd r4, r5, [lr, #bool_decoder_count] ;load count, pos, buffer
|
||||||
|
ldr r1, [lr, #bool_decoder_buffer]
|
||||||
|
|
||||||
|
clz r12, r2
|
||||||
|
add r1, r1, r5
|
||||||
|
|
||||||
|
sub r12, r12, #24
|
||||||
|
subs r4, r4, r12 ;count -= shift
|
||||||
|
mov r2, r2, lsl r12 ;range <<= shift
|
||||||
|
mov r3, r3, lsl r12 ;value <<= shift
|
||||||
|
addle r4, r4, #8 ;count += 8
|
||||||
|
ldrleb r12, [r1], #1 ;br->buffer[br->pos]
|
||||||
|
|
||||||
|
rsble r1, r4, #8 ;-count
|
||||||
|
addle r5, r5, #1 ;br->pos++
|
||||||
|
orrle r3, r3, r12, lsl r1 ;value |= (br->buffer[br->pos]) << (-count)
|
||||||
|
|
||||||
|
strd r2, r3, [lr, #bool_decoder_range] ;store result
|
||||||
|
strd r4, r5, [lr, #bool_decoder_count]
|
||||||
|
|
||||||
|
ldmia sp!, {r4 - r5, pc}
|
||||||
|
ENDP ; |vp8dx_decode_bool_neon|
|
||||||
|
|
||||||
|
END
|
@@ -9,8 +9,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "vp8/decoder/dequantize.h"
|
#include "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
|
||||||
|
@@ -26,9 +26,8 @@ DECLARE_ALIGNED(16, const unsigned char, vp8dx_bitreader_norm[256]) =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int vp8dx_start_decode(BOOL_DECODER *br,
|
int vp8dx_start_decode_c(BOOL_DECODER *br, const unsigned char *source,
|
||||||
const unsigned char *source,
|
unsigned int source_sz)
|
||||||
unsigned int source_sz)
|
|
||||||
{
|
{
|
||||||
br->user_buffer_end = source+source_sz;
|
br->user_buffer_end = source+source_sz;
|
||||||
br->user_buffer = source;
|
br->user_buffer = source;
|
||||||
@@ -40,13 +39,13 @@ int vp8dx_start_decode(BOOL_DECODER *br,
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Populate the buffer */
|
/* Populate the buffer */
|
||||||
vp8dx_bool_decoder_fill(br);
|
vp8dx_bool_decoder_fill_c(br);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void vp8dx_bool_decoder_fill(BOOL_DECODER *br)
|
void vp8dx_bool_decoder_fill_c(BOOL_DECODER *br)
|
||||||
{
|
{
|
||||||
const unsigned char *bufptr;
|
const unsigned char *bufptr;
|
||||||
const unsigned char *bufend;
|
const unsigned char *bufend;
|
||||||
@@ -63,3 +62,69 @@ void vp8dx_bool_decoder_fill(BOOL_DECODER *br)
|
|||||||
br->value = value;
|
br->value = value;
|
||||||
br->count = count;
|
br->count = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/*
|
||||||
|
* Until optimized versions of these functions are available, we
|
||||||
|
* keep the implementation in the header to allow inlining.
|
||||||
|
*
|
||||||
|
* The RTCD-style invocations are still in place so this can
|
||||||
|
* be switched by just uncommenting these functions here and
|
||||||
|
* the DBOOLHUFF_INVOKE calls in the header.
|
||||||
|
*/
|
||||||
|
int vp8dx_decode_bool_c(BOOL_DECODER *br, int probability)
|
||||||
|
{
|
||||||
|
unsigned int bit=0;
|
||||||
|
VP8_BD_VALUE value;
|
||||||
|
unsigned int split;
|
||||||
|
VP8_BD_VALUE bigsplit;
|
||||||
|
int count;
|
||||||
|
unsigned int range;
|
||||||
|
|
||||||
|
value = br->value;
|
||||||
|
count = br->count;
|
||||||
|
range = br->range;
|
||||||
|
|
||||||
|
split = 1 + (((range-1) * probability) >> 8);
|
||||||
|
bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8);
|
||||||
|
|
||||||
|
range = split;
|
||||||
|
if(value >= bigsplit)
|
||||||
|
{
|
||||||
|
range = br->range-split;
|
||||||
|
value = value-bigsplit;
|
||||||
|
bit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if(range>=0x80)
|
||||||
|
{
|
||||||
|
br->value = value;
|
||||||
|
br->range = range;
|
||||||
|
return bit;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
{
|
||||||
|
register unsigned int shift = vp8dx_bitreader_norm[range];
|
||||||
|
range <<= shift;
|
||||||
|
value <<= shift;
|
||||||
|
count -= shift;
|
||||||
|
}
|
||||||
|
br->value = value;
|
||||||
|
br->count = count;
|
||||||
|
br->range = range;
|
||||||
|
if (count < 0)
|
||||||
|
vp8dx_bool_decoder_fill_c(br);
|
||||||
|
return bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vp8dx_decode_value_c(BOOL_DECODER *br, int bits)
|
||||||
|
{
|
||||||
|
int z = 0;
|
||||||
|
int bit;
|
||||||
|
for ( bit=bits-1; bit>=0; bit-- )
|
||||||
|
{
|
||||||
|
z |= (vp8dx_decode_bool(br, 0x80)<<bit);
|
||||||
|
}
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@@ -25,6 +25,10 @@ typedef size_t VP8_BD_VALUE;
|
|||||||
Even relatively modest values like 100 would work fine.*/
|
Even relatively modest values like 100 would work fine.*/
|
||||||
# define VP8_LOTS_OF_BITS (0x40000000)
|
# define VP8_LOTS_OF_BITS (0x40000000)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct vp8_dboolhuff_rtcd_vtable;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const unsigned char *user_buffer_end;
|
const unsigned char *user_buffer_end;
|
||||||
@@ -32,15 +36,82 @@ typedef struct
|
|||||||
VP8_BD_VALUE value;
|
VP8_BD_VALUE value;
|
||||||
int count;
|
int count;
|
||||||
unsigned int range;
|
unsigned int range;
|
||||||
|
#if CONFIG_RUNTIME_CPU_DETECT
|
||||||
|
struct vp8_dboolhuff_rtcd_vtable *rtcd;
|
||||||
|
#endif
|
||||||
} BOOL_DECODER;
|
} BOOL_DECODER;
|
||||||
|
|
||||||
|
#define prototype_dbool_start(sym) int sym(BOOL_DECODER *br, \
|
||||||
|
const unsigned char *source, unsigned int source_sz)
|
||||||
|
#define prototype_dbool_fill(sym) void sym(BOOL_DECODER *br)
|
||||||
|
#define prototype_dbool_debool(sym) int sym(BOOL_DECODER *br, int probability)
|
||||||
|
#define prototype_dbool_devalue(sym) int sym(BOOL_DECODER *br, int bits)
|
||||||
|
|
||||||
|
#if ARCH_ARM
|
||||||
|
#include "arm/dboolhuff_arm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vp8_dbool_start
|
||||||
|
#define vp8_dbool_start vp8dx_start_decode_c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vp8_dbool_fill
|
||||||
|
#define vp8_dbool_fill vp8dx_bool_decoder_fill_c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vp8_dbool_debool
|
||||||
|
#define vp8_dbool_debool vp8dx_decode_bool_c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vp8_dbool_devalue
|
||||||
|
#define vp8_dbool_devalue vp8dx_decode_value_c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern prototype_dbool_start(vp8_dbool_start);
|
||||||
|
extern prototype_dbool_fill(vp8_dbool_fill);
|
||||||
|
extern prototype_dbool_debool(vp8_dbool_debool);
|
||||||
|
extern prototype_dbool_devalue(vp8_dbool_devalue);
|
||||||
|
|
||||||
|
typedef prototype_dbool_start((*vp8_dbool_start_fn_t));
|
||||||
|
typedef prototype_dbool_fill((*vp8_dbool_fill_fn_t));
|
||||||
|
typedef prototype_dbool_debool((*vp8_dbool_debool_fn_t));
|
||||||
|
typedef prototype_dbool_devalue((*vp8_dbool_devalue_fn_t));
|
||||||
|
|
||||||
|
typedef struct vp8_dboolhuff_rtcd_vtable {
|
||||||
|
vp8_dbool_start_fn_t start;
|
||||||
|
vp8_dbool_fill_fn_t fill;
|
||||||
|
vp8_dbool_debool_fn_t debool;
|
||||||
|
vp8_dbool_devalue_fn_t devalue;
|
||||||
|
} vp8_dboolhuff_rtcd_vtable_t;
|
||||||
|
|
||||||
|
/* There are no processor-specific versions of these
|
||||||
|
* functions right now. Disable RTCD to avoid using
|
||||||
|
* function pointers which gives a speed boost
|
||||||
|
*/
|
||||||
|
/*#ifdef ENABLE_RUNTIME_CPU_DETECT
|
||||||
|
#define DBOOLHUFF_INVOKE(ctx,fn) (ctx)->fn
|
||||||
|
#define IF_RTCD(x) (x)
|
||||||
|
#else*/
|
||||||
|
#define DBOOLHUFF_INVOKE(ctx,fn) vp8_dbool_##fn
|
||||||
|
#define IF_RTCD(x) NULL
|
||||||
|
/*#endif*/
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
||||||
|
|
||||||
int vp8dx_start_decode(BOOL_DECODER *br,
|
/* wrapper functions to hide RTCD. static means inline means hopefully no
|
||||||
const unsigned char *source,
|
* penalty
|
||||||
unsigned int source_sz);
|
*/
|
||||||
|
static int vp8dx_start_decode(BOOL_DECODER *br,
|
||||||
void vp8dx_bool_decoder_fill(BOOL_DECODER *br);
|
struct vp8_dboolhuff_rtcd_vtable *rtcd,
|
||||||
|
const unsigned char *source, unsigned int source_sz) {
|
||||||
|
#if CONFIG_RUNTIME_CPU_DETECT
|
||||||
|
br->rtcd = rtcd;
|
||||||
|
#endif
|
||||||
|
return DBOOLHUFF_INVOKE(rtcd, start)(br, source, source_sz);
|
||||||
|
}
|
||||||
|
static void vp8dx_bool_decoder_fill(BOOL_DECODER *br) {
|
||||||
|
DBOOLHUFF_INVOKE(br->rtcd, fill)(br);
|
||||||
|
}
|
||||||
|
|
||||||
/*The refill loop is used in several places, so define it in a macro to make
|
/*The refill loop is used in several places, so define it in a macro to make
|
||||||
sure they're all consistent.
|
sure they're all consistent.
|
||||||
@@ -55,7 +126,7 @@ void vp8dx_bool_decoder_fill(BOOL_DECODER *br);
|
|||||||
for(shift = VP8_BD_VALUE_SIZE - 8 - ((_count) + 8); shift >= 0; ) \
|
for(shift = VP8_BD_VALUE_SIZE - 8 - ((_count) + 8); shift >= 0; ) \
|
||||||
{ \
|
{ \
|
||||||
if((_bufptr) >= (_bufend)) { \
|
if((_bufptr) >= (_bufend)) { \
|
||||||
(_count) = VP8_LOTS_OF_BITS; \
|
(_count) += VP8_LOTS_OF_BITS; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
(_count) += 8; \
|
(_count) += 8; \
|
||||||
@@ -67,6 +138,12 @@ void vp8dx_bool_decoder_fill(BOOL_DECODER *br);
|
|||||||
|
|
||||||
|
|
||||||
static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) {
|
static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) {
|
||||||
|
/*
|
||||||
|
* Until optimized versions of this function are available, we
|
||||||
|
* keep the implementation in the header to allow inlining.
|
||||||
|
*
|
||||||
|
*return DBOOLHUFF_INVOKE(br->rtcd, debool)(br, probability);
|
||||||
|
*/
|
||||||
unsigned int bit = 0;
|
unsigned int bit = 0;
|
||||||
VP8_BD_VALUE value;
|
VP8_BD_VALUE value;
|
||||||
unsigned int split;
|
unsigned int split;
|
||||||
@@ -90,6 +167,13 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) {
|
|||||||
bit = 1;
|
bit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*if(range>=0x80)
|
||||||
|
{
|
||||||
|
br->value = value;
|
||||||
|
br->range = range;
|
||||||
|
return bit
|
||||||
|
}*/
|
||||||
|
|
||||||
{
|
{
|
||||||
register unsigned int shift = vp8dx_bitreader_norm[range];
|
register unsigned int shift = vp8dx_bitreader_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
@@ -106,6 +190,12 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) {
|
|||||||
|
|
||||||
static int vp8_decode_value(BOOL_DECODER *br, int bits)
|
static int vp8_decode_value(BOOL_DECODER *br, int bits)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Until optimized versions of this function are available, we
|
||||||
|
* keep the implementation in the header to allow inlining.
|
||||||
|
*
|
||||||
|
*return DBOOLHUFF_INVOKE(br->rtcd, devalue)(br, bits);
|
||||||
|
*/
|
||||||
int z = 0;
|
int z = 0;
|
||||||
int bit;
|
int bit;
|
||||||
|
|
||||||
@@ -119,18 +209,19 @@ static int vp8_decode_value(BOOL_DECODER *br, int bits)
|
|||||||
|
|
||||||
static int vp8dx_bool_error(BOOL_DECODER *br)
|
static int vp8dx_bool_error(BOOL_DECODER *br)
|
||||||
{
|
{
|
||||||
/* Check if we have reached the end of the buffer.
|
/* Check if we have reached the end of the buffer.
|
||||||
*
|
*
|
||||||
* Variable 'count' stores the number of bits in the 'value' buffer,
|
* Variable 'count' stores the number of bits in the 'value' buffer, minus
|
||||||
* minus 8. So if count == 8, there are 16 bits available to be read.
|
* 8. The top byte is part of the algorithm, and the remainder is buffered
|
||||||
* Normally, count is filled with 8 and one byte is filled into the
|
* to be shifted into it. So if count == 8, the top 16 bits of 'value' are
|
||||||
* value buffer. When we reach the end of the buffer, count is instead
|
* occupied, 8 for the algorithm and 8 in the buffer.
|
||||||
* filled with VP8_LOTS_OF_BITS, 8 of which represent the last 8 real
|
*
|
||||||
* bits from the bitstream. So the last bit in the bitstream will be
|
* When reading a byte from the user's buffer, count is filled with 8 and
|
||||||
* represented by count == VP8_LOTS_OF_BITS - 16.
|
* one byte is filled into the value buffer. When we reach the end of the
|
||||||
*/
|
* data, count is additionally filled with VP8_LOTS_OF_BITS. So when
|
||||||
if ((br->count > VP8_BD_VALUE_SIZE)
|
* count == VP8_LOTS_OF_BITS - 1, the user's data has been exhausted.
|
||||||
&& (br->count <= VP8_LOTS_OF_BITS - 16))
|
*/
|
||||||
|
if ((br->count > VP8_BD_VALUE_SIZE) && (br->count < VP8_LOTS_OF_BITS))
|
||||||
{
|
{
|
||||||
/* We have tried to decode bits after the end of
|
/* We have tried to decode bits after the end of
|
||||||
* stream was encountered.
|
* stream was encountered.
|
||||||
|
@@ -10,10 +10,10 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "treereader.h"
|
#include "treereader.h"
|
||||||
#include "vp8/common/entropymv.h"
|
#include "entropymv.h"
|
||||||
#include "vp8/common/entropymode.h"
|
#include "entropymode.h"
|
||||||
#include "onyxd_int.h"
|
#include "onyxd_int.h"
|
||||||
#include "vp8/common/findnearmv.h"
|
#include "findnearmv.h"
|
||||||
|
|
||||||
#if CONFIG_DEBUG
|
#if CONFIG_DEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@@ -251,6 +251,7 @@ void vp8_mb_mode_mv_init(VP8D_COMP *pbi)
|
|||||||
vp8_reader *const bc = & pbi->bc;
|
vp8_reader *const bc = & pbi->bc;
|
||||||
MV_CONTEXT *const mvc = pbi->common.fc.mvc;
|
MV_CONTEXT *const mvc = pbi->common.fc.mvc;
|
||||||
|
|
||||||
|
pbi->mvs_corrupt_from_mb = -1;
|
||||||
pbi->prob_skip_false = 0;
|
pbi->prob_skip_false = 0;
|
||||||
if (pbi->common.mb_no_coeff_skip)
|
if (pbi->common.mb_no_coeff_skip)
|
||||||
pbi->prob_skip_false = (vp8_prob)vp8_read_literal(bc, 8);
|
pbi->prob_skip_false = (vp8_prob)vp8_read_literal(bc, 8);
|
||||||
@@ -412,7 +413,7 @@ void vp8_read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
mi->bmi[ *fill_offset] = bmi;
|
mi->bmi[ *fill_offset] = bmi;
|
||||||
fill_offset++;
|
fill_offset++;
|
||||||
|
|
||||||
}while (--fill_count);
|
}while (--fill_count);
|
||||||
}
|
}
|
||||||
@@ -543,12 +544,18 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi)
|
|||||||
|
|
||||||
while (++mb_col < pbi->common.mb_cols)
|
while (++mb_col < pbi->common.mb_cols)
|
||||||
{
|
{
|
||||||
|
int mb_num = mb_row * pbi->common.mb_cols + mb_col;
|
||||||
/*vp8_read_mb_modes_mv(pbi, xd->mode_info_context, &xd->mode_info_context->mbmi, mb_row, mb_col);*/
|
/*vp8_read_mb_modes_mv(pbi, xd->mode_info_context, &xd->mode_info_context->mbmi, mb_row, mb_col);*/
|
||||||
if(pbi->common.frame_type == KEY_FRAME)
|
if(pbi->common.frame_type == KEY_FRAME)
|
||||||
vp8_kfread_modes(pbi, mi, mb_row, mb_col);
|
vp8_kfread_modes(pbi, mi, mb_row, mb_col);
|
||||||
else
|
else
|
||||||
vp8_read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
|
vp8_read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
|
||||||
|
|
||||||
|
/* look for corruption */
|
||||||
|
if (vp8dx_bool_error(&pbi->bc) && mb_num < pbi->mvs_corrupt_from_mb)
|
||||||
|
pbi->mvs_corrupt_from_mb = mb_num;
|
||||||
|
|
||||||
|
|
||||||
mi++; /* next macroblock */
|
mi++; /* next macroblock */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,27 +10,29 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "onyxd_int.h"
|
#include "onyxd_int.h"
|
||||||
#include "vp8/common/header.h"
|
#include "header.h"
|
||||||
#include "vp8/common/reconintra.h"
|
#include "reconintra.h"
|
||||||
#include "vp8/common/reconintra4x4.h"
|
#include "reconintra4x4.h"
|
||||||
#include "vp8/common/recon.h"
|
#include "recon.h"
|
||||||
#include "vp8/common/reconinter.h"
|
#include "reconinter.h"
|
||||||
#include "dequantize.h"
|
#include "dequantize.h"
|
||||||
#include "detokenize.h"
|
#include "detokenize.h"
|
||||||
#include "vp8/common/invtrans.h"
|
#include "invtrans.h"
|
||||||
#include "vp8/common/alloccommon.h"
|
#include "alloccommon.h"
|
||||||
#include "vp8/common/entropymode.h"
|
#include "entropymode.h"
|
||||||
#include "vp8/common/quant_common.h"
|
#include "quant_common.h"
|
||||||
#include "vpx_scale/vpxscale.h"
|
#include "vpx_scale/vpxscale.h"
|
||||||
#include "vpx_scale/yv12extend.h"
|
#include "vpx_scale/yv12extend.h"
|
||||||
#include "vp8/common/setupintrarecon.h"
|
#include "setupintrarecon.h"
|
||||||
|
|
||||||
#include "decodemv.h"
|
#include "decodemv.h"
|
||||||
#include "vp8/common/extend.h"
|
#include "extend.h"
|
||||||
|
#include "error_concealment.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "idct.h"
|
||||||
#include "dequantize.h"
|
#include "dequantize.h"
|
||||||
#include "vp8/common/threading.h"
|
#include "predictdc.h"
|
||||||
|
#include "threading.h"
|
||||||
#include "decoderthreading.h"
|
#include "decoderthreading.h"
|
||||||
#include "dboolhuff.h"
|
#include "dboolhuff.h"
|
||||||
|
|
||||||
@@ -175,11 +177,21 @@ void clamp_mvs(MACROBLOCKD *xd)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp8_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd)
|
void vp8_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, unsigned int mb_idx)
|
||||||
{
|
{
|
||||||
int eobtotal = 0;
|
int eobtotal = 0;
|
||||||
int i, do_clamp = xd->mode_info_context->mbmi.need_to_clamp_mvs;
|
int i, do_clamp = xd->mode_info_context->mbmi.need_to_clamp_mvs;
|
||||||
|
|
||||||
|
/* TODO(holmer): change when we have MB level error tracking
|
||||||
|
* The residuals may not match the predicted signal when a macroblock is
|
||||||
|
* corrupted due to previous losses. Should we try to add the residual
|
||||||
|
* anyway, or just throw it away? Should test this on a couple of files.
|
||||||
|
*/
|
||||||
|
if (pbi->ec_enabled && mb_idx >= pbi->mvs_corrupt_from_mb)
|
||||||
|
{
|
||||||
|
xd->mode_info_context->mbmi.mb_skip_coeff = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (xd->mode_info_context->mbmi.mb_skip_coeff)
|
if (xd->mode_info_context->mbmi.mb_skip_coeff)
|
||||||
{
|
{
|
||||||
vp8_reset_mb_tokens_context(xd);
|
vp8_reset_mb_tokens_context(xd);
|
||||||
@@ -332,6 +344,7 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
|||||||
int dst_fb_idx = pc->new_fb_idx;
|
int dst_fb_idx = pc->new_fb_idx;
|
||||||
int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride;
|
int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride;
|
||||||
int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride;
|
int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride;
|
||||||
|
int corrupt_partition = 0;
|
||||||
|
|
||||||
vpx_memset(&pc->left_context, 0, sizeof(pc->left_context));
|
vpx_memset(&pc->left_context, 0, sizeof(pc->left_context));
|
||||||
recon_yoffset = mb_row * recon_y_stride * 16;
|
recon_yoffset = mb_row * recon_y_stride * 16;
|
||||||
@@ -346,6 +359,28 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
|||||||
|
|
||||||
for (mb_col = 0; mb_col < pc->mb_cols; mb_col++)
|
for (mb_col = 0; mb_col < pc->mb_cols; mb_col++)
|
||||||
{
|
{
|
||||||
|
/* Distance of Mb to the various image edges.
|
||||||
|
* These are specified to 8th pel as they are always compared to values that are in 1/8th pel units
|
||||||
|
*/
|
||||||
|
xd->mb_to_left_edge = -((mb_col * 16) << 3);
|
||||||
|
xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;
|
||||||
|
|
||||||
|
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME &&
|
||||||
|
corrupt_partition)
|
||||||
|
{
|
||||||
|
/* We have an intra block with corrupt coefficients,
|
||||||
|
* better to conceal with an inter block. Interpolate MVs
|
||||||
|
* from neighboring MBs.
|
||||||
|
*/
|
||||||
|
/* TODO(holmer): We will fail to conceal an intra block with missing
|
||||||
|
* coefficients if it's the first block with missing coefficients,
|
||||||
|
* since the bool dec error detection is done after reconstruction.
|
||||||
|
*/
|
||||||
|
vp8_interpolate_motion(xd,
|
||||||
|
mb_row, mb_col,
|
||||||
|
pc->mb_rows, pc->mb_cols,
|
||||||
|
pc->mode_info_stride);
|
||||||
|
}
|
||||||
|
|
||||||
if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED)
|
if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context->mbmi.mode == B_PRED)
|
||||||
{
|
{
|
||||||
@@ -356,12 +391,6 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Distance of Mb to the various image edges.
|
|
||||||
* These are specified to 8th pel as they are always compared to values that are in 1/8th pel units
|
|
||||||
*/
|
|
||||||
xd->mb_to_left_edge = -((mb_col * 16) << 3);
|
|
||||||
xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;
|
|
||||||
|
|
||||||
xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
|
xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
|
||||||
xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
|
xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
|
||||||
xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
|
xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
|
||||||
@@ -394,10 +423,11 @@ void vp8_decode_mb_row(VP8D_COMP *pbi,
|
|||||||
else
|
else
|
||||||
pbi->debugoutput =0;
|
pbi->debugoutput =0;
|
||||||
*/
|
*/
|
||||||
vp8_decode_macroblock(pbi, xd);
|
vp8_decode_macroblock(pbi, xd, mb_row * pc->mb_cols + mb_col);
|
||||||
|
|
||||||
/* check if the boolean decoder has suffered an error */
|
/* check if the boolean decoder has suffered an error */
|
||||||
xd->corrupted |= vp8dx_bool_error(xd->current_bc);
|
corrupt_partition = vp8dx_bool_error(xd->current_bc);
|
||||||
|
xd->corrupted |= corrupt_partition;
|
||||||
|
|
||||||
recon_yoffset += 16;
|
recon_yoffset += 16;
|
||||||
recon_uvoffset += 8;
|
recon_uvoffset += 8;
|
||||||
@@ -468,13 +498,14 @@ static void setup_token_decoder(VP8D_COMP *pbi,
|
|||||||
partition_size = user_data_end - partition;
|
partition_size = user_data_end - partition;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (partition + partition_size > user_data_end
|
if (!pbi->ec_enabled && (partition + partition_size > user_data_end
|
||||||
|| partition + partition_size < partition)
|
|| partition + partition_size < partition))
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
"Truncated packet or corrupt partition "
|
"Truncated packet or corrupt partition "
|
||||||
"%d length", i + 1);
|
"%d length", i + 1);
|
||||||
|
|
||||||
if (vp8dx_start_decode(bool_decoder, partition, partition_size))
|
if (vp8dx_start_decode(bool_decoder, IF_RTCD(&pbi->dboolhuff),
|
||||||
|
partition, partition_size))
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
||||||
"Failed to allocate bool decoder %d", i + 1);
|
"Failed to allocate bool decoder %d", i + 1);
|
||||||
|
|
||||||
@@ -483,11 +514,9 @@ static void setup_token_decoder(VP8D_COMP *pbi,
|
|||||||
bool_decoder++;
|
bool_decoder++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
|
||||||
/* Clamp number of decoder threads */
|
/* Clamp number of decoder threads */
|
||||||
if (pbi->decoding_thread_count > num_part - 1)
|
if (pbi->decoding_thread_count > num_part - 1)
|
||||||
pbi->decoding_thread_count = num_part - 1;
|
pbi->decoding_thread_count = num_part - 1;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -584,63 +613,87 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
pc->yv12_fb[pc->new_fb_idx].corrupted = 0;
|
pc->yv12_fb[pc->new_fb_idx].corrupted = 0;
|
||||||
|
|
||||||
if (data_end - data < 3)
|
if (data_end - data < 3)
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
|
||||||
"Truncated packet");
|
|
||||||
pc->frame_type = (FRAME_TYPE)(data[0] & 1);
|
|
||||||
pc->version = (data[0] >> 1) & 7;
|
|
||||||
pc->show_frame = (data[0] >> 4) & 1;
|
|
||||||
first_partition_length_in_bytes =
|
|
||||||
(data[0] | (data[1] << 8) | (data[2] << 16)) >> 5;
|
|
||||||
data += 3;
|
|
||||||
|
|
||||||
if (data + first_partition_length_in_bytes > data_end
|
|
||||||
|| data + first_partition_length_in_bytes < data)
|
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
|
||||||
"Truncated packet or corrupt partition 0 length");
|
|
||||||
vp8_setup_version(pc);
|
|
||||||
|
|
||||||
if (pc->frame_type == KEY_FRAME)
|
|
||||||
{
|
{
|
||||||
const int Width = pc->Width;
|
if (pbi->ec_enabled)
|
||||||
const int Height = pc->Height;
|
|
||||||
|
|
||||||
/* vet via sync code */
|
|
||||||
if (data[0] != 0x9d || data[1] != 0x01 || data[2] != 0x2a)
|
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM,
|
|
||||||
"Invalid frame sync code");
|
|
||||||
|
|
||||||
pc->Width = (data[3] | (data[4] << 8)) & 0x3fff;
|
|
||||||
pc->horiz_scale = data[4] >> 6;
|
|
||||||
pc->Height = (data[5] | (data[6] << 8)) & 0x3fff;
|
|
||||||
pc->vert_scale = data[6] >> 6;
|
|
||||||
data += 7;
|
|
||||||
|
|
||||||
if (Width != pc->Width || Height != pc->Height)
|
|
||||||
{
|
{
|
||||||
int prev_mb_rows = pc->mb_rows;
|
/* Declare the missing frame as an inter frame since it will
|
||||||
|
be handled as an inter frame when we have estimated its
|
||||||
|
motion vectors. */
|
||||||
|
pc->frame_type = INTER_FRAME;
|
||||||
|
pc->version = 0;
|
||||||
|
pc->show_frame = 1;
|
||||||
|
first_partition_length_in_bytes = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
|
"Truncated packet");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pc->frame_type = (FRAME_TYPE)(data[0] & 1);
|
||||||
|
pc->version = (data[0] >> 1) & 7;
|
||||||
|
pc->show_frame = (data[0] >> 4) & 1;
|
||||||
|
first_partition_length_in_bytes =
|
||||||
|
(data[0] | (data[1] << 8) | (data[2] << 16)) >> 5;
|
||||||
|
data += 3;
|
||||||
|
|
||||||
if (pc->Width <= 0)
|
if (!pbi->ec_enabled && (data + first_partition_length_in_bytes > data_end
|
||||||
|
|| data + first_partition_length_in_bytes < data))
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
|
"Truncated packet or corrupt partition 0 length");
|
||||||
|
vp8_setup_version(pc);
|
||||||
|
|
||||||
|
if (pc->frame_type == KEY_FRAME)
|
||||||
|
{
|
||||||
|
const int Width = pc->Width;
|
||||||
|
const int Height = pc->Height;
|
||||||
|
|
||||||
|
/* vet via sync code */
|
||||||
|
if (!pbi->ec_enabled &&
|
||||||
|
(data[0] != 0x9d || data[1] != 0x01 || data[2] != 0x2a))
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM,
|
||||||
|
"Invalid frame sync code");
|
||||||
|
|
||||||
|
pc->Width = (data[3] | (data[4] << 8)) & 0x3fff;
|
||||||
|
pc->horiz_scale = data[4] >> 6;
|
||||||
|
pc->Height = (data[5] | (data[6] << 8)) & 0x3fff;
|
||||||
|
pc->vert_scale = data[6] >> 6;
|
||||||
|
data += 7;
|
||||||
|
|
||||||
|
if (Width != pc->Width || Height != pc->Height)
|
||||||
{
|
{
|
||||||
pc->Width = Width;
|
int prev_mb_rows = pc->mb_rows;
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
|
||||||
"Invalid frame width");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pc->Height <= 0)
|
if (pc->Width <= 0)
|
||||||
{
|
{
|
||||||
pc->Height = Height;
|
pc->Width = Width;
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
"Invalid frame height");
|
"Invalid frame width");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height))
|
if (pc->Height <= 0)
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
{
|
||||||
"Failed to allocate frame buffers");
|
pc->Height = Height;
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME,
|
||||||
|
"Invalid frame height");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height))
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
||||||
|
"Failed to allocate frame buffers");
|
||||||
|
|
||||||
|
if (vp8_alloc_overlap_lists(pbi))
|
||||||
|
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
||||||
|
"Failed to allocate overlap lists for "
|
||||||
|
"error concealment");
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
if (pbi->b_multithreaded_rd)
|
if (pbi->b_multithreaded_rd)
|
||||||
vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows);
|
vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,7 +704,8 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
|
|
||||||
init_frame(pbi);
|
init_frame(pbi);
|
||||||
|
|
||||||
if (vp8dx_start_decode(bc, data, data_end - data))
|
if (vp8dx_start_decode(bc, IF_RTCD(&pbi->dboolhuff),
|
||||||
|
data, data_end - data))
|
||||||
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
|
||||||
"Failed to allocate bool decoder 0");
|
"Failed to allocate bool decoder 0");
|
||||||
if (pc->frame_type == KEY_FRAME) {
|
if (pc->frame_type == KEY_FRAME) {
|
||||||
@@ -845,9 +899,7 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG));
|
vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG));
|
||||||
|
|
||||||
/* set up frame new frame for intra coded blocks */
|
/* set up frame new frame for intra coded blocks */
|
||||||
#if CONFIG_MULTITHREAD
|
|
||||||
if (!(pbi->b_multithreaded_rd) || pc->multi_token_partition == ONE_PARTITION || !(pc->filter_level))
|
if (!(pbi->b_multithreaded_rd) || pc->multi_token_partition == ONE_PARTITION || !(pc->filter_level))
|
||||||
#endif
|
|
||||||
vp8_setup_intra_recon(&pc->yv12_fb[pc->new_fb_idx]);
|
vp8_setup_intra_recon(&pc->yv12_fb[pc->new_fb_idx]);
|
||||||
|
|
||||||
vp8_setup_block_dptrs(xd);
|
vp8_setup_block_dptrs(xd);
|
||||||
@@ -863,11 +915,16 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
|
|
||||||
vp8_decode_mode_mvs(pbi);
|
vp8_decode_mode_mvs(pbi);
|
||||||
|
|
||||||
|
if (pbi->ec_enabled &&
|
||||||
|
pbi->mvs_corrupt_from_mb < (unsigned int)pc->mb_cols * pc->mb_rows)
|
||||||
|
{
|
||||||
|
vp8_estimate_missing_mvs(pbi);
|
||||||
|
}
|
||||||
|
|
||||||
vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols);
|
vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols);
|
||||||
|
|
||||||
vpx_memcpy(&xd->block[0].bmi, &xd->mode_info_context->bmi[0], sizeof(B_MODE_INFO));
|
vpx_memcpy(&xd->block[0].bmi, &xd->mode_info_context->bmi[0], sizeof(B_MODE_INFO));
|
||||||
|
|
||||||
#if CONFIG_MULTITHREAD
|
|
||||||
if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION)
|
if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION)
|
||||||
{
|
{
|
||||||
vp8mt_decode_mb_rows(pbi, xd);
|
vp8mt_decode_mb_rows(pbi, xd);
|
||||||
@@ -882,7 +939,6 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
vp8_yv12_extend_frame_borders_ptr(&pc->yv12_fb[pc->new_fb_idx]); /*cm->frame_to_show);*/
|
vp8_yv12_extend_frame_borders_ptr(&pc->yv12_fb[pc->new_fb_idx]); /*cm->frame_to_show);*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
int ibc = 0;
|
int ibc = 0;
|
||||||
int num_part = 1 << pc->multi_token_partition;
|
int num_part = 1 << pc->multi_token_partition;
|
||||||
|
@@ -11,7 +11,8 @@
|
|||||||
|
|
||||||
#include "vpx_ports/config.h"
|
#include "vpx_ports/config.h"
|
||||||
#include "dequantize.h"
|
#include "dequantize.h"
|
||||||
#include "vp8/common/idct.h"
|
#include "predictdc.h"
|
||||||
|
#include "idct.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
extern void vp8_short_idct4x4llm_c(short *input, short *output, int pitch) ;
|
extern void vp8_short_idct4x4llm_c(short *input, short *output, int pitch) ;
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#ifndef DEQUANTIZE_H
|
#ifndef DEQUANTIZE_H
|
||||||
#define DEQUANTIZE_H
|
#define DEQUANTIZE_H
|
||||||
#include "vp8/common/blockd.h"
|
#include "blockd.h"
|
||||||
|
|
||||||
#define prototype_dequant_block(sym) \
|
#define prototype_dequant_block(sym) \
|
||||||
void sym(BLOCKD *x)
|
void sym(BLOCKD *x)
|
||||||
|
@@ -9,8 +9,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "vp8/common/type_aliases.h"
|
#include "type_aliases.h"
|
||||||
#include "vp8/common/blockd.h"
|
#include "blockd.h"
|
||||||
#include "onyxd_int.h"
|
#include "onyxd_int.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
@@ -74,6 +74,37 @@ void vp8_reset_mb_tokens_context(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if CONFIG_ARM_ASM_DETOK
|
||||||
|
/* mashup of vp8_block2left and vp8_block2above so we only need one pointer
|
||||||
|
* for the assembly version.
|
||||||
|
*/
|
||||||
|
DECLARE_ALIGNED(16, const UINT8, vp8_block2leftabove[25*2]) =
|
||||||
|
{
|
||||||
|
/* vp8_block2left */
|
||||||
|
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
|
||||||
|
/* vp8_block2above */
|
||||||
|
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8
|
||||||
|
};
|
||||||
|
|
||||||
|
void vp8_init_detokenizer(VP8D_COMP *dx)
|
||||||
|
{
|
||||||
|
const VP8_COMMON *const oc = & dx->common;
|
||||||
|
MACROBLOCKD *x = & dx->mb;
|
||||||
|
|
||||||
|
dx->detoken.vp8_coef_tree_ptr = vp8_coef_tree;
|
||||||
|
dx->detoken.ptr_block2leftabove = vp8_block2leftabove;
|
||||||
|
dx->detoken.ptr_coef_bands_x = vp8_coef_bands_x;
|
||||||
|
dx->detoken.scan = vp8_default_zig_zag1d;
|
||||||
|
dx->detoken.teb_base_ptr = vp8d_token_extra_bits2;
|
||||||
|
dx->detoken.qcoeff_start_ptr = &x->qcoeff[0];
|
||||||
|
|
||||||
|
dx->detoken.coef_probs[0] = (oc->fc.coef_probs [0] [ 0 ] [0]);
|
||||||
|
dx->detoken.coef_probs[1] = (oc->fc.coef_probs [1] [ 0 ] [0]);
|
||||||
|
dx->detoken.coef_probs[2] = (oc->fc.coef_probs [2] [ 0 ] [0]);
|
||||||
|
dx->detoken.coef_probs[3] = (oc->fc.coef_probs [3] [ 0 ] [0]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
||||||
#define FILL \
|
#define FILL \
|
||||||
if(count < 0) \
|
if(count < 0) \
|
||||||
@@ -171,6 +202,35 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
|||||||
}\
|
}\
|
||||||
NORMALIZE
|
NORMALIZE
|
||||||
|
|
||||||
|
#if CONFIG_ARM_ASM_DETOK
|
||||||
|
int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
|
||||||
|
{
|
||||||
|
int eobtotal = 0;
|
||||||
|
int i, type;
|
||||||
|
|
||||||
|
dx->detoken.current_bc = x->current_bc;
|
||||||
|
dx->detoken.A = x->above_context;
|
||||||
|
dx->detoken.L = x->left_context;
|
||||||
|
|
||||||
|
type = 3;
|
||||||
|
|
||||||
|
if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
|
||||||
|
{
|
||||||
|
type = 1;
|
||||||
|
eobtotal -= 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
vp8_decode_mb_tokens_v6(&dx->detoken, type);
|
||||||
|
|
||||||
|
for (i = 0; i < 25; i++)
|
||||||
|
{
|
||||||
|
x->eobs[i] = dx->detoken.eob[i];
|
||||||
|
eobtotal += dx->detoken.eob[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return eobtotal;
|
||||||
|
}
|
||||||
|
#else
|
||||||
int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
|
int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
|
||||||
{
|
{
|
||||||
ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
|
ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
|
||||||
@@ -363,3 +423,4 @@ BLOCK_FINISHED:
|
|||||||
return eobtotal;
|
return eobtotal;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif /*!CONFIG_ASM_DETOK*/
|
||||||
|
@@ -14,6 +14,10 @@
|
|||||||
|
|
||||||
#include "onyxd_int.h"
|
#include "onyxd_int.h"
|
||||||
|
|
||||||
|
#if ARCH_ARM
|
||||||
|
#include "arm/detokenize_arm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
void vp8_reset_mb_tokens_context(MACROBLOCKD *x);
|
void vp8_reset_mb_tokens_context(MACROBLOCKD *x);
|
||||||
int vp8_decode_mb_tokens(VP8D_COMP *, MACROBLOCKD *);
|
int vp8_decode_mb_tokens(VP8D_COMP *, MACROBLOCKD *);
|
||||||
|
|
||||||
|
40
vp8/decoder/ec_types.h
Normal file
40
vp8/decoder/ec_types.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VP8_DEC_EC_TYPES_H
|
||||||
|
#define VP8_DEC_EC_TYPES_H
|
||||||
|
|
||||||
|
#define MAX_OVERLAPS 16
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int overlap;
|
||||||
|
B_MODE_INFO *bmi;
|
||||||
|
MV_REFERENCE_FRAME ref_frame;
|
||||||
|
} OVERLAP_NODE;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* TODO(holmer): This array should be exchanged for a linked list */
|
||||||
|
OVERLAP_NODE overlaps[MAX_OVERLAPS];
|
||||||
|
} B_OVERLAP;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
B_OVERLAP overlaps[16];
|
||||||
|
} MB_OVERLAP;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
MV mv;
|
||||||
|
MV_REFERENCE_FRAME ref_frame;
|
||||||
|
} EC_BLOCK;
|
||||||
|
|
||||||
|
#endif /* VP8_DEC_EC_TYPES_H */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user