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