blob: e44c43a7cc58ad319ee79e4d5e5f162aa2bd2074 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*------------------------------------------------------------------------------
Table of contents
1. Include headers
2. External compiler flags
3. Module defines
4. Local function prototypes
5. Functions
h264bsdDecodeNalUnit
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
1. Include headers
------------------------------------------------------------------------------*/
#include "h264bsd_nal_unit.h"
#include "h264bsd_util.h"
/*------------------------------------------------------------------------------
2. External compiler flags
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
3. Module defines
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
4. Local function prototypes
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
Function name: h264bsdDecodeNalUnit
Functional description:
Decode NAL unit header information
Inputs:
pStrmData pointer to stream data structure
Outputs:
pNalUnit NAL unit header information is stored here
Returns:
HANTRO_OK success
HANTRO_NOK invalid NAL unit header information
------------------------------------------------------------------------------*/
u32 h264bsdDecodeNalUnit(strmData_t *pStrmData, nalUnit_t *pNalUnit)
{
/* Variables */
u32 tmp;
/* Code */
ASSERT(pStrmData);
ASSERT(pNalUnit);
ASSERT(pStrmData->bitPosInWord == 0);
/* forbidden_zero_bit (not checked to be zero, errors ignored) */
tmp = h264bsdGetBits(pStrmData, 1);
/* Assuming that NAL unit starts from byte boundary ­> don't have to check
* following 7 bits for END_OF_STREAM */
if (tmp == END_OF_STREAM)
return(HANTRO_NOK);
tmp = h264bsdGetBits(pStrmData, 2);
pNalUnit->nalRefIdc = tmp;
tmp = h264bsdGetBits(pStrmData, 5);
pNalUnit->nalUnitType = (nalUnitType_e)tmp;
/* data partitioning NAL units not supported */
if ( (tmp == 2) || (tmp == 3) || (tmp == 4) )
{
return(HANTRO_NOK);
}
/* nal_ref_idc shall not be zero for these nal_unit_types */
if ( ( (tmp == NAL_SEQ_PARAM_SET) || (tmp == NAL_PIC_PARAM_SET) ||
(tmp == NAL_CODED_SLICE_IDR) ) && (pNalUnit->nalRefIdc == 0) )
{
return(HANTRO_NOK);
}
/* nal_ref_idc shall be zero for these nal_unit_types */
else if ( ( (tmp == NAL_SEI) || (tmp == NAL_ACCESS_UNIT_DELIMITER) ||
(tmp == NAL_END_OF_SEQUENCE) || (tmp == NAL_END_OF_STREAM) ||
(tmp == NAL_FILLER_DATA) ) && (pNalUnit->nalRefIdc != 0) )
{
return(HANTRO_NOK);
}
return(HANTRO_OK);
}