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