10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * 40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License. 60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at 70c1bc742181ded4930842b46e9507372f0b1b963James Dong * 80c1bc742181ded4930842b46e9507372f0b1b963James Dong * http://www.apache.org/licenses/LICENSE-2.0 90c1bc742181ded4930842b46e9507372f0b1b963James Dong * 100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software 110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS, 120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License. 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 180c1bc742181ded4930842b46e9507372f0b1b963James Dong 190c1bc742181ded4930842b46e9507372f0b1b963James Dong Table of contents 200c1bc742181ded4930842b46e9507372f0b1b963James Dong 210c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 220c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. External compiler flags 230c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Module defines 240c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Local function prototypes 250c1bc742181ded4930842b46e9507372f0b1b963James Dong 5. Functions 260c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeSeiMessage 270c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeBufferingPeriod 280c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodePictureTiming 290c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodePanScanRectangle 300c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeFillerPayload 310c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeUserDataRegisteredITuTT35 320c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeUserDataUnregistered 330c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeRecoveryPoint 340c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeDecRefPicMarkingRepetition 350c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeSparePic 360c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeSceneInfo 370c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeSubSeqInfo 380c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeSubSeqLayerCharacteristics 390c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeSubSeqCharacteristics 400c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeFullFrameFreeze 410c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeFullFrameSnapshot 420c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeProgressiveRefinementSegmentStart 430c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeProgressiveRefinementSegmentEnd 440c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeMotionConstrainedSliceGroupSet 450c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeReservedSeiMessage 460c1bc742181ded4930842b46e9507372f0b1b963James Dong 470c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 480c1bc742181ded4930842b46e9507372f0b1b963James Dong 490c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 500c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 510c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 520c1bc742181ded4930842b46e9507372f0b1b963James Dong 530c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_sei.h" 540c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "basetype.h" 550c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_util.h" 560c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_stream.h" 570c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_vlc.h" 580c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_seq_param_set.h" 590c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_slice_header.h" 600c1bc742181ded4930842b46e9507372f0b1b963James Dong 610c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 620c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. External compiler flags 630c1bc742181ded4930842b46e9507372f0b1b963James Dong-------------------------------------------------------------------------------- 640c1bc742181ded4930842b46e9507372f0b1b963James Dong 650c1bc742181ded4930842b46e9507372f0b1b963James Dong-------------------------------------------------------------------------------- 660c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Module defines 670c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 680c1bc742181ded4930842b46e9507372f0b1b963James Dong 690c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u32 numClockTS[9] = {1,1,1,2,2,3,3,2,3}; 700c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u32 ceilLog2NumSliceGroups[9] = {0,1,1,2,2,3,3,3,3}; 710c1bc742181ded4930842b46e9507372f0b1b963James Dong 720c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 730c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Local function prototypes 740c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 750c1bc742181ded4930842b46e9507372f0b1b963James Dong 760c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeBufferingPeriod( 770c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 780c1bc742181ded4930842b46e9507372f0b1b963James Dong seiBufferingPeriod_t *pBufferingPeriod, 790c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbCnt, 800c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 initialCpbRemovalDelayLength, 810c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 nalHrdBpPresentFlag, 820c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 vclHrdBpPresentFlag); 830c1bc742181ded4930842b46e9507372f0b1b963James Dong 840c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodePictureTiming( 850c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 860c1bc742181ded4930842b46e9507372f0b1b963James Dong seiPicTiming_t *pPicTiming, 870c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbRemovalDelayLength, 880c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 dpbOutputDelayLength, 890c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 timeOffsetLength, 900c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbDpbDelaysPresentFlag, 910c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picStructPresentFlag); 920c1bc742181ded4930842b46e9507372f0b1b963James Dong 930c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodePanScanRectangle( 940c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 950c1bc742181ded4930842b46e9507372f0b1b963James Dong seiPanScanRect_t *pPanScanRectangle); 960c1bc742181ded4930842b46e9507372f0b1b963James Dong 970c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFillerPayload(strmData_t *pStrmData, u32 payloadSize); 980c1bc742181ded4930842b46e9507372f0b1b963James Dong 990c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeUserDataRegisteredITuTT35( 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong seiUserDataRegisteredItuTT35_t *pUserDataRegisteredItuTT35, 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize); 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong 1040c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeUserDataUnregistered( 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong seiUserDataUnregistered_t *pUserDataUnregistered, 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize); 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong 1090c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeRecoveryPoint( 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong seiRecoveryPoint_t *pRecoveryPoint); 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong 1130c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeDecRefPicMarkingRepetition( 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong seiDecRefPicMarkingRepetition_t *pDecRefPicMarkingRepetition, 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numRefFrames); 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong 1180c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSparePic( 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSparePic_t *pSparePic, 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picSizeInMapUnits); 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong 1230c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSceneInfo( 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSceneInfo_t *pSceneInfo); 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong 1270c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqInfo( 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqInfo_t *pSubSeqInfo); 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong 1310c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqLayerCharacteristics( 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqLayerCharacteristics_t *pSubSeqLayerCharacteristics); 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong 1350c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqCharacteristics( 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqCharacteristics_t *pSubSeqCharacteristics); 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong 1390c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFullFrameFreeze( 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong seiFullFrameFreeze_t *pFullFrameFreeze); 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong 1430c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFullFrameSnapshot( 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong seiFullFrameSnapshot_t *pFullFrameSnapshot); 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong 1470c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeProgressiveRefinementSegmentStart( 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong seiProgressiveRefinementSegmentStart_t *pProgressiveRefinementSegmentStart); 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong 1510c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeProgressiveRefinementSegmentEnd( 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong seiProgressiveRefinementSegmentEnd_t *pProgressiveRefinementSegmentEnd); 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong 1550c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeMotionConstrainedSliceGroupSet( 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong seiMotionConstrainedSliceGroupSet_t *pMotionConstrainedSliceGroupSet, 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numSliceGroups); 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong 1600c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeReservedSeiMessage( 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong seiReservedSeiMessage_t *pReservedSeiMessage, 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize); 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: h264bsdDecodeSeiMessage 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong 1780c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeSeiMessage( 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong seqParamSet_t *pSeqParamSet, 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong seiMessage_t *pSeiMessage, 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numSliceGroups) 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, payloadType, payloadSize, status; 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSeiMessage); 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong H264SwDecMemset(pSeiMessage, 0, sizeof(seiMessage_t)); 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong do 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadType = 0; 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong while((tmp = h264bsdGetBits(pStrmData, 8)) == 0xFF) 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadType += 255; 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadType += tmp; 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize = 0; 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong while((tmp = h264bsdGetBits(pStrmData, 8)) == 0xFF) 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize += 255; 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2130c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 2140c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 2150c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize += tmp; 2160c1bc742181ded4930842b46e9507372f0b1b963James Dong 2170c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeiMessage->payloadType = payloadType; 2180c1bc742181ded4930842b46e9507372f0b1b963James Dong 2190c1bc742181ded4930842b46e9507372f0b1b963James Dong switch (payloadType) 2200c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2210c1bc742181ded4930842b46e9507372f0b1b963James Dong case 0: 2220c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSeqParamSet); 2230c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeBufferingPeriod( 2240c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2250c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->bufferingPeriod, 2260c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParameters.cpbCnt, 2270c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParameters. 2280c1bc742181ded4930842b46e9507372f0b1b963James Dong initialCpbRemovalDelayLength, 2290c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->nalHrdParametersPresentFlag, 2300c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParametersPresentFlag); 2310c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2320c1bc742181ded4930842b46e9507372f0b1b963James Dong 2330c1bc742181ded4930842b46e9507372f0b1b963James Dong case 1: 2340c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSeqParamSet->vuiParametersPresentFlag); 2350c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodePictureTiming( 2360c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2370c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->picTiming, 2380c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParameters. 2390c1bc742181ded4930842b46e9507372f0b1b963James Dong cpbRemovalDelayLength, 2400c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParameters. 2410c1bc742181ded4930842b46e9507372f0b1b963James Dong dpbOutputDelayLength, 2420c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParameters. 2430c1bc742181ded4930842b46e9507372f0b1b963James Dong timeOffsetLength, 2440c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->nalHrdParametersPresentFlag || 2450c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->vclHrdParametersPresentFlag ? 2460c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE, 2470c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->vuiParameters->picStructPresentFlag); 2480c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2490c1bc742181ded4930842b46e9507372f0b1b963James Dong 2500c1bc742181ded4930842b46e9507372f0b1b963James Dong case 2: 2510c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodePanScanRectangle( 2520c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2530c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->panScanRect); 2540c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2550c1bc742181ded4930842b46e9507372f0b1b963James Dong 2560c1bc742181ded4930842b46e9507372f0b1b963James Dong case 3: 2570c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeFillerPayload(pStrmData, payloadSize); 2580c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2590c1bc742181ded4930842b46e9507372f0b1b963James Dong 2600c1bc742181ded4930842b46e9507372f0b1b963James Dong case 4: 2610c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeUserDataRegisteredITuTT35( 2620c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2630c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->userDataRegisteredItuTT35, 2640c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize); 2650c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2660c1bc742181ded4930842b46e9507372f0b1b963James Dong 2670c1bc742181ded4930842b46e9507372f0b1b963James Dong case 5: 2680c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeUserDataUnregistered( 2690c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2700c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->userDataUnregistered, 2710c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize); 2720c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2730c1bc742181ded4930842b46e9507372f0b1b963James Dong 2740c1bc742181ded4930842b46e9507372f0b1b963James Dong case 6: 2750c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeRecoveryPoint( 2760c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2770c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->recoveryPoint); 2780c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2790c1bc742181ded4930842b46e9507372f0b1b963James Dong 2800c1bc742181ded4930842b46e9507372f0b1b963James Dong case 7: 2810c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeDecRefPicMarkingRepetition( 2820c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2830c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->decRefPicMarkingRepetition, 2840c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->numRefFrames); 2850c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2860c1bc742181ded4930842b46e9507372f0b1b963James Dong 2870c1bc742181ded4930842b46e9507372f0b1b963James Dong case 8: 2880c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSeqParamSet); 2890c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeSparePic( 2900c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2910c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->sparePic, 2920c1bc742181ded4930842b46e9507372f0b1b963James Dong pSeqParamSet->picWidthInMbs * pSeqParamSet->picHeightInMbs); 2930c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 2940c1bc742181ded4930842b46e9507372f0b1b963James Dong 2950c1bc742181ded4930842b46e9507372f0b1b963James Dong case 9: 2960c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeSceneInfo( 2970c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 2980c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->sceneInfo); 2990c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3000c1bc742181ded4930842b46e9507372f0b1b963James Dong 3010c1bc742181ded4930842b46e9507372f0b1b963James Dong case 10: 3020c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeSubSeqInfo( 3030c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3040c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->subSeqInfo); 3050c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3060c1bc742181ded4930842b46e9507372f0b1b963James Dong 3070c1bc742181ded4930842b46e9507372f0b1b963James Dong case 11: 3080c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeSubSeqLayerCharacteristics( 3090c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3100c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->subSeqLayerCharacteristics); 3110c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3120c1bc742181ded4930842b46e9507372f0b1b963James Dong 3130c1bc742181ded4930842b46e9507372f0b1b963James Dong case 12: 3140c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeSubSeqCharacteristics( 3150c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3160c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->subSeqCharacteristics); 3170c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3180c1bc742181ded4930842b46e9507372f0b1b963James Dong 3190c1bc742181ded4930842b46e9507372f0b1b963James Dong case 13: 3200c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeFullFrameFreeze( 3210c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3220c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->fullFrameFreeze); 3230c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3240c1bc742181ded4930842b46e9507372f0b1b963James Dong 3250c1bc742181ded4930842b46e9507372f0b1b963James Dong case 14: /* This SEI does not contain data, what to do ??? */ 3260c1bc742181ded4930842b46e9507372f0b1b963James Dong status = HANTRO_OK; 3270c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3280c1bc742181ded4930842b46e9507372f0b1b963James Dong 3290c1bc742181ded4930842b46e9507372f0b1b963James Dong case 15: 3300c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeFullFrameSnapshot( 3310c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3320c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->fullFrameSnapshot); 3330c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3340c1bc742181ded4930842b46e9507372f0b1b963James Dong 3350c1bc742181ded4930842b46e9507372f0b1b963James Dong case 16: 3360c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeProgressiveRefinementSegmentStart( 3370c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3380c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->progressiveRefinementSegmentStart); 3390c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3400c1bc742181ded4930842b46e9507372f0b1b963James Dong 3410c1bc742181ded4930842b46e9507372f0b1b963James Dong case 17: 3420c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeProgressiveRefinementSegmentEnd( 3430c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3440c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->progressiveRefinementSegmentEnd); 3450c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3460c1bc742181ded4930842b46e9507372f0b1b963James Dong 3470c1bc742181ded4930842b46e9507372f0b1b963James Dong case 18: 3480c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(numSliceGroups); 3490c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeMotionConstrainedSliceGroupSet( 3500c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3510c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->motionConstrainedSliceGroupSet, 3520c1bc742181ded4930842b46e9507372f0b1b963James Dong numSliceGroups); 3530c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3540c1bc742181ded4930842b46e9507372f0b1b963James Dong 3550c1bc742181ded4930842b46e9507372f0b1b963James Dong default: 3560c1bc742181ded4930842b46e9507372f0b1b963James Dong status = DecodeReservedSeiMessage( 3570c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData, 3580c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSeiMessage->reservedSeiMessage, 3590c1bc742181ded4930842b46e9507372f0b1b963James Dong payloadSize); 3600c1bc742181ded4930842b46e9507372f0b1b963James Dong break; 3610c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3620c1bc742181ded4930842b46e9507372f0b1b963James Dong 3630c1bc742181ded4930842b46e9507372f0b1b963James Dong if (status != HANTRO_OK) 3640c1bc742181ded4930842b46e9507372f0b1b963James Dong return(status); 3650c1bc742181ded4930842b46e9507372f0b1b963James Dong 3660c1bc742181ded4930842b46e9507372f0b1b963James Dong while (!h264bsdIsByteAligned(pStrmData)) 3670c1bc742181ded4930842b46e9507372f0b1b963James Dong { 3680c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdGetBits(pStrmData, 1) != 1) 3690c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 3700c1bc742181ded4930842b46e9507372f0b1b963James Dong while (!h264bsdIsByteAligned(pStrmData)) 3710c1bc742181ded4930842b46e9507372f0b1b963James Dong { 3720c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdGetBits(pStrmData, 1) != 0) 3730c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 3740c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3750c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3760c1bc742181ded4930842b46e9507372f0b1b963James Dong } while (h264bsdMoreRbspData(pStrmData)); 3770c1bc742181ded4930842b46e9507372f0b1b963James Dong 3780c1bc742181ded4930842b46e9507372f0b1b963James Dong return(h264bsdRbspTrailingBits(pStrmData)); 3790c1bc742181ded4930842b46e9507372f0b1b963James Dong 3800c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3810c1bc742181ded4930842b46e9507372f0b1b963James Dong 3820c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 3830c1bc742181ded4930842b46e9507372f0b1b963James Dong 3840c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeBufferingPeriod 3850c1bc742181ded4930842b46e9507372f0b1b963James Dong 3860c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 3870c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 3880c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 3890c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 3900c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 3910c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 3920c1bc742181ded4930842b46e9507372f0b1b963James Dong 3930c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3940c1bc742181ded4930842b46e9507372f0b1b963James Dong 3950c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeBufferingPeriod( 3960c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 3970c1bc742181ded4930842b46e9507372f0b1b963James Dong seiBufferingPeriod_t *pBufferingPeriod, 3980c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbCnt, 3990c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 initialCpbRemovalDelayLength, 4000c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 nalHrdBpPresentFlag, 4010c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 vclHrdBpPresentFlag) 4020c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 4030c1bc742181ded4930842b46e9507372f0b1b963James Dong 4040c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 4050c1bc742181ded4930842b46e9507372f0b1b963James Dong 4060c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i; 4070c1bc742181ded4930842b46e9507372f0b1b963James Dong 4080c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 4090c1bc742181ded4930842b46e9507372f0b1b963James Dong 4100c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 4110c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pBufferingPeriod); 4120c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(cpbCnt); 4130c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(initialCpbRemovalDelayLength); 4140c1bc742181ded4930842b46e9507372f0b1b963James Dong 4150c1bc742181ded4930842b46e9507372f0b1b963James Dong 4160c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 4170c1bc742181ded4930842b46e9507372f0b1b963James Dong &pBufferingPeriod->seqParameterSetId); 4180c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 4190c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 4200c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pBufferingPeriod->seqParameterSetId > 31) 4210c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4220c1bc742181ded4930842b46e9507372f0b1b963James Dong 4230c1bc742181ded4930842b46e9507372f0b1b963James Dong if (nalHrdBpPresentFlag) 4240c1bc742181ded4930842b46e9507372f0b1b963James Dong { 4250c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < cpbCnt; i++) 4260c1bc742181ded4930842b46e9507372f0b1b963James Dong { 4270c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, initialCpbRemovalDelayLength); 4280c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 4290c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4300c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == 0) 4310c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4320c1bc742181ded4930842b46e9507372f0b1b963James Dong pBufferingPeriod->initialCpbRemovalDelay[i] = tmp; 4330c1bc742181ded4930842b46e9507372f0b1b963James Dong 4340c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, initialCpbRemovalDelayLength); 4350c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 4360c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4370c1bc742181ded4930842b46e9507372f0b1b963James Dong pBufferingPeriod->initialCpbRemovalDelayOffset[i] = tmp; 4380c1bc742181ded4930842b46e9507372f0b1b963James Dong } 4390c1bc742181ded4930842b46e9507372f0b1b963James Dong } 4400c1bc742181ded4930842b46e9507372f0b1b963James Dong 4410c1bc742181ded4930842b46e9507372f0b1b963James Dong if (vclHrdBpPresentFlag) 4420c1bc742181ded4930842b46e9507372f0b1b963James Dong { 4430c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < cpbCnt; i++) 4440c1bc742181ded4930842b46e9507372f0b1b963James Dong { 4450c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, initialCpbRemovalDelayLength); 4460c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 4470c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4480c1bc742181ded4930842b46e9507372f0b1b963James Dong pBufferingPeriod->initialCpbRemovalDelay[i] = tmp; 4490c1bc742181ded4930842b46e9507372f0b1b963James Dong 4500c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, initialCpbRemovalDelayLength); 4510c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 4520c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 4530c1bc742181ded4930842b46e9507372f0b1b963James Dong pBufferingPeriod->initialCpbRemovalDelayOffset[i] = tmp; 4540c1bc742181ded4930842b46e9507372f0b1b963James Dong } 4550c1bc742181ded4930842b46e9507372f0b1b963James Dong } 4560c1bc742181ded4930842b46e9507372f0b1b963James Dong 4570c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 4580c1bc742181ded4930842b46e9507372f0b1b963James Dong 4590c1bc742181ded4930842b46e9507372f0b1b963James Dong} 4600c1bc742181ded4930842b46e9507372f0b1b963James Dong 4610c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 4620c1bc742181ded4930842b46e9507372f0b1b963James Dong 4630c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodePictureTiming 4640c1bc742181ded4930842b46e9507372f0b1b963James Dong 4650c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 4660c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 4670c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 4680c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 4690c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 4700c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 4710c1bc742181ded4930842b46e9507372f0b1b963James Dong 4720c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 4730c1bc742181ded4930842b46e9507372f0b1b963James Dong 4740c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodePictureTiming( 4750c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 4760c1bc742181ded4930842b46e9507372f0b1b963James Dong seiPicTiming_t *pPicTiming, 4770c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbRemovalDelayLength, 4780c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 dpbOutputDelayLength, 4790c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 timeOffsetLength, 4800c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 cpbDpbDelaysPresentFlag, 4810c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picStructPresentFlag) 4820c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 4830c1bc742181ded4930842b46e9507372f0b1b963James Dong 4840c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 4850c1bc742181ded4930842b46e9507372f0b1b963James Dong 4860c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i; 4870c1bc742181ded4930842b46e9507372f0b1b963James Dong i32 itmp; 4880c1bc742181ded4930842b46e9507372f0b1b963James Dong 4890c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 4900c1bc742181ded4930842b46e9507372f0b1b963James Dong 4910c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 4920c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pPicTiming); 4930c1bc742181ded4930842b46e9507372f0b1b963James Dong 4940c1bc742181ded4930842b46e9507372f0b1b963James Dong 4950c1bc742181ded4930842b46e9507372f0b1b963James Dong if (cpbDpbDelaysPresentFlag) 4960c1bc742181ded4930842b46e9507372f0b1b963James Dong { 4970c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, cpbRemovalDelayLength); 4980c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 4990c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5000c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->cpbRemovalDelay = tmp; 5010c1bc742181ded4930842b46e9507372f0b1b963James Dong 5020c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, dpbOutputDelayLength); 5030c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5040c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5050c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->dpbOutputDelay = tmp; 5060c1bc742181ded4930842b46e9507372f0b1b963James Dong } 5070c1bc742181ded4930842b46e9507372f0b1b963James Dong 5080c1bc742181ded4930842b46e9507372f0b1b963James Dong if (picStructPresentFlag) 5090c1bc742181ded4930842b46e9507372f0b1b963James Dong { 5100c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 4); 5110c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5120c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5130c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 8) 5140c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5150c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->picStruct = tmp; 5160c1bc742181ded4930842b46e9507372f0b1b963James Dong 5170c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < numClockTS[pPicTiming->picStruct]; i++) 5180c1bc742181ded4930842b46e9507372f0b1b963James Dong { 5190c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5200c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5210c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5220c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->clockTimeStampFlag[i] = tmp == 1 ? 5230c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5240c1bc742181ded4930842b46e9507372f0b1b963James Dong 5250c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPicTiming->clockTimeStampFlag[i]) 5260c1bc742181ded4930842b46e9507372f0b1b963James Dong { 5270c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 2); 5280c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5290c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5300c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->ctType[i] = tmp; 5310c1bc742181ded4930842b46e9507372f0b1b963James Dong 5320c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5330c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5340c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5350c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->nuitFieldBasedFlag[i] = tmp == 1 ? 5360c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5370c1bc742181ded4930842b46e9507372f0b1b963James Dong 5380c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 5); 5390c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5400c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5410c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 6) 5420c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5430c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->countingType[i] = tmp; 5440c1bc742181ded4930842b46e9507372f0b1b963James Dong 5450c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5460c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5470c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5480c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->fullTimeStampFlag[i] = tmp == 1 ? 5490c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5500c1bc742181ded4930842b46e9507372f0b1b963James Dong 5510c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5520c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5530c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5540c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->discontinuityFlag[i] = tmp == 1 ? 5550c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5560c1bc742181ded4930842b46e9507372f0b1b963James Dong 5570c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5580c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5590c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5600c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->cntDroppedFlag[i] = tmp == 1 ? 5610c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5620c1bc742181ded4930842b46e9507372f0b1b963James Dong 5630c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 8); 5640c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5650c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5660c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->nFrames[i] = tmp; 5670c1bc742181ded4930842b46e9507372f0b1b963James Dong 5680c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPicTiming->fullTimeStampFlag[i]) 5690c1bc742181ded4930842b46e9507372f0b1b963James Dong { 5700c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 6); 5710c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5720c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5730c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 59) 5740c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5750c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->secondsValue[i] = tmp; 5760c1bc742181ded4930842b46e9507372f0b1b963James Dong 5770c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 6); 5780c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5790c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5800c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 59) 5810c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5820c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->minutesValue[i] = tmp; 5830c1bc742181ded4930842b46e9507372f0b1b963James Dong 5840c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 5); 5850c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5860c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5870c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 23) 5880c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5890c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->hoursValue[i] = tmp; 5900c1bc742181ded4930842b46e9507372f0b1b963James Dong } 5910c1bc742181ded4930842b46e9507372f0b1b963James Dong else 5920c1bc742181ded4930842b46e9507372f0b1b963James Dong { 5930c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 5940c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 5950c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 5960c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->secondsFlag[i] = tmp == 1 ? 5970c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 5980c1bc742181ded4930842b46e9507372f0b1b963James Dong 5990c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPicTiming->secondsFlag[i]) 6000c1bc742181ded4930842b46e9507372f0b1b963James Dong { 6010c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 6); 6020c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6030c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6040c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 59) 6050c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6060c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->secondsValue[i] = tmp; 6070c1bc742181ded4930842b46e9507372f0b1b963James Dong 6080c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 6090c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6100c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6110c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->minutesFlag[i] = tmp == 1 ? 6120c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 6130c1bc742181ded4930842b46e9507372f0b1b963James Dong 6140c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPicTiming->minutesFlag[i]) 6150c1bc742181ded4930842b46e9507372f0b1b963James Dong { 6160c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 6); 6170c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6180c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6190c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 59) 6200c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6210c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->minutesValue[i] = tmp; 6220c1bc742181ded4930842b46e9507372f0b1b963James Dong 6230c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 6240c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6250c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6260c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->hoursFlag[i] = tmp == 1 ? 6270c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 6280c1bc742181ded4930842b46e9507372f0b1b963James Dong 6290c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPicTiming->hoursFlag[i]) 6300c1bc742181ded4930842b46e9507372f0b1b963James Dong { 6310c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 5); 6320c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6330c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6340c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 23) 6350c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6360c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->hoursValue[i] = tmp; 6370c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6380c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6390c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6400c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6410c1bc742181ded4930842b46e9507372f0b1b963James Dong if (timeOffsetLength) 6420c1bc742181ded4930842b46e9507372f0b1b963James Dong { 6430c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, timeOffsetLength); 6440c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 6450c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 6460c1bc742181ded4930842b46e9507372f0b1b963James Dong itmp = (i32)tmp; 6470c1bc742181ded4930842b46e9507372f0b1b963James Dong /* following "converts" timeOffsetLength-bit signed 6480c1bc742181ded4930842b46e9507372f0b1b963James Dong * integer into i32 */ 6490c1bc742181ded4930842b46e9507372f0b1b963James Dong /*lint -save -e701 -e702 */ 6500c1bc742181ded4930842b46e9507372f0b1b963James Dong itmp <<= (32 - timeOffsetLength); 6510c1bc742181ded4930842b46e9507372f0b1b963James Dong itmp >>= (32 - timeOffsetLength); 6520c1bc742181ded4930842b46e9507372f0b1b963James Dong /*lint -restore */ 6530c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->timeOffset[i] = itmp; 6540c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6550c1bc742181ded4930842b46e9507372f0b1b963James Dong else 6560c1bc742181ded4930842b46e9507372f0b1b963James Dong pPicTiming->timeOffset[i] = 0; 6570c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6580c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6590c1bc742181ded4930842b46e9507372f0b1b963James Dong } 6600c1bc742181ded4930842b46e9507372f0b1b963James Dong 6610c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 6620c1bc742181ded4930842b46e9507372f0b1b963James Dong 6630c1bc742181ded4930842b46e9507372f0b1b963James Dong} 6640c1bc742181ded4930842b46e9507372f0b1b963James Dong 6650c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 6660c1bc742181ded4930842b46e9507372f0b1b963James Dong 6670c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodePanScanRectangle 6680c1bc742181ded4930842b46e9507372f0b1b963James Dong 6690c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 6700c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 6710c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 6720c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 6730c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 6740c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 6750c1bc742181ded4930842b46e9507372f0b1b963James Dong 6760c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 6770c1bc742181ded4930842b46e9507372f0b1b963James Dong 6780c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodePanScanRectangle( 6790c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 6800c1bc742181ded4930842b46e9507372f0b1b963James Dong seiPanScanRect_t *pPanScanRectangle) 6810c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 6820c1bc742181ded4930842b46e9507372f0b1b963James Dong 6830c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 6840c1bc742181ded4930842b46e9507372f0b1b963James Dong 6850c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i; 6860c1bc742181ded4930842b46e9507372f0b1b963James Dong 6870c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 6880c1bc742181ded4930842b46e9507372f0b1b963James Dong 6890c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 6900c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pPanScanRectangle); 6910c1bc742181ded4930842b46e9507372f0b1b963James Dong 6920c1bc742181ded4930842b46e9507372f0b1b963James Dong 6930c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 6940c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectId); 6950c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 6960c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 6970c1bc742181ded4930842b46e9507372f0b1b963James Dong 6980c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 6990c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 7000c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 7010c1bc742181ded4930842b46e9507372f0b1b963James Dong pPanScanRectangle->panScanRectCancelFlag = tmp == 1 ? 7020c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 7030c1bc742181ded4930842b46e9507372f0b1b963James Dong 7040c1bc742181ded4930842b46e9507372f0b1b963James Dong if (!pPanScanRectangle->panScanRectCancelFlag) 7050c1bc742181ded4930842b46e9507372f0b1b963James Dong { 7060c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 7070c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanCnt); 7080c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7090c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7100c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPanScanRectangle->panScanCnt > 2) 7110c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 7120c1bc742181ded4930842b46e9507372f0b1b963James Dong pPanScanRectangle->panScanCnt++; 7130c1bc742181ded4930842b46e9507372f0b1b963James Dong 7140c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < pPanScanRectangle->panScanCnt; i++) 7150c1bc742181ded4930842b46e9507372f0b1b963James Dong { 7160c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombSigned(pStrmData, 7170c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectLeftOffset[i]); 7180c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7190c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7200c1bc742181ded4930842b46e9507372f0b1b963James Dong 7210c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombSigned(pStrmData, 7220c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectRightOffset[i]); 7230c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7240c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7250c1bc742181ded4930842b46e9507372f0b1b963James Dong 7260c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombSigned(pStrmData, 7270c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectTopOffset[i]); 7280c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7290c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7300c1bc742181ded4930842b46e9507372f0b1b963James Dong 7310c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombSigned(pStrmData, 7320c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectBottomOffset[i]); 7330c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7340c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7350c1bc742181ded4930842b46e9507372f0b1b963James Dong } 7360c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 7370c1bc742181ded4930842b46e9507372f0b1b963James Dong &pPanScanRectangle->panScanRectRepetitionPeriod); 7380c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 7390c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 7400c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPanScanRectangle->panScanRectRepetitionPeriod > 16384) 7410c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 7420c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pPanScanRectangle->panScanCnt > 1 && 7430c1bc742181ded4930842b46e9507372f0b1b963James Dong pPanScanRectangle->panScanRectRepetitionPeriod > 1) 7440c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 7450c1bc742181ded4930842b46e9507372f0b1b963James Dong } 7460c1bc742181ded4930842b46e9507372f0b1b963James Dong 7470c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 7480c1bc742181ded4930842b46e9507372f0b1b963James Dong} 7490c1bc742181ded4930842b46e9507372f0b1b963James Dong 7500c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 7510c1bc742181ded4930842b46e9507372f0b1b963James Dong 7520c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeFillerPayload 7530c1bc742181ded4930842b46e9507372f0b1b963James Dong 7540c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 7550c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7560c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 7570c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7580c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 7590c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7600c1bc742181ded4930842b46e9507372f0b1b963James Dong 7610c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 7620c1bc742181ded4930842b46e9507372f0b1b963James Dong 7630c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFillerPayload(strmData_t *pStrmData, u32 payloadSize) 7640c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 7650c1bc742181ded4930842b46e9507372f0b1b963James Dong 7660c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 7670c1bc742181ded4930842b46e9507372f0b1b963James Dong 7680c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 7690c1bc742181ded4930842b46e9507372f0b1b963James Dong 7700c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 7710c1bc742181ded4930842b46e9507372f0b1b963James Dong 7720c1bc742181ded4930842b46e9507372f0b1b963James Dong 7730c1bc742181ded4930842b46e9507372f0b1b963James Dong if (payloadSize) 7740c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData, 8 * payloadSize) == END_OF_STREAM) 7750c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 7760c1bc742181ded4930842b46e9507372f0b1b963James Dong 7770c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 7780c1bc742181ded4930842b46e9507372f0b1b963James Dong 7790c1bc742181ded4930842b46e9507372f0b1b963James Dong} 7800c1bc742181ded4930842b46e9507372f0b1b963James Dong 7810c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 7820c1bc742181ded4930842b46e9507372f0b1b963James Dong 7830c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeUserDataRegisteredITuTT35 7840c1bc742181ded4930842b46e9507372f0b1b963James Dong 7850c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 7860c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7870c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 7880c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7890c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 7900c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 7910c1bc742181ded4930842b46e9507372f0b1b963James Dong 7920c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 7930c1bc742181ded4930842b46e9507372f0b1b963James Dong 7940c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeUserDataRegisteredITuTT35( 7950c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 7960c1bc742181ded4930842b46e9507372f0b1b963James Dong seiUserDataRegisteredItuTT35_t *pUserDataRegisteredItuTT35, 7970c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize) 7980c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 7990c1bc742181ded4930842b46e9507372f0b1b963James Dong 8000c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 8010c1bc742181ded4930842b46e9507372f0b1b963James Dong 8020c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i, j; 8030c1bc742181ded4930842b46e9507372f0b1b963James Dong 8040c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 8050c1bc742181ded4930842b46e9507372f0b1b963James Dong 8060c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 8070c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pUserDataRegisteredItuTT35); 8080c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(payloadSize); 8090c1bc742181ded4930842b46e9507372f0b1b963James Dong 8100c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 8); 8110c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 8120c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 8130c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataRegisteredItuTT35->ituTT35CountryCode = tmp; 8140c1bc742181ded4930842b46e9507372f0b1b963James Dong 8150c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pUserDataRegisteredItuTT35->ituTT35CountryCode != 0xFF) 8160c1bc742181ded4930842b46e9507372f0b1b963James Dong i = 1; 8170c1bc742181ded4930842b46e9507372f0b1b963James Dong else 8180c1bc742181ded4930842b46e9507372f0b1b963James Dong { 8190c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 8); 8200c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 8210c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 8220c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataRegisteredItuTT35->ituTT35CountryCodeExtensionByte = tmp; 8230c1bc742181ded4930842b46e9507372f0b1b963James Dong i = 2; 8240c1bc742181ded4930842b46e9507372f0b1b963James Dong } 8250c1bc742181ded4930842b46e9507372f0b1b963James Dong 8260c1bc742181ded4930842b46e9507372f0b1b963James Dong /* where corresponding FREE() ??? */ 8270c1bc742181ded4930842b46e9507372f0b1b963James Dong ALLOCATE(pUserDataRegisteredItuTT35->ituTT35PayloadByte,payloadSize-i,u8); 8280c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataRegisteredItuTT35->numPayloadBytes = payloadSize - i; 8290c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pUserDataRegisteredItuTT35->ituTT35PayloadByte == NULL) 8300c1bc742181ded4930842b46e9507372f0b1b963James Dong return(MEMORY_ALLOCATION_ERROR); 8310c1bc742181ded4930842b46e9507372f0b1b963James Dong 8320c1bc742181ded4930842b46e9507372f0b1b963James Dong j = 0; 8330c1bc742181ded4930842b46e9507372f0b1b963James Dong do 8340c1bc742181ded4930842b46e9507372f0b1b963James Dong { 8350c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 8); 8360c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 8370c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 8380c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataRegisteredItuTT35->ituTT35PayloadByte[j] = (u8)tmp; 8390c1bc742181ded4930842b46e9507372f0b1b963James Dong i++; 8400c1bc742181ded4930842b46e9507372f0b1b963James Dong j++; 8410c1bc742181ded4930842b46e9507372f0b1b963James Dong } while (i < payloadSize); 8420c1bc742181ded4930842b46e9507372f0b1b963James Dong 8430c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 8440c1bc742181ded4930842b46e9507372f0b1b963James Dong 8450c1bc742181ded4930842b46e9507372f0b1b963James Dong} 8460c1bc742181ded4930842b46e9507372f0b1b963James Dong 8470c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 8480c1bc742181ded4930842b46e9507372f0b1b963James Dong 8490c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeUserDataUnregistered 8500c1bc742181ded4930842b46e9507372f0b1b963James Dong 8510c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 8520c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 8530c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 8540c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 8550c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 8560c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 8570c1bc742181ded4930842b46e9507372f0b1b963James Dong 8580c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 8590c1bc742181ded4930842b46e9507372f0b1b963James Dong 8600c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeUserDataUnregistered( 8610c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 8620c1bc742181ded4930842b46e9507372f0b1b963James Dong seiUserDataUnregistered_t *pUserDataUnregistered, 8630c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize) 8640c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 8650c1bc742181ded4930842b46e9507372f0b1b963James Dong 8660c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 8670c1bc742181ded4930842b46e9507372f0b1b963James Dong 8680c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 i, tmp; 8690c1bc742181ded4930842b46e9507372f0b1b963James Dong 8700c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 8710c1bc742181ded4930842b46e9507372f0b1b963James Dong 8720c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 8730c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pUserDataUnregistered); 8740c1bc742181ded4930842b46e9507372f0b1b963James Dong 8750c1bc742181ded4930842b46e9507372f0b1b963James Dong 8760c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < 4; i++) 8770c1bc742181ded4930842b46e9507372f0b1b963James Dong { 8780c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataUnregistered->uuidIsoIec11578[i] = h264bsdShowBits32(pStrmData); 8790c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData,32) == END_OF_STREAM) 8800c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 8810c1bc742181ded4930842b46e9507372f0b1b963James Dong } 8820c1bc742181ded4930842b46e9507372f0b1b963James Dong 8830c1bc742181ded4930842b46e9507372f0b1b963James Dong /* where corresponding FREE() ??? */ 8840c1bc742181ded4930842b46e9507372f0b1b963James Dong ALLOCATE(pUserDataUnregistered->userDataPayloadByte, payloadSize - 16, u8); 8850c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pUserDataUnregistered->userDataPayloadByte == NULL) 8860c1bc742181ded4930842b46e9507372f0b1b963James Dong return(MEMORY_ALLOCATION_ERROR); 8870c1bc742181ded4930842b46e9507372f0b1b963James Dong 8880c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataUnregistered->numPayloadBytes = payloadSize - 16; 8890c1bc742181ded4930842b46e9507372f0b1b963James Dong 8900c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < payloadSize - 16; i++) 8910c1bc742181ded4930842b46e9507372f0b1b963James Dong { 8920c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 8); 8930c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 8940c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 8950c1bc742181ded4930842b46e9507372f0b1b963James Dong pUserDataUnregistered->userDataPayloadByte[i] = (u8)tmp; 8960c1bc742181ded4930842b46e9507372f0b1b963James Dong } 8970c1bc742181ded4930842b46e9507372f0b1b963James Dong 8980c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 8990c1bc742181ded4930842b46e9507372f0b1b963James Dong 9000c1bc742181ded4930842b46e9507372f0b1b963James Dong} 9010c1bc742181ded4930842b46e9507372f0b1b963James Dong 9020c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 9030c1bc742181ded4930842b46e9507372f0b1b963James Dong 9040c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeRecoveryPoint 9050c1bc742181ded4930842b46e9507372f0b1b963James Dong 9060c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 9070c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9080c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 9090c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9100c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 9110c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9120c1bc742181ded4930842b46e9507372f0b1b963James Dong 9130c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 9140c1bc742181ded4930842b46e9507372f0b1b963James Dong 9150c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeRecoveryPoint( 9160c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 9170c1bc742181ded4930842b46e9507372f0b1b963James Dong seiRecoveryPoint_t *pRecoveryPoint) 9180c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 9190c1bc742181ded4930842b46e9507372f0b1b963James Dong 9200c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 9210c1bc742181ded4930842b46e9507372f0b1b963James Dong 9220c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 9230c1bc742181ded4930842b46e9507372f0b1b963James Dong 9240c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 9250c1bc742181ded4930842b46e9507372f0b1b963James Dong 9260c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 9270c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pRecoveryPoint); 9280c1bc742181ded4930842b46e9507372f0b1b963James Dong 9290c1bc742181ded4930842b46e9507372f0b1b963James Dong 9300c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 9310c1bc742181ded4930842b46e9507372f0b1b963James Dong &pRecoveryPoint->recoveryFrameCnt); 9320c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 9330c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 9340c1bc742181ded4930842b46e9507372f0b1b963James Dong 9350c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 9360c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 9370c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 9380c1bc742181ded4930842b46e9507372f0b1b963James Dong pRecoveryPoint->exactMatchFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 9390c1bc742181ded4930842b46e9507372f0b1b963James Dong 9400c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 9410c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 9420c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 9430c1bc742181ded4930842b46e9507372f0b1b963James Dong pRecoveryPoint->brokenLinkFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 9440c1bc742181ded4930842b46e9507372f0b1b963James Dong 9450c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 2); 9460c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 9470c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 9480c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp > 2) 9490c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 9500c1bc742181ded4930842b46e9507372f0b1b963James Dong pRecoveryPoint->changingSliceGroupIdc = tmp; 9510c1bc742181ded4930842b46e9507372f0b1b963James Dong 9520c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 9530c1bc742181ded4930842b46e9507372f0b1b963James Dong 9540c1bc742181ded4930842b46e9507372f0b1b963James Dong} 9550c1bc742181ded4930842b46e9507372f0b1b963James Dong 9560c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 9570c1bc742181ded4930842b46e9507372f0b1b963James Dong 9580c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeDecRefPicMarkingRepetition 9590c1bc742181ded4930842b46e9507372f0b1b963James Dong 9600c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 9610c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9620c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 9630c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9640c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 9650c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 9660c1bc742181ded4930842b46e9507372f0b1b963James Dong 9670c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 9680c1bc742181ded4930842b46e9507372f0b1b963James Dong 9690c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeDecRefPicMarkingRepetition( 9700c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 9710c1bc742181ded4930842b46e9507372f0b1b963James Dong seiDecRefPicMarkingRepetition_t *pDecRefPicMarkingRepetition, 9720c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numRefFrames) 9730c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 9740c1bc742181ded4930842b46e9507372f0b1b963James Dong 9750c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 9760c1bc742181ded4930842b46e9507372f0b1b963James Dong 9770c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 9780c1bc742181ded4930842b46e9507372f0b1b963James Dong 9790c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 9800c1bc742181ded4930842b46e9507372f0b1b963James Dong 9810c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 9820c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pDecRefPicMarkingRepetition); 9830c1bc742181ded4930842b46e9507372f0b1b963James Dong 9840c1bc742181ded4930842b46e9507372f0b1b963James Dong 9850c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 9860c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 9870c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 9880c1bc742181ded4930842b46e9507372f0b1b963James Dong pDecRefPicMarkingRepetition->originalIdrFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 9890c1bc742181ded4930842b46e9507372f0b1b963James Dong 9900c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 9910c1bc742181ded4930842b46e9507372f0b1b963James Dong &pDecRefPicMarkingRepetition->originalFrameNum); 9920c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 9930c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 9940c1bc742181ded4930842b46e9507372f0b1b963James Dong 9950c1bc742181ded4930842b46e9507372f0b1b963James Dong /* frame_mbs_only_flag assumed always true so some field related syntax 9960c1bc742181ded4930842b46e9507372f0b1b963James Dong * elements are skipped, see H.264 standard */ 9970c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecRefPicMarking(pStrmData, 9980c1bc742181ded4930842b46e9507372f0b1b963James Dong &pDecRefPicMarkingRepetition->decRefPicMarking, NAL_SEI, numRefFrames); 9990c1bc742181ded4930842b46e9507372f0b1b963James Dong 10000c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10010c1bc742181ded4930842b46e9507372f0b1b963James Dong 10020c1bc742181ded4930842b46e9507372f0b1b963James Dong} 10030c1bc742181ded4930842b46e9507372f0b1b963James Dong 10040c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 10050c1bc742181ded4930842b46e9507372f0b1b963James Dong 10060c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeSparePic 10070c1bc742181ded4930842b46e9507372f0b1b963James Dong 10080c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 10090c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 10100c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 10110c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 10120c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 10130c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 10140c1bc742181ded4930842b46e9507372f0b1b963James Dong 10150c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 10160c1bc742181ded4930842b46e9507372f0b1b963James Dong 10170c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSparePic( 10180c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 10190c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSparePic_t *pSparePic, 10200c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 picSizeInMapUnits) 10210c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 10220c1bc742181ded4930842b46e9507372f0b1b963James Dong 10230c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 10240c1bc742181ded4930842b46e9507372f0b1b963James Dong 10250c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i, j, mapUnitCnt; 10260c1bc742181ded4930842b46e9507372f0b1b963James Dong 10270c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 10280c1bc742181ded4930842b46e9507372f0b1b963James Dong 10290c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 10300c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSparePic); 10310c1bc742181ded4930842b46e9507372f0b1b963James Dong 10320c1bc742181ded4930842b46e9507372f0b1b963James Dong 10330c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 10340c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSparePic->targetFrameNum); 10350c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 10360c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10370c1bc742181ded4930842b46e9507372f0b1b963James Dong 10380c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 10390c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 10400c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 10410c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->spareFieldFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 10420c1bc742181ded4930842b46e9507372f0b1b963James Dong /* do not accept fields */ 10430c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->spareFieldFlag) 10440c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 10450c1bc742181ded4930842b46e9507372f0b1b963James Dong 10460c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &pSparePic->numSparePics); 10470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 10480c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10490c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->numSparePics++; 10500c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->numSparePics > MAX_NUM_SPARE_PICS) 10510c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 10520c1bc742181ded4930842b46e9507372f0b1b963James Dong 10530c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < pSparePic->numSparePics; i++) 10540c1bc742181ded4930842b46e9507372f0b1b963James Dong { 10550c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 10560c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSparePic->deltaSpareFrameNum[i]); 10570c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 10580c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10590c1bc742181ded4930842b46e9507372f0b1b963James Dong 10600c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 10610c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSparePic->spareAreaIdc[i]); 10620c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 10630c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10640c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->spareAreaIdc[i] > 2) 10650c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 10660c1bc742181ded4930842b46e9507372f0b1b963James Dong 10670c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->spareAreaIdc[i] == 1) 10680c1bc742181ded4930842b46e9507372f0b1b963James Dong { 10690c1bc742181ded4930842b46e9507372f0b1b963James Dong /* where corresponding FREE() ??? */ 10700c1bc742181ded4930842b46e9507372f0b1b963James Dong ALLOCATE(pSparePic->spareUnitFlag[i], picSizeInMapUnits, u32); 10710c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->spareUnitFlag[i] == NULL) 10720c1bc742181ded4930842b46e9507372f0b1b963James Dong return(MEMORY_ALLOCATION_ERROR); 10730c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->zeroRunLength[i] = NULL; 10740c1bc742181ded4930842b46e9507372f0b1b963James Dong 10750c1bc742181ded4930842b46e9507372f0b1b963James Dong for (j = 0; j < picSizeInMapUnits; j++) 10760c1bc742181ded4930842b46e9507372f0b1b963James Dong { 10770c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 10780c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 10790c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 10800c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->spareUnitFlag[i][j] = tmp == 1 ? 10810c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 10820c1bc742181ded4930842b46e9507372f0b1b963James Dong } 10830c1bc742181ded4930842b46e9507372f0b1b963James Dong } 10840c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (pSparePic->spareAreaIdc[i] == 2) 10850c1bc742181ded4930842b46e9507372f0b1b963James Dong { 10860c1bc742181ded4930842b46e9507372f0b1b963James Dong /* where corresponding FREE() ??? */ 10870c1bc742181ded4930842b46e9507372f0b1b963James Dong ALLOCATE(pSparePic->zeroRunLength[i], picSizeInMapUnits, u32); 10880c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSparePic->zeroRunLength[i] == NULL) 10890c1bc742181ded4930842b46e9507372f0b1b963James Dong return(MEMORY_ALLOCATION_ERROR); 10900c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->spareUnitFlag[i] = NULL; 10910c1bc742181ded4930842b46e9507372f0b1b963James Dong 10920c1bc742181ded4930842b46e9507372f0b1b963James Dong for (j = 0, mapUnitCnt = 0; mapUnitCnt < picSizeInMapUnits; j++) 10930c1bc742181ded4930842b46e9507372f0b1b963James Dong { 10940c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 10950c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSparePic->zeroRunLength[i][j]); 10960c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 10970c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 10980c1bc742181ded4930842b46e9507372f0b1b963James Dong mapUnitCnt += pSparePic->zeroRunLength[i][j] + 1; 10990c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11000c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11010c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11020c1bc742181ded4930842b46e9507372f0b1b963James Dong 11030c1bc742181ded4930842b46e9507372f0b1b963James Dong /* set rest to null */ 11040c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = pSparePic->numSparePics; i < MAX_NUM_SPARE_PICS; i++) 11050c1bc742181ded4930842b46e9507372f0b1b963James Dong { 11060c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->spareUnitFlag[i] = NULL; 11070c1bc742181ded4930842b46e9507372f0b1b963James Dong pSparePic->zeroRunLength[i] = NULL; 11080c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11090c1bc742181ded4930842b46e9507372f0b1b963James Dong 11100c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 11110c1bc742181ded4930842b46e9507372f0b1b963James Dong 11120c1bc742181ded4930842b46e9507372f0b1b963James Dong} 11130c1bc742181ded4930842b46e9507372f0b1b963James Dong 11140c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 11150c1bc742181ded4930842b46e9507372f0b1b963James Dong 11160c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeSceneInfo 11170c1bc742181ded4930842b46e9507372f0b1b963James Dong 11180c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 11190c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11200c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 11210c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11220c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 11230c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11240c1bc742181ded4930842b46e9507372f0b1b963James Dong 11250c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 11260c1bc742181ded4930842b46e9507372f0b1b963James Dong 11270c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSceneInfo( 11280c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 11290c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSceneInfo_t *pSceneInfo) 11300c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 11310c1bc742181ded4930842b46e9507372f0b1b963James Dong 11320c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 11330c1bc742181ded4930842b46e9507372f0b1b963James Dong 11340c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 11350c1bc742181ded4930842b46e9507372f0b1b963James Dong 11360c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 11370c1bc742181ded4930842b46e9507372f0b1b963James Dong 11380c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 11390c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSceneInfo); 11400c1bc742181ded4930842b46e9507372f0b1b963James Dong 11410c1bc742181ded4930842b46e9507372f0b1b963James Dong 11420c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 11430c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 11440c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 11450c1bc742181ded4930842b46e9507372f0b1b963James Dong pSceneInfo->sceneInfoPresentFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 11460c1bc742181ded4930842b46e9507372f0b1b963James Dong 11470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSceneInfo->sceneInfoPresentFlag) 11480c1bc742181ded4930842b46e9507372f0b1b963James Dong { 11490c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &pSceneInfo->sceneId); 11500c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 11510c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 11520c1bc742181ded4930842b46e9507372f0b1b963James Dong 11530c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 11540c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSceneInfo->sceneTransitionType); 11550c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 11560c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 11570c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSceneInfo->sceneTransitionType > 6) 11580c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 11590c1bc742181ded4930842b46e9507372f0b1b963James Dong 11600c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSceneInfo->sceneTransitionType) 11610c1bc742181ded4930842b46e9507372f0b1b963James Dong { 11620c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 11630c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSceneInfo->secondSceneId); 11640c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 11650c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 11660c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11670c1bc742181ded4930842b46e9507372f0b1b963James Dong 11680c1bc742181ded4930842b46e9507372f0b1b963James Dong } 11690c1bc742181ded4930842b46e9507372f0b1b963James Dong 11700c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 11710c1bc742181ded4930842b46e9507372f0b1b963James Dong 11720c1bc742181ded4930842b46e9507372f0b1b963James Dong} 11730c1bc742181ded4930842b46e9507372f0b1b963James Dong 11740c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 11750c1bc742181ded4930842b46e9507372f0b1b963James Dong 11760c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeSubSeqInfo 11770c1bc742181ded4930842b46e9507372f0b1b963James Dong 11780c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 11790c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11800c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 11810c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11820c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 11830c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 11840c1bc742181ded4930842b46e9507372f0b1b963James Dong 11850c1bc742181ded4930842b46e9507372f0b1b963James Dong-----------------------------------------------------------------------------*/ 11860c1bc742181ded4930842b46e9507372f0b1b963James Dong 11870c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqInfo( 11880c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 11890c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqInfo_t *pSubSeqInfo) 11900c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 11910c1bc742181ded4930842b46e9507372f0b1b963James Dong 11920c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 11930c1bc742181ded4930842b46e9507372f0b1b963James Dong 11940c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 11950c1bc742181ded4930842b46e9507372f0b1b963James Dong 11960c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 11970c1bc742181ded4930842b46e9507372f0b1b963James Dong 11980c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 11990c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSubSeqInfo); 12000c1bc742181ded4930842b46e9507372f0b1b963James Dong 12010c1bc742181ded4930842b46e9507372f0b1b963James Dong 12020c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 12030c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqInfo->subSeqLayerNum); 12040c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 12050c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 12060c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqInfo->subSeqLayerNum > 255) 12070c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12080c1bc742181ded4930842b46e9507372f0b1b963James Dong 12090c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, &pSubSeqInfo->subSeqId); 12100c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 12110c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 12120c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqInfo->subSeqId > 65535) 12130c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12140c1bc742181ded4930842b46e9507372f0b1b963James Dong 12150c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 12160c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12170c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12180c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqInfo->firstRefPicFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 12190c1bc742181ded4930842b46e9507372f0b1b963James Dong 12200c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 12210c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12220c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12230c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqInfo->leadingNonRefPicFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 12240c1bc742181ded4930842b46e9507372f0b1b963James Dong 12250c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 12260c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12270c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12280c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqInfo->lastPicFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 12290c1bc742181ded4930842b46e9507372f0b1b963James Dong 12300c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 12310c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12320c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12330c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqInfo->subSeqFrameNumFlag = tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 12340c1bc742181ded4930842b46e9507372f0b1b963James Dong 12350c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqInfo->subSeqFrameNumFlag) 12360c1bc742181ded4930842b46e9507372f0b1b963James Dong { 12370c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 12380c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqInfo->subSeqFrameNum); 12390c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 12400c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 12410c1bc742181ded4930842b46e9507372f0b1b963James Dong } 12420c1bc742181ded4930842b46e9507372f0b1b963James Dong 12430c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 12440c1bc742181ded4930842b46e9507372f0b1b963James Dong 12450c1bc742181ded4930842b46e9507372f0b1b963James Dong} 12460c1bc742181ded4930842b46e9507372f0b1b963James Dong 12470c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 12480c1bc742181ded4930842b46e9507372f0b1b963James Dong 12490c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeSubSeqLayerCharacteristics 12500c1bc742181ded4930842b46e9507372f0b1b963James Dong 12510c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 12520c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 12530c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 12540c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 12550c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 12560c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 12570c1bc742181ded4930842b46e9507372f0b1b963James Dong 12580c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 12590c1bc742181ded4930842b46e9507372f0b1b963James Dong 12600c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqLayerCharacteristics( 12610c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 12620c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqLayerCharacteristics_t *pSubSeqLayerCharacteristics) 12630c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 12640c1bc742181ded4930842b46e9507372f0b1b963James Dong 12650c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 12660c1bc742181ded4930842b46e9507372f0b1b963James Dong 12670c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i; 12680c1bc742181ded4930842b46e9507372f0b1b963James Dong 12690c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 12700c1bc742181ded4930842b46e9507372f0b1b963James Dong 12710c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 12720c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSubSeqLayerCharacteristics); 12730c1bc742181ded4930842b46e9507372f0b1b963James Dong 12740c1bc742181ded4930842b46e9507372f0b1b963James Dong 12750c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 12760c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqLayerCharacteristics->numSubSeqLayers); 12770c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 12780c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 12790c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqLayerCharacteristics->numSubSeqLayers++; 12800c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqLayerCharacteristics->numSubSeqLayers > MAX_NUM_SUB_SEQ_LAYERS) 12810c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12820c1bc742181ded4930842b46e9507372f0b1b963James Dong 12830c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < pSubSeqLayerCharacteristics->numSubSeqLayers; i++) 12840c1bc742181ded4930842b46e9507372f0b1b963James Dong { 12850c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 12860c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12870c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12880c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqLayerCharacteristics->accurateStatisticsFlag[i] = 12890c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 12900c1bc742181ded4930842b46e9507372f0b1b963James Dong 12910c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 16); 12920c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12930c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12940c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqLayerCharacteristics->averageBitRate[i] = tmp; 12950c1bc742181ded4930842b46e9507372f0b1b963James Dong 12960c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 16); 12970c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 12980c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 12990c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqLayerCharacteristics->averageFrameRate[i] = tmp; 13000c1bc742181ded4930842b46e9507372f0b1b963James Dong } 13010c1bc742181ded4930842b46e9507372f0b1b963James Dong 13020c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 13030c1bc742181ded4930842b46e9507372f0b1b963James Dong 13040c1bc742181ded4930842b46e9507372f0b1b963James Dong} 13050c1bc742181ded4930842b46e9507372f0b1b963James Dong 13060c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 13070c1bc742181ded4930842b46e9507372f0b1b963James Dong 13080c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeSubSeqCharacteristics 13090c1bc742181ded4930842b46e9507372f0b1b963James Dong 13100c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 13110c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 13120c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 13130c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 13140c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 13150c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 13160c1bc742181ded4930842b46e9507372f0b1b963James Dong 13170c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 13180c1bc742181ded4930842b46e9507372f0b1b963James Dong 13190c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeSubSeqCharacteristics( 13200c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 13210c1bc742181ded4930842b46e9507372f0b1b963James Dong seiSubSeqCharacteristics_t *pSubSeqCharacteristics) 13220c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 13230c1bc742181ded4930842b46e9507372f0b1b963James Dong 13240c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 13250c1bc742181ded4930842b46e9507372f0b1b963James Dong 13260c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp, i; 13270c1bc742181ded4930842b46e9507372f0b1b963James Dong 13280c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 13290c1bc742181ded4930842b46e9507372f0b1b963James Dong 13300c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 13310c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pSubSeqCharacteristics); 13320c1bc742181ded4930842b46e9507372f0b1b963James Dong 13330c1bc742181ded4930842b46e9507372f0b1b963James Dong 13340c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 13350c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqCharacteristics->subSeqLayerNum); 13360c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 13370c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 13380c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqCharacteristics->subSeqLayerNum > MAX_NUM_SUB_SEQ_LAYERS-1) 13390c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13400c1bc742181ded4930842b46e9507372f0b1b963James Dong 13410c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 13420c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqCharacteristics->subSeqId); 13430c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 13440c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 13450c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqCharacteristics->subSeqId > 65535) 13460c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13470c1bc742181ded4930842b46e9507372f0b1b963James Dong 13480c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 13490c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 13500c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13510c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->durationFlag = tmp == 1 ? 13520c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 13530c1bc742181ded4930842b46e9507372f0b1b963James Dong 13540c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqCharacteristics->durationFlag) 13550c1bc742181ded4930842b46e9507372f0b1b963James Dong { 13560c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->subSeqDuration = h264bsdShowBits32(pStrmData); 13570c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData,32) == END_OF_STREAM) 13580c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13590c1bc742181ded4930842b46e9507372f0b1b963James Dong } 13600c1bc742181ded4930842b46e9507372f0b1b963James Dong 13610c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 13620c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 13630c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13640c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->averageRateFlag = tmp == 1 ? 13650c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 13660c1bc742181ded4930842b46e9507372f0b1b963James Dong 13670c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqCharacteristics->averageRateFlag) 13680c1bc742181ded4930842b46e9507372f0b1b963James Dong { 13690c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 13700c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 13710c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13720c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->accurateStatisticsFlag = 13730c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 13740c1bc742181ded4930842b46e9507372f0b1b963James Dong 13750c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 16); 13760c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 13770c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13780c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->averageBitRate = tmp; 13790c1bc742181ded4930842b46e9507372f0b1b963James Dong 13800c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 16); 13810c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 13820c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13830c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->averageFrameRate = tmp; 13840c1bc742181ded4930842b46e9507372f0b1b963James Dong } 13850c1bc742181ded4930842b46e9507372f0b1b963James Dong 13860c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 13870c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqCharacteristics->numReferencedSubseqs); 13880c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 13890c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 13900c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pSubSeqCharacteristics->numReferencedSubseqs > MAX_NUM_SUB_SEQ_LAYERS-1) 13910c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 13920c1bc742181ded4930842b46e9507372f0b1b963James Dong 13930c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < pSubSeqCharacteristics->numReferencedSubseqs; i++) 13940c1bc742181ded4930842b46e9507372f0b1b963James Dong { 13950c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 13960c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqCharacteristics->refSubSeqLayerNum[i]); 13970c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 13980c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 13990c1bc742181ded4930842b46e9507372f0b1b963James Dong 14000c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 14010c1bc742181ded4930842b46e9507372f0b1b963James Dong &pSubSeqCharacteristics->refSubSeqId[i]); 14020c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 14030c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 14040c1bc742181ded4930842b46e9507372f0b1b963James Dong 14050c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 14060c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 14070c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 14080c1bc742181ded4930842b46e9507372f0b1b963James Dong pSubSeqCharacteristics->refSubSeqDirection[i] = tmp; 14090c1bc742181ded4930842b46e9507372f0b1b963James Dong } 14100c1bc742181ded4930842b46e9507372f0b1b963James Dong 14110c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 14120c1bc742181ded4930842b46e9507372f0b1b963James Dong 14130c1bc742181ded4930842b46e9507372f0b1b963James Dong} 14140c1bc742181ded4930842b46e9507372f0b1b963James Dong 14150c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 14160c1bc742181ded4930842b46e9507372f0b1b963James Dong 14170c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeFullFrameFreeze 14180c1bc742181ded4930842b46e9507372f0b1b963James Dong 14190c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 14200c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14210c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 14220c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14230c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 14240c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14250c1bc742181ded4930842b46e9507372f0b1b963James Dong 14260c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 14270c1bc742181ded4930842b46e9507372f0b1b963James Dong 14280c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFullFrameFreeze( 14290c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 14300c1bc742181ded4930842b46e9507372f0b1b963James Dong seiFullFrameFreeze_t *pFullFrameFreeze) 14310c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 14320c1bc742181ded4930842b46e9507372f0b1b963James Dong 14330c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 14340c1bc742181ded4930842b46e9507372f0b1b963James Dong 14350c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 14360c1bc742181ded4930842b46e9507372f0b1b963James Dong 14370c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 14380c1bc742181ded4930842b46e9507372f0b1b963James Dong 14390c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 14400c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pFullFrameFreeze); 14410c1bc742181ded4930842b46e9507372f0b1b963James Dong 14420c1bc742181ded4930842b46e9507372f0b1b963James Dong 14430c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 14440c1bc742181ded4930842b46e9507372f0b1b963James Dong &pFullFrameFreeze->fullFrameFreezeRepetitionPeriod); 14450c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 14460c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 14470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pFullFrameFreeze->fullFrameFreezeRepetitionPeriod > 16384) 14480c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 14490c1bc742181ded4930842b46e9507372f0b1b963James Dong 14500c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 14510c1bc742181ded4930842b46e9507372f0b1b963James Dong 14520c1bc742181ded4930842b46e9507372f0b1b963James Dong} 14530c1bc742181ded4930842b46e9507372f0b1b963James Dong 14540c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 14550c1bc742181ded4930842b46e9507372f0b1b963James Dong 14560c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeFullFrameSnapshot 14570c1bc742181ded4930842b46e9507372f0b1b963James Dong 14580c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 14590c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14600c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 14610c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14620c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 14630c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14640c1bc742181ded4930842b46e9507372f0b1b963James Dong 14650c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 14660c1bc742181ded4930842b46e9507372f0b1b963James Dong 14670c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeFullFrameSnapshot( 14680c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 14690c1bc742181ded4930842b46e9507372f0b1b963James Dong seiFullFrameSnapshot_t *pFullFrameSnapshot) 14700c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 14710c1bc742181ded4930842b46e9507372f0b1b963James Dong 14720c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 14730c1bc742181ded4930842b46e9507372f0b1b963James Dong 14740c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 14750c1bc742181ded4930842b46e9507372f0b1b963James Dong 14760c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 14770c1bc742181ded4930842b46e9507372f0b1b963James Dong 14780c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 14790c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pFullFrameSnapshot); 14800c1bc742181ded4930842b46e9507372f0b1b963James Dong 14810c1bc742181ded4930842b46e9507372f0b1b963James Dong 14820c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 14830c1bc742181ded4930842b46e9507372f0b1b963James Dong &pFullFrameSnapshot->snapShotId); 14840c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 14850c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 14860c1bc742181ded4930842b46e9507372f0b1b963James Dong 14870c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 14880c1bc742181ded4930842b46e9507372f0b1b963James Dong 14890c1bc742181ded4930842b46e9507372f0b1b963James Dong} 14900c1bc742181ded4930842b46e9507372f0b1b963James Dong 14910c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 14920c1bc742181ded4930842b46e9507372f0b1b963James Dong 14930c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeProgressiveRefinementSegmentStart 14940c1bc742181ded4930842b46e9507372f0b1b963James Dong 14950c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 14960c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14970c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 14980c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 14990c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 15000c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15010c1bc742181ded4930842b46e9507372f0b1b963James Dong 15020c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 15030c1bc742181ded4930842b46e9507372f0b1b963James Dong 15040c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeProgressiveRefinementSegmentStart( 15050c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 15060c1bc742181ded4930842b46e9507372f0b1b963James Dong seiProgressiveRefinementSegmentStart_t *pProgressiveRefinementSegmentStart) 15070c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 15080c1bc742181ded4930842b46e9507372f0b1b963James Dong 15090c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 15100c1bc742181ded4930842b46e9507372f0b1b963James Dong 15110c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 15120c1bc742181ded4930842b46e9507372f0b1b963James Dong 15130c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 15140c1bc742181ded4930842b46e9507372f0b1b963James Dong 15150c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 15160c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pProgressiveRefinementSegmentStart); 15170c1bc742181ded4930842b46e9507372f0b1b963James Dong 15180c1bc742181ded4930842b46e9507372f0b1b963James Dong 15190c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 15200c1bc742181ded4930842b46e9507372f0b1b963James Dong &pProgressiveRefinementSegmentStart->progressiveRefinementId); 15210c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 15220c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 15230c1bc742181ded4930842b46e9507372f0b1b963James Dong 15240c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 15250c1bc742181ded4930842b46e9507372f0b1b963James Dong &pProgressiveRefinementSegmentStart->numRefinementSteps); 15260c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 15270c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 15280c1bc742181ded4930842b46e9507372f0b1b963James Dong pProgressiveRefinementSegmentStart->numRefinementSteps++; 15290c1bc742181ded4930842b46e9507372f0b1b963James Dong 15300c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 15310c1bc742181ded4930842b46e9507372f0b1b963James Dong 15320c1bc742181ded4930842b46e9507372f0b1b963James Dong} 15330c1bc742181ded4930842b46e9507372f0b1b963James Dong 15340c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 15350c1bc742181ded4930842b46e9507372f0b1b963James Dong 15360c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeProgressiveRefinementSegmentEnd 15370c1bc742181ded4930842b46e9507372f0b1b963James Dong 15380c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 15390c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15400c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 15410c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15420c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 15430c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15440c1bc742181ded4930842b46e9507372f0b1b963James Dong 15450c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 15460c1bc742181ded4930842b46e9507372f0b1b963James Dong 15470c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeProgressiveRefinementSegmentEnd( 15480c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 15490c1bc742181ded4930842b46e9507372f0b1b963James Dong seiProgressiveRefinementSegmentEnd_t *pProgressiveRefinementSegmentEnd) 15500c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 15510c1bc742181ded4930842b46e9507372f0b1b963James Dong 15520c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 15530c1bc742181ded4930842b46e9507372f0b1b963James Dong 15540c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp; 15550c1bc742181ded4930842b46e9507372f0b1b963James Dong 15560c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 15570c1bc742181ded4930842b46e9507372f0b1b963James Dong 15580c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 15590c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pProgressiveRefinementSegmentEnd); 15600c1bc742181ded4930842b46e9507372f0b1b963James Dong 15610c1bc742181ded4930842b46e9507372f0b1b963James Dong 15620c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 15630c1bc742181ded4930842b46e9507372f0b1b963James Dong &pProgressiveRefinementSegmentEnd->progressiveRefinementId); 15640c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 15650c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 15660c1bc742181ded4930842b46e9507372f0b1b963James Dong 15670c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 15680c1bc742181ded4930842b46e9507372f0b1b963James Dong 15690c1bc742181ded4930842b46e9507372f0b1b963James Dong} 15700c1bc742181ded4930842b46e9507372f0b1b963James Dong 15710c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 15720c1bc742181ded4930842b46e9507372f0b1b963James Dong 15730c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeMotionConstrainedSliceGroupSet 15740c1bc742181ded4930842b46e9507372f0b1b963James Dong 15750c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 15760c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15770c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 15780c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15790c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 15800c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 15810c1bc742181ded4930842b46e9507372f0b1b963James Dong 15820c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 15830c1bc742181ded4930842b46e9507372f0b1b963James Dong 15840c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeMotionConstrainedSliceGroupSet( 15850c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 15860c1bc742181ded4930842b46e9507372f0b1b963James Dong seiMotionConstrainedSliceGroupSet_t *pMotionConstrainedSliceGroupSet, 15870c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 numSliceGroups) 15880c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 15890c1bc742181ded4930842b46e9507372f0b1b963James Dong 15900c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 15910c1bc742181ded4930842b46e9507372f0b1b963James Dong 15920c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 tmp,i; 15930c1bc742181ded4930842b46e9507372f0b1b963James Dong 15940c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 15950c1bc742181ded4930842b46e9507372f0b1b963James Dong 15960c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 15970c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pMotionConstrainedSliceGroupSet); 15980c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(numSliceGroups < MAX_NUM_SLICE_GROUPS); 15990c1bc742181ded4930842b46e9507372f0b1b963James Dong 16000c1bc742181ded4930842b46e9507372f0b1b963James Dong 16010c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 16020c1bc742181ded4930842b46e9507372f0b1b963James Dong &pMotionConstrainedSliceGroupSet->numSliceGroupsInSet); 16030c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 16040c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 16050c1bc742181ded4930842b46e9507372f0b1b963James Dong pMotionConstrainedSliceGroupSet->numSliceGroupsInSet++; 16060c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pMotionConstrainedSliceGroupSet->numSliceGroupsInSet > numSliceGroups) 16070c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16080c1bc742181ded4930842b46e9507372f0b1b963James Dong 16090c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < pMotionConstrainedSliceGroupSet->numSliceGroupsInSet; i++) 16100c1bc742181ded4930842b46e9507372f0b1b963James Dong { 16110c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 16120c1bc742181ded4930842b46e9507372f0b1b963James Dong ceilLog2NumSliceGroups[numSliceGroups]); 16130c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 16140c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16150c1bc742181ded4930842b46e9507372f0b1b963James Dong pMotionConstrainedSliceGroupSet->sliceGroupId[i] = tmp; 16160c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pMotionConstrainedSliceGroupSet->sliceGroupId[i] > 16170c1bc742181ded4930842b46e9507372f0b1b963James Dong pMotionConstrainedSliceGroupSet->numSliceGroupsInSet-1) 16180c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16190c1bc742181ded4930842b46e9507372f0b1b963James Dong } 16200c1bc742181ded4930842b46e9507372f0b1b963James Dong 16210c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 16220c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 16230c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16240c1bc742181ded4930842b46e9507372f0b1b963James Dong pMotionConstrainedSliceGroupSet->exactSampleValueMatchFlag = 16250c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp == 1 ? HANTRO_TRUE : HANTRO_FALSE; 16260c1bc742181ded4930842b46e9507372f0b1b963James Dong 16270c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData, 1); 16280c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 16290c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16300c1bc742181ded4930842b46e9507372f0b1b963James Dong pMotionConstrainedSliceGroupSet->panScanRectFlag = tmp == 1 ? 16310c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_TRUE : HANTRO_FALSE; 16320c1bc742181ded4930842b46e9507372f0b1b963James Dong 16330c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pMotionConstrainedSliceGroupSet->panScanRectFlag) 16340c1bc742181ded4930842b46e9507372f0b1b963James Dong { 16350c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdDecodeExpGolombUnsigned(pStrmData, 16360c1bc742181ded4930842b46e9507372f0b1b963James Dong &pMotionConstrainedSliceGroupSet->panScanRectId); 16370c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp != HANTRO_OK) 16380c1bc742181ded4930842b46e9507372f0b1b963James Dong return(tmp); 16390c1bc742181ded4930842b46e9507372f0b1b963James Dong } 16400c1bc742181ded4930842b46e9507372f0b1b963James Dong 16410c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 16420c1bc742181ded4930842b46e9507372f0b1b963James Dong 16430c1bc742181ded4930842b46e9507372f0b1b963James Dong} 16440c1bc742181ded4930842b46e9507372f0b1b963James Dong 16450c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 16460c1bc742181ded4930842b46e9507372f0b1b963James Dong 16470c1bc742181ded4930842b46e9507372f0b1b963James Dong Function: DecodeReservedSeiMessage 16480c1bc742181ded4930842b46e9507372f0b1b963James Dong 16490c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 16500c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 16510c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 16520c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 16530c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 16540c1bc742181ded4930842b46e9507372f0b1b963James Dong <++> 16550c1bc742181ded4930842b46e9507372f0b1b963James Dong 16560c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 16570c1bc742181ded4930842b46e9507372f0b1b963James Dong 16580c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeReservedSeiMessage( 16590c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 16600c1bc742181ded4930842b46e9507372f0b1b963James Dong seiReservedSeiMessage_t *pReservedSeiMessage, 16610c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 payloadSize) 16620c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 16630c1bc742181ded4930842b46e9507372f0b1b963James Dong 16640c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 16650c1bc742181ded4930842b46e9507372f0b1b963James Dong 16660c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 i, tmp; 16670c1bc742181ded4930842b46e9507372f0b1b963James Dong 16680c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 16690c1bc742181ded4930842b46e9507372f0b1b963James Dong 16700c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 16710c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pReservedSeiMessage); 16720c1bc742181ded4930842b46e9507372f0b1b963James Dong 16730c1bc742181ded4930842b46e9507372f0b1b963James Dong 16740c1bc742181ded4930842b46e9507372f0b1b963James Dong /* where corresponding FREE() ??? */ 16750c1bc742181ded4930842b46e9507372f0b1b963James Dong ALLOCATE(pReservedSeiMessage->reservedSeiMessagePayloadByte,payloadSize,u8); 16760c1bc742181ded4930842b46e9507372f0b1b963James Dong if (pReservedSeiMessage->reservedSeiMessagePayloadByte == NULL) 16770c1bc742181ded4930842b46e9507372f0b1b963James Dong return(MEMORY_ALLOCATION_ERROR); 16780c1bc742181ded4930842b46e9507372f0b1b963James Dong 16790c1bc742181ded4930842b46e9507372f0b1b963James Dong pReservedSeiMessage->numPayloadBytes = payloadSize; 16800c1bc742181ded4930842b46e9507372f0b1b963James Dong 16810c1bc742181ded4930842b46e9507372f0b1b963James Dong for (i = 0; i < payloadSize; i++) 16820c1bc742181ded4930842b46e9507372f0b1b963James Dong { 16830c1bc742181ded4930842b46e9507372f0b1b963James Dong tmp = h264bsdGetBits(pStrmData,8); 16840c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tmp == END_OF_STREAM) 16850c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 16860c1bc742181ded4930842b46e9507372f0b1b963James Dong pReservedSeiMessage->reservedSeiMessagePayloadByte[i] = (u8)tmp; 16870c1bc742181ded4930842b46e9507372f0b1b963James Dong } 16880c1bc742181ded4930842b46e9507372f0b1b963James Dong 16890c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 16900c1bc742181ded4930842b46e9507372f0b1b963James Dong 16910c1bc742181ded4930842b46e9507372f0b1b963James Dong} 16920c1bc742181ded4930842b46e9507372f0b1b963James Dong 1693