Merge "Decoder: MVC decoding support added"
This commit is contained in:
commit
d249d3642d
33 changed files with 12666 additions and 82 deletions
200
.clang-format
Normal file
200
.clang-format
Normal file
|
|
@ -0,0 +1,200 @@
|
||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: Google
|
||||||
|
AccessModifierOffset: -1
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveMacros: None
|
||||||
|
AlignConsecutiveAssignments: None
|
||||||
|
AlignConsecutiveBitFields: None
|
||||||
|
AlignConsecutiveDeclarations: None
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortEnumsOnASingleLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: WithoutElse
|
||||||
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: true
|
||||||
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
|
AttributeMacros:
|
||||||
|
- __capability
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: Always
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterObjCDeclaration: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
BeforeWhile: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeConceptDeclarations: true
|
||||||
|
BreakBeforeBraces: Allman
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 100
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DeriveLineEnding: true
|
||||||
|
DerivePointerAlignment: true
|
||||||
|
DisableFormat: false
|
||||||
|
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
StatementAttributeLikeMacros:
|
||||||
|
- Q_EMIT
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<ext/.*\.h>'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: '^<.*\.h>'
|
||||||
|
Priority: 1
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: '^<.*'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 3
|
||||||
|
SortPriority: 0
|
||||||
|
CaseSensitive: false
|
||||||
|
IncludeIsMainRegex: '([-_](test|unittest))?$'
|
||||||
|
IncludeIsMainSourceRegex: ''
|
||||||
|
IndentCaseLabels: true
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentGotoLabels: true
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentExternBlock: AfterExternBlock
|
||||||
|
IndentRequires: false
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
InsertTrailingCommas: None
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBinPackProtocolList: Never
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCBreakBeforeNestedBlockParam: true
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 1
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 200
|
||||||
|
PenaltyIndentedWhitespace: 0
|
||||||
|
PointerAlignment: Right
|
||||||
|
RawStringFormats:
|
||||||
|
- Language: Cpp
|
||||||
|
Delimiters:
|
||||||
|
- cc
|
||||||
|
- CC
|
||||||
|
- cpp
|
||||||
|
- Cpp
|
||||||
|
- CPP
|
||||||
|
- 'c++'
|
||||||
|
- 'C++'
|
||||||
|
CanonicalDelimiter: ''
|
||||||
|
BasedOnStyle: google
|
||||||
|
- Language: TextProto
|
||||||
|
Delimiters:
|
||||||
|
- pb
|
||||||
|
- PB
|
||||||
|
- proto
|
||||||
|
- PROTO
|
||||||
|
EnclosingFunctions:
|
||||||
|
- EqualsProto
|
||||||
|
- EquivToProto
|
||||||
|
- PARSE_PARTIAL_TEXT_PROTO
|
||||||
|
- PARSE_TEST_PROTO
|
||||||
|
- PARSE_TEXT_PROTO
|
||||||
|
- ParseTextOrDie
|
||||||
|
- ParseTextProtoOrDie
|
||||||
|
- ParseTestProto
|
||||||
|
- ParsePartialTestProto
|
||||||
|
CanonicalDelimiter: ''
|
||||||
|
BasedOnStyle: google
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: false
|
||||||
|
SortJavaStaticImport: Before
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCaseColon: false
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: Never
|
||||||
|
SpaceAroundPointerQualifiers: Default
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
BitFieldColonSpacing: Both
|
||||||
|
Standard: Auto
|
||||||
|
StatementMacros:
|
||||||
|
- Q_UNUSED
|
||||||
|
- QT_REQUIRE_VERSION
|
||||||
|
TabWidth: 4
|
||||||
|
UseCRLF: false
|
||||||
|
UseTab: Never
|
||||||
|
WhitespaceSensitiveMacros:
|
||||||
|
- STRINGIZE
|
||||||
|
- PP_STRINGIZE
|
||||||
|
- BOOST_PP_STRINGIZE
|
||||||
|
- NS_SWIFT_NAME
|
||||||
|
- CF_SWIFT_NAME
|
||||||
|
...
|
||||||
|
|
||||||
184
Android.bp
184
Android.bp
|
|
@ -24,6 +24,17 @@ cc_library_headers {
|
||||||
min_sdk_version: "29",
|
min_sdk_version: "29",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc_library_headers {
|
||||||
|
name: "libmvcdec_headers",
|
||||||
|
export_include_dirs: [
|
||||||
|
"decoder",
|
||||||
|
"decoder/mvc",
|
||||||
|
"common",
|
||||||
|
"common/mvc",
|
||||||
|
],
|
||||||
|
min_sdk_version: "29",
|
||||||
|
}
|
||||||
|
|
||||||
cc_library_headers {
|
cc_library_headers {
|
||||||
name: "libavcenc_headers",
|
name: "libavcenc_headers",
|
||||||
export_include_dirs: [
|
export_include_dirs: [
|
||||||
|
|
@ -33,15 +44,8 @@ cc_library_headers {
|
||||||
min_sdk_version: "29",
|
min_sdk_version: "29",
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_defaults {
|
||||||
name: "libavcdec",
|
name: "libavc_mvc_dec_defaults",
|
||||||
vendor_available: true,
|
|
||||||
host_supported: true,
|
|
||||||
shared_libs: [
|
|
||||||
"liblog",
|
|
||||||
"libcutils",
|
|
||||||
],
|
|
||||||
|
|
||||||
cflags: [
|
cflags: [
|
||||||
"-fPIC",
|
"-fPIC",
|
||||||
"-O3",
|
"-O3",
|
||||||
|
|
@ -52,6 +56,87 @@ cc_library_static {
|
||||||
// #KEEP_THREAD_ACTIVE is experimental
|
// #KEEP_THREAD_ACTIVE is experimental
|
||||||
"-UKEEP_THREADS_ACTIVE",
|
"-UKEEP_THREADS_ACTIVE",
|
||||||
],
|
],
|
||||||
|
vendor_available: true,
|
||||||
|
host_supported: true,
|
||||||
|
shared_libs: [
|
||||||
|
"liblog",
|
||||||
|
"libcutils",
|
||||||
|
],
|
||||||
|
|
||||||
|
arch: {
|
||||||
|
arm: {
|
||||||
|
local_include_dirs: [
|
||||||
|
"decoder/arm",
|
||||||
|
"common/arm",
|
||||||
|
],
|
||||||
|
cflags: [
|
||||||
|
"-DARM",
|
||||||
|
// These will be overriden by armv7_a_neon
|
||||||
|
"-DDISABLE_NEON",
|
||||||
|
"-DDEFAULT_ARCH=D_ARCH_ARM_NONEON",
|
||||||
|
],
|
||||||
|
|
||||||
|
neon: {
|
||||||
|
cflags: [
|
||||||
|
"-UDISABLE_NEON",
|
||||||
|
"-UDEFAULT_ARCH",
|
||||||
|
"-DDEFAULT_ARCH=D_ARCH_ARM_A9Q",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
arm64: {
|
||||||
|
cflags: [
|
||||||
|
"-DARMV8",
|
||||||
|
"-DARM",
|
||||||
|
"-DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC",
|
||||||
|
],
|
||||||
|
local_include_dirs: [
|
||||||
|
"decoder/arm",
|
||||||
|
"common/armv8",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
x86: {
|
||||||
|
cflags: [
|
||||||
|
"-DX86",
|
||||||
|
"-msse4.2",
|
||||||
|
"-DDEFAULT_ARCH=D_ARCH_X86_SSE42",
|
||||||
|
],
|
||||||
|
|
||||||
|
local_include_dirs: [
|
||||||
|
"decoder/x86",
|
||||||
|
"common/x86",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
x86_64: {
|
||||||
|
cflags: [
|
||||||
|
"-DX86",
|
||||||
|
"-msse4.2",
|
||||||
|
"-DDEFAULT_ARCH=D_ARCH_X86_SSE42",
|
||||||
|
],
|
||||||
|
|
||||||
|
local_include_dirs: [
|
||||||
|
"decoder/x86",
|
||||||
|
"common/x86",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
sanitize: {
|
||||||
|
integer_overflow: true,
|
||||||
|
misc_undefined: ["bounds"],
|
||||||
|
cfi: true,
|
||||||
|
config: {
|
||||||
|
cfi_assembly_support: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_library_static {
|
||||||
|
name: "libavcdec",
|
||||||
|
defaults: ["libavc_mvc_dec_defaults"],
|
||||||
|
|
||||||
export_include_dirs: [
|
export_include_dirs: [
|
||||||
"common",
|
"common",
|
||||||
|
|
@ -106,24 +191,11 @@ cc_library_static {
|
||||||
|
|
||||||
arch: {
|
arch: {
|
||||||
arm: {
|
arm: {
|
||||||
local_include_dirs: [
|
|
||||||
"decoder/arm",
|
|
||||||
"common/arm",
|
|
||||||
],
|
|
||||||
|
|
||||||
srcs: [
|
srcs: [
|
||||||
"decoder/arm/ih264d_function_selector.c",
|
"decoder/arm/ih264d_function_selector.c",
|
||||||
"common/arm/ih264_arm_memory_barrier.s",
|
"common/arm/ih264_arm_memory_barrier.s",
|
||||||
],
|
],
|
||||||
|
|
||||||
cflags: [
|
|
||||||
"-DARM",
|
|
||||||
|
|
||||||
// These will be overriden by armv7_a_neon
|
|
||||||
"-DDISABLE_NEON",
|
|
||||||
"-DDEFAULT_ARCH=D_ARCH_ARM_NONEON",
|
|
||||||
],
|
|
||||||
|
|
||||||
neon: {
|
neon: {
|
||||||
srcs: [
|
srcs: [
|
||||||
"decoder/arm/ih264d_function_selector_a9q.c",
|
"decoder/arm/ih264d_function_selector_a9q.c",
|
||||||
|
|
@ -151,25 +223,10 @@ cc_library_static {
|
||||||
"common/arm/ih264_iquant_itrans_recon_dc_a9.s",
|
"common/arm/ih264_iquant_itrans_recon_dc_a9.s",
|
||||||
"common/arm/ih264_ihadamard_scaling_a9.s",
|
"common/arm/ih264_ihadamard_scaling_a9.s",
|
||||||
],
|
],
|
||||||
cflags: [
|
|
||||||
"-UDISABLE_NEON",
|
|
||||||
"-UDEFAULT_ARCH",
|
|
||||||
"-DDEFAULT_ARCH=D_ARCH_ARM_A9Q",
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
arm64: {
|
arm64: {
|
||||||
cflags: [
|
|
||||||
"-DARMV8",
|
|
||||||
"-DARM",
|
|
||||||
"-DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC",
|
|
||||||
],
|
|
||||||
local_include_dirs: [
|
|
||||||
"decoder/arm",
|
|
||||||
"common/armv8",
|
|
||||||
],
|
|
||||||
|
|
||||||
srcs: [
|
srcs: [
|
||||||
"decoder/arm/ih264d_function_selector.c",
|
"decoder/arm/ih264d_function_selector.c",
|
||||||
"decoder/arm/ih264d_function_selector_av8.c",
|
"decoder/arm/ih264d_function_selector_av8.c",
|
||||||
|
|
@ -200,17 +257,6 @@ cc_library_static {
|
||||||
},
|
},
|
||||||
|
|
||||||
x86: {
|
x86: {
|
||||||
cflags: [
|
|
||||||
"-DX86",
|
|
||||||
"-msse4.2",
|
|
||||||
"-DDEFAULT_ARCH=D_ARCH_X86_SSE42",
|
|
||||||
],
|
|
||||||
|
|
||||||
local_include_dirs: [
|
|
||||||
"decoder/x86",
|
|
||||||
"common/x86",
|
|
||||||
],
|
|
||||||
|
|
||||||
srcs: [
|
srcs: [
|
||||||
"decoder/x86/ih264d_function_selector.c",
|
"decoder/x86/ih264d_function_selector.c",
|
||||||
"decoder/x86/ih264d_function_selector_sse42.c",
|
"decoder/x86/ih264d_function_selector_sse42.c",
|
||||||
|
|
@ -231,17 +277,6 @@ cc_library_static {
|
||||||
},
|
},
|
||||||
|
|
||||||
x86_64: {
|
x86_64: {
|
||||||
cflags: [
|
|
||||||
"-DX86",
|
|
||||||
"-msse4.2",
|
|
||||||
"-DDEFAULT_ARCH=D_ARCH_X86_SSE42",
|
|
||||||
],
|
|
||||||
|
|
||||||
local_include_dirs: [
|
|
||||||
"decoder/x86",
|
|
||||||
"common/x86",
|
|
||||||
],
|
|
||||||
|
|
||||||
srcs: [
|
srcs: [
|
||||||
"decoder/x86/ih264d_function_selector.c",
|
"decoder/x86/ih264d_function_selector.c",
|
||||||
"decoder/x86/ih264d_function_selector_sse42.c",
|
"decoder/x86/ih264d_function_selector_sse42.c",
|
||||||
|
|
@ -263,12 +298,6 @@ cc_library_static {
|
||||||
},
|
},
|
||||||
|
|
||||||
sanitize: {
|
sanitize: {
|
||||||
integer_overflow: true,
|
|
||||||
misc_undefined: ["bounds"],
|
|
||||||
cfi: true,
|
|
||||||
config: {
|
|
||||||
cfi_assembly_support: true,
|
|
||||||
},
|
|
||||||
blocklist: "libavc_blocklist.txt",
|
blocklist: "libavc_blocklist.txt",
|
||||||
},
|
},
|
||||||
apex_available: [
|
apex_available: [
|
||||||
|
|
@ -278,6 +307,31 @@ cc_library_static {
|
||||||
min_sdk_version: "29",
|
min_sdk_version: "29",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc_library_static {
|
||||||
|
name: "libmvcdec",
|
||||||
|
defaults: ["libavc_mvc_dec_defaults"],
|
||||||
|
whole_static_libs: [
|
||||||
|
"libavcdec",
|
||||||
|
],
|
||||||
|
|
||||||
|
export_include_dirs: [
|
||||||
|
"decoder",
|
||||||
|
"decoder/mvc",
|
||||||
|
"common",
|
||||||
|
"common/mvc",
|
||||||
|
],
|
||||||
|
|
||||||
|
srcs: [
|
||||||
|
"decoder/mvc/imvcd_api.c",
|
||||||
|
"decoder/mvc/imvcd_api_utils.c",
|
||||||
|
"decoder/mvc/imvcd_dpb_manager.c",
|
||||||
|
"decoder/mvc/imvcd_error_handler.c",
|
||||||
|
"decoder/mvc/imvcd_nalu_parser.c",
|
||||||
|
"decoder/mvc/imvcd_slice_functions.c",
|
||||||
|
"decoder/mvc/imvcd_utils.c",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
name: "libavcenc",
|
name: "libavcenc",
|
||||||
vendor_available: true,
|
vendor_available: true,
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,13 @@ libavc_set_link_libraries()
|
||||||
|
|
||||||
include("${AVC_ROOT}/common/common.cmake")
|
include("${AVC_ROOT}/common/common.cmake")
|
||||||
include("${AVC_ROOT}/decoder/libavcdec.cmake")
|
include("${AVC_ROOT}/decoder/libavcdec.cmake")
|
||||||
|
include("${AVC_ROOT}/decoder/mvc/libmvcdec.cmake")
|
||||||
include("${AVC_ROOT}/encoder/libavcenc.cmake")
|
include("${AVC_ROOT}/encoder/libavcenc.cmake")
|
||||||
|
|
||||||
include("${AVC_ROOT}/test/decoder/avcdec.cmake")
|
include("${AVC_ROOT}/test/decoder/avcdec.cmake")
|
||||||
|
include("${AVC_ROOT}/test/mvcdec/mvcdec.cmake")
|
||||||
include("${AVC_ROOT}/test/encoder/avcenc.cmake")
|
include("${AVC_ROOT}/test/encoder/avcenc.cmake")
|
||||||
|
|
||||||
include("${AVC_ROOT}/fuzzer/avc_dec_fuzzer.cmake")
|
include("${AVC_ROOT}/fuzzer/avc_dec_fuzzer.cmake")
|
||||||
|
include("${AVC_ROOT}/fuzzer/mvc_dec_fuzzer.cmake")
|
||||||
include("${AVC_ROOT}/fuzzer/avc_enc_fuzzer.cmake")
|
include("${AVC_ROOT}/fuzzer/avc_enc_fuzzer.cmake")
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ list(
|
||||||
"${AVC_ROOT}/common/ithread.c")
|
"${AVC_ROOT}/common/ithread.c")
|
||||||
|
|
||||||
include_directories(${AVC_ROOT}/common)
|
include_directories(${AVC_ROOT}/common)
|
||||||
|
include_directories(${AVC_ROOT}/common/mvc)
|
||||||
|
|
||||||
# arm/x86 sources
|
# arm/x86 sources
|
||||||
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
|
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@
|
||||||
#ifndef _IH264_DEBUG_H_
|
#ifndef _IH264_DEBUG_H_
|
||||||
#define _IH264_DEBUG_H_
|
#define _IH264_DEBUG_H_
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#if DEBUG_PRINT
|
#if DEBUG_PRINT
|
||||||
|
|
||||||
|
|
|
||||||
114
common/mvc/imvc_defs.h
Normal file
114
common/mvc/imvc_defs.h
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IMVC_DEFS_H_
|
||||||
|
#define _IMVC_DEFS_H_
|
||||||
|
|
||||||
|
#define MAX_NUM_VIEWS 6
|
||||||
|
|
||||||
|
#define LOG2_MAX_NUM_VIEWS 3
|
||||||
|
|
||||||
|
#define MAX_NUM_IVP_REFS MAX_NUM_VIEWS
|
||||||
|
|
||||||
|
#define MAX_NUM_LEVEL_VALUES_SIGNALLED 1
|
||||||
|
|
||||||
|
#define MAX_NUM_OPERATING_POINTS 1
|
||||||
|
|
||||||
|
#define MULTIVIEW_HIGH_PROFILE_IDC 118
|
||||||
|
|
||||||
|
#define NUM_OF_ZERO_BYTES_BEFORE_START_CODE 2
|
||||||
|
|
||||||
|
#define EMULATION_PREVENTION_BYTE 0x03
|
||||||
|
|
||||||
|
#define MIN_H264_QP 0
|
||||||
|
|
||||||
|
#define MAX_H264_QP 51
|
||||||
|
|
||||||
|
#define NUM_SP_COMPONENTS 2
|
||||||
|
|
||||||
|
#define NUM_COMPONENTS 3
|
||||||
|
|
||||||
|
#define FORCEINLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
|
typedef void *FT_ALIGNED_ALLOC(void *pv_mem_ctxt, WORD32 i4_alignment, WORD32 i4_size);
|
||||||
|
|
||||||
|
typedef void FT_ALIGNED_FREE(void *pv_mem_ctxt, void *pv_buf);
|
||||||
|
|
||||||
|
typedef enum COMPONENT_TYPES_T
|
||||||
|
{
|
||||||
|
Y = 0,
|
||||||
|
UV = 1,
|
||||||
|
U = 1,
|
||||||
|
V = 2,
|
||||||
|
} COMPONENT_TYPES_T;
|
||||||
|
|
||||||
|
typedef enum AVC_EXT_NALU_ID_T
|
||||||
|
{
|
||||||
|
UNSPEC_0 = 0,
|
||||||
|
|
||||||
|
SLICE_NON_IDR = 1,
|
||||||
|
|
||||||
|
SLICE_DPA = 2,
|
||||||
|
|
||||||
|
SLICE_DPB = 3,
|
||||||
|
|
||||||
|
SLICE_DPC = 4,
|
||||||
|
|
||||||
|
SLICE_IDR = 5,
|
||||||
|
|
||||||
|
SEI = 6,
|
||||||
|
|
||||||
|
SPS = 7,
|
||||||
|
|
||||||
|
PPS = 8,
|
||||||
|
|
||||||
|
AUD = 9,
|
||||||
|
|
||||||
|
EOSEQ = 10,
|
||||||
|
|
||||||
|
EOSTR = 11,
|
||||||
|
|
||||||
|
FILLER = 12,
|
||||||
|
|
||||||
|
SPSE = 13,
|
||||||
|
|
||||||
|
PREFIX_NAL = 14,
|
||||||
|
|
||||||
|
SUBSET_SPS = 15,
|
||||||
|
|
||||||
|
AUX_PIC = 19,
|
||||||
|
|
||||||
|
CODED_SLICE_EXTENSION = 20,
|
||||||
|
|
||||||
|
UNSPEC_31 = 24
|
||||||
|
|
||||||
|
} AVC_EXT_NALU_ID_T;
|
||||||
|
|
||||||
|
typedef enum SLICE_TYPES_T
|
||||||
|
{
|
||||||
|
PSLICE = 0,
|
||||||
|
BSLICE = 1,
|
||||||
|
ISLICE = 2,
|
||||||
|
SPSLICE = 3,
|
||||||
|
SISLICE = 4,
|
||||||
|
MAXSLICE_TYPE,
|
||||||
|
} SLICE_TYPES_T;
|
||||||
|
|
||||||
|
#endif
|
||||||
164
common/mvc/imvc_structs.h
Normal file
164
common/mvc/imvc_structs.h
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IMVC_STRUCTS_H_
|
||||||
|
#define _IMVC_STRUCTS_H_
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvc_defs.h"
|
||||||
|
|
||||||
|
typedef struct nalu_mvc_ext_t
|
||||||
|
{
|
||||||
|
UWORD8 u1_non_idr_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_priority_id;
|
||||||
|
|
||||||
|
UWORD16 u2_view_id;
|
||||||
|
|
||||||
|
UWORD8 u1_temporal_id;
|
||||||
|
|
||||||
|
UWORD8 u1_anchor_pic_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_inter_view_flag;
|
||||||
|
|
||||||
|
} nalu_mvc_ext_t;
|
||||||
|
|
||||||
|
typedef struct mvc_ivp_ref_data_t
|
||||||
|
{
|
||||||
|
UWORD8 u1_num_refs;
|
||||||
|
|
||||||
|
UWORD16 au2_ref_view_ids[MAX_NUM_IVP_REFS];
|
||||||
|
|
||||||
|
} mvc_ivp_ref_data_t;
|
||||||
|
|
||||||
|
typedef struct mvc_op_data_t
|
||||||
|
{
|
||||||
|
UWORD8 u1_temporal_id;
|
||||||
|
|
||||||
|
UWORD16 u2_num_ops;
|
||||||
|
|
||||||
|
UWORD16 u2_num_target_views;
|
||||||
|
|
||||||
|
UWORD16 au2_target_view_ids[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/* Counter for num target views and views each target is dependent on */
|
||||||
|
UWORD16 u2_num_views;
|
||||||
|
|
||||||
|
} mvc_op_data_t;
|
||||||
|
|
||||||
|
typedef struct mvc_level_info_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_level_idc;
|
||||||
|
|
||||||
|
mvc_op_data_t as_mvc_op_data[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
} mvc_level_info_t;
|
||||||
|
|
||||||
|
typedef struct sps_mvc_ext_t
|
||||||
|
{
|
||||||
|
UWORD16 u2_num_views;
|
||||||
|
|
||||||
|
UWORD16 au2_view_ids[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/* 0 => L0; 1 => L1 */
|
||||||
|
mvc_ivp_ref_data_t as_anchor_ref_data[2][MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/* 0 => L0; 1 => L1 */
|
||||||
|
mvc_ivp_ref_data_t as_non_anchor_ref_data[2][MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
UWORD8 u1_num_level_values_signalled;
|
||||||
|
|
||||||
|
mvc_level_info_t as_mvc_level_info[MAX_NUM_LEVEL_VALUES_SIGNALLED];
|
||||||
|
|
||||||
|
} sps_mvc_ext_t;
|
||||||
|
|
||||||
|
typedef struct mvc_vui_ext_t
|
||||||
|
{
|
||||||
|
UWORD16 u2_vui_mvc_num_ops;
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_temporal_id[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD16 u2_vui_mvc_num_target_output_views[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD16 u2_vui_mvc_view_id[MAX_NUM_OPERATING_POINTS][MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_timing_info_present_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD32 u4_vui_mvc_num_units_in_tick[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD32 u4_vui_mvc_time_scale[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_fixed_frame_rate_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_nal_hrd_parameters_present_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_vcl_hrd_parameters_present_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_low_delay_hrd_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
UWORD8 u1_vui_mvc_pic_struct_present_flag[MAX_NUM_OPERATING_POINTS];
|
||||||
|
|
||||||
|
} mvc_vui_ext_t;
|
||||||
|
|
||||||
|
typedef struct buffer_container_t
|
||||||
|
{
|
||||||
|
void *pv_data;
|
||||||
|
|
||||||
|
WORD32 i4_data_stride;
|
||||||
|
|
||||||
|
} buffer_container_t;
|
||||||
|
|
||||||
|
typedef struct yuv_buf_props_t
|
||||||
|
{
|
||||||
|
buffer_container_t as_component_bufs[NUM_COMPONENTS];
|
||||||
|
|
||||||
|
UWORD8 u1_bit_depth;
|
||||||
|
|
||||||
|
UWORD16 u2_width;
|
||||||
|
|
||||||
|
UWORD16 u2_height;
|
||||||
|
|
||||||
|
} yuv_buf_props_t;
|
||||||
|
|
||||||
|
typedef struct iv_mvc_yuv_buf_t
|
||||||
|
{
|
||||||
|
yuv_buf_props_t as_view_buf_props[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
} iv_mvc_yuv_buf_t;
|
||||||
|
|
||||||
|
typedef struct coordinates_t
|
||||||
|
{
|
||||||
|
WORD32 i4_abscissa;
|
||||||
|
|
||||||
|
WORD32 i4_ordinate;
|
||||||
|
} coordinates_t;
|
||||||
|
|
||||||
|
typedef struct offsets_t
|
||||||
|
{
|
||||||
|
UWORD16 u2_top_offset;
|
||||||
|
|
||||||
|
UWORD16 u2_bottom_offset;
|
||||||
|
|
||||||
|
UWORD16 u2_left_offset;
|
||||||
|
|
||||||
|
UWORD16 u2_right_offset;
|
||||||
|
} offsets_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
72
decoder/ih264d_api_utils.h
Normal file
72
decoder/ih264d_api_utils.h
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : ih264d_api_utils.h */
|
||||||
|
/* */
|
||||||
|
/* Description : This file contains function prototypes for non-API */
|
||||||
|
/* functions defined in ih264d_api.c */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IH264D_API_UTILS_H_
|
||||||
|
#define _IH264D_API_UTILS_H_
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "iv.h"
|
||||||
|
|
||||||
|
#define MIN_IN_BUFS 1
|
||||||
|
#define MIN_OUT_BUFS_420 3
|
||||||
|
#define MIN_OUT_BUFS_422ILE 1
|
||||||
|
#define MIN_OUT_BUFS_RGB565 1
|
||||||
|
#define MIN_OUT_BUFS_420SP 2
|
||||||
|
|
||||||
|
extern WORD32 ih264d_create(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_delete(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_set_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_set_processor(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_set_degrade(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_set_flush_mode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op);
|
||||||
|
|
||||||
|
extern UWORD32 ih264d_get_outbuf_size(WORD32 u4_pic_wd, UWORD32 u4_pic_ht, UWORD8 u1_chroma_format,
|
||||||
|
UWORD32 *pu4_buf_size);
|
||||||
|
|
||||||
|
extern void ih264d_export_sei_params(ivd_sei_decode_op_t *ps_sei_decode_op, dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern UWORD32 ih264d_map_error(UWORD32 i4_err_status);
|
||||||
|
|
||||||
|
extern void ih264d_signal_decode_thread(dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern void ih264d_signal_bs_deblk_thread(dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern WORD32 ih264d_deblock_display(dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
#endif
|
||||||
279
decoder/mvc/imvcd.h
Normal file
279
decoder/mvc/imvcd.h
Normal file
|
|
@ -0,0 +1,279 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*******************************************************************************
|
||||||
|
* @file
|
||||||
|
* imvcd.h
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* This file contains all the necessary structure and enumeration
|
||||||
|
* definitions needed for the Application Program Interface(API) of the
|
||||||
|
* Ittiam MVC Decoder
|
||||||
|
*
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_H_
|
||||||
|
#define _IMVCD_H_
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "iv.h"
|
||||||
|
#include "ivd.h"
|
||||||
|
|
||||||
|
/* Extern functions */
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_api_function(iv_obj_t *ps_dec_hdl, void *pv_ip, void *pv_op);
|
||||||
|
|
||||||
|
/* Typedefs */
|
||||||
|
typedef enum IMVCD_CTL_SUB_CMDS
|
||||||
|
{
|
||||||
|
IMVCD_CTL_SET_NUM_CORES = IVD_CMD_CTL_CODEC_SUBCMD_START,
|
||||||
|
IMVCD_CTL_SET_PROCESSOR = IVD_CMD_CTL_CODEC_SUBCMD_START + 1,
|
||||||
|
IMVCD_CTL_GET_VUI_PARAMS = IVD_CMD_CTL_CODEC_SUBCMD_START + 2,
|
||||||
|
IMVCD_CTL_DEGRADE = IVD_CMD_CTL_CODEC_SUBCMD_START + 3,
|
||||||
|
|
||||||
|
} IMVCD_CTL_SUB_CMDS;
|
||||||
|
|
||||||
|
typedef struct imvcd_create_ip_t
|
||||||
|
{
|
||||||
|
ivd_create_ip_t s_ivd_ip;
|
||||||
|
|
||||||
|
} imvcd_create_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_create_op_t
|
||||||
|
{
|
||||||
|
ivd_create_op_t s_ivd_op;
|
||||||
|
|
||||||
|
} imvcd_create_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_delete_ip_t
|
||||||
|
{
|
||||||
|
ivd_delete_ip_t s_ivd_ip;
|
||||||
|
|
||||||
|
} imvcd_delete_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_delete_op_t
|
||||||
|
{
|
||||||
|
ivd_delete_op_t s_ivd_op;
|
||||||
|
|
||||||
|
} imvcd_delete_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_video_decode_ip_t
|
||||||
|
{
|
||||||
|
ivd_video_decode_ip_t s_ivd_ip;
|
||||||
|
|
||||||
|
} imvcd_video_decode_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_video_decode_op_t
|
||||||
|
{
|
||||||
|
ivd_video_decode_op_t s_ivd_op;
|
||||||
|
|
||||||
|
iv_yuv_buf_t *ps_view_disp_bufs;
|
||||||
|
|
||||||
|
} imvcd_video_decode_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_config_ip_t
|
||||||
|
{
|
||||||
|
ivd_ctl_set_config_ip_t s_ivd_ip;
|
||||||
|
} imvcd_set_config_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_config_op_t
|
||||||
|
{
|
||||||
|
ivd_ctl_set_config_op_t s_ivd_op;
|
||||||
|
} imvcd_set_config_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_num_cores_ip_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
IVD_API_COMMAND_TYPE_T e_cmd;
|
||||||
|
|
||||||
|
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
|
||||||
|
|
||||||
|
UWORD32 u4_num_cores;
|
||||||
|
} imvcd_set_num_cores_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_num_cores_op_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
UWORD32 u4_error_code;
|
||||||
|
} imvcd_set_num_cores_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_arch_ip_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
IVD_API_COMMAND_TYPE_T e_cmd;
|
||||||
|
|
||||||
|
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
|
||||||
|
|
||||||
|
IVD_ARCH_T e_arch;
|
||||||
|
|
||||||
|
IVD_SOC_T e_soc;
|
||||||
|
|
||||||
|
} imvcd_set_arch_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_arch_op_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
UWORD32 u4_error_code;
|
||||||
|
} imvcd_set_arch_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_degrade_mode_ip_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
IVD_API_COMMAND_TYPE_T e_cmd;
|
||||||
|
|
||||||
|
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pictures that are are degraded
|
||||||
|
* 0 : No degrade
|
||||||
|
* 1 : Only on non-reference frames
|
||||||
|
* 2 : Use interval specified by u4_nondegrade_interval
|
||||||
|
* 3 : All non-key frames
|
||||||
|
* 4 : All frames
|
||||||
|
*/
|
||||||
|
WORD32 i4_degrade_pics;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interval for pictures which are completely decoded without any degradation
|
||||||
|
*/
|
||||||
|
WORD32 i4_nondegrade_interval;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bit position (lsb is zero): Type of degradation
|
||||||
|
* 1 : Disable deblocking
|
||||||
|
* 2 : Faster inter prediction filters
|
||||||
|
* 3 : Fastest inter prediction filters
|
||||||
|
*/
|
||||||
|
WORD32 i4_degrade_type;
|
||||||
|
|
||||||
|
} imvcd_set_degrade_mode_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_set_degrade_mode_op_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
UWORD32 u4_error_code;
|
||||||
|
} imvcd_set_degrade_mode_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_flush_dec_ip_t
|
||||||
|
{
|
||||||
|
ivd_ctl_flush_ip_t s_ivd_ip;
|
||||||
|
} imvcd_flush_dec_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_flush_dec_op_t
|
||||||
|
{
|
||||||
|
ivd_ctl_flush_op_t s_ivd_op;
|
||||||
|
} imvcd_flush_dec_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_get_buf_info_ip_t
|
||||||
|
{
|
||||||
|
ivd_ctl_getbufinfo_ip_t s_ivd_ip;
|
||||||
|
} imvcd_get_buf_info_ip_t;
|
||||||
|
|
||||||
|
typedef struct ivd_mvc_buf_info_t
|
||||||
|
{
|
||||||
|
UWORD16 u2_num_views;
|
||||||
|
} ivd_mvc_buf_info_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_get_buf_info_op_t
|
||||||
|
{
|
||||||
|
ivd_ctl_getbufinfo_op_t s_ivd_op;
|
||||||
|
|
||||||
|
ivd_mvc_buf_info_t s_mvc_buf_info;
|
||||||
|
|
||||||
|
} imvcd_get_buf_info_op_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_get_vui_ip_t
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
IVD_API_COMMAND_TYPE_T e_cmd;
|
||||||
|
|
||||||
|
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
|
||||||
|
|
||||||
|
} imvcd_get_vui_ip_t;
|
||||||
|
|
||||||
|
typedef struct imvcd_get_vui_op_t
|
||||||
|
{
|
||||||
|
bool b_is_vui_available;
|
||||||
|
|
||||||
|
UWORD32 u4_error_code;
|
||||||
|
|
||||||
|
UWORD8 u1_aspect_ratio_idc;
|
||||||
|
|
||||||
|
UWORD16 u2_sar_width;
|
||||||
|
|
||||||
|
UWORD16 u2_sar_height;
|
||||||
|
|
||||||
|
UWORD8 u1_overscan_appropriate_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_video_format;
|
||||||
|
|
||||||
|
UWORD8 u1_video_full_range_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_colour_primaries;
|
||||||
|
|
||||||
|
UWORD8 u1_tfr_chars;
|
||||||
|
|
||||||
|
UWORD8 u1_matrix_coeffs;
|
||||||
|
|
||||||
|
UWORD8 u1_cr_top_field;
|
||||||
|
|
||||||
|
UWORD8 u1_cr_bottom_field;
|
||||||
|
|
||||||
|
UWORD32 u4_num_units_in_tick;
|
||||||
|
|
||||||
|
UWORD32 u4_time_scale;
|
||||||
|
|
||||||
|
UWORD8 u1_fixed_frame_rate_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_nal_hrd_params_present;
|
||||||
|
|
||||||
|
UWORD8 u1_vcl_hrd_params_present;
|
||||||
|
|
||||||
|
UWORD8 u1_low_delay_hrd_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_pic_struct_present_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_bitstream_restriction_flag;
|
||||||
|
|
||||||
|
UWORD8 u1_mv_over_pic_boundaries_flag;
|
||||||
|
|
||||||
|
UWORD32 u4_max_bytes_per_pic_denom;
|
||||||
|
|
||||||
|
UWORD32 u4_max_bits_per_mb_denom;
|
||||||
|
|
||||||
|
UWORD32 u4_log2_max_mv_length_horz;
|
||||||
|
|
||||||
|
UWORD32 u4_log2_max_mv_length_vert;
|
||||||
|
|
||||||
|
UWORD32 u4_num_reorder_frames;
|
||||||
|
|
||||||
|
UWORD32 u4_max_dec_frame_buffering;
|
||||||
|
|
||||||
|
} imvcd_get_vui_op_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
1588
decoder/mvc/imvcd_api.c
Normal file
1588
decoder/mvc/imvcd_api.c
Normal file
File diff suppressed because it is too large
Load diff
392
decoder/mvc/imvcd_api_utils.c
Normal file
392
decoder/mvc/imvcd_api_utils.c
Normal file
|
|
@ -0,0 +1,392 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_api_utils.c */
|
||||||
|
/* */
|
||||||
|
/* Description : Utility functions used by 'imvcd_api.c' */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "iv.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
#include "ih264_disp_mgr.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "ih264d_tables.h"
|
||||||
|
#include "ih264d_utils.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
#include "imvcd_utils.h"
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_check_dec_handle(iv_obj_t *ps_handle)
|
||||||
|
{
|
||||||
|
if(ps_handle == NULL)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_handle->pv_codec_handle == NULL)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_check_create_structs(imvcd_create_ip_t *ps_ip, imvcd_create_op_t *ps_op)
|
||||||
|
{
|
||||||
|
if(NULL == ps_ip)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == ps_op)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_ip->s_ivd_ip.e_output_format != IV_YUV_420P)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == ps_ip->s_ivd_ip.pf_aligned_alloc)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == ps_ip->s_ivd_ip.pf_aligned_free)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0 != ps_ip->s_ivd_ip.u4_share_disp_buf)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_check_ctl_structs(void *pv_ip, void *pv_op)
|
||||||
|
{
|
||||||
|
ivd_ctl_set_config_ip_t *ps_ip = (ivd_ctl_set_config_ip_t *) pv_ip;
|
||||||
|
ivd_ctl_set_config_op_t *ps_op = (ivd_ctl_set_config_op_t *) pv_op;
|
||||||
|
|
||||||
|
WORD32 i4_sub_cmd = ps_ip->e_sub_cmd;
|
||||||
|
|
||||||
|
if(NULL == ps_ip)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == ps_op)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(i4_sub_cmd)
|
||||||
|
{
|
||||||
|
case IVD_CMD_CTL_SETPARAMS:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(ivd_ctl_set_config_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(ivd_ctl_set_config_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IMVCD_CTL_SET_NUM_CORES:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(imvcd_set_num_cores_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(imvcd_set_num_cores_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IMVCD_CTL_SET_PROCESSOR:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(imvcd_set_arch_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(imvcd_set_arch_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IMVCD_CTL_DEGRADE:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(imvcd_set_degrade_mode_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(imvcd_set_degrade_mode_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IVD_CMD_CTL_FLUSH:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(ivd_ctl_flush_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(ivd_ctl_flush_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IVD_CMD_CTL_GETBUFINFO:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(ivd_ctl_getbufinfo_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(ivd_ctl_getbufinfo_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case IMVCD_CTL_GET_VUI_PARAMS:
|
||||||
|
{
|
||||||
|
if((ps_ip->u4_size != sizeof(imvcd_get_vui_ip_t)) ||
|
||||||
|
(ps_op->u4_size != sizeof(imvcd_get_vui_op_t)))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_check_decode_structs(iv_obj_t *ps_dec_hdl,
|
||||||
|
imvcd_video_decode_ip_t *ps_ip,
|
||||||
|
imvcd_video_decode_op_t *ps_op)
|
||||||
|
{
|
||||||
|
WORD32 i, j;
|
||||||
|
|
||||||
|
mvc_dec_ctxt_t *ps_mvcd_ctxt = (mvc_dec_ctxt_t *) ps_dec_hdl->pv_codec_handle;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views = 1;
|
||||||
|
|
||||||
|
if(NULL == ps_ip)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == ps_op)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_mvcd_ctxt->b_flush_enabled && !ps_mvcd_ctxt->b_header_only_decode)
|
||||||
|
{
|
||||||
|
if(NULL == ps_ip->s_ivd_ip.pv_stream_buffer)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < u2_num_views; i++)
|
||||||
|
{
|
||||||
|
for(j = 0; j < NUM_COMPONENTS; j++)
|
||||||
|
{
|
||||||
|
if(NULL == ps_ip->s_ivd_ip.s_out_buffer.pu1_bufs[i * NUM_COMPONENTS + j])
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0 == ps_ip->s_ivd_ip.u4_num_Bytes)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imvcd_convert_app_out_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt,
|
||||||
|
ivd_out_bufdesc_t *ps_app_buffer)
|
||||||
|
{
|
||||||
|
if(!ps_mvcd_ctxt->b_header_only_decode)
|
||||||
|
{
|
||||||
|
WORD32 i, j;
|
||||||
|
|
||||||
|
subset_sps_t *ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views =
|
||||||
|
(NULL == ps_subset_sps) ? 1 : ps_subset_sps->s_sps_mvc_ext.u2_num_views;
|
||||||
|
|
||||||
|
for(i = 0; i < u2_num_views; i++)
|
||||||
|
{
|
||||||
|
yuv_buf_props_t *ps_view_buf = &ps_mvcd_ctxt->s_out_buffer.as_view_buf_props[i];
|
||||||
|
|
||||||
|
ps_view_buf->u1_bit_depth = 8;
|
||||||
|
ps_view_buf->u2_height = ps_view_ctxt->u2_disp_height;
|
||||||
|
ps_view_buf->u2_width = ps_view_ctxt->u2_disp_width;
|
||||||
|
|
||||||
|
for(j = 0; j < NUM_COMPONENTS; j++)
|
||||||
|
{
|
||||||
|
buffer_container_t *ps_component_buf = &ps_view_buf->as_component_bufs[j];
|
||||||
|
bool b_is_chroma = (((COMPONENT_TYPES_T) j) != Y);
|
||||||
|
|
||||||
|
ps_component_buf->pv_data = ps_app_buffer->pu1_bufs[i * NUM_COMPONENTS + j];
|
||||||
|
ps_component_buf->i4_data_stride = ps_view_buf->u2_width >> b_is_chroma;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void imvcd_convert_to_app_disp_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt, iv_yuv_buf_t *ps_view_disp_bufs)
|
||||||
|
{
|
||||||
|
WORD32 i;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views = ps_mvcd_ctxt->u2_num_views;
|
||||||
|
|
||||||
|
for(i = 0; i < u2_num_views; i++)
|
||||||
|
{
|
||||||
|
yuv_buf_props_t *ps_view_buf = &ps_mvcd_ctxt->s_out_buffer.as_view_buf_props[i];
|
||||||
|
|
||||||
|
ps_view_disp_bufs[i].u4_size = sizeof(ps_view_disp_bufs[i]);
|
||||||
|
|
||||||
|
ps_view_disp_bufs[i].pv_y_buf = ps_view_buf->as_component_bufs[Y].pv_data;
|
||||||
|
ps_view_disp_bufs[i].u4_y_strd = ps_view_buf->as_component_bufs[Y].i4_data_stride;
|
||||||
|
ps_view_disp_bufs[i].u4_y_wd = ps_view_buf->u2_width;
|
||||||
|
ps_view_disp_bufs[i].u4_y_ht = ps_view_buf->u2_height;
|
||||||
|
|
||||||
|
ps_view_disp_bufs[i].pv_u_buf = ps_view_buf->as_component_bufs[U].pv_data;
|
||||||
|
ps_view_disp_bufs[i].u4_u_strd = ps_view_buf->as_component_bufs[U].i4_data_stride;
|
||||||
|
ps_view_disp_bufs[i].u4_u_wd = ps_view_buf->u2_width / 2;
|
||||||
|
ps_view_disp_bufs[i].u4_u_ht = ps_view_buf->u2_height / 2;
|
||||||
|
|
||||||
|
ps_view_disp_bufs[i].pv_v_buf = ps_view_buf->as_component_bufs[V].pv_data;
|
||||||
|
ps_view_disp_bufs[i].u4_v_strd = ps_view_buf->as_component_bufs[V].i4_data_stride;
|
||||||
|
ps_view_disp_bufs[i].u4_v_wd = ps_view_buf->u2_width / 2;
|
||||||
|
ps_view_disp_bufs[i].u4_v_ht = ps_view_buf->u2_height / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void imvcd_au_init(iv_obj_t *ps_dec_hdl, imvcd_video_decode_ip_t *ps_ip,
|
||||||
|
imvcd_video_decode_op_t *ps_op)
|
||||||
|
{
|
||||||
|
subset_sps_t *ps_subset_sps;
|
||||||
|
|
||||||
|
mvc_dec_ctxt_t *ps_mvcd_ctxt = (mvc_dec_ctxt_t *) ps_dec_hdl->pv_codec_handle;
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
ps_mvcd_ctxt->u2_num_views_decoded = 0;
|
||||||
|
ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
|
||||||
|
ps_mvcd_ctxt->u2_num_views =
|
||||||
|
(NULL == ps_subset_sps) ? 1 : ps_subset_sps->s_sps_mvc_ext.u2_num_views;
|
||||||
|
imvcd_convert_app_out_buf(ps_mvcd_ctxt, &ps_ip->s_ivd_ip.s_out_buffer);
|
||||||
|
|
||||||
|
ps_op->s_ivd_op.u4_num_bytes_consumed = 0;
|
||||||
|
ps_op->s_ivd_op.u4_output_present = 0;
|
||||||
|
ps_op->s_ivd_op.u4_error_code = 0;
|
||||||
|
ps_op->s_ivd_op.e_pic_type = IV_FRAMETYPE_DEFAULT;
|
||||||
|
ps_op->s_ivd_op.u4_frame_decoded_flag = 0;
|
||||||
|
ps_op->s_ivd_op.u4_new_seq = 0;
|
||||||
|
ps_op->s_ivd_op.u4_progressive_frame_flag = 1;
|
||||||
|
ps_op->s_ivd_op.u4_is_ref_flag = 1;
|
||||||
|
ps_op->s_ivd_op.e4_fld_type = IV_NA_FLD;
|
||||||
|
|
||||||
|
ps_view_ctxt->u4_fmt_conv_cur_row = 0;
|
||||||
|
ps_view_ctxt->u4_output_present = 0;
|
||||||
|
ps_view_ctxt->u4_fmt_conv_num_rows = FMT_CONV_NUM_ROWS;
|
||||||
|
ps_view_ctxt->u4_ts = ps_ip->s_ivd_ip.u4_ts;
|
||||||
|
ps_view_ctxt->i4_frametype = IV_NA_FRAME;
|
||||||
|
ps_view_ctxt->i4_content_type = IV_CONTENTTYPE_NA;
|
||||||
|
|
||||||
|
/* Mimicking the hack in lines '2005' in 'ih264d_api.c' and '1323' in
|
||||||
|
* 'ih264d_parse_headers.c */
|
||||||
|
ps_view_ctxt->u4_sps_cnt_in_process = 0;
|
||||||
|
|
||||||
|
memset(ps_mvcd_ctxt->as_nalu_mvc_ext, 0, sizeof(ps_mvcd_ctxt->as_nalu_mvc_ext));
|
||||||
|
}
|
||||||
|
|
||||||
|
void imvcd_view_init(mvc_dec_ctxt_t *ps_mvcd_ctxt)
|
||||||
|
{
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
ps_view_ctxt->u4_num_fld_in_frm = 0;
|
||||||
|
ps_view_ctxt->u4_slice_start_code_found = 0;
|
||||||
|
ps_view_ctxt->u2_cur_mb_addr = 0;
|
||||||
|
ps_view_ctxt->u2_total_mbs_coded = 0;
|
||||||
|
ps_view_ctxt->u2_cur_slice_num = 0;
|
||||||
|
ps_view_ctxt->cur_dec_mb_num = 0;
|
||||||
|
ps_view_ctxt->cur_recon_mb_num = 0;
|
||||||
|
ps_view_ctxt->u4_first_slice_in_pic = 1;
|
||||||
|
ps_view_ctxt->u1_slice_header_done = 0;
|
||||||
|
ps_view_ctxt->u1_dangling_field = 0;
|
||||||
|
ps_view_ctxt->u4_dec_thread_created = 0;
|
||||||
|
ps_view_ctxt->u4_bs_deblk_thread_created = 0;
|
||||||
|
ps_view_ctxt->u4_cur_bs_mb_num = 0;
|
||||||
|
ps_view_ctxt->u4_start_recon_deblk = 0;
|
||||||
|
ps_view_ctxt->u4_pic_buf_got = 0;
|
||||||
|
ps_view_ctxt->pu1_inv_scan = (UWORD8 *) gau1_ih264d_inv_scan;
|
||||||
|
ps_view_ctxt->u1_pic_decode_done = 0;
|
||||||
|
|
||||||
|
ps_view_ctxt->pu1_init_dpb_base = NULL;
|
||||||
|
ps_view_ctxt->ps_dpb_mgr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_bitstream_buf_alloc(dec_struct_t *ps_view_ctxt, UWORD16 u2_num_views)
|
||||||
|
{
|
||||||
|
UWORD32 u4_size;
|
||||||
|
|
||||||
|
u4_size = ((ps_view_ctxt->u2_pic_wd * ps_view_ctxt->u2_pic_ht * 3 / 2) + EXTRA_BS_OFFSET) *
|
||||||
|
u2_num_views * sizeof(ps_view_ctxt->pu1_bits_buf_dynamic[0]);
|
||||||
|
ps_view_ctxt->pu1_bits_buf_dynamic =
|
||||||
|
ps_view_ctxt->pf_aligned_alloc(ps_view_ctxt->pv_mem_ctxt, 128, u4_size);
|
||||||
|
RETURN_IF((NULL == ps_view_ctxt->pu1_bits_buf_dynamic), IV_FAIL);
|
||||||
|
|
||||||
|
memset(ps_view_ctxt->pu1_bits_buf_dynamic, 0, u4_size);
|
||||||
|
ps_view_ctxt->u4_dynamic_bits_buf_size = u4_size;
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void imvcd_bitsteam_buf_free(dec_struct_t *ps_view_ctxt)
|
||||||
|
{
|
||||||
|
PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_bits_buf_dynamic);
|
||||||
|
}
|
||||||
58
decoder/mvc/imvcd_api_utils.h
Normal file
58
decoder/mvc/imvcd_api_utils.h
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_api_utils.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Utility functions used by 'imvcd_api.c' */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_API_UTILS_H_
|
||||||
|
#define _IMVCD_API_UTILS_H_
|
||||||
|
|
||||||
|
#include "iv.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_check_dec_handle(iv_obj_t *ps_handle);
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_check_create_structs(imvcd_create_ip_t *ps_ip,
|
||||||
|
imvcd_create_op_t *ps_op);
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_check_ctl_structs(void *pv_ip, void *pv_op);
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_check_decode_structs(iv_obj_t *ps_dec_hdl,
|
||||||
|
imvcd_video_decode_ip_t *ps_ip,
|
||||||
|
imvcd_video_decode_op_t *ps_op);
|
||||||
|
|
||||||
|
extern void imvcd_au_init(iv_obj_t *ps_dec_hdl, imvcd_video_decode_ip_t *ps_ip,
|
||||||
|
imvcd_video_decode_op_t *ps_op);
|
||||||
|
|
||||||
|
extern void imvcd_view_init(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_bitstream_buf_alloc(dec_struct_t *ps_view_ctxt,
|
||||||
|
UWORD16 u2_num_views);
|
||||||
|
|
||||||
|
extern void imvcd_bitsteam_buf_free(dec_struct_t *ps_view_ctxt);
|
||||||
|
|
||||||
|
extern void imvcd_convert_to_app_disp_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt,
|
||||||
|
iv_yuv_buf_t *ps_view_disp_bufs);
|
||||||
|
#endif
|
||||||
37
decoder/mvc/imvcd_defs.h
Normal file
37
decoder/mvc/imvcd_defs.h
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_DEFS_H_
|
||||||
|
#define _IMVCD_DEFS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvc_defs.h"
|
||||||
|
#include "ih264d_defs.h"
|
||||||
|
|
||||||
|
#define MVC_MAX_REF_PICS MAX(16 * LOG2_MAX_NUM_VIEWS, 2 * H264_MAX_REF_PICS)
|
||||||
|
|
||||||
|
/* Set to identify between actual ref pic with valid u1_pic_buf_id
|
||||||
|
and replicated IVP ref pic! Ensure that MAX_VAL_PIC_BUF_ID-MAX_NUM_VIEWS
|
||||||
|
is still greater than any possible value of u1_pic_buf_id */
|
||||||
|
#define IVP_PIC_BUF_ID UINT8_MAX
|
||||||
|
|
||||||
|
#endif
|
||||||
2136
decoder/mvc/imvcd_dpb_manager.c
Normal file
2136
decoder/mvc/imvcd_dpb_manager.c
Normal file
File diff suppressed because it is too large
Load diff
214
decoder/mvc/imvcd_dpb_manager.h
Normal file
214
decoder/mvc/imvcd_dpb_manager.h
Normal file
|
|
@ -0,0 +1,214 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_nalu_parser.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for MVC NALU parsing */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_DPB_MANAGER_H_
|
||||||
|
#define _IMVCD_DPB_MANAGER_H_
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "ih264_error.h"
|
||||||
|
#include "ih264_buf_mgr.h"
|
||||||
|
#include "ih264_disp_mgr.h"
|
||||||
|
#include "imvcd_defs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
#include "imvcd_utils.h"
|
||||||
|
|
||||||
|
typedef struct mvc_dpb_info_t
|
||||||
|
{
|
||||||
|
mvc_au_buffer_t *ps_au_buf;
|
||||||
|
|
||||||
|
struct mvc_dpb_info_t *ps_prev_short;
|
||||||
|
|
||||||
|
struct mvc_dpb_info_t *ps_prev_long;
|
||||||
|
|
||||||
|
struct field_t s_top_field;
|
||||||
|
|
||||||
|
struct field_t s_bot_field;
|
||||||
|
|
||||||
|
bool b_used_as_ref;
|
||||||
|
|
||||||
|
} mvc_dpb_info_t;
|
||||||
|
|
||||||
|
typedef struct display_buf_info_t
|
||||||
|
{
|
||||||
|
WORD32 i4_poc;
|
||||||
|
|
||||||
|
WORD32 i4_poc_buf_id;
|
||||||
|
|
||||||
|
WORD32 i4_frame_num;
|
||||||
|
} display_buf_info_t;
|
||||||
|
|
||||||
|
typedef struct dpb_ivp_ctxt_t
|
||||||
|
{
|
||||||
|
sps_mvc_ext_t *ps_sps_mvc_ext;
|
||||||
|
|
||||||
|
nalu_mvc_ext_t *ps_nalu_mvc_exts;
|
||||||
|
|
||||||
|
UWORD8 au1_au_buf_ids[MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
UWORD8 au1_mv_buf_ids[MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
UWORD32 u4_num_ivp_refs;
|
||||||
|
} dpb_ivp_ctxt_t;
|
||||||
|
|
||||||
|
typedef struct mvc_dpb_manager_t
|
||||||
|
{
|
||||||
|
/** DPB in default index order */
|
||||||
|
mvc_au_buffer_t *aps_def_dpb[MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
/** DPB in reordered index order, 0-fwd,1-bwd */
|
||||||
|
mvc_au_buffer_t *aps_mod_dpb[2][MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
/** DPB in reordered index order, 0-fwd,1-bwd */
|
||||||
|
mvc_au_buffer_t as_init_dpb[2][MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
/** Replicates view level data in 'aps_mod_dpb' */
|
||||||
|
pic_buffer_t *aps_view_mod_dpb[2][MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
/** Replicates view level data in 'aps_init_dpb' */
|
||||||
|
pic_buffer_t as_view_init_dpb[2][MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
mvc_dpb_info_t as_dpb_info[MVC_MAX_REF_PICS];
|
||||||
|
|
||||||
|
display_buf_info_t as_display_buf_info[MAX_FRAMES];
|
||||||
|
|
||||||
|
dpb_ivp_ctxt_t s_dpb_ivp_ctxt;
|
||||||
|
|
||||||
|
mvc_dpb_info_t *ps_dpb_st_head;
|
||||||
|
|
||||||
|
mvc_dpb_info_t *ps_dpb_lt_head;
|
||||||
|
|
||||||
|
mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr;
|
||||||
|
|
||||||
|
mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr;
|
||||||
|
|
||||||
|
disp_mgr_t *ps_disp_buf_mgr;
|
||||||
|
|
||||||
|
WORD32 ai4_gaps_start_frm_num[MAX_FRAMES];
|
||||||
|
|
||||||
|
WORD32 ai4_gaps_end_frm_num[MAX_FRAMES];
|
||||||
|
|
||||||
|
WORD8 ai1_gaps_per_seq[MAX_FRAMES];
|
||||||
|
|
||||||
|
UWORD8 au1_num_active_st_refs[2];
|
||||||
|
|
||||||
|
UWORD8 au1_num_active_lt_refs[2];
|
||||||
|
|
||||||
|
WORD32 i4_max_pic_num;
|
||||||
|
|
||||||
|
WORD32 i4_display_delay;
|
||||||
|
|
||||||
|
WORD32 i4_cur_display_seq;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views;
|
||||||
|
|
||||||
|
UWORD8 u1_num_st_ref_bufs;
|
||||||
|
|
||||||
|
UWORD8 u1_num_lt_ref_bufs;
|
||||||
|
|
||||||
|
UWORD8 u1_max_lt_frame_idx;
|
||||||
|
|
||||||
|
UWORD8 u1_num_gaps;
|
||||||
|
|
||||||
|
WORD8 i1_poc_buf_id_entries;
|
||||||
|
|
||||||
|
WORD8 i1_gaps_deleted;
|
||||||
|
|
||||||
|
UWORD8 u1_mmco_error_in_seq;
|
||||||
|
|
||||||
|
} mvc_dpb_manager_t;
|
||||||
|
|
||||||
|
/* Function declarations */
|
||||||
|
extern void imvcd_init_dpb_mgr(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
|
||||||
|
mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
|
||||||
|
disp_mgr_t *ps_disp_buf_mgr);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_assign_display_seq(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_insert_pic_in_display_list(mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
WORD32 i4_display_poc, UWORD32 u4_frame_num,
|
||||||
|
WORD32 i4_buf_id);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_do_mmco_for_gaps(mvc_dpb_manager_t *ps_dpb_mgr, UWORD8 u1_num_ref_frames);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_delete_nonref_nondisplay_pics(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern void imvcd_reset_dpb(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_release_display_bufs(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern void imvcd_assign_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_frame_num,
|
||||||
|
WORD32 i4_cur_frame_num,
|
||||||
|
bool b_are_gaps_in_frame_num_value_allowed);
|
||||||
|
|
||||||
|
extern UWORD8 imvcd_dpb_st_lt_deduplicator(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_init_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
|
||||||
|
mvc_au_buffer_t *ps_cur_au, UWORD16 u2_view_order_id);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_reorder_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
nalu_mvc_ext_t *ps_cur_nalu_mvc_ext,
|
||||||
|
mvc_au_buffer_t *ps_cur_au,
|
||||||
|
ref_pic_list_mod_data_t *ps_ref_pic_list_mod_data,
|
||||||
|
UWORD16 u2_view_order_id);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_insert_st_node(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_au_buf);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_delete_st_node_or_make_lt(mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
WORD32 i4_frame_num, UWORD32 u4_lt_idx);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_do_mmco(dpb_commands_t *ps_dpb_cmds, mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
mvc_au_buffer_t *ps_cur_au, UWORD8 u1_max_num_ref_frames,
|
||||||
|
UWORD8 u1_curr_pic_in_err);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_dpb_update_default_index_list(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_set_display_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_num);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_set_max_pic_num(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_max_pic_num);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_set_num_views(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_num_views);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_set_display_delay(mvc_dpb_manager_t *ps_dpb_mgr, WORD32 i4_display_delay);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_init_au_bufs(mvc_dpb_manager_t *ps_dpb_mgr, mvc_au_buffer_t *ps_cur_au);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_init_view_bufs(mvc_dpb_manager_t *ps_dpb_mgr, UWORD16 u2_view_order_id,
|
||||||
|
UWORD16 u2_view_id);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_init_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr, sps_mvc_ext_t *ps_sps_mvc_ext,
|
||||||
|
nalu_mvc_ext_t *ps_nalu_mvc_exts);
|
||||||
|
|
||||||
|
extern void imvcd_dpb_reset_ivp_ctxt(mvc_dpb_manager_t *ps_dpb_mgr);
|
||||||
|
|
||||||
|
extern pic_buffer_t **imvcd_dpb_get_view_ref_pic_list(mvc_dpb_manager_t *ps_dpb_mgr,
|
||||||
|
UWORD16 u2_view_order_id, UWORD16 u2_view_id,
|
||||||
|
UWORD8 u1_pred_dir);
|
||||||
|
|
||||||
|
#endif
|
||||||
394
decoder/mvc/imvcd_error_handler.c
Normal file
394
decoder/mvc/imvcd_error_handler.c
Normal file
|
|
@ -0,0 +1,394 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_error_handler.c */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for error handling */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "iv.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
#include "ih264_macros.h"
|
||||||
|
#include "imvc_defs.h"
|
||||||
|
#include "ih264d_defs.h"
|
||||||
|
#include "ih264d_error_handler.h"
|
||||||
|
#include "ih264d_nal.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
#include "imvcd_utils.h"
|
||||||
|
|
||||||
|
static IV_API_CALL_STATUS_T imvcd_check_invalid_numViews(mvc_dec_ctxt_t *ps_mvcd_ctxt)
|
||||||
|
{
|
||||||
|
WORD32 i;
|
||||||
|
|
||||||
|
UWORD8 u1_num_valid_subset_sps_found = 0;
|
||||||
|
UWORD16 u2_max_views = 1;
|
||||||
|
|
||||||
|
if((ps_mvcd_ctxt->u1_num_subset_sps == 0) && (ps_mvcd_ctxt->u2_num_views_decoded > 0))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
|
||||||
|
{
|
||||||
|
if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_is_valid)
|
||||||
|
{
|
||||||
|
if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_mvc_ext.u2_num_views > MAX_NUM_VIEWS)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
u2_max_views =
|
||||||
|
MAX(u2_max_views, ps_mvcd_ctxt->as_subset_sps[i].s_sps_mvc_ext.u2_num_views);
|
||||||
|
u1_num_valid_subset_sps_found++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u1_num_valid_subset_sps_found > ps_mvcd_ctxt->u1_num_subset_sps)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->u2_num_views > u2_max_views)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->u2_num_views_decoded >= u2_max_views)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IV_API_CALL_STATUS_T imvcd_check_sps_and_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt)
|
||||||
|
{
|
||||||
|
UWORD32 i;
|
||||||
|
UWORD32 u4_cnt;
|
||||||
|
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
UWORD32 u4_num_sps = ps_mvcd_ctxt->u1_num_sps;
|
||||||
|
UWORD32 u4_num_subset_sps = ps_mvcd_ctxt->u1_num_subset_sps;
|
||||||
|
WORD32 i4_max_mb_addr = INT32_MIN;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
u4_cnt = 0;
|
||||||
|
|
||||||
|
while((u4_cnt < u4_num_sps) && (i < MAX_NUM_SEQ_PARAMS))
|
||||||
|
{
|
||||||
|
if(ps_view_ctxt->ps_sps[i].u1_is_valid)
|
||||||
|
{
|
||||||
|
u4_cnt++;
|
||||||
|
|
||||||
|
if(i4_max_mb_addr == INT32_MIN)
|
||||||
|
{
|
||||||
|
i4_max_mb_addr = ps_view_ctxt->ps_sps[i].u2_max_mb_addr;
|
||||||
|
}
|
||||||
|
else if(i4_max_mb_addr != ps_view_ctxt->ps_sps[i].u2_max_mb_addr)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->ps_sps[i].u2_max_mb_addr >
|
||||||
|
imvcd_get_num_mbs_in_level(ps_view_ctxt->ps_sps[i].u1_level_idc))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->ps_sps[i].u1_mb_aff_flag)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_view_ctxt->ps_sps[i].u1_frame_mbs_only_flag)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u4_cnt != u4_num_sps)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
u4_cnt = 0;
|
||||||
|
|
||||||
|
while((u4_cnt < u4_num_subset_sps) && (i < MAX_NUM_SEQ_PARAMS))
|
||||||
|
{
|
||||||
|
if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_is_valid)
|
||||||
|
{
|
||||||
|
u4_cnt++;
|
||||||
|
|
||||||
|
if(i4_max_mb_addr == INT32_MIN)
|
||||||
|
{
|
||||||
|
i4_max_mb_addr = ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u2_max_mb_addr;
|
||||||
|
}
|
||||||
|
else if(i4_max_mb_addr != ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u2_max_mb_addr)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u2_max_mb_addr >
|
||||||
|
imvcd_get_num_mbs_in_level(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_level_idc))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_mb_aff_flag)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_frame_mbs_only_flag)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u4_cnt != u4_num_subset_sps)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IV_API_CALL_STATUS_T imvcd_check_pps(mvc_dec_ctxt_t *ps_mvcd_ctxt)
|
||||||
|
{
|
||||||
|
WORD32 i;
|
||||||
|
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
bool b_is_valid_pps_found = false;
|
||||||
|
|
||||||
|
for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
|
||||||
|
{
|
||||||
|
if(ps_view_ctxt->ps_pps[i].u1_is_valid)
|
||||||
|
{
|
||||||
|
b_is_valid_pps_found = true;
|
||||||
|
|
||||||
|
if(ps_view_ctxt->ps_pps[i].u1_frame_cropping_flag)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->ps_pps[i].u1_num_slice_groups != 1)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return b_is_valid_pps_found ? IV_SUCCESS : IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IV_API_CALL_STATUS_T imvcd_check_num_view_slices_in_au(mvc_dec_ctxt_t *ps_mvcd_ctxt,
|
||||||
|
imvcd_video_decode_ip_t *ps_ip)
|
||||||
|
{
|
||||||
|
AVC_EXT_NALU_ID_T e_nalu_id;
|
||||||
|
|
||||||
|
UWORD16 u2_num_view_slices_in_au = 0;
|
||||||
|
UWORD8 *pu1_input_buffer = (UWORD8 *) ps_ip->s_ivd_ip.pv_stream_buffer;
|
||||||
|
UWORD32 u4_num_bytes_remaining = ps_ip->s_ivd_ip.u4_num_Bytes;
|
||||||
|
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
UWORD32 u4_length_of_start_code = 0;
|
||||||
|
UWORD32 u4_next_is_aud = 0;
|
||||||
|
WORD32 i4_nalu_length = ih264d_find_start_code(pu1_input_buffer, 0, u4_num_bytes_remaining,
|
||||||
|
&u4_length_of_start_code, &u4_next_is_aud);
|
||||||
|
|
||||||
|
if(i4_nalu_length <= 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((0 != u4_next_is_aud) && (1 != u4_next_is_aud))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u4_length_of_start_code < (NUM_OF_ZERO_BYTES_BEFORE_START_CODE + 1))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
e_nalu_id = NAL_UNIT_TYPE(pu1_input_buffer[u4_length_of_start_code]);
|
||||||
|
u2_num_view_slices_in_au += (SLICE_NON_IDR == e_nalu_id) || (SLICE_IDR == e_nalu_id) ||
|
||||||
|
(CODED_SLICE_EXTENSION == e_nalu_id);
|
||||||
|
|
||||||
|
if(((WORD64) u4_num_bytes_remaining) <=
|
||||||
|
((WORD64) (((WORD64) u4_length_of_start_code) + ((WORD64) i4_nalu_length))))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pu1_input_buffer += u4_length_of_start_code + i4_nalu_length;
|
||||||
|
u4_num_bytes_remaining -= u4_length_of_start_code + i4_nalu_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u2_num_view_slices_in_au == ps_mvcd_ctxt->u2_num_views)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (u2_num_view_slices_in_au != ps_mvcd_ctxt->u2_num_views) ? IV_FAIL : IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_au_error_checks(mvc_dec_ctxt_t *ps_mvcd_ctxt,
|
||||||
|
imvcd_video_decode_ip_t *ps_ip)
|
||||||
|
{
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->b_header_only_decode)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_view_ctxt->init_done)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IV_FAIL == imvcd_check_invalid_numViews(ps_mvcd_ctxt))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IV_FAIL == imvcd_check_sps_and_subset_sps(ps_mvcd_ctxt))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(IV_FAIL == imvcd_check_pps(ps_mvcd_ctxt))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_mvcd_ctxt->b_flush_enabled)
|
||||||
|
{
|
||||||
|
if(IV_FAIL == imvcd_check_num_view_slices_in_au(ps_mvcd_ctxt, ps_ip))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T imvcd_view_error_checks(mvc_dec_ctxt_t *ps_mvcd_ctxt)
|
||||||
|
{
|
||||||
|
WORD32 i;
|
||||||
|
|
||||||
|
nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
bool b_is_idr_slice = imvcd_is_idr_au(ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
if(b_is_idr_slice && (ps_view_ctxt->ps_cur_slice->u1_slice_type != ISLICE))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->u1_first_slice_in_stream && !b_is_idr_slice)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_nalu_mvc_ext->u2_view_id != 0)
|
||||||
|
{
|
||||||
|
subset_sps_t *ps_subset_sps =
|
||||||
|
ps_mvcd_ctxt
|
||||||
|
->aps_pps_id_to_subset_sps_map[ps_view_ctxt->ps_cur_pps->u1_pic_parameter_set_id];
|
||||||
|
|
||||||
|
if((NULL == ps_subset_sps) || !ps_subset_sps->s_sps_data.u1_is_valid)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0 == ps_mvcd_ctxt->u1_num_subset_sps)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_nalu_mvc_ext->u2_view_id >= ps_subset_sps->s_sps_mvc_ext.u2_num_views)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(ps_mvcd_ctxt->u2_num_views_decoded > 0)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ps_view_ctxt->u4_first_slice_in_pic || (ps_view_ctxt->u2_cur_slice_num > 0))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->u4_first_slice_in_pic &&
|
||||||
|
(ps_view_ctxt->ps_cur_slice->u2_first_mb_in_slice != 0))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->ps_cur_slice->u1_mmco_equalto5)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < ps_mvcd_ctxt->u2_num_views_decoded; i++)
|
||||||
|
{
|
||||||
|
if(ps_mvcd_ctxt->as_slices[i].i4_poc != ps_view_ctxt->ps_cur_slice->i4_poc)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_mvcd_ctxt->as_slices[i].u2_frame_num != ps_view_ctxt->ps_cur_slice->u2_frame_num)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SKIP_NONE != ps_view_ctxt->u4_skip_frm_mask)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
39
decoder/mvc/imvcd_error_handler.h
Normal file
39
decoder/mvc/imvcd_error_handler.h
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_error_handler.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for error handling */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_ERROR_HANDLER_H_
|
||||||
|
#define _IMVCD_ERROR_HANDLER_H_
|
||||||
|
|
||||||
|
#include "iv.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_au_error_checks(mvc_dec_ctxt_t *ps_mvcd_ctxt,
|
||||||
|
imvcd_video_decode_ip_t *ps_ip);
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_view_error_checks(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
#endif
|
||||||
797
decoder/mvc/imvcd_nalu_parser.c
Normal file
797
decoder/mvc/imvcd_nalu_parser.c
Normal file
|
|
@ -0,0 +1,797 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_nalu_parser.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for MVC NALU parsing */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "iv.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
#include "ih264d_error_handler.h"
|
||||||
|
#include "ih264d_bitstrm.h"
|
||||||
|
#include "ih264d_defs.h"
|
||||||
|
#include "ih264d_nal.h"
|
||||||
|
#include "ih264d_parse_cavlc.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "ih264d_vui.h"
|
||||||
|
#include "imvcd_defs.h"
|
||||||
|
#include "imvcd_slice_functions.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
#include "imvcd_utils.h"
|
||||||
|
|
||||||
|
static WORD32 imvcd_nalu_mvc_ext_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, dec_bit_stream_t *ps_bitstrm)
|
||||||
|
{
|
||||||
|
nalu_mvc_ext_t *ps_nalu_mvc_ext =
|
||||||
|
&ps_mvcd_ctxt->as_nalu_mvc_ext[ps_mvcd_ctxt->u2_num_views_decoded];
|
||||||
|
|
||||||
|
ps_nalu_mvc_ext->u1_non_idr_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
ps_nalu_mvc_ext->u1_priority_id = ih264d_get_bits_h264(ps_bitstrm, 6);
|
||||||
|
ps_nalu_mvc_ext->u2_view_id = ih264d_get_bits_h264(ps_bitstrm, 10);
|
||||||
|
ps_nalu_mvc_ext->u1_temporal_id = ih264d_get_bits_h264(ps_bitstrm, 3);
|
||||||
|
ps_nalu_mvc_ext->u1_anchor_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
ps_nalu_mvc_ext->u1_inter_view_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(0 == ih264d_get_bit_h264(ps_bitstrm))
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_nalu_mvc_ext->u2_view_id >= MAX_NUM_VIEWS)
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WORD32 imvcd_parse_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt, dec_bit_stream_t *ps_bitstrm)
|
||||||
|
{
|
||||||
|
subset_sps_t *ps_subset_sps;
|
||||||
|
|
||||||
|
WORD32 i, j, k;
|
||||||
|
UWORD8 u1_profile_idc;
|
||||||
|
UWORD8 au1_constraint_set_flags[6];
|
||||||
|
UWORD8 u1_level_idc;
|
||||||
|
UWORD8 u1_seq_parameter_set_id;
|
||||||
|
UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
|
||||||
|
UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
|
||||||
|
UWORD32 u4_temp;
|
||||||
|
UWORD16 u2_num_views_m1;
|
||||||
|
UWORD8 u1_num_refs;
|
||||||
|
UWORD8 u1_num_level_values_signalled_m1;
|
||||||
|
UWORD8 u2_num_ops_m1;
|
||||||
|
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
|
||||||
|
WORD32 i4_error_code = OK;
|
||||||
|
|
||||||
|
u1_profile_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
|
||||||
|
|
||||||
|
for(i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
au1_constraint_set_flags[i] = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((u1_profile_idc != MULTIVIEW_HIGH_PROFILE_IDC) || (au1_constraint_set_flags[1] == 1))
|
||||||
|
{
|
||||||
|
return ERROR_FEATURE_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************/
|
||||||
|
/* Read reserved_zero_2bits (2 bits) */
|
||||||
|
/*****************************************************/
|
||||||
|
ih264d_get_bits_h264(ps_bitstrm, 2);
|
||||||
|
|
||||||
|
u1_level_idc = ih264d_get_bits_h264(ps_bitstrm, 8);
|
||||||
|
|
||||||
|
u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
u1_seq_parameter_set_id = u4_temp;
|
||||||
|
|
||||||
|
if(u4_temp & MASK_ERR_SEQ_SET_ID)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps = &ps_mvcd_ctxt->as_subset_sps[u1_seq_parameter_set_id];
|
||||||
|
|
||||||
|
/* Accounting for the idiocy in 'ih264d_parse_pps' */
|
||||||
|
ps_subset_sps->s_sps_data.u1_profile_idc = HIGH_PROFILE_IDC;
|
||||||
|
ps_subset_sps->s_sps_data.u1_level_idc = u1_level_idc;
|
||||||
|
ps_subset_sps->s_sps_data.u1_seq_parameter_set_id = u1_seq_parameter_set_id;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_chroma_format_idc = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.i4_chroma_format_idc != 1)
|
||||||
|
{
|
||||||
|
return ERROR_FEATURE_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.i4_bit_depth_luma_minus8 != 0)
|
||||||
|
{
|
||||||
|
return ERROR_FEATURE_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.i4_bit_depth_chroma_minus8 != 0)
|
||||||
|
{
|
||||||
|
return ERROR_FEATURE_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag =
|
||||||
|
ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.i4_qpprime_y_zero_transform_bypass_flag != 0)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.i4_seq_scaling_matrix_present_flag)
|
||||||
|
{
|
||||||
|
for(i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_data.u1_seq_scaling_list_present_flag[i] =
|
||||||
|
ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_bits_in_frm_num =
|
||||||
|
4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_bits_in_frm_num > MAX_BITS_IN_FRAME_NUM)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u2_u4_max_pic_num_minus1 =
|
||||||
|
(1 << (ps_subset_sps->s_sps_data.u1_bits_in_frm_num)) - 1;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_pic_order_cnt_type = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type > MAX_PIC_ORDER_CNT_TYPE)
|
||||||
|
{
|
||||||
|
return ERROR_INV_POC_TYPE_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle = 1;
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 0)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus =
|
||||||
|
4 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus > MAX_BITS_IN_POC_LSB)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_max_pic_order_cntLsb =
|
||||||
|
(1 << ps_subset_sps->s_sps_data.u1_log2_max_pic_order_cnt_lsb_minus);
|
||||||
|
}
|
||||||
|
else if(ps_subset_sps->s_sps_data.u1_pic_order_cnt_type == 1)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_data.u1_delta_pic_order_always_zero_flag =
|
||||||
|
ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_ofst_for_non_ref_pic =
|
||||||
|
ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.i4_ofst_for_top_to_bottom_field =
|
||||||
|
ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle > MVC_MAX_REF_PICS)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < ps_subset_sps->s_sps_data.u1_num_ref_frames_in_pic_order_cnt_cycle; i++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_data.i4_ofst_for_ref_frame[i] =
|
||||||
|
ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_num_ref_frames = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if((ps_subset_sps->s_sps_data.u1_num_ref_frames > MVC_MAX_REF_PICS))
|
||||||
|
{
|
||||||
|
return ERROR_NUM_REF;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_gaps_in_frame_num_value_allowed_flag =
|
||||||
|
ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs > (H264_MAX_FRAME_WIDTH >> 4))
|
||||||
|
{
|
||||||
|
return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs = 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs > (H264_MAX_FRAME_HEIGHT >> 4))
|
||||||
|
{
|
||||||
|
return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u2_max_mb_addr =
|
||||||
|
ps_subset_sps->s_sps_data.u2_frm_wd_in_mbs * ps_subset_sps->s_sps_data.u2_frm_ht_in_mbs - 1;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u2_total_num_of_mbs = ps_subset_sps->s_sps_data.u2_max_mb_addr + 1;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(!ps_subset_sps->s_sps_data.u1_frame_mbs_only_flag)
|
||||||
|
{
|
||||||
|
return ERROR_FEATURE_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_mb_aff_flag = 0;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
/* Frame cropping flag */
|
||||||
|
u4_temp = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(u4_temp)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_disp_offsets.u2_left_offset =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_disp_offsets.u2_right_offset =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_disp_offsets.u2_top_offset = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_disp_offsets.u2_bottom_offset =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(&ps_subset_sps->s_disp_offsets, 0, sizeof(ps_subset_sps->s_disp_offsets));
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(ps_subset_sps->s_sps_data.u1_vui_parameters_present_flag)
|
||||||
|
{
|
||||||
|
i4_error_code = ih264d_parse_vui_parametres(&ps_subset_sps->s_sps_data.s_vui, ps_bitstrm);
|
||||||
|
|
||||||
|
if(i4_error_code != OK)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ih264d_get_bit_h264(ps_bitstrm) != 1)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
u2_num_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.u2_num_views = 1 + u2_num_views_m1;
|
||||||
|
|
||||||
|
if(u2_num_views_m1 > MAX_NUM_VIEWS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ps_view_ctxt->i4_decode_header)
|
||||||
|
{
|
||||||
|
ps_mvcd_ctxt->u2_num_views = MAX(ps_mvcd_ctxt->u2_num_views, 1 + u2_num_views_m1);
|
||||||
|
}
|
||||||
|
else if(ps_mvcd_ctxt->u2_num_views != (1 + u2_num_views_m1))
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i <= u2_num_views_m1; i++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.au2_view_ids[i] =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[i][0].u1_num_refs = 0;
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[i][0].u1_num_refs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 1; i <= u2_num_views_m1; i++)
|
||||||
|
{
|
||||||
|
u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
|
||||||
|
|
||||||
|
if(u1_num_refs > MAX_NUM_IVP_REFS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < u1_num_refs; j++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].au2_ref_view_ids[j] =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
|
||||||
|
|
||||||
|
if(u1_num_refs > MAX_NUM_IVP_REFS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < u1_num_refs; j++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].au2_ref_view_ids[j] =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 1; i <= u2_num_views_m1; i++)
|
||||||
|
{
|
||||||
|
u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].u1_num_refs = u1_num_refs;
|
||||||
|
|
||||||
|
if(u1_num_refs > MAX_NUM_IVP_REFS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < u1_num_refs; j++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].au2_ref_view_ids[j] =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
u1_num_refs = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].u1_num_refs = u1_num_refs;
|
||||||
|
|
||||||
|
if(u1_num_refs > MAX_NUM_IVP_REFS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < u1_num_refs; j++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].au2_ref_view_ids[j] =
|
||||||
|
ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u1_num_level_values_signalled_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.u1_num_level_values_signalled =
|
||||||
|
u1_num_level_values_signalled_m1 + 1;
|
||||||
|
|
||||||
|
if(u1_num_level_values_signalled_m1 >= MAX_NUM_LEVEL_VALUES_SIGNALLED)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i <= u1_num_level_values_signalled_m1; i++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info[i].u4_level_idc =
|
||||||
|
ih264d_get_bits_h264(ps_bitstrm, 8);
|
||||||
|
|
||||||
|
u2_num_ops_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[i].u2_num_ops =
|
||||||
|
1 + u2_num_ops_m1;
|
||||||
|
|
||||||
|
if(u2_num_ops_m1 >= MAX_NUM_OPERATING_POINTS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j <= u2_num_ops_m1; j++)
|
||||||
|
{
|
||||||
|
UWORD16 u2_num_target_views_m1;
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u1_temporal_id =
|
||||||
|
ih264d_get_bits_h264(ps_bitstrm, 3);
|
||||||
|
|
||||||
|
u2_num_target_views_m1 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_target_views =
|
||||||
|
1 + u2_num_target_views_m1;
|
||||||
|
|
||||||
|
if(u2_num_target_views_m1 >= MAX_NUM_VIEWS)
|
||||||
|
{
|
||||||
|
return ERROR_INVALID_SEQ_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(k = 0; k <= u2_num_target_views_m1; k++)
|
||||||
|
{
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j]
|
||||||
|
.au2_target_view_ids[k] = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_mvc_ext.as_mvc_level_info->as_mvc_op_data[j].u2_num_views =
|
||||||
|
(UWORD16) 1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->u1_mvc_vui_parameters_present_flag = ih264d_get_bit_h264(ps_bitstrm);
|
||||||
|
|
||||||
|
if(ps_subset_sps->u1_mvc_vui_parameters_present_flag)
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case bitstream read has exceeded the filled size, then
|
||||||
|
return an error */
|
||||||
|
if(EXCEED_OFFSET(ps_bitstrm))
|
||||||
|
{
|
||||||
|
return ERROR_INV_SPS_PPS_T;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_subset_sps->s_sps_data.u1_is_valid = 1;
|
||||||
|
|
||||||
|
/* This ensures PPS has valid data in SPS array for reference */
|
||||||
|
ps_view_ctxt->ps_sps[ps_subset_sps->s_sps_data.u1_seq_parameter_set_id] =
|
||||||
|
ps_subset_sps->s_sps_data;
|
||||||
|
|
||||||
|
ps_mvcd_ctxt->u1_num_subset_sps++;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function removes emulation byte "0x03" from bitstream(EBSP to RBSP).
|
||||||
|
It also converts bytestream format into 32 bit little - endian format. */
|
||||||
|
static WORD32 imvcd_transform_nalu(dec_bit_stream_t *ps_bitstrm, UWORD8 *pu1_nal_unit,
|
||||||
|
UWORD32 u4_numbytes_in_nal_unit)
|
||||||
|
{
|
||||||
|
UWORD32 ui4_word;
|
||||||
|
UWORD8 u1_cur_byte;
|
||||||
|
|
||||||
|
static const UWORD32 u4_num_bytes_in_word = sizeof(ui4_word) / sizeof(u1_cur_byte);
|
||||||
|
UWORD32 u4_num_bytes_in_rbsp = 0;
|
||||||
|
WORD32 i = 0, j;
|
||||||
|
WORD8 c_count = 0;
|
||||||
|
UWORD32 *puc_bitstream_buffer = (UWORD32 *) pu1_nal_unit;
|
||||||
|
UWORD8 u1_nal_header_size = 1;
|
||||||
|
UWORD8 u1_num_bytes_copied = 0;
|
||||||
|
|
||||||
|
ps_bitstrm->pu4_buffer = puc_bitstream_buffer;
|
||||||
|
|
||||||
|
ui4_word = *pu1_nal_unit++;
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
|
||||||
|
if((NAL_UNIT_TYPE(ui4_word) == PREFIX_NAL) ||
|
||||||
|
(NAL_UNIT_TYPE(ui4_word) == CODED_SLICE_EXTENSION))
|
||||||
|
{
|
||||||
|
u1_nal_header_size += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < 2; j++)
|
||||||
|
{
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
|
||||||
|
c_count++;
|
||||||
|
u4_num_bytes_in_rbsp++;
|
||||||
|
|
||||||
|
if(u1_cur_byte != 0x00)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u4_numbytes_in_nal_unit > 2)
|
||||||
|
{
|
||||||
|
i = ((u4_numbytes_in_nal_unit - 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(; i > 8; i -= 4)
|
||||||
|
{
|
||||||
|
// loop 0
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
|
||||||
|
u1_cur_byte == EMULATION_PREVENTION_BYTE)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
if(u4_num_bytes_in_word == u1_num_bytes_copied)
|
||||||
|
{
|
||||||
|
*puc_bitstream_buffer = ui4_word;
|
||||||
|
puc_bitstream_buffer++;
|
||||||
|
u1_num_bytes_copied = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c_count++;
|
||||||
|
if(u1_cur_byte != 0x00) c_count = 0;
|
||||||
|
|
||||||
|
// loop 1
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
|
||||||
|
u1_cur_byte == EMULATION_PREVENTION_BYTE)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
if(u4_num_bytes_in_word == u1_num_bytes_copied)
|
||||||
|
{
|
||||||
|
*puc_bitstream_buffer = ui4_word;
|
||||||
|
puc_bitstream_buffer++;
|
||||||
|
u1_num_bytes_copied = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c_count++;
|
||||||
|
if(u1_cur_byte != 0x00) c_count = 0;
|
||||||
|
|
||||||
|
// loop 2
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
|
||||||
|
u1_cur_byte == EMULATION_PREVENTION_BYTE)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
if(u4_num_bytes_in_word == u1_num_bytes_copied)
|
||||||
|
{
|
||||||
|
*puc_bitstream_buffer = ui4_word;
|
||||||
|
puc_bitstream_buffer++;
|
||||||
|
u1_num_bytes_copied = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c_count++;
|
||||||
|
if(u1_cur_byte != 0x00) c_count = 0;
|
||||||
|
|
||||||
|
// loop 3
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
|
||||||
|
u1_cur_byte == EMULATION_PREVENTION_BYTE)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u1_num_bytes_copied++;
|
||||||
|
if(u4_num_bytes_in_word == u1_num_bytes_copied)
|
||||||
|
{
|
||||||
|
*puc_bitstream_buffer = ui4_word;
|
||||||
|
puc_bitstream_buffer++;
|
||||||
|
u1_num_bytes_copied = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
c_count++;
|
||||||
|
if(u1_cur_byte != 0x00) c_count = 0;
|
||||||
|
|
||||||
|
u4_num_bytes_in_rbsp += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(; i > 0; i--)
|
||||||
|
{
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
|
||||||
|
if(c_count == NUM_OF_ZERO_BYTES_BEFORE_START_CODE &&
|
||||||
|
u1_cur_byte == EMULATION_PREVENTION_BYTE)
|
||||||
|
{
|
||||||
|
c_count = 0;
|
||||||
|
i--;
|
||||||
|
u1_cur_byte = *pu1_nal_unit++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui4_word = ((ui4_word << 8) | u1_cur_byte);
|
||||||
|
u4_num_bytes_in_rbsp++;
|
||||||
|
|
||||||
|
if((u4_num_bytes_in_rbsp & 0x03) == 0x03)
|
||||||
|
{
|
||||||
|
*puc_bitstream_buffer = ui4_word;
|
||||||
|
puc_bitstream_buffer++;
|
||||||
|
}
|
||||||
|
c_count++;
|
||||||
|
if(u1_cur_byte != 0x00) c_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*puc_bitstream_buffer = (ui4_word << ((3 - (((u4_num_bytes_in_rbsp << 30) >> 30))) << 3));
|
||||||
|
ps_bitstrm->u4_ofst = 0;
|
||||||
|
ps_bitstrm->u4_max_ofst = ((u4_num_bytes_in_rbsp + u1_nal_header_size) << 3);
|
||||||
|
|
||||||
|
return (u4_num_bytes_in_rbsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD32 imvcd_nalu_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, UWORD8 *pu1_bitstream_buf,
|
||||||
|
UWORD32 i4_nalu_length)
|
||||||
|
{
|
||||||
|
AVC_EXT_NALU_ID_T e_nalu_id;
|
||||||
|
|
||||||
|
UWORD8 u1_first_byte;
|
||||||
|
|
||||||
|
dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
|
||||||
|
dec_bit_stream_t *ps_bitstrm = ps_view_ctxt->ps_bitstrm;
|
||||||
|
|
||||||
|
WORD32 i4_error_code = NOT_OK;
|
||||||
|
|
||||||
|
if((NULL != pu1_bitstream_buf) && (i4_nalu_length > 0))
|
||||||
|
{
|
||||||
|
imvcd_transform_nalu(ps_bitstrm, pu1_bitstream_buf, i4_nalu_length);
|
||||||
|
|
||||||
|
u1_first_byte = ih264d_get_bits_h264(ps_bitstrm, 8);
|
||||||
|
|
||||||
|
if(NAL_FORBIDDEN_BIT(u1_first_byte))
|
||||||
|
{
|
||||||
|
return NOT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
e_nalu_id = NAL_UNIT_TYPE(u1_first_byte);
|
||||||
|
ps_view_ctxt->u1_nal_unit_type = e_nalu_id;
|
||||||
|
|
||||||
|
// if any other nal unit other than slice nal is encountered in between a
|
||||||
|
// frame break out of loop without consuming header
|
||||||
|
if((ps_view_ctxt->u4_slice_start_code_found == 1) &&
|
||||||
|
(ps_view_ctxt->u1_pic_decode_done != 1) && is_slice_nalu_type(e_nalu_id))
|
||||||
|
{
|
||||||
|
return ERROR_INCOMPLETE_FRAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(e_nalu_id)
|
||||||
|
{
|
||||||
|
case PREFIX_NAL:
|
||||||
|
{
|
||||||
|
if(!ps_view_ctxt->i4_decode_header)
|
||||||
|
{
|
||||||
|
if(1 == ih264d_get_bit_h264(ps_bitstrm))
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
|
||||||
|
|
||||||
|
if(i4_error_code != OK)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SUBSET_SPS:
|
||||||
|
{
|
||||||
|
ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
|
||||||
|
|
||||||
|
i4_error_code = imvcd_parse_subset_sps(ps_mvcd_ctxt, ps_bitstrm);
|
||||||
|
|
||||||
|
if(OK != i4_error_code)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_view_ctxt->i4_header_decoded |= 1 << SUBSET_SPS;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SLICE_NON_IDR:
|
||||||
|
case SLICE_IDR:
|
||||||
|
{
|
||||||
|
if(!ps_view_ctxt->i4_decode_header)
|
||||||
|
{
|
||||||
|
if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
|
||||||
|
is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS))
|
||||||
|
{
|
||||||
|
nalu_mvc_ext_t *ps_nalu_mvc_ext = imvcd_get_cur_nalu_mvc_ext(ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
ps_view_ctxt->u4_slice_start_code_found = 1;
|
||||||
|
|
||||||
|
if((0 == ps_mvcd_ctxt->u2_num_views_decoded) &&
|
||||||
|
!ps_nalu_mvc_ext->u1_inter_view_flag)
|
||||||
|
{
|
||||||
|
ps_nalu_mvc_ext->u1_inter_view_flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
|
||||||
|
|
||||||
|
i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
if(i4_error_code != OK)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CODED_SLICE_EXTENSION:
|
||||||
|
{
|
||||||
|
if(!ps_view_ctxt->i4_decode_header)
|
||||||
|
{
|
||||||
|
if(is_header_decoded(ps_view_ctxt->i4_header_decoded, SPS) &&
|
||||||
|
is_header_decoded(ps_view_ctxt->i4_header_decoded, PPS) &&
|
||||||
|
is_header_decoded(ps_view_ctxt->i4_header_decoded, SUBSET_SPS))
|
||||||
|
{
|
||||||
|
ps_view_ctxt->u4_slice_start_code_found = 1;
|
||||||
|
|
||||||
|
if(1 == ih264d_get_bit_h264(ps_bitstrm))
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
i4_error_code = imvcd_nalu_mvc_ext_parser(ps_mvcd_ctxt, ps_bitstrm);
|
||||||
|
|
||||||
|
if(i4_error_code != OK)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
ih264d_rbsp_to_sodb(ps_view_ctxt->ps_bitstrm);
|
||||||
|
|
||||||
|
i4_error_code = imvcd_parse_decode_slice(ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
if(i4_error_code != OK)
|
||||||
|
{
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IVD_INVALID_BITSTREAM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
i4_error_code = ERROR_UNKNOWN_NAL;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i4_error_code;
|
||||||
|
}
|
||||||
37
decoder/mvc/imvcd_nalu_parser.h
Normal file
37
decoder/mvc/imvcd_nalu_parser.h
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_nalu_parser.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for MVC NALU parsing */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_NALU_PARSER_H_
|
||||||
|
#define _IMVCD_NALU_PARSER_H_
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
|
||||||
|
extern WORD32 imvcd_nalu_parser(mvc_dec_ctxt_t *ps_mvcd_ctxt, UWORD8 *pu1_bitstream_buf,
|
||||||
|
UWORD32 i4_nalu_length);
|
||||||
|
#endif
|
||||||
2391
decoder/mvc/imvcd_slice_functions.c
Normal file
2391
decoder/mvc/imvcd_slice_functions.c
Normal file
File diff suppressed because it is too large
Load diff
36
decoder/mvc/imvcd_slice_functions.h
Normal file
36
decoder/mvc/imvcd_slice_functions.h
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_slice_functions.h */
|
||||||
|
/* */
|
||||||
|
/* Description : Functions for MVC Slice parsing, etc. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_SLICE_FUNCTIONS_H_
|
||||||
|
#define _IMVCD_SLICE_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
|
||||||
|
extern WORD32 imvcd_parse_decode_slice(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
#endif
|
||||||
234
decoder/mvc/imvcd_structs.h
Normal file
234
decoder/mvc/imvcd_structs.h
Normal file
|
|
@ -0,0 +1,234 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
#ifndef _IMVCD_STRUCTS_H_
|
||||||
|
#define _IMVCD_STRUCTS_H_
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
#include "ih264_error.h"
|
||||||
|
#include "ih264_buf_mgr.h"
|
||||||
|
#include "ih264_disp_mgr.h"
|
||||||
|
#include "ih264d_sei.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "imvc_defs.h"
|
||||||
|
#include "imvc_structs.h"
|
||||||
|
#include "imvcd_defs.h"
|
||||||
|
|
||||||
|
/* structs */
|
||||||
|
typedef struct mvc_au_mv_pred_t
|
||||||
|
{
|
||||||
|
mv_pred_t *aps_mvs[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/* colZeroFlag | // 0th bit
|
||||||
|
field_flag | // 1st bit
|
||||||
|
XX | // 2:3 bit don't cares
|
||||||
|
subMbMode | // 4:5 bit
|
||||||
|
MbMode | // 6:7 bit */
|
||||||
|
UWORD8 *apu1_mode_descriptors[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
} mvc_au_mv_pred_t;
|
||||||
|
|
||||||
|
typedef struct ivp_data_t
|
||||||
|
{
|
||||||
|
bool b_is_ivp_ref;
|
||||||
|
|
||||||
|
/* Due to the structuring of dpb_mgr_t, */
|
||||||
|
/* mvc_pic_buffer_t used for referencing ought to contain */
|
||||||
|
/* all data in indices corresponding to view_id doing the referencing. */
|
||||||
|
/* This struct, and this variable in particular, is used for identifying */
|
||||||
|
/* the reference view's view_id */
|
||||||
|
|
||||||
|
UWORD16 u2_ref_view_id;
|
||||||
|
} ivp_data_t;
|
||||||
|
|
||||||
|
typedef struct mvc_au_buffer_t
|
||||||
|
{
|
||||||
|
/** pic_buffer for all views */
|
||||||
|
yuv_buf_props_t as_view_buffers[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/** display offsets for all views */
|
||||||
|
offsets_t as_disp_offsets[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
ivp_data_t s_ivp_data;
|
||||||
|
|
||||||
|
/** SEI data */
|
||||||
|
sei s_sei_pic;
|
||||||
|
|
||||||
|
/** AU MV Data */
|
||||||
|
mvc_au_mv_pred_t *ps_au_mv_data;
|
||||||
|
|
||||||
|
/* It will contain information about types of slices */
|
||||||
|
UWORD32 au4_pack_slc_typ[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/** Width of the display luma frame in pixels */
|
||||||
|
UWORD16 u2_disp_width;
|
||||||
|
|
||||||
|
/** Height of the display luma frame in pixels */
|
||||||
|
UWORD16 u2_disp_height;
|
||||||
|
|
||||||
|
/** Time at which frame has to be displayed */
|
||||||
|
UWORD32 u4_time_stamp;
|
||||||
|
|
||||||
|
/** (1: short 0: long) term ref pic */
|
||||||
|
bool b_is_short_term_ref;
|
||||||
|
|
||||||
|
/** frame / field / complementary field pair */
|
||||||
|
UWORD8 u1_pic_type;
|
||||||
|
|
||||||
|
/** Idx into the picBufAPI array */
|
||||||
|
WORD32 i4_pic_buf_id;
|
||||||
|
|
||||||
|
WORD32 i4_mv_buf_id;
|
||||||
|
|
||||||
|
WORD32 i4_poc;
|
||||||
|
|
||||||
|
WORD32 i4_frame_num;
|
||||||
|
|
||||||
|
/* Derived based on '8.2.4.1' */
|
||||||
|
WORD32 i4_pic_num;
|
||||||
|
|
||||||
|
/** minPOC */
|
||||||
|
WORD32 i4_avg_poc;
|
||||||
|
|
||||||
|
/*Same as u1_pic_type..u1_pic_type gets overwritten whereas this doesnot get
|
||||||
|
overwritten
|
||||||
|
...stores the pictype of frame/complementary field pair/ mbaff */
|
||||||
|
UWORD8 u1_picturetype;
|
||||||
|
|
||||||
|
UWORD8 u1_long_term_frm_idx;
|
||||||
|
|
||||||
|
UWORD8 u1_long_term_pic_num;
|
||||||
|
|
||||||
|
/* Refer to SEI table D-1 */
|
||||||
|
UWORD8 u1_pic_struct;
|
||||||
|
|
||||||
|
} mvc_au_buffer_t;
|
||||||
|
|
||||||
|
typedef struct mvc_au_buf_mgr_t
|
||||||
|
{
|
||||||
|
void *pv_mem;
|
||||||
|
|
||||||
|
buf_mgr_t *ps_buf_mgr_ctxt;
|
||||||
|
|
||||||
|
void *pv_au_buf_base;
|
||||||
|
|
||||||
|
mvc_au_buffer_t *aps_buf_id_to_au_buf_map[MAX_DISP_BUFS_NEW];
|
||||||
|
|
||||||
|
UWORD8 au1_au_buf_id_to_mv_buf_id_map[MAX_DISP_BUFS_NEW];
|
||||||
|
|
||||||
|
UWORD8 au1_au_buf_ref_flag[MAX_DISP_BUFS_NEW];
|
||||||
|
|
||||||
|
} mvc_au_buf_mgr_t;
|
||||||
|
|
||||||
|
typedef struct mvc_au_mv_pred_buf_mgr_t
|
||||||
|
{
|
||||||
|
void *pv_mem;
|
||||||
|
|
||||||
|
buf_mgr_t *ps_buf_mgr_ctxt;
|
||||||
|
|
||||||
|
void *pv_au_mv_pred_buf_base;
|
||||||
|
|
||||||
|
mvc_au_mv_pred_t *aps_buf_id_to_mv_pred_buf_map[MAX_DISP_BUFS_NEW];
|
||||||
|
|
||||||
|
} mvc_au_mv_pred_buf_mgr_t;
|
||||||
|
|
||||||
|
typedef struct subset_sps_t
|
||||||
|
{
|
||||||
|
dec_seq_params_t s_sps_data;
|
||||||
|
|
||||||
|
sps_mvc_ext_t s_sps_mvc_ext;
|
||||||
|
|
||||||
|
mvc_vui_ext_t s_mvc_vui_ext;
|
||||||
|
|
||||||
|
offsets_t s_disp_offsets;
|
||||||
|
|
||||||
|
UWORD8 u1_mvc_vui_parameters_present_flag;
|
||||||
|
|
||||||
|
} subset_sps_t;
|
||||||
|
|
||||||
|
typedef struct ref_pic_list_mod_data_t
|
||||||
|
{
|
||||||
|
UWORD8 au1_num_active_refs[2];
|
||||||
|
|
||||||
|
UWORD8 au1_ref_pic_list_modification_flag_lx[2];
|
||||||
|
|
||||||
|
UWORD8 au1_modification_of_pic_nums_idc[2][MVC_MAX_REF_PICS + 1];
|
||||||
|
|
||||||
|
WORD32 ai4_abs_diff_pic_num_minus1[2][MVC_MAX_REF_PICS + 1];
|
||||||
|
|
||||||
|
WORD32 ai4_long_term_pic_num[2][MVC_MAX_REF_PICS + 1];
|
||||||
|
|
||||||
|
WORD32 ai4_abs_diff_view_idx_minus1[2][MVC_MAX_REF_PICS + 1];
|
||||||
|
} ref_pic_list_mod_data_t;
|
||||||
|
|
||||||
|
typedef struct mvc_dec_ctxt_t
|
||||||
|
{
|
||||||
|
dec_struct_t s_view_dec_ctxt;
|
||||||
|
|
||||||
|
iv_mvc_yuv_buf_t s_out_buffer;
|
||||||
|
|
||||||
|
/* Resolves circular dependency with mvc_dpb_manager_t */
|
||||||
|
void *ps_dpb_mgr;
|
||||||
|
|
||||||
|
subset_sps_t as_subset_sps[MAX_NUM_SEQ_PARAMS];
|
||||||
|
|
||||||
|
/* Indexed via viewOrderID */
|
||||||
|
nalu_mvc_ext_t as_nalu_mvc_ext[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
/* Indexed via viewOrderID */
|
||||||
|
dec_slice_params_t as_slices[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
ref_pic_list_mod_data_t as_ref_pic_list_mod_data[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
subset_sps_t *aps_pps_id_to_subset_sps_map[MAX_NUM_PIC_PARAMS];
|
||||||
|
|
||||||
|
disp_mgr_t s_mvc_disp_buf_mgr;
|
||||||
|
|
||||||
|
mvc_au_buf_mgr_t s_mvc_au_buf_mgr;
|
||||||
|
|
||||||
|
mvc_au_mv_pred_buf_mgr_t s_mvc_au_mv_pred_buf_mgr;
|
||||||
|
|
||||||
|
mvc_au_buffer_t *ps_cur_au;
|
||||||
|
|
||||||
|
AVC_EXT_NALU_ID_T ae_nalu_id[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
UWORD8 au1_nal_ref_idc[MAX_NUM_VIEWS];
|
||||||
|
|
||||||
|
UWORD32 u4_num_aus_decoded;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views;
|
||||||
|
|
||||||
|
UWORD16 u2_num_views_decoded;
|
||||||
|
|
||||||
|
UWORD8 u1_num_sps;
|
||||||
|
|
||||||
|
UWORD8 u1_num_subset_sps;
|
||||||
|
|
||||||
|
UWORD8 u1_num_pps;
|
||||||
|
|
||||||
|
bool b_header_only_decode;
|
||||||
|
|
||||||
|
bool b_flush_enabled;
|
||||||
|
|
||||||
|
} mvc_dec_ctxt_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
1139
decoder/mvc/imvcd_utils.c
Normal file
1139
decoder/mvc/imvcd_utils.c
Normal file
File diff suppressed because it is too large
Load diff
121
decoder/mvc/imvcd_utils.h
Normal file
121
decoder/mvc/imvcd_utils.h
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* File Name : imvcd_utils.c */
|
||||||
|
/* */
|
||||||
|
/* Description : MVCD Utility functions used by 'imvcd_api.c' */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _IMVCD_UTILS_H_
|
||||||
|
#define _IMVCD_UTILS_H_
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvc_defs.h"
|
||||||
|
#include "ih264d_mvpred.h"
|
||||||
|
#include "ih264d_structs.h"
|
||||||
|
#include "imvcd_structs.h"
|
||||||
|
|
||||||
|
#define SWAP(x, y, data_type) \
|
||||||
|
{ \
|
||||||
|
data_type temp; \
|
||||||
|
memcpy(&temp, &y, sizeof(data_type)); \
|
||||||
|
memcpy(&y, &x, sizeof(data_type)); \
|
||||||
|
memcpy(&x, &temp, sizeof(data_type)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
extern IV_API_CALL_STATUS_T imvcd_get_next_display_au_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern UWORD32 imvcd_get_num_mbs_in_level(UWORD8 u1_level_idc);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_allocate_dynamic_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern WORD16 imvcd_free_dynamic_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_init_au_buffers(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_init_au_mv_pred_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern void imvcd_convert_au_buf_to_view_buf(mvc_au_buffer_t *ps_au_buf, pic_buffer_t *ps_view_buf,
|
||||||
|
UWORD16 u2_view_order_id, UWORD16 u2_view_id);
|
||||||
|
|
||||||
|
extern void imvcd_init_ref_idx_to_ref_buf_map(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern void imvcd_ivp_buf_copier(mvc_au_buffer_t *ps_au_buf_src, mvc_au_buffer_t *ps_au_buf_dst,
|
||||||
|
mvc_au_mv_pred_t *ps_au_mv_data_src,
|
||||||
|
mvc_au_mv_pred_t *ps_au_mv_data_dst, UWORD16 u2_src_view_id,
|
||||||
|
UWORD16 u2_dst_view_id);
|
||||||
|
|
||||||
|
/* Function defined in 'ih264d_utils.c' and declared nowhere else */
|
||||||
|
extern WORD32 ih264d_init_dec_mb_grp(dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern void ih264d_get_implicit_weights(dec_struct_t *ps_dec);
|
||||||
|
|
||||||
|
extern void imvcd_free_ref_bufs(mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
|
||||||
|
mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
|
||||||
|
WORD32 i4_pic_buf_id);
|
||||||
|
|
||||||
|
extern void imvcd_release_all_ref_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt, WORD32 i4_num_bufs);
|
||||||
|
|
||||||
|
extern void imvcd_free_ref_and_io_bufs(mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
|
||||||
|
mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
|
||||||
|
WORD32 i4_pic_buf_id);
|
||||||
|
|
||||||
|
extern void imvcd_release_all_ref_and_io_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt, WORD32 i4_num_bufs);
|
||||||
|
|
||||||
|
extern bool is_header_decoded(WORD32 i4_header_decoded, AVC_EXT_NALU_ID_T e_nalu_id);
|
||||||
|
|
||||||
|
extern bool is_mvc_nalu(AVC_EXT_NALU_ID_T e_nalu_id);
|
||||||
|
|
||||||
|
extern bool is_slice_nalu_type(AVC_EXT_NALU_ID_T e_nalu_id);
|
||||||
|
|
||||||
|
extern nalu_mvc_ext_t *imvcd_get_cur_nalu_mvc_ext(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern nalu_mvc_ext_t *imvcd_get_nalu_mvc_ext(nalu_mvc_ext_t *ps_nalu_mvc_exts,
|
||||||
|
UWORD16 u2_num_views_decoded, UWORD16 u2_view_id);
|
||||||
|
|
||||||
|
extern ref_pic_list_mod_data_t *imvcd_get_cur_ref_pic_list_mod_data(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern subset_sps_t *imvcd_get_valid_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern void imvcd_modulate_max_disp_seq(dec_struct_t *ps_view_ctxt);
|
||||||
|
|
||||||
|
extern mv_pred_t imvcd_get_default_mv_pred(void);
|
||||||
|
|
||||||
|
extern UWORD32 imvcd_get_max_num_ivp_refs(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern bool imvcd_is_idr_au(mvc_dec_ctxt_t *ps_mvcd_ctxt);
|
||||||
|
|
||||||
|
extern coordinates_t imvcd_get_buf_pad_dims(bool b_is_chroma);
|
||||||
|
|
||||||
|
extern WORD32 imvcd_get_ref_pic_pad_offset(WORD32 i4_stride, bool b_is_chroma);
|
||||||
|
|
||||||
|
extern UWORD32 imvcd_get_next_bits(dec_bit_stream_t *ps_bitstream);
|
||||||
|
|
||||||
|
extern void imvcd_set_view_buf_id_to_buf_map(dec_struct_t *ps_view_ctxt);
|
||||||
|
|
||||||
|
#endif
|
||||||
61
decoder/mvc/libmvcdec.cmake
Normal file
61
decoder/mvc/libmvcdec.cmake
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# src files
|
||||||
|
list(
|
||||||
|
APPEND
|
||||||
|
LIBMVCDEC_SRCS
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_api.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_bitstrm.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_cabac.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_cabac_init_tables.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_compute_bs.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_deblocking.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_dpb_mgr.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_format_conv.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_function_selector_generic.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_inter_pred.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_mb_utils.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_mvpred.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_nal.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_bslice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_cabac.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_cavlc.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_headers.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_islice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_mb_header.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_pslice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_parse_slice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_process_bslice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_process_intra_mb.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_process_pslice.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_quant_scaling.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_sei.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_tables.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_thread_compute_bs.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_thread_parse_decode.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_utils.c"
|
||||||
|
"${AVC_ROOT}/decoder/ih264d_vui.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_api.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_api_utils.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_dpb_manager.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_error_handler.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_nalu_parser.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_slice_functions.c"
|
||||||
|
"${AVC_ROOT}/decoder/mvc/imvcd_utils.c")
|
||||||
|
|
||||||
|
include_directories(${AVC_ROOT}/decoder)
|
||||||
|
include_directories(${AVC_ROOT}/decoder/mvc)
|
||||||
|
|
||||||
|
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}"
|
||||||
|
STREQUAL "aarch32")
|
||||||
|
list(
|
||||||
|
APPEND LIBMVCDEC_ASMS "${AVC_ROOT}/decoder/arm/ih264d_function_selector.c"
|
||||||
|
"${AVC_ROOT}/decoder/arm/ih264d_function_selector_a9q.c"
|
||||||
|
"${AVC_ROOT}/decoder/arm/ih264d_function_selector_av8.c")
|
||||||
|
else()
|
||||||
|
list(
|
||||||
|
APPEND LIBMVCDEC_ASMS "${AVC_ROOT}/decoder/x86/ih264d_function_selector.c"
|
||||||
|
"${AVC_ROOT}/decoder/x86/ih264d_function_selector_sse42.c"
|
||||||
|
"${AVC_ROOT}/decoder/x86/ih264d_function_selector_ssse3.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(libmvcdec STATIC ${LIBAVC_COMMON_SRCS} ${LIBAVC_COMMON_ASMS}
|
||||||
|
${LIBMVCDEC_SRCS} ${LIBMVCDEC_ASMS})
|
||||||
|
|
@ -7,16 +7,10 @@ package {
|
||||||
default_applicable_licenses: ["external_libavc_license"],
|
default_applicable_licenses: ["external_libavc_license"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_fuzz {
|
cc_defaults {
|
||||||
name: "avc_dec_fuzzer",
|
name: "libavc_mvc_fuzzer_defaults",
|
||||||
host_supported: true,
|
host_supported:true,
|
||||||
srcs: [
|
static_libs: ["liblog"],
|
||||||
"avc_dec_fuzzer.cpp",
|
|
||||||
],
|
|
||||||
static_libs: [
|
|
||||||
"libavcdec",
|
|
||||||
"liblog",
|
|
||||||
],
|
|
||||||
target: {
|
target: {
|
||||||
darwin: {
|
darwin: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
|
|
@ -30,6 +24,28 @@ cc_fuzz {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc_fuzz {
|
||||||
|
name: "avc_dec_fuzzer",
|
||||||
|
defaults: ["libavc_mvc_fuzzer_defaults"],
|
||||||
|
srcs: [
|
||||||
|
"avc_dec_fuzzer.cpp",
|
||||||
|
],
|
||||||
|
static_libs: [
|
||||||
|
"libavcdec",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_fuzz {
|
||||||
|
name: "mvc_dec_fuzzer",
|
||||||
|
defaults: ["libavc_mvc_fuzzer_defaults"],
|
||||||
|
srcs: [
|
||||||
|
"mvc_dec_fuzzer.cpp",
|
||||||
|
],
|
||||||
|
static_libs: [
|
||||||
|
"libmvcdec",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
cc_fuzz {
|
cc_fuzz {
|
||||||
name: "avc_enc_fuzzer",
|
name: "avc_enc_fuzzer",
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ Create a directory CORPUS_DIR and copy some elementary h264 files
|
||||||
To run the fuzzers
|
To run the fuzzers
|
||||||
```
|
```
|
||||||
$ ./avc_dec_fuzzer CORPUS_DIR
|
$ ./avc_dec_fuzzer CORPUS_DIR
|
||||||
|
$ ./mvc_dec_fuzzer CORPUS_DIR
|
||||||
$ ./avc_enc_fuzzer CORPUS_DIR
|
$ ./avc_enc_fuzzer CORPUS_DIR
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -45,6 +46,7 @@ $ ./avc_enc_fuzzer CORPUS_DIR
|
||||||
Build the fuzzers
|
Build the fuzzers
|
||||||
```
|
```
|
||||||
$ mm -j$(nproc) avc_dec_fuzzer
|
$ mm -j$(nproc) avc_dec_fuzzer
|
||||||
|
$ mm -j$(nproc) mvc_dec_fuzzer
|
||||||
$ mm -j$(nproc) avc_enc_fuzzer
|
$ mm -j$(nproc) avc_enc_fuzzer
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -58,6 +60,11 @@ To run avc_dec_fuzzer on device
|
||||||
$ adb sync data
|
$ adb sync data
|
||||||
$ adb shell /data/fuzz/arm64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR
|
$ adb shell /data/fuzz/arm64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR
|
||||||
```
|
```
|
||||||
|
To run mvc_dec_fuzzer on device
|
||||||
|
```
|
||||||
|
$ adb sync data
|
||||||
|
$ adb shell /data/fuzz/arm64/mvc_dec_fuzzer/mvc_dec_fuzzer CORPUS_DIR
|
||||||
|
```
|
||||||
To run avc_enc_fuzzer on device
|
To run avc_enc_fuzzer on device
|
||||||
```
|
```
|
||||||
$ adb sync data
|
$ adb sync data
|
||||||
|
|
@ -69,6 +76,11 @@ To run avc_dec_fuzzer on host
|
||||||
$ $ANDROID_HOST_OUT/fuzz/x86_64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR
|
$ $ANDROID_HOST_OUT/fuzz/x86_64/avc_dec_fuzzer/avc_dec_fuzzer CORPUS_DIR
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To run mvc_dec_fuzzer on host
|
||||||
|
```
|
||||||
|
$ $ANDROID_HOST_OUT/fuzz/x86_64/mvc_dec_fuzzer/mvc_dec_fuzzer CORPUS_DIR
|
||||||
|
```
|
||||||
|
|
||||||
To run avc_enc_fuzzer on host
|
To run avc_enc_fuzzer on host
|
||||||
```
|
```
|
||||||
$ $ANDROID_HOST_OUT/fuzz/x86_64/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR
|
$ $ANDROID_HOST_OUT/fuzz/x86_64/avc_enc_fuzzer/avc_enc_fuzzer CORPUS_DIR
|
||||||
|
|
|
||||||
2
fuzzer/mvc_dec_fuzzer.cmake
Normal file
2
fuzzer/mvc_dec_fuzzer.cmake
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
libavc_add_fuzzer(mvc_dec_fuzzer libmvcdec SOURCES
|
||||||
|
"${AVC_ROOT}/fuzzer/mvc_dec_fuzzer.cpp")
|
||||||
416
fuzzer/mvc_dec_fuzzer.cpp
Normal file
416
fuzzer/mvc_dec_fuzzer.cpp
Normal file
|
|
@ -0,0 +1,416 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*****************************************************************************
|
||||||
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
||||||
|
*/
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "ih264_typedefs.h"
|
||||||
|
#include "imvcd.h"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAX_NUM_VIEWS 6
|
||||||
|
|
||||||
|
#define NUM_COMPONENTS 3
|
||||||
|
|
||||||
|
#define NELEMENTS(x) (sizeof(x) / sizeof(x[0]))
|
||||||
|
|
||||||
|
typedef enum ARG_OFFSETS_T
|
||||||
|
{
|
||||||
|
OFFSET_COLOR_FORMAT = 6,
|
||||||
|
OFFSET_NUM_CORES,
|
||||||
|
OFFSET_ARCH,
|
||||||
|
/* Should be the last entry */
|
||||||
|
OFFSET_MAX,
|
||||||
|
} ARG_OFFSETS_T;
|
||||||
|
|
||||||
|
static const IV_COLOR_FORMAT_T supportedColorFormats[] = {IV_YUV_420P};
|
||||||
|
static const IVD_ARCH_T supportedArchitectures[] = {ARCH_ARM_NEONINTR, ARCH_X86_GENERIC,
|
||||||
|
ARCH_X86_SSSE3, ARCH_X86_SSE42};
|
||||||
|
static const int kMaxNumDecodeCalls = 1000;
|
||||||
|
static const int kSupportedColorFormats = NELEMENTS(supportedColorFormats);
|
||||||
|
static const int kSupportedArchitectures = NELEMENTS(supportedArchitectures);
|
||||||
|
static const int kMaxCores = 3;
|
||||||
|
|
||||||
|
static inline void *mvcd_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
|
||||||
|
{
|
||||||
|
void *buf = nullptr;
|
||||||
|
(void) pv_ctxt;
|
||||||
|
|
||||||
|
if(0 != posix_memalign(&buf, alignment, i4_size))
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void mvcd_aligned_free(void *pv_ctxt, void *pv_buf)
|
||||||
|
{
|
||||||
|
(void) pv_ctxt;
|
||||||
|
free(pv_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Codec
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Codec(IV_COLOR_FORMAT_T colorFormat, size_t numCores);
|
||||||
|
~Codec();
|
||||||
|
|
||||||
|
void resetCodec();
|
||||||
|
WORD32 allocFrame();
|
||||||
|
void freeFrame();
|
||||||
|
IV_API_CALL_STATUS_T decodeHeader(const uint8_t *data, size_t size);
|
||||||
|
IV_API_CALL_STATUS_T decodeFrame(const uint8_t *data, size_t size, size_t *bytesConsumed);
|
||||||
|
void setArchitecture(IVD_ARCH_T arch);
|
||||||
|
void setBufInfo();
|
||||||
|
void setCores();
|
||||||
|
|
||||||
|
ivd_out_bufdesc_t *getOutBuf() { return &mOutBufHandle; }
|
||||||
|
|
||||||
|
iv_yuv_buf_t *getViewDispBuf(UWORD16 u2_view_id = 0) { return &as_view_disp_bufs[u2_view_id]; }
|
||||||
|
|
||||||
|
UWORD32 getNumViews() { return mBufInfo.s_mvc_buf_info.u2_num_views; }
|
||||||
|
|
||||||
|
iv_obj_t *getCodecHandle() { return mCodec; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
iv_obj_t *mCodec;
|
||||||
|
ivd_out_bufdesc_t mOutBufHandle;
|
||||||
|
iv_yuv_buf_t as_view_disp_bufs[MAX_NUM_VIEWS];
|
||||||
|
imvcd_get_buf_info_op_t mBufInfo;
|
||||||
|
IV_COLOR_FORMAT_T mColorFormat;
|
||||||
|
size_t mNumCores;
|
||||||
|
uint32_t mWidth;
|
||||||
|
uint32_t mHeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
Codec::Codec(IV_COLOR_FORMAT_T colorFormat, size_t numCores)
|
||||||
|
: mCodec(nullptr), mColorFormat(colorFormat), mNumCores(numCores), mWidth(0), mHeight(0)
|
||||||
|
{
|
||||||
|
imvcd_create_ip_t s_create_ip;
|
||||||
|
imvcd_create_op_t s_create_op;
|
||||||
|
|
||||||
|
s_create_ip.s_ivd_ip.e_cmd = IVD_CMD_CREATE;
|
||||||
|
s_create_ip.s_ivd_ip.e_output_format = colorFormat;
|
||||||
|
s_create_ip.s_ivd_ip.pf_aligned_alloc = mvcd_aligned_malloc;
|
||||||
|
s_create_ip.s_ivd_ip.pf_aligned_free = mvcd_aligned_free;
|
||||||
|
s_create_ip.s_ivd_ip.u4_share_disp_buf = 0;
|
||||||
|
s_create_ip.s_ivd_ip.pv_mem_ctxt = nullptr;
|
||||||
|
|
||||||
|
s_create_ip.s_ivd_ip.u4_size = sizeof(s_create_ip.s_ivd_ip);
|
||||||
|
s_create_op.s_ivd_op.u4_size = sizeof(s_create_op.s_ivd_op);
|
||||||
|
|
||||||
|
imvcd_api_function(NULL, &s_create_ip, &s_create_op);
|
||||||
|
|
||||||
|
mCodec = static_cast<iv_obj_t *>(s_create_op.s_ivd_op.pv_handle);
|
||||||
|
|
||||||
|
setCores();
|
||||||
|
|
||||||
|
memset(getOutBuf(), 0, sizeof(getOutBuf()[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Codec::~Codec()
|
||||||
|
{
|
||||||
|
imvcd_delete_ip_t s_delete_ip;
|
||||||
|
imvcd_delete_op_t s_delete_op;
|
||||||
|
|
||||||
|
s_delete_ip.s_ivd_ip.e_cmd = IVD_CMD_DELETE;
|
||||||
|
|
||||||
|
s_delete_ip.s_ivd_ip.u4_size = sizeof(s_delete_ip.s_ivd_ip);
|
||||||
|
s_delete_op.s_ivd_op.u4_size = sizeof(s_delete_op.s_ivd_op);
|
||||||
|
|
||||||
|
imvcd_api_function(mCodec, &s_delete_ip, &s_delete_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Codec::setCores()
|
||||||
|
{
|
||||||
|
imvcd_set_num_cores_ip_t s_ctl_ip;
|
||||||
|
imvcd_set_num_cores_op_t s_ctl_op;
|
||||||
|
|
||||||
|
s_ctl_ip.u4_size = sizeof(s_ctl_ip);
|
||||||
|
s_ctl_op.u4_size = sizeof(s_ctl_op);
|
||||||
|
s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
|
||||||
|
s_ctl_ip.e_sub_cmd = static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IMVCD_CTL_SET_NUM_CORES);
|
||||||
|
s_ctl_ip.u4_num_cores = mNumCores;
|
||||||
|
|
||||||
|
imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Codec::setArchitecture(IVD_ARCH_T e_arch)
|
||||||
|
{
|
||||||
|
imvcd_set_arch_ip_t s_ctl_ip;
|
||||||
|
imvcd_set_arch_op_t s_ctl_op;
|
||||||
|
|
||||||
|
s_ctl_ip.u4_size = sizeof(s_ctl_ip);
|
||||||
|
s_ctl_op.u4_size = sizeof(s_ctl_op);
|
||||||
|
s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
|
||||||
|
s_ctl_ip.e_sub_cmd = static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IMVCD_CTL_SET_PROCESSOR);
|
||||||
|
s_ctl_ip.e_arch = e_arch;
|
||||||
|
s_ctl_ip.e_soc = SOC_GENERIC;
|
||||||
|
|
||||||
|
imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Codec::setBufInfo()
|
||||||
|
{
|
||||||
|
imvcd_get_buf_info_ip_t s_ctl_ip;
|
||||||
|
imvcd_get_buf_info_op_t s_ctl_op;
|
||||||
|
|
||||||
|
s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
|
||||||
|
s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
|
||||||
|
s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
|
||||||
|
s_ctl_ip.s_ivd_ip.e_sub_cmd =
|
||||||
|
static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IVD_CMD_CTL_GETBUFINFO);
|
||||||
|
|
||||||
|
imvcd_api_function(mCodec, &s_ctl_ip, &s_ctl_op);
|
||||||
|
|
||||||
|
mBufInfo = s_ctl_op;
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD32 Codec::allocFrame()
|
||||||
|
{
|
||||||
|
if(getNumViews() > MAX_NUM_VIEWS)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mBufInfo.s_ivd_op.u4_min_num_out_bufs < (NUM_COMPONENTS * getNumViews()))
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
getOutBuf()->u4_num_bufs = mBufInfo.s_ivd_op.u4_min_num_out_bufs;
|
||||||
|
|
||||||
|
for(UWORD32 i = 0; i < getOutBuf()->u4_num_bufs; i++)
|
||||||
|
{
|
||||||
|
getOutBuf()->u4_min_out_buf_size[i] = mBufInfo.s_ivd_op.u4_min_out_buf_size[i];
|
||||||
|
getOutBuf()->pu1_bufs[i] =
|
||||||
|
(UWORD8 *) mvcd_aligned_malloc(nullptr, 16, mBufInfo.s_ivd_op.u4_min_out_buf_size[i]);
|
||||||
|
|
||||||
|
if(getOutBuf()->pu1_bufs[i] == nullptr)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Codec::freeFrame()
|
||||||
|
{
|
||||||
|
for(UWORD32 i = 0; i < getOutBuf()->u4_num_bufs; i++)
|
||||||
|
{
|
||||||
|
if(getOutBuf()->pu1_bufs[i])
|
||||||
|
{
|
||||||
|
mvcd_aligned_free(nullptr, getOutBuf()->pu1_bufs[i]);
|
||||||
|
getOutBuf()->pu1_bufs[i] = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sendDecodeSignal(iv_obj_t *psCodec, IVD_VIDEO_DECODE_MODE_T eDecMode)
|
||||||
|
{
|
||||||
|
imvcd_set_config_ip_t s_ctl_ip;
|
||||||
|
imvcd_set_config_op_t s_ctl_op;
|
||||||
|
|
||||||
|
s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
|
||||||
|
s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
|
||||||
|
s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
|
||||||
|
s_ctl_ip.s_ivd_ip.e_sub_cmd =
|
||||||
|
static_cast<IVD_CONTROL_API_COMMAND_TYPE_T>(IVD_CMD_CTL_SETPARAMS);
|
||||||
|
|
||||||
|
s_ctl_ip.s_ivd_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
|
||||||
|
s_ctl_ip.s_ivd_ip.e_frm_skip_mode = IVD_SKIP_NONE;
|
||||||
|
s_ctl_ip.s_ivd_ip.e_vid_dec_mode = eDecMode;
|
||||||
|
|
||||||
|
imvcd_api_function(psCodec, &s_ctl_ip, &s_ctl_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T Codec::decodeHeader(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
IV_API_CALL_STATUS_T ret;
|
||||||
|
|
||||||
|
WORD32 numBytesRemaining = size;
|
||||||
|
|
||||||
|
sendDecodeSignal(mCodec, IVD_DECODE_HEADER);
|
||||||
|
|
||||||
|
while(size > 0)
|
||||||
|
{
|
||||||
|
imvcd_video_decode_ip_t s_video_decode_ip;
|
||||||
|
imvcd_video_decode_op_t s_video_decode_op;
|
||||||
|
|
||||||
|
UWORD32 u4_num_bytes_dec = 0;
|
||||||
|
|
||||||
|
memset(&s_video_decode_ip, 0, sizeof(s_video_decode_ip));
|
||||||
|
memset(&s_video_decode_op, 0, sizeof(s_video_decode_op));
|
||||||
|
|
||||||
|
s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_ts = 0;
|
||||||
|
s_video_decode_ip.s_ivd_ip.pv_stream_buffer =
|
||||||
|
static_cast<void *>(const_cast<uint8_t *>(data));
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_num_Bytes = numBytesRemaining;
|
||||||
|
s_video_decode_ip.s_ivd_ip.s_out_buffer = getOutBuf()[0];
|
||||||
|
s_video_decode_op.ps_view_disp_bufs = getViewDispBuf();
|
||||||
|
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
|
||||||
|
s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
|
||||||
|
|
||||||
|
ret = imvcd_api_function(mCodec, &s_video_decode_ip, &s_video_decode_op);
|
||||||
|
|
||||||
|
if(IV_SUCCESS != ret)
|
||||||
|
{
|
||||||
|
return IV_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
u4_num_bytes_dec = s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
|
||||||
|
|
||||||
|
data += u4_num_bytes_dec;
|
||||||
|
numBytesRemaining -= u4_num_bytes_dec;
|
||||||
|
mWidth = s_video_decode_op.s_ivd_op.u4_pic_wd;
|
||||||
|
mHeight = s_video_decode_op.s_ivd_op.u4_pic_ht;
|
||||||
|
|
||||||
|
/* Break after successful header decode */
|
||||||
|
if(mWidth && mHeight)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if width / height are invalid, set them to defaults */
|
||||||
|
if(!mWidth)
|
||||||
|
{
|
||||||
|
mWidth = 1920;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!mHeight)
|
||||||
|
{
|
||||||
|
mHeight = 1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
setBufInfo();
|
||||||
|
|
||||||
|
return IV_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T Codec::decodeFrame(const uint8_t *data, size_t size, size_t *bytesConsumed)
|
||||||
|
{
|
||||||
|
imvcd_video_decode_ip_t s_video_decode_ip;
|
||||||
|
imvcd_video_decode_op_t s_video_decode_op;
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T ret;
|
||||||
|
|
||||||
|
memset(&s_video_decode_ip, 0, sizeof(s_video_decode_ip));
|
||||||
|
memset(&s_video_decode_op, 0, sizeof(s_video_decode_op));
|
||||||
|
|
||||||
|
sendDecodeSignal(mCodec, IVD_DECODE_FRAME);
|
||||||
|
|
||||||
|
s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_ts = 0;
|
||||||
|
s_video_decode_ip.s_ivd_ip.pv_stream_buffer = static_cast<void *>(const_cast<uint8_t *>(data));
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_num_Bytes = size;
|
||||||
|
s_video_decode_ip.s_ivd_ip.s_out_buffer = getOutBuf()[0];
|
||||||
|
s_video_decode_op.ps_view_disp_bufs = getViewDispBuf();
|
||||||
|
|
||||||
|
s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
|
||||||
|
s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
|
||||||
|
|
||||||
|
ret = imvcd_api_function(mCodec, &s_video_decode_ip, &s_video_decode_op);
|
||||||
|
|
||||||
|
bytesConsumed[0] = s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
|
||||||
|
|
||||||
|
if(s_video_decode_op.s_ivd_op.u4_pic_wd && s_video_decode_op.s_ivd_op.u4_pic_ht &&
|
||||||
|
((mWidth != s_video_decode_op.s_ivd_op.u4_pic_wd) ||
|
||||||
|
(mHeight != s_video_decode_op.s_ivd_op.u4_pic_ht)))
|
||||||
|
{
|
||||||
|
mWidth = s_video_decode_op.s_ivd_op.u4_pic_wd;
|
||||||
|
mHeight = s_video_decode_op.s_ivd_op.u4_pic_ht;
|
||||||
|
freeFrame();
|
||||||
|
allocFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
|
if(size < 1)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD32 ret;
|
||||||
|
|
||||||
|
size_t colorFormatOfst = std::min((size_t) OFFSET_COLOR_FORMAT, size - 1);
|
||||||
|
size_t numCoresOfst = std::min((size_t) OFFSET_NUM_CORES, size - 1);
|
||||||
|
size_t architectureOfst = std::min((size_t) OFFSET_ARCH, size - 1);
|
||||||
|
size_t architectureIdx = data[architectureOfst] % kSupportedArchitectures;
|
||||||
|
size_t colorFormatIdx = data[colorFormatOfst] % kSupportedColorFormats;
|
||||||
|
uint32_t numCores = (data[numCoresOfst] % kMaxCores) + 1;
|
||||||
|
uint32_t numDecodeCalls = 0;
|
||||||
|
|
||||||
|
IVD_ARCH_T arch = (IVD_ARCH_T) supportedArchitectures[architectureIdx];
|
||||||
|
IV_COLOR_FORMAT_T colorFormat = (IV_COLOR_FORMAT_T) (supportedColorFormats[colorFormatIdx]);
|
||||||
|
|
||||||
|
Codec cCodec = Codec(colorFormat, numCores);
|
||||||
|
|
||||||
|
cCodec.setArchitecture(arch);
|
||||||
|
|
||||||
|
ret = cCodec.decodeHeader(data, size);
|
||||||
|
|
||||||
|
if(IV_SUCCESS != ret)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cCodec.allocFrame();
|
||||||
|
|
||||||
|
if(IV_SUCCESS != ret)
|
||||||
|
{
|
||||||
|
cCodec.freeFrame();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while((size > 0) && (numDecodeCalls < kMaxNumDecodeCalls))
|
||||||
|
{
|
||||||
|
size_t bytesConsumed;
|
||||||
|
|
||||||
|
IV_API_CALL_STATUS_T ret = cCodec.decodeFrame(data, size, &bytesConsumed);
|
||||||
|
|
||||||
|
if(ret != IV_SUCCESS)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bytesConsumed = std::min(size, bytesConsumed);
|
||||||
|
data += bytesConsumed;
|
||||||
|
size -= bytesConsumed;
|
||||||
|
numDecodeCalls++;
|
||||||
|
}
|
||||||
|
|
||||||
|
cCodec.freeFrame();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -7,8 +7,8 @@ package {
|
||||||
default_applicable_licenses: ["external_libavc_license"],
|
default_applicable_licenses: ["external_libavc_license"],
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_test {
|
cc_defaults {
|
||||||
name: "avcdec",
|
name: "libavc_mvc_app_defaults",
|
||||||
gtest: false,
|
gtest: false,
|
||||||
host_supported:true,
|
host_supported:true,
|
||||||
cflags: [
|
cflags: [
|
||||||
|
|
@ -19,11 +19,6 @@ cc_test {
|
||||||
"-Wall",
|
"-Wall",
|
||||||
"-Werror",
|
"-Werror",
|
||||||
],
|
],
|
||||||
local_include_dirs: [
|
|
||||||
"decoder/",
|
|
||||||
],
|
|
||||||
srcs: ["decoder/main.c"],
|
|
||||||
static_libs: ["libavcdec"],
|
|
||||||
shared_libs: ["liblog"],
|
shared_libs: ["liblog"],
|
||||||
target: {
|
target: {
|
||||||
darwin: {
|
darwin: {
|
||||||
|
|
@ -32,6 +27,28 @@ cc_test {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cc_test {
|
||||||
|
name: "avcdec",
|
||||||
|
defaults: ["libavc_mvc_app_defaults"],
|
||||||
|
local_include_dirs: [
|
||||||
|
"decoder/",
|
||||||
|
],
|
||||||
|
srcs: ["decoder/main.c"],
|
||||||
|
static_libs: ["libavcdec"],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_test {
|
||||||
|
name: "mvcdec",
|
||||||
|
defaults: ["libavc_mvc_app_defaults"],
|
||||||
|
local_include_dirs: [
|
||||||
|
"mvcdec/",
|
||||||
|
],
|
||||||
|
srcs: ["mvcdec/main.c"],
|
||||||
|
static_libs: [
|
||||||
|
"libmvcdec",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
cc_test {
|
cc_test {
|
||||||
name: "avcenc",
|
name: "avcenc",
|
||||||
gtest: false,
|
gtest: false,
|
||||||
|
|
|
||||||
12
test/mvcdec/dec.cfg
Normal file
12
test/mvcdec/dec.cfg
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
--input input.h264
|
||||||
|
--save_output 0
|
||||||
|
--num_frames -1
|
||||||
|
--output out.yuv
|
||||||
|
--chroma_format YUV_420P
|
||||||
|
--share_display_buf 0
|
||||||
|
--num_cores 3
|
||||||
|
--loopback 0
|
||||||
|
--display 0
|
||||||
|
--fps 59.94
|
||||||
|
--arch ARM_A9Q
|
||||||
|
--soc GENERIC
|
||||||
1544
test/mvcdec/main.c
Normal file
1544
test/mvcdec/main.c
Normal file
File diff suppressed because it is too large
Load diff
3
test/mvcdec/mvcdec.cmake
Normal file
3
test/mvcdec/mvcdec.cmake
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
list(APPEND MVC_DEC_APP_SRCS "${AVC_ROOT}/test/mvcdec/main.c")
|
||||||
|
|
||||||
|
libavc_add_executable(mvcdec libmvcdec SOURCES ${MVC_DEC_APP_SRCS})
|
||||||
Loading…
Add table
Add a link
Reference in a new issue