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 
h264bsdDecodeNalUnit(strmData_t * pStrmData,nalUnit_t * pNalUnit)68 u32 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 
118