1 /******************************************************************************
2  *
3  * Copyright (C) 2015 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 
21 /**
22 ******************************************************************************
23 * @file
24 *  ih264e_encode_header.h
25 *
26 * @brief
27 *  This file contains structures and interface prototypes for h264 bitstream
28 *  header encoding
29 *
30 * @author
31 *  ittiam
32 *
33 * @remarks
34 *  None
35 *
36 *******************************************************************************
37 */
38 
39 #ifndef IH264E_ENCODE_HEADER_H_
40 #define IH264E_ENCODE_HEADER_H_
41 
42 /*****************************************************************************/
43 /* Function Macros                                                           */
44 /*****************************************************************************/
45 
46 /**
47 ******************************************************************************
48  *  @brief   Macro to put a code with specified number of bits into the
49  *           bitstream
50 ******************************************************************************
51  */
52 #define PUT_BITS(ps_bitstrm, code_val, code_len, ret_val, syntax_string) \
53          ENTROPY_TRACE(syntax_string, code_val);\
54         ret_val |= ih264e_put_bits((ps_bitstrm), (code_val), (code_len))
55 
56 /**
57 ******************************************************************************
58  *  @brief   Macro to put a code with specified number of bits into the
59  *           bitstream using 0th order exponential Golomb encoding for
60  *           signed numbers
61 ******************************************************************************
62  */
63 #define PUT_BITS_UEV(ps_bitstrm, code_val, ret_val, syntax_string) \
64         ENTROPY_TRACE(syntax_string, code_val);\
65         ret_val |= ih264e_put_uev((ps_bitstrm), (code_val))
66 
67 /**
68 ******************************************************************************
69  *  @brief   Macro to put a code with specified number of bits into the
70  *           bitstream using 0th order exponential Golomb encoding for
71  *           signed numbers
72 ******************************************************************************
73  */
74 #define PUT_BITS_SEV(ps_bitstrm, code_val, ret_val, syntax_string) \
75         ENTROPY_TRACE(syntax_string, code_val);\
76         ret_val |= ih264e_put_sev((ps_bitstrm), (code_val))
77 
78 
79 /*****************************************************************************/
80 /* Extern Function Declarations                                              */
81 /*****************************************************************************/
82 
83 /**
84 ******************************************************************************
85 *
86 * @brief Generates SPS (Sequence Parameter Set)
87 *
88 * @par   Description
89 *  This function generates Sequence Parameter Set header as per the spec
90 *
91 * @param[in]   ps_bitstrm
92 *  pointer to bitstream context (handle)
93 *
94 * @param[in]   ps_sps
95 *  pointer to structure containing SPS data
96 *
97 * @return      success or failure error code
98 *
99 ******************************************************************************
100 */
101 WORD32      ih264e_generate_sps
102     (
103         bitstrm_t   *ps_bitstrm,
104         sps_t       *ps_sps,
105         vui_t       *ps_vui
106     );
107 
108 /**
109 ******************************************************************************
110 *
111 * @brief Generates PPS (Picture Parameter Set)
112 *
113 * @par   Description
114 *  Generate Picture Parameter Set as per Section 7.3.2.2
115 *
116 * @param[in]   ps_bitstrm
117 *  pointer to bitstream context (handle)
118 *
119 * @param[in]   ps_pps
120 *  pointer to structure containing PPS data
121 *
122 * @return      success or failure error code
123 *
124 ******************************************************************************
125 */
126 WORD32      ih264e_generate_pps
127     (
128         bitstrm_t   *ps_bitstrm,
129         pps_t       *ps_pps,
130         sps_t       *ps_sps
131     );
132 
133 /**
134 ******************************************************************************
135 *
136 * @brief Generates Slice Header
137 *
138 * @par   Description
139 *  Generate Slice Header as per Section 7.3.5.1
140 *
141 * @param[inout]   ps_bitstrm
142 *  pointer to bitstream context for generating slice header
143 *
144 * @param[in]   ps_slice_hdr
145 *  pointer to slice header params
146 *
147 * @param[in]   ps_pps
148 *  pointer to pps params referred by slice
149 *
150 * @param[in]   ps_sps
151 *  pointer to sps params referred by slice
152 *
153 * @param[out]   ps_dup_bit_strm_ent_offset
154 *  Bitstream struct to store bitstream state
155 *
156 * @param[out]   pu4_first_slice_start_offset
157 *  first slice offset is returned
158 *
159 * @return      success or failure error code
160 *
161 ******************************************************************************
162 */
163 WORD32      ih264e_generate_slice_header
164     (
165         bitstrm_t       *ps_bitstrm,
166         slice_header_t  *ps_slice_hdr,
167         pps_t           *ps_pps,
168         sps_t           *ps_sps
169     );
170 
171 /**
172 ******************************************************************************
173 *
174 * @brief Populates sps structure
175 *
176 * @par   Description
177 *  Populates sps structure for its use in header generation
178 *
179 * @param[in]   ps_codec
180 *  pointer to encoder context
181 *
182 * @param[out]  ps_sps
183 *  pointer to sps params that needs to be populated
184 *
185 * @return      success or failure error code
186 *
187 ******************************************************************************
188 */
189 IH264E_ERROR_T      ih264e_populate_sps
190         (
191             codec_t *ps_codec,
192             sps_t   *ps_sps
193         );
194 
195 /**
196 ******************************************************************************
197 *
198 * @brief Populates pps structure
199 *
200 * @par   Description
201 *  Populates pps structure for its use in header generation
202 *
203 * @param[in]   ps_codec
204 *  pointer to encoder context
205 *
206 * @param[out]  ps_pps
207 *  pointer to pps params that needs to be populated
208 *
209 * @return      success or failure error code
210 *
211 ******************************************************************************
212 */
213 IH264E_ERROR_T ih264e_populate_pps
214         (
215             codec_t *ps_codec,
216             pps_t *ps_pps
217         );
218 
219 
220 /**
221 ******************************************************************************
222 *
223 * @brief Populates slice header structure
224 *
225 * @par   Description
226 *  Populates slice header structure for its use in header generation
227 *
228 * @param[in]  ps_proc
229 *  pointer to proc context
230 *
231 * @param[out]  ps_slice_hdr
232 *  pointer to slice header structure that needs to be populated
233 *
234 * @param[in]  ps_pps
235 *  pointer to pps params structure referred by the slice
236 *
237 * @param[in]   ps_sps
238 *  pointer to sps params referred by the pps
239 *
240 * @return      success or failure error code
241 *
242 ******************************************************************************
243 */
244 WORD32 ih264e_populate_slice_header
245         (
246             process_ctxt_t *ps_proc,
247             slice_header_t *ps_slice_hdr,
248             pps_t *ps_pps,
249             sps_t *ps_sps
250         );
251 
252 
253 /**
254 ******************************************************************************
255 *
256 * @brief inserts FILLER Nal Unit.
257 *
258 * @par   Description
259 *  In constant bit rate rc mode, when the bits generated by the codec is
260 *  underflowing the target bit rate, the encoder library inserts filler nal unit.
261 *
262 * @param[in]    ps_bitstrm
263 *  pointer to bitstream context (handle)
264 *
265 * @param[in]    insert_fill_bytes
266 *  Number of fill bytes to be inserted
267 *
268 * @return      success or failure error code
269 *
270 ******************************************************************************
271 */
272 IH264E_ERROR_T ih264e_add_filler_nal_unit
273         (
274             bitstrm_t   *ps_bitstrm,
275             WORD32      insert_fill_bytes
276         );
277 
278 
279 #endif //IH264E_ENCODE_HEADER_H_
280