PageRenderTime 30ms CodeModel.GetById 18ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/H264Dec/source/h264bsd_nal_unit.c

http://github.com/mbebenita/Broadway
C | 117 lines | 32 code | 19 blank | 66 comment | 27 complexity | 2b2dc8865030a1f72b3778d40f005f12 MD5 | raw file
  1/*
  2 * Copyright (C) 2009 The Android Open Source Project
  3 *
  4 * Licensed under the Apache License, Version 2.0 (the "License");
  5 * you may not use this file except in compliance with the License.
  6 * You may obtain a copy of the License at
  7 *
  8 *      http://www.apache.org/licenses/LICENSE-2.0
  9 *
 10 * Unless required by applicable law or agreed to in writing, software
 11 * distributed under the License is distributed on an "AS IS" BASIS,
 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 * See the License for the specific language governing permissions and
 14 * limitations under the License.
 15 */
 16
 17/*------------------------------------------------------------------------------
 18
 19    Table of contents
 20
 21     1. Include headers
 22     2. External compiler flags
 23     3. Module defines
 24     4. Local function prototypes
 25     5. Functions
 26          h264bsdDecodeNalUnit
 27
 28------------------------------------------------------------------------------*/
 29
 30/*------------------------------------------------------------------------------
 31    1. Include headers
 32------------------------------------------------------------------------------*/
 33
 34#include "h264bsd_nal_unit.h"
 35#include "h264bsd_util.h"
 36
 37/*------------------------------------------------------------------------------
 38    2. External compiler flags
 39--------------------------------------------------------------------------------
 40
 41--------------------------------------------------------------------------------
 42    3. Module defines
 43------------------------------------------------------------------------------*/
 44
 45/*------------------------------------------------------------------------------
 46    4. Local function prototypes
 47------------------------------------------------------------------------------*/
 48
 49/*------------------------------------------------------------------------------
 50
 51    Function name: h264bsdDecodeNalUnit
 52
 53        Functional description:
 54            Decode NAL unit header information
 55
 56        Inputs:
 57            pStrmData       pointer to stream data structure
 58
 59        Outputs:
 60            pNalUnit        NAL unit header information is stored here
 61
 62        Returns:
 63            HANTRO_OK       success
 64            HANTRO_NOK      invalid NAL unit header information
 65
 66------------------------------------------------------------------------------*/
 67
 68u32 h264bsdDecodeNalUnit(strmData_t *pStrmData, nalUnit_t *pNalUnit)
 69{
 70
 71/* Variables */
 72
 73    u32 tmp;
 74
 75/* Code */
 76
 77    ASSERT(pStrmData);
 78    ASSERT(pNalUnit);
 79    ASSERT(pStrmData->bitPosInWord == 0);
 80
 81    /* forbidden_zero_bit (not checked to be zero, errors ignored) */
 82    tmp = h264bsdGetBits(pStrmData, 1);
 83    /* Assuming that NAL unit starts from byte boundary ­> don't have to check
 84     * following 7 bits for END_OF_STREAM */
 85    if (tmp == END_OF_STREAM)
 86        return(HANTRO_NOK);
 87
 88    tmp = h264bsdGetBits(pStrmData, 2);
 89    pNalUnit->nalRefIdc = tmp;
 90
 91    tmp = h264bsdGetBits(pStrmData, 5);
 92    pNalUnit->nalUnitType = (nalUnitType_e)tmp;
 93
 94    /* data partitioning NAL units not supported */
 95    if ( (tmp == 2) || (tmp == 3) || (tmp == 4) )
 96    {
 97        return(HANTRO_NOK);
 98    }
 99
100    /* nal_ref_idc shall not be zero for these nal_unit_types */
101    if ( ( (tmp == NAL_SEQ_PARAM_SET) || (tmp == NAL_PIC_PARAM_SET) ||
102           (tmp == NAL_CODED_SLICE_IDR) ) && (pNalUnit->nalRefIdc == 0) )
103    {
104        return(HANTRO_NOK);
105    }
106    /* nal_ref_idc shall be zero for these nal_unit_types */
107    else if ( ( (tmp == NAL_SEI) || (tmp == NAL_ACCESS_UNIT_DELIMITER) ||
108                (tmp == NAL_END_OF_SEQUENCE) || (tmp == NAL_END_OF_STREAM) ||
109                (tmp == NAL_FILLER_DATA) ) && (pNalUnit->nalRefIdc != 0) )
110    {
111        return(HANTRO_NOK);
112    }
113
114    return(HANTRO_OK);
115
116}
117