/src/libavc/decoder/ih264d_sei.c
Line | Count | Source |
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 Name : ih264d_sei.c */ |
24 | | /* */ |
25 | | /* Description : This file contains routines to parse SEI NAL's */ |
26 | | /* */ |
27 | | /* List of Functions : <List the functions defined in this file> */ |
28 | | /* */ |
29 | | /* Issues / Problems : None */ |
30 | | /* */ |
31 | | /* Revision History : */ |
32 | | /* */ |
33 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
34 | | /* 25 05 2005 NS Draft */ |
35 | | /* */ |
36 | | /*****************************************************************************/ |
37 | | |
38 | | #include <string.h> |
39 | | |
40 | | #include "ih264_typedefs.h" |
41 | | #include "ih264_macros.h" |
42 | | #include "ih264_platform_macros.h" |
43 | | #include "ih264d_bitstrm.h" |
44 | | #include "ih264d_structs.h" |
45 | | #include "ih264d_error_handler.h" |
46 | | #include "ih264d_vui.h" |
47 | | #include "ih264d_parse_cavlc.h" |
48 | | #include "ih264d_defs.h" |
49 | | |
50 | | /*****************************************************************************/ |
51 | | /* */ |
52 | | /* Function Name : ih264d_parse_buffering_period */ |
53 | | /* */ |
54 | | /* Description : This function parses SEI message buffering_period */ |
55 | | /* Inputs : ps_buf_prd pointer to struct buf_period_t */ |
56 | | /* ps_bitstrm Bitstream */ |
57 | | /* Globals : None */ |
58 | | /* Processing : Parses SEI payload buffering period. */ |
59 | | /* Outputs : None */ |
60 | | /* Return : 0 for successfull parsing, else error message */ |
61 | | /* */ |
62 | | /* Issues : Not implemented fully */ |
63 | | /* */ |
64 | | /* Revision History: */ |
65 | | /* */ |
66 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
67 | | /* 06 05 2002 NS Draft */ |
68 | | /* */ |
69 | | /*****************************************************************************/ |
70 | | |
71 | | WORD32 ih264d_parse_buffering_period(buf_period_t *ps_buf_prd, |
72 | | dec_bit_stream_t *ps_bitstrm, |
73 | | dec_struct_t *ps_dec) |
74 | 175 | { |
75 | 175 | UWORD8 u1_seq_parameter_set_id; |
76 | 175 | dec_seq_params_t *ps_seq; |
77 | 175 | UWORD8 u1_nal_hrd_present, u1_vcl_hrd_present; |
78 | 175 | UWORD32 i; |
79 | 175 | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
80 | 175 | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
81 | 175 | UNUSED(ps_buf_prd); |
82 | 175 | u1_seq_parameter_set_id = ih264d_uev(pu4_bitstrm_ofst, |
83 | 175 | pu4_bitstrm_buf); |
84 | 175 | if(u1_seq_parameter_set_id >= MAX_NUM_SEQ_PARAMS) |
85 | 2 | return ERROR_INVALID_SEQ_PARAM; |
86 | 173 | ps_seq = &ps_dec->ps_sps[u1_seq_parameter_set_id]; |
87 | 173 | if(TRUE != ps_seq->u1_is_valid) |
88 | 7 | return ERROR_INVALID_SEQ_PARAM; |
89 | | |
90 | 166 | ps_dec->ps_sei->u1_seq_param_set_id = u1_seq_parameter_set_id; |
91 | 166 | ps_dec->ps_cur_sps = ps_seq; |
92 | 166 | if(FALSE == ps_seq->u1_is_valid) |
93 | 0 | return ERROR_INVALID_SEQ_PARAM; |
94 | 166 | if(1 == ps_seq->u1_vui_parameters_present_flag) |
95 | 155 | { |
96 | 155 | u1_nal_hrd_present = ps_seq->s_vui.u1_nal_hrd_params_present; |
97 | 155 | if(u1_nal_hrd_present) |
98 | 153 | { |
99 | 306 | for(i = 0; i < ps_seq->s_vui.s_nal_hrd.u4_cpb_cnt; i++) |
100 | 153 | { |
101 | 153 | ih264d_get_bits_h264( |
102 | 153 | ps_bitstrm, |
103 | 153 | ps_seq->s_vui.s_nal_hrd.u1_initial_cpb_removal_delay); |
104 | 153 | ih264d_get_bits_h264( |
105 | 153 | ps_bitstrm, |
106 | 153 | ps_seq->s_vui.s_nal_hrd.u1_initial_cpb_removal_delay); |
107 | 153 | } |
108 | 153 | } |
109 | | |
110 | 155 | u1_vcl_hrd_present = ps_seq->s_vui.u1_vcl_hrd_params_present; |
111 | 155 | if(u1_vcl_hrd_present) |
112 | 0 | { |
113 | 0 | for(i = 0; i < ps_seq->s_vui.s_vcl_hrd.u4_cpb_cnt; i++) |
114 | 0 | { |
115 | 0 | ih264d_get_bits_h264( |
116 | 0 | ps_bitstrm, |
117 | 0 | ps_seq->s_vui.s_vcl_hrd.u1_initial_cpb_removal_delay); |
118 | 0 | ih264d_get_bits_h264( |
119 | 0 | ps_bitstrm, |
120 | 0 | ps_seq->s_vui.s_vcl_hrd.u1_initial_cpb_removal_delay); |
121 | 0 | } |
122 | 0 | } |
123 | 155 | } |
124 | 166 | return (OK); |
125 | 166 | } |
126 | | |
127 | | /*****************************************************************************/ |
128 | | /* */ |
129 | | /* Function Name : ih264d_parse_pic_timing */ |
130 | | /* */ |
131 | | /* Description : This function parses SEI message pic_timing */ |
132 | | /* Inputs : ps_bitstrm Bitstream */ |
133 | | /* ps_dec Poniter decoder context */ |
134 | | /* ui4_payload_size pay load i4_size */ |
135 | | /* Globals : None */ |
136 | | /* Processing : Parses SEI payload picture timing */ |
137 | | /* Outputs : None */ |
138 | | /* Return : 0 */ |
139 | | /* */ |
140 | | /* Issues : Not implemented fully */ |
141 | | /* */ |
142 | | /* Revision History: */ |
143 | | /* */ |
144 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
145 | | /* 06 05 2002 NS Draft */ |
146 | | /* */ |
147 | | /*****************************************************************************/ |
148 | | WORD32 ih264d_parse_pic_timing(dec_bit_stream_t *ps_bitstrm, |
149 | | dec_struct_t *ps_dec, |
150 | | UWORD32 ui4_payload_size) |
151 | 9.62k | { |
152 | 9.62k | sei *ps_sei; |
153 | 9.62k | vui_t *ps_vu4; |
154 | 9.62k | UWORD8 u1_cpb_dpb_present; |
155 | 9.62k | UWORD8 u1_pic_struct_present_flag; |
156 | 9.62k | UWORD32 u4_start_offset, u4_bits_consumed; |
157 | 9.62k | UWORD8 u1_cpb_removal_delay_length, u1_dpb_output_delay_length; |
158 | | |
159 | 9.62k | ps_sei = (sei *)ps_dec->ps_sei; |
160 | 9.62k | ps_vu4 = &ps_dec->ps_cur_sps->s_vui; |
161 | | |
162 | 9.62k | u1_cpb_dpb_present = ps_vu4->u1_vcl_hrd_params_present |
163 | 9.62k | + ps_vu4->u1_nal_hrd_params_present; |
164 | | |
165 | 9.62k | if(ps_vu4->u1_vcl_hrd_params_present) |
166 | 301 | { |
167 | 301 | u1_cpb_removal_delay_length = |
168 | 301 | ps_vu4->s_vcl_hrd.u1_cpb_removal_delay_length; |
169 | 301 | u1_dpb_output_delay_length = |
170 | 301 | ps_vu4->s_vcl_hrd.u1_dpb_output_delay_length; |
171 | 301 | } |
172 | 9.32k | else if(ps_vu4->u1_nal_hrd_params_present) |
173 | 0 | { |
174 | 0 | u1_cpb_removal_delay_length = |
175 | 0 | ps_vu4->s_nal_hrd.u1_cpb_removal_delay_length; |
176 | 0 | u1_dpb_output_delay_length = |
177 | 0 | ps_vu4->s_nal_hrd.u1_dpb_output_delay_length; |
178 | 0 | } |
179 | 9.32k | else |
180 | 9.32k | { |
181 | 9.32k | u1_cpb_removal_delay_length = 24; |
182 | 9.32k | u1_dpb_output_delay_length = 24; |
183 | | |
184 | 9.32k | } |
185 | | |
186 | 9.62k | u4_start_offset = ps_bitstrm->u4_ofst; |
187 | 9.62k | if(u1_cpb_dpb_present) |
188 | 301 | { |
189 | 301 | ih264d_get_bits_h264(ps_bitstrm, u1_cpb_removal_delay_length); |
190 | 301 | ih264d_get_bits_h264(ps_bitstrm, u1_dpb_output_delay_length); |
191 | 301 | } |
192 | | |
193 | 9.62k | u1_pic_struct_present_flag = ps_vu4->u1_pic_struct_present_flag; |
194 | 9.62k | if(u1_pic_struct_present_flag) |
195 | 181 | { |
196 | 181 | ps_sei->u1_pic_struct = ih264d_get_bits_h264(ps_bitstrm, 4); |
197 | 181 | ps_dec->u1_pic_struct_copy = ps_sei->u1_pic_struct; |
198 | 181 | ps_sei->u1_is_valid = 1; |
199 | 181 | } |
200 | 9.62k | u4_bits_consumed = ps_bitstrm->u4_ofst - u4_start_offset; |
201 | | |
202 | 9.62k | if((ui4_payload_size << 3) < u4_bits_consumed) |
203 | 132 | return ERROR_CORRUPTED_SLICE; |
204 | | |
205 | 9.49k | ih264d_flush_bits_h264(ps_bitstrm, |
206 | 9.49k | (ui4_payload_size << 3) - u4_bits_consumed); |
207 | | |
208 | 9.49k | return (OK); |
209 | 9.62k | } |
210 | | |
211 | | /*****************************************************************************/ |
212 | | /* */ |
213 | | /* Function Name : ih264d_parse_recovery_point */ |
214 | | /* */ |
215 | | /* Description : This function parses SEI message recovery point */ |
216 | | /* Inputs : ps_bitstrm Bitstream */ |
217 | | /* ps_dec Poniter decoder context */ |
218 | | /* ui4_payload_size pay load i4_size */ |
219 | | /* Globals : None */ |
220 | | /* Processing : Parses SEI payload picture timing */ |
221 | | /* Outputs : None */ |
222 | | /* Return : 0 */ |
223 | | /* */ |
224 | | /* Issues : Not implemented fully */ |
225 | | /* */ |
226 | | /* Revision History: */ |
227 | | /* */ |
228 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
229 | | /* 06 05 2002 NS Draft */ |
230 | | /* */ |
231 | | /*****************************************************************************/ |
232 | | WORD32 ih264d_parse_recovery_point(dec_bit_stream_t *ps_bitstrm, |
233 | | dec_struct_t *ps_dec, |
234 | | UWORD32 ui4_payload_size) |
235 | 5.09k | { |
236 | 5.09k | sei *ps_sei = ps_dec->ps_sei; |
237 | 5.09k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
238 | 5.09k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
239 | 5.09k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
240 | 5.09k | UNUSED(ui4_payload_size); |
241 | 5.09k | ps_sei->u2_recovery_frame_cnt = ih264d_uev(pu4_bitstrm_ofst, |
242 | 5.09k | pu4_bitstrm_buf); |
243 | 5.09k | ps_err->u4_frm_sei_sync = ps_err->u4_cur_frm |
244 | 5.09k | + ps_sei->u2_recovery_frame_cnt; |
245 | 5.09k | ps_sei->u1_exact_match_flag = ih264d_get_bit_h264(ps_bitstrm); |
246 | 5.09k | ps_sei->u1_broken_link_flag = ih264d_get_bit_h264(ps_bitstrm); |
247 | 5.09k | ps_sei->u1_changing_slice_grp_idc = ih264d_get_bits_h264(ps_bitstrm, 2); |
248 | | |
249 | 5.09k | return (OK); |
250 | 5.09k | } |
251 | | |
252 | | /*****************************************************************************/ |
253 | | /* */ |
254 | | /* Function Name : ih264d_parse_mdcv */ |
255 | | /* */ |
256 | | /* Description : This function parses SEI message mdcv */ |
257 | | /* Inputs : ps_bitstrm Bitstream */ |
258 | | /* ps_dec Poniter decoder context */ |
259 | | /* ui4_payload_size pay load i4_size */ |
260 | | /* Globals : None */ |
261 | | /* Processing : */ |
262 | | /* Outputs : None */ |
263 | | /* Return : 0 for successfull parsing, else -1 */ |
264 | | /* */ |
265 | | /* Issues : */ |
266 | | /* */ |
267 | | /* Revision History: */ |
268 | | /* */ |
269 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
270 | | /* Draft */ |
271 | | /* */ |
272 | | /*****************************************************************************/ |
273 | | WORD32 ih264d_parse_mdcv(dec_bit_stream_t *ps_bitstrm, |
274 | | dec_struct_t *ps_dec, |
275 | | UWORD32 ui4_payload_size) |
276 | 3.93k | { |
277 | 3.93k | sei *ps_sei = ps_dec->ps_sei_parse; |
278 | 3.93k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
279 | 3.93k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
280 | 3.93k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
281 | 3.93k | UWORD32 u4_count; |
282 | 3.93k | UNUSED(ui4_payload_size); |
283 | | |
284 | 3.93k | if((ps_dec == NULL) || (ps_sei == NULL)) |
285 | 0 | { |
286 | 0 | return NOT_OK; |
287 | 0 | } |
288 | | |
289 | 3.93k | ps_sei->u1_sei_mdcv_params_present_flag = 1; |
290 | | |
291 | | /* display primaries x */ |
292 | 13.9k | for(u4_count = 0; u4_count < NUM_SEI_MDCV_PRIMARIES; u4_count++) |
293 | 11.0k | { |
294 | 11.0k | ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] = |
295 | 11.0k | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
296 | | |
297 | 11.0k | if((ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] > |
298 | 11.0k | DISPLAY_PRIMARIES_X_UPPER_LIMIT) || |
299 | 10.8k | (ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] < |
300 | 10.8k | DISPLAY_PRIMARIES_X_LOWER_LIMIT) || |
301 | 10.5k | ((ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] % |
302 | 10.5k | DISPLAY_PRIMARIES_X_DIVISION_FACTOR) != 0)) |
303 | 760 | { |
304 | 760 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
305 | 760 | return ERROR_INV_SEI_MDCV_PARAMS; |
306 | 760 | } |
307 | | |
308 | 10.3k | ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] = |
309 | 10.3k | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
310 | | |
311 | 10.3k | if((ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] > |
312 | 10.3k | DISPLAY_PRIMARIES_Y_UPPER_LIMIT) || |
313 | 10.1k | (ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] < |
314 | 10.1k | DISPLAY_PRIMARIES_Y_LOWER_LIMIT) || |
315 | 10.1k | ((ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] % |
316 | 10.1k | DISPLAY_PRIMARIES_Y_DIVISION_FACTOR) != 0)) |
317 | 328 | { |
318 | 328 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
319 | 328 | return ERROR_INV_SEI_MDCV_PARAMS; |
320 | 328 | } |
321 | 10.3k | } |
322 | | |
323 | | /* white point x */ |
324 | 2.85k | ps_sei->s_sei_mdcv_params.u2_white_point_x = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
325 | | |
326 | 2.85k | if((ps_sei->s_sei_mdcv_params.u2_white_point_x > WHITE_POINT_X_UPPER_LIMIT) || |
327 | 2.57k | (ps_sei->s_sei_mdcv_params.u2_white_point_x < WHITE_POINT_X_LOWER_LIMIT) || |
328 | 2.39k | ((ps_sei->s_sei_mdcv_params.u2_white_point_x % WHITE_POINT_X_DIVISION_FACTOR) != 0)) |
329 | 631 | { |
330 | 631 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
331 | 631 | return ERROR_INV_SEI_MDCV_PARAMS; |
332 | 631 | } |
333 | | /* white point y */ |
334 | 2.22k | ps_sei->s_sei_mdcv_params.u2_white_point_y = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
335 | | |
336 | 2.22k | if((ps_sei->s_sei_mdcv_params.u2_white_point_y > WHITE_POINT_Y_UPPER_LIMIT) || |
337 | 1.87k | (ps_sei->s_sei_mdcv_params.u2_white_point_y < WHITE_POINT_Y_LOWER_LIMIT) || |
338 | 1.86k | ((ps_sei->s_sei_mdcv_params.u2_white_point_y % WHITE_POINT_Y_DIVISION_FACTOR) != 0)) |
339 | 535 | { |
340 | 535 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
341 | 535 | return ERROR_INV_SEI_MDCV_PARAMS; |
342 | 535 | } |
343 | | /* max display mastering luminance */ |
344 | 1.68k | ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance = |
345 | 1.68k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
346 | | |
347 | 1.68k | if((ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance > |
348 | 1.68k | MAX_DISPLAY_MASTERING_LUMINANCE_UPPER_LIMIT) || |
349 | 1.48k | (ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance < |
350 | 1.48k | MAX_DISPLAY_MASTERING_LUMINANCE_LOWER_LIMIT) || |
351 | 1.20k | ((ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance % |
352 | 1.20k | MAX_DISPLAY_MASTERING_LUMINANCE_DIVISION_FACTOR) != 0)) |
353 | 860 | { |
354 | 860 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
355 | 860 | return ERROR_INV_SEI_MDCV_PARAMS; |
356 | 860 | } |
357 | | /* min display mastering luminance */ |
358 | 825 | ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance = |
359 | 825 | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
360 | | |
361 | 825 | if((ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance > |
362 | 825 | MIN_DISPLAY_MASTERING_LUMINANCE_UPPER_LIMIT) || |
363 | 645 | (ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance < |
364 | 645 | MIN_DISPLAY_MASTERING_LUMINANCE_LOWER_LIMIT)) |
365 | 561 | { |
366 | 561 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
367 | 561 | return ERROR_INV_SEI_MDCV_PARAMS; |
368 | 561 | } |
369 | 264 | if(ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance <= |
370 | 264 | ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance) |
371 | 128 | { |
372 | 128 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
373 | 128 | return ERROR_INV_SEI_MDCV_PARAMS; |
374 | 128 | } |
375 | 136 | return (OK); |
376 | 264 | } |
377 | | |
378 | | /*****************************************************************************/ |
379 | | /* */ |
380 | | /* Function Name : ih264d_parse_cll */ |
381 | | /* */ |
382 | | /* Description : This function parses SEI message cll */ |
383 | | /* Inputs : ps_bitstrm Bitstream */ |
384 | | /* ps_dec Poniter decoder context */ |
385 | | /* ui4_payload_size pay load i4_size */ |
386 | | /* Globals : None */ |
387 | | /* Processing : */ |
388 | | /* Outputs : None */ |
389 | | /* Return : 0 for successfull parsing, else -1 */ |
390 | | /* */ |
391 | | /* Issues : */ |
392 | | /* */ |
393 | | /* Revision History: */ |
394 | | /* */ |
395 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
396 | | /* Draft */ |
397 | | /* */ |
398 | | /*****************************************************************************/ |
399 | | WORD32 ih264d_parse_cll(dec_bit_stream_t *ps_bitstrm, |
400 | | dec_struct_t *ps_dec, |
401 | | UWORD32 ui4_payload_size) |
402 | 1.34k | { |
403 | 1.34k | sei *ps_sei = ps_dec->ps_sei_parse; |
404 | 1.34k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
405 | 1.34k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
406 | 1.34k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
407 | 1.34k | UNUSED(ui4_payload_size); |
408 | | |
409 | 1.34k | if((ps_dec == NULL) || (ps_sei == NULL)) |
410 | 0 | { |
411 | 0 | return NOT_OK; |
412 | 0 | } |
413 | | |
414 | 1.34k | ps_sei->u1_sei_cll_params_present_flag = 1; |
415 | | |
416 | 1.34k | ps_sei->s_sei_cll_params.u2_max_content_light_level = |
417 | 1.34k | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
418 | 1.34k | ps_sei->s_sei_cll_params.u2_max_pic_average_light_level = |
419 | 1.34k | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
420 | | /*No any sanity checks done for CLL params*/ |
421 | | |
422 | 1.34k | return (OK); |
423 | 1.34k | } |
424 | | |
425 | | /*****************************************************************************/ |
426 | | /* */ |
427 | | /* Function Name : ih264d_parse_ave */ |
428 | | /* */ |
429 | | /* Description : This function parses SEI message ave */ |
430 | | /* Inputs : ps_bitstrm Bitstream */ |
431 | | /* ps_dec Poniter decoder context */ |
432 | | /* ui4_payload_size pay load i4_size */ |
433 | | /* Globals : None */ |
434 | | /* Processing : */ |
435 | | /* Outputs : None */ |
436 | | /* Return : 0 for successfull parsing, else -1 */ |
437 | | /* */ |
438 | | /* Issues : */ |
439 | | /* */ |
440 | | /* Revision History: */ |
441 | | /* */ |
442 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
443 | | /* Draft */ |
444 | | /* */ |
445 | | /*****************************************************************************/ |
446 | | WORD32 ih264d_parse_ave(dec_bit_stream_t *ps_bitstrm, |
447 | | dec_struct_t *ps_dec, |
448 | | UWORD32 ui4_payload_size) |
449 | 61.3k | { |
450 | 61.3k | sei *ps_sei = ps_dec->ps_sei_parse; |
451 | 61.3k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
452 | 61.3k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
453 | 61.3k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
454 | 61.3k | UNUSED(ui4_payload_size); |
455 | | |
456 | 61.3k | if((ps_dec == NULL) || (ps_sei == NULL)) |
457 | 0 | { |
458 | 0 | return NOT_OK; |
459 | 0 | } |
460 | | |
461 | 61.3k | ps_sei->u1_sei_ave_params_present_flag = 1; |
462 | | |
463 | 61.3k | ps_sei->s_sei_ave_params.u4_ambient_illuminance = (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
464 | 61.3k | if(0 == ps_sei->s_sei_ave_params.u4_ambient_illuminance) |
465 | 142 | { |
466 | 142 | ps_sei->u1_sei_ave_params_present_flag = 0; |
467 | 142 | return ERROR_INV_SEI_AVE_PARAMS; |
468 | 142 | } |
469 | | |
470 | 61.1k | ps_sei->s_sei_ave_params.u2_ambient_light_x = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
471 | 61.1k | if(ps_sei->s_sei_ave_params.u2_ambient_light_x > AMBIENT_LIGHT_X_UPPER_LIMIT) |
472 | 34 | { |
473 | 34 | ps_sei->u1_sei_ave_params_present_flag = 0; |
474 | 34 | return ERROR_INV_SEI_AVE_PARAMS; |
475 | 34 | } |
476 | | |
477 | 61.1k | ps_sei->s_sei_ave_params.u2_ambient_light_y = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
478 | 61.1k | if(ps_sei->s_sei_ave_params.u2_ambient_light_y > AMBIENT_LIGHT_Y_UPPER_LIMIT) |
479 | 3 | { |
480 | 3 | ps_sei->u1_sei_ave_params_present_flag = 0; |
481 | 3 | return ERROR_INV_SEI_AVE_PARAMS; |
482 | 3 | } |
483 | 61.1k | return (OK); |
484 | 61.1k | } |
485 | | |
486 | | /*****************************************************************************/ |
487 | | /* */ |
488 | | /* Function Name : ih264d_parse_ccv */ |
489 | | /* */ |
490 | | /* Description : This function parses SEI message ccv */ |
491 | | /* Inputs : ps_bitstrm Bitstream */ |
492 | | /* ps_dec Poniter decoder context */ |
493 | | /* ui4_payload_size pay load i4_size */ |
494 | | /* Globals : None */ |
495 | | /* Processing : */ |
496 | | /* Outputs : None */ |
497 | | /* Return : 0 for successfull parsing, else -1 */ |
498 | | /* */ |
499 | | /* Issues : */ |
500 | | /* */ |
501 | | /* Revision History: */ |
502 | | /* */ |
503 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
504 | | /* Draft */ |
505 | | /* */ |
506 | | /*****************************************************************************/ |
507 | | WORD32 ih264d_parse_ccv(dec_bit_stream_t *ps_bitstrm, |
508 | | dec_struct_t *ps_dec, |
509 | | UWORD32 ui4_payload_size) |
510 | 40.6k | { |
511 | 40.6k | sei *ps_sei = ps_dec->ps_sei_parse; |
512 | 40.6k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
513 | 40.6k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
514 | 40.6k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
515 | 40.6k | UWORD32 u4_count; |
516 | 40.6k | UNUSED(ui4_payload_size); |
517 | | |
518 | 40.6k | if((ps_dec == NULL) || (ps_sei == NULL)) |
519 | 0 | { |
520 | 0 | return NOT_OK; |
521 | 0 | } |
522 | | |
523 | 40.6k | ps_sei->u1_sei_ccv_params_present_flag = 0; |
524 | | |
525 | 40.6k | ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag = (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
526 | | |
527 | 40.6k | if(ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag > 1) |
528 | 0 | { |
529 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
530 | 0 | } |
531 | 40.6k | if(0 == ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag) |
532 | 11.8k | { |
533 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_persistence_flag = |
534 | 11.8k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
535 | 11.8k | if(ps_sei->s_sei_ccv_params.u1_ccv_persistence_flag > 1) |
536 | 0 | { |
537 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
538 | 0 | } |
539 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag = |
540 | 11.8k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
541 | 11.8k | if(ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag > 1) |
542 | 0 | { |
543 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
544 | 0 | } |
545 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag = |
546 | 11.8k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
547 | 11.8k | if(ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag > 1) |
548 | 0 | { |
549 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
550 | 0 | } |
551 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag = |
552 | 11.8k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
553 | 11.8k | if(ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag > 1) |
554 | 0 | { |
555 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
556 | 0 | } |
557 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag = |
558 | 11.8k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
559 | 11.8k | if(ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag > 1) |
560 | 0 | { |
561 | 0 | return ERROR_INV_SEI_CCV_PARAMS; |
562 | 0 | } |
563 | | |
564 | 11.8k | if((ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag == 0) && |
565 | 2.06k | (ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag == 0) && |
566 | 291 | (ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag == 0) && |
567 | 139 | (ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag == 0)) |
568 | 6 | { |
569 | 6 | return ERROR_INV_SEI_CCV_PARAMS; |
570 | 6 | } |
571 | | |
572 | 11.8k | ps_sei->s_sei_ccv_params.u1_ccv_reserved_zero_2bits = |
573 | 11.8k | (UWORD8)ih264d_get_bits_h264(ps_bitstrm, 2); |
574 | 11.8k | if((ps_sei->s_sei_ccv_params.u1_ccv_reserved_zero_2bits != 0)) |
575 | 149 | { |
576 | 149 | return ERROR_INV_SEI_CCV_PARAMS; |
577 | 149 | } |
578 | | |
579 | | /* ccv primaries */ |
580 | 11.6k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag) |
581 | 9.74k | { |
582 | 25.6k | for(u4_count = 0; u4_count < NUM_SEI_CCV_PRIMARIES; u4_count++) |
583 | 22.9k | { |
584 | 22.9k | ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] = |
585 | 22.9k | (WORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
586 | 22.9k | if((ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] > |
587 | 22.9k | CCV_PRIMARIES_X_UPPER_LIMIT) || |
588 | 22.7k | (ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] < |
589 | 22.7k | CCV_PRIMARIES_X_LOWER_LIMIT)) |
590 | 735 | { |
591 | 735 | return ERROR_INV_SEI_CCV_PARAMS; |
592 | 735 | } |
593 | | |
594 | 22.2k | ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] = |
595 | 22.2k | (WORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
596 | 22.2k | if((ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] > |
597 | 22.2k | CCV_PRIMARIES_Y_UPPER_LIMIT) || |
598 | 21.4k | (ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] < |
599 | 21.4k | CCV_PRIMARIES_Y_LOWER_LIMIT)) |
600 | 6.33k | { |
601 | 6.33k | return ERROR_INV_SEI_CCV_PARAMS; |
602 | 6.33k | } |
603 | 22.2k | } |
604 | 9.74k | } |
605 | | |
606 | 4.59k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) |
607 | 1.76k | { |
608 | 1.76k | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value = |
609 | 1.76k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
610 | 1.76k | } |
611 | | |
612 | 4.59k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag) |
613 | 1.92k | { |
614 | 1.92k | ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value = |
615 | 1.92k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
616 | 1.92k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) && |
617 | 1.76k | (ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value < |
618 | 1.76k | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value)) |
619 | 4 | { |
620 | 4 | return ERROR_INV_SEI_CCV_PARAMS; |
621 | 4 | } |
622 | 1.92k | } |
623 | 4.58k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag) |
624 | 2.07k | { |
625 | 2.07k | ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value = |
626 | 2.07k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
627 | 2.07k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) && |
628 | 138 | (ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value < |
629 | 138 | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value)) |
630 | 7 | { |
631 | 7 | return ERROR_INV_SEI_CCV_PARAMS; |
632 | 7 | } |
633 | 2.06k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag) && |
634 | 282 | (ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value < |
635 | 282 | ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value)) |
636 | 177 | { |
637 | 177 | return ERROR_INV_SEI_CCV_PARAMS; |
638 | 177 | } |
639 | 2.06k | } |
640 | 4.58k | } |
641 | 33.2k | ps_sei->u1_sei_ccv_params_present_flag = 1; |
642 | 33.2k | return (OK); |
643 | 40.6k | } |
644 | | |
645 | | /*****************************************************************************/ |
646 | | /* */ |
647 | | /* Function Name : ih264d_parse_sii */ |
648 | | /* */ |
649 | | /* Description : This function parses SEI message sii */ |
650 | | /* Inputs : ps_bitstrm Bitstream */ |
651 | | /* ps_dec Poniter decoder context */ |
652 | | /* ui4_payload_size pay load i4_size */ |
653 | | /* Globals : None */ |
654 | | /* Processing : */ |
655 | | /* Outputs : None */ |
656 | | /* Return : 0 for successfull parsing, else -1 */ |
657 | | /* */ |
658 | | /* Issues : */ |
659 | | /* */ |
660 | | /* Revision History: */ |
661 | | /* */ |
662 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
663 | | /* Draft */ |
664 | | /* */ |
665 | | /*****************************************************************************/ |
666 | | WORD32 ih264d_parse_sii(dec_bit_stream_t *ps_bitstrm, dec_struct_t *ps_dec, |
667 | | UWORD32 ui4_payload_size) |
668 | 1.27k | { |
669 | 1.27k | sei *ps_sei; |
670 | 1.27k | dec_err_status_t *ps_err; |
671 | 1.27k | int i; |
672 | 1.27k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
673 | 1.27k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
674 | 1.27k | UNUSED(ui4_payload_size); |
675 | | |
676 | 1.27k | if(ps_dec == NULL) |
677 | 0 | { |
678 | 0 | return NOT_OK; |
679 | 0 | } |
680 | 1.27k | ps_sei = ps_dec->ps_sei_parse; |
681 | | |
682 | 1.27k | if(ps_sei == NULL) |
683 | 0 | { |
684 | 0 | return NOT_OK; |
685 | 0 | } |
686 | 1.27k | ps_err = ps_dec->ps_dec_err_status; |
687 | | |
688 | 1.27k | ps_sei->u1_sei_sii_params_present_flag = 0; |
689 | 1.27k | memset(&ps_sei->s_sei_sii_params, 0, sizeof(ps_sei->s_sei_sii_params)); |
690 | | |
691 | 1.27k | ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
692 | | |
693 | 1.27k | if(0 == ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx) |
694 | 1.00k | { |
695 | 1.00k | ps_sei->s_sei_sii_params.u1_shutter_interval_info_present_flag = |
696 | 1.00k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
697 | | |
698 | 1.00k | if(1 == ps_sei->s_sei_sii_params.u1_shutter_interval_info_present_flag) |
699 | 91 | { |
700 | 91 | ps_sei->s_sei_sii_params.u4_sii_time_scale = |
701 | 91 | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
702 | | |
703 | 91 | ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag = |
704 | 91 | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
705 | | |
706 | 91 | if(1 == ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag) |
707 | 1 | { |
708 | 1 | ps_sei->s_sei_sii_params.u4_sii_num_units_in_shutter_interval = |
709 | 1 | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
710 | 1 | } |
711 | 90 | else |
712 | 90 | { |
713 | 90 | ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1 = |
714 | 90 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
715 | 540 | for(i = 0; i <= ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1; i++) |
716 | 450 | { |
717 | 450 | ps_sei->s_sei_sii_params.au4_sub_layer_num_units_in_shutter_interval[i] = |
718 | 450 | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
719 | 450 | } |
720 | 90 | } |
721 | 91 | } |
722 | 1.00k | } |
723 | | |
724 | 1.27k | if((ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx > |
725 | 1.27k | ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1) && |
726 | 270 | (ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag == 0)) |
727 | 270 | { |
728 | 270 | return ERROR_INV_SEI_SII_PARAMS; |
729 | 270 | } |
730 | | |
731 | 1.00k | ps_sei->u1_sei_sii_params_present_flag = 1; |
732 | 1.00k | return (OK); |
733 | 1.27k | } |
734 | | |
735 | | /*****************************************************************************/ |
736 | | /* */ |
737 | | /* Function Name : ih264d_parse_fgc */ |
738 | | /* */ |
739 | | /* Description : This function parses SEI message film grain charcaristics*/ |
740 | | /* Inputs : ps_bitstrm Bitstream */ |
741 | | /* ps_dec Poniter decoder context */ |
742 | | /* ui4_payload_size pay load i4_size */ |
743 | | /* Globals : None */ |
744 | | /* Processing : */ |
745 | | /* Outputs : None */ |
746 | | /* Return : 0 for successfull parsing, else -1 */ |
747 | | /* */ |
748 | | /* Issues : */ |
749 | | /* */ |
750 | | /* Revision History: */ |
751 | | /* */ |
752 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
753 | | /* Draft */ |
754 | | /* */ |
755 | | /*****************************************************************************/ |
756 | | WORD32 ih264d_parse_fgc(dec_bit_stream_t *ps_bitstrm, dec_struct_t *ps_dec, |
757 | | UWORD32 ui4_payload_size) |
758 | 1.62k | { |
759 | 1.62k | sei *ps_sei = ps_dec->ps_sei_parse; |
760 | 1.62k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
761 | 1.62k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
762 | 1.62k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
763 | 1.62k | UWORD32 u4_count; |
764 | 1.62k | WORD32 i4_luma_bitdepth, i4_chroma_bitdepth; |
765 | 1.62k | UWORD32 c, i, j; |
766 | 1.62k | UNUSED(ui4_payload_size); |
767 | | |
768 | 1.62k | if((ps_dec == NULL) || (ps_sei == NULL)) |
769 | 0 | { |
770 | 0 | return NOT_OK; |
771 | 0 | } |
772 | | |
773 | 1.62k | ps_sei->u1_sei_fgc_params_present_flag = 0; |
774 | | |
775 | 1.62k | ps_sei->s_sei_fgc_params.u1_film_grain_characteristics_cancel_flag = |
776 | 1.62k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
777 | | |
778 | 1.62k | if(0 == ps_sei->s_sei_fgc_params.u1_film_grain_characteristics_cancel_flag) |
779 | 1.60k | { |
780 | 1.60k | ps_sei->s_sei_fgc_params.u1_film_grain_model_id = |
781 | 1.60k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 2); |
782 | 1.60k | if(ps_sei->s_sei_fgc_params.u1_film_grain_model_id > 1) |
783 | 208 | { |
784 | 208 | return ERROR_INV_SEI_FGC_PARAMS; |
785 | 208 | } |
786 | 1.39k | ps_sei->s_sei_fgc_params.u1_separate_colour_description_present_flag = |
787 | 1.39k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
788 | | |
789 | 1.39k | if(ps_sei->s_sei_fgc_params.u1_separate_colour_description_present_flag) |
790 | 789 | { |
791 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_luma_minus8 = |
792 | 789 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
793 | | |
794 | 789 | i4_luma_bitdepth = ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_luma_minus8 + 8; |
795 | | |
796 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_chroma_minus8 = |
797 | 789 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
798 | | |
799 | 789 | i4_chroma_bitdepth = ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_chroma_minus8 + 8; |
800 | | |
801 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_full_range_flag = |
802 | 789 | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
803 | | |
804 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_colour_primaries = |
805 | 789 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
806 | | |
807 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_transfer_characteristics = |
808 | 789 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
809 | | |
810 | 789 | ps_sei->s_sei_fgc_params.u1_film_grain_matrix_coefficients = |
811 | 789 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
812 | 789 | } |
813 | 607 | else |
814 | 607 | { |
815 | 607 | if(ps_dec->ps_cur_sps == NULL) |
816 | 73 | { |
817 | 73 | return NOT_OK; |
818 | 73 | } |
819 | 534 | i4_luma_bitdepth = ps_dec->ps_cur_sps->i4_bit_depth_luma_minus8 + 8; |
820 | 534 | i4_chroma_bitdepth = ps_dec->ps_cur_sps->i4_bit_depth_chroma_minus8 + 8; |
821 | 534 | } |
822 | 1.32k | ps_sei->s_sei_fgc_params.u1_blending_mode_id = (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 2); |
823 | | |
824 | 1.32k | if(ps_sei->s_sei_fgc_params.u1_blending_mode_id > 1) |
825 | 22 | { |
826 | 22 | return ERROR_INV_SEI_FGC_PARAMS; |
827 | 22 | } |
828 | | |
829 | 1.30k | ps_sei->s_sei_fgc_params.u1_log2_scale_factor = |
830 | 1.30k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 4); |
831 | | |
832 | 5.20k | for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++) |
833 | 3.90k | { |
834 | 3.90k | ps_sei->s_sei_fgc_params.au1_comp_model_present_flag[c] = |
835 | 3.90k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
836 | 3.90k | } |
837 | | |
838 | 2.96k | for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++) |
839 | 2.75k | { |
840 | 2.75k | if(ps_sei->s_sei_fgc_params.au1_comp_model_present_flag[c]) |
841 | 1.22k | { |
842 | 1.22k | ps_sei->s_sei_fgc_params.au1_num_intensity_intervals_minus1[c] = |
843 | 1.22k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
844 | | |
845 | 1.22k | ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c] = |
846 | 1.22k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
847 | | |
848 | 1.22k | if(ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c] > |
849 | 1.22k | (SEI_FGC_MAX_NUM_MODEL_VALUES - 1)) |
850 | 36 | { |
851 | 36 | return ERROR_INV_SEI_FGC_PARAMS; |
852 | 36 | } |
853 | | |
854 | 1.47k | for(i = 0; i <= ps_sei->s_sei_fgc_params.au1_num_intensity_intervals_minus1[c]; i++) |
855 | 1.34k | { |
856 | | /* Although the fag end of both the NALU and the bitstream buffer */ |
857 | | /* is being parsed, not all FGC SEI symbols would have been */ |
858 | | /* decoded semantically. The code below detects this condition */ |
859 | 1.34k | if((ps_bitstrm->u4_ofst + 8 + 8) >= ps_bitstrm->u4_max_ofst) |
860 | 137 | { |
861 | 137 | return ERROR_INV_SEI_FGC_PARAMS; |
862 | 137 | } |
863 | | |
864 | 1.20k | ps_sei->s_sei_fgc_params.au1_intensity_interval_lower_bound[c][i] = |
865 | 1.20k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
866 | | |
867 | 1.20k | ps_sei->s_sei_fgc_params.au1_intensity_interval_upper_bound[c][i] = |
868 | 1.20k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
869 | | |
870 | 2.27k | for(j = 0; j <= ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c]; j++) |
871 | 1.98k | { |
872 | 1.98k | ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] = |
873 | 1.98k | (WORD32) ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
874 | 1.98k | if(0 == ps_sei->s_sei_fgc_params.u1_film_grain_model_id) |
875 | 1.20k | { |
876 | 1.20k | if((1 == j) || (2 == j)) |
877 | 364 | { |
878 | 364 | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
879 | 223 | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > 16)) |
880 | 326 | return ERROR_INV_SEI_FGC_PARAMS; |
881 | 364 | } |
882 | 838 | else if((3 == j) || (4 == j)) |
883 | 31 | { |
884 | 31 | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
885 | 29 | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > |
886 | 29 | ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j - 2])) |
887 | 5 | return ERROR_INV_SEI_FGC_PARAMS; |
888 | 31 | } |
889 | 807 | else |
890 | 807 | { |
891 | 807 | WORD32 max_lim = (c == 0) ? (1 << i4_luma_bitdepth) - 1 |
892 | 807 | : (1 << i4_chroma_bitdepth) - 1; |
893 | | |
894 | 807 | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
895 | 686 | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > |
896 | 686 | max_lim)) |
897 | 281 | { |
898 | 281 | return ERROR_INV_SEI_FGC_PARAMS; |
899 | 281 | } |
900 | 807 | } |
901 | 1.20k | } |
902 | 783 | else |
903 | 783 | { |
904 | 783 | WORD32 max_lim = (c == 0) ? (1 << (i4_luma_bitdepth - 1)) |
905 | 783 | : (1 << (i4_chroma_bitdepth - 1)); |
906 | | |
907 | 783 | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < |
908 | 783 | -max_lim) || |
909 | 624 | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] >= max_lim)) |
910 | 305 | { |
911 | 305 | return ERROR_INV_SEI_FGC_PARAMS; |
912 | 305 | } |
913 | 783 | } |
914 | 1.98k | } |
915 | 1.20k | } |
916 | 1.18k | } |
917 | 2.75k | } |
918 | | |
919 | 211 | ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period = |
920 | 211 | (UWORD32) ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
921 | | |
922 | 211 | if(ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period < 0 || |
923 | 211 | ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period > 16384) |
924 | 139 | { |
925 | 139 | return ERROR_INV_SEI_FGC_PARAMS; |
926 | 139 | } |
927 | | |
928 | 72 | ps_sei->u1_sei_fgc_params_present_flag = 1; |
929 | 72 | } |
930 | | |
931 | 91 | return (OK); |
932 | 1.62k | } |
933 | | |
934 | | /*****************************************************************************/ |
935 | | /* */ |
936 | | /* Function Name : ih264d_parse_sei_payload */ |
937 | | /* */ |
938 | | /* Description : This function parses SEI pay loads. Currently it's */ |
939 | | /* implemented partially. */ |
940 | | /* Inputs : ps_bitstrm Bitstream */ |
941 | | /* ui4_payload_type SEI payload type */ |
942 | | /* ui4_payload_size SEI payload i4_size */ |
943 | | /* Globals : None */ |
944 | | /* Processing : Parses SEI payloads units and stores the info */ |
945 | | /* Outputs : None */ |
946 | | /* Return : status for successful parsing, else -1 */ |
947 | | /* */ |
948 | | /* Issues : Not implemented fully */ |
949 | | /* */ |
950 | | /* Revision History: */ |
951 | | /* */ |
952 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
953 | | /* 06 05 2002 NS Draft */ |
954 | | /* */ |
955 | | /*****************************************************************************/ |
956 | | |
957 | | WORD32 ih264d_parse_sei_payload(dec_bit_stream_t *ps_bitstrm, |
958 | | UWORD32 ui4_payload_type, |
959 | | UWORD32 ui4_payload_size, |
960 | | dec_struct_t *ps_dec) |
961 | 263k | { |
962 | 263k | sei *ps_sei; |
963 | 263k | WORD32 i4_status = 0; |
964 | 263k | ps_sei = (sei *)ps_dec->ps_sei_parse; |
965 | | |
966 | 263k | if(ui4_payload_size == 0) |
967 | 239 | return -1; |
968 | 263k | if(NULL == ps_bitstrm) |
969 | 0 | { |
970 | 0 | return NOT_OK; |
971 | 0 | } |
972 | | |
973 | 263k | switch(ui4_payload_type) |
974 | 263k | { |
975 | 175 | case SEI_BUF_PERIOD: |
976 | | |
977 | 175 | i4_status = ih264d_parse_buffering_period(&ps_sei->s_buf_period, |
978 | 175 | ps_bitstrm, ps_dec); |
979 | 175 | break; |
980 | 121k | case SEI_PIC_TIMING: |
981 | 121k | if(NULL == ps_dec->ps_cur_sps) |
982 | 111k | i4_status = ih264d_flush_bits_h264(ps_bitstrm, (ui4_payload_size << 3)); |
983 | 9.62k | else |
984 | 9.62k | i4_status = ih264d_parse_pic_timing(ps_bitstrm, ps_dec, |
985 | 9.62k | ui4_payload_size); |
986 | 121k | break; |
987 | 5.09k | case SEI_RECOVERY_PT: |
988 | 5.09k | i4_status = ih264d_parse_recovery_point(ps_bitstrm, ps_dec, |
989 | 5.09k | ui4_payload_size); |
990 | 5.09k | break; |
991 | 3.93k | case SEI_MASTERING_DISP_COL_VOL: |
992 | | |
993 | 3.93k | i4_status = ih264d_parse_mdcv(ps_bitstrm, ps_dec, |
994 | 3.93k | ui4_payload_size); |
995 | 3.93k | break; |
996 | 1.34k | case SEI_CONTENT_LIGHT_LEVEL_DATA: |
997 | | |
998 | 1.34k | i4_status = ih264d_parse_cll(ps_bitstrm, ps_dec, |
999 | 1.34k | ui4_payload_size); |
1000 | 1.34k | break; |
1001 | 61.3k | case SEI_AMBIENT_VIEWING_ENVIRONMENT: |
1002 | | |
1003 | 61.3k | i4_status = ih264d_parse_ave(ps_bitstrm, ps_dec, |
1004 | 61.3k | ui4_payload_size); |
1005 | 61.3k | break; |
1006 | 40.6k | case SEI_CONTENT_COLOR_VOLUME: |
1007 | | |
1008 | 40.6k | i4_status = ih264d_parse_ccv(ps_bitstrm, ps_dec, |
1009 | 40.6k | ui4_payload_size); |
1010 | 40.6k | break; |
1011 | 1.27k | case SEI_SHUTTER_INTERVAL_INFO: |
1012 | | |
1013 | 1.27k | i4_status = ih264d_parse_sii(ps_bitstrm, ps_dec, ui4_payload_size); |
1014 | 1.27k | break; |
1015 | | |
1016 | 1.62k | case SEI_FILM_GRAIN_CHARACTERISTICS: |
1017 | 1.62k | i4_status = ih264d_parse_fgc(ps_bitstrm, ps_dec, ui4_payload_size); |
1018 | | |
1019 | 1.62k | break; |
1020 | 26.6k | default: |
1021 | 26.6k | i4_status = ih264d_flush_bits_h264(ps_bitstrm, (ui4_payload_size << 3)); |
1022 | 26.6k | break; |
1023 | 263k | } |
1024 | 263k | return (i4_status); |
1025 | 263k | } |
1026 | | |
1027 | | /*****************************************************************************/ |
1028 | | /* */ |
1029 | | /* Function Name : ih264d_parse_sei_message */ |
1030 | | /* */ |
1031 | | /* Description : This function is parses and decode SEI. Currently it's */ |
1032 | | /* not implemented fully. */ |
1033 | | /* Inputs : ps_dec Decoder parameters */ |
1034 | | /* ps_bitstrm Bitstream */ |
1035 | | /* Globals : None */ |
1036 | | /* Processing : Parses SEI NAL units and stores the info */ |
1037 | | /* Outputs : None */ |
1038 | | /* Returns : None */ |
1039 | | /* */ |
1040 | | /* Issues : Not implemented fully */ |
1041 | | /* */ |
1042 | | /* Revision History: */ |
1043 | | /* */ |
1044 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1045 | | /* 06 05 2002 NS Draft */ |
1046 | | /* */ |
1047 | | /*****************************************************************************/ |
1048 | | |
1049 | | WORD32 ih264d_parse_sei_message(dec_struct_t *ps_dec, |
1050 | | dec_bit_stream_t *ps_bitstrm) |
1051 | 20.4k | { |
1052 | 20.4k | UWORD32 ui4_payload_type, ui4_payload_size; |
1053 | 20.4k | UWORD32 u4_bits; |
1054 | 20.4k | WORD32 i4_status = 0; |
1055 | | |
1056 | 20.4k | do |
1057 | 267k | { |
1058 | 267k | ui4_payload_type = 0; |
1059 | | |
1060 | 267k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1061 | 642 | { |
1062 | 642 | return ERROR_EOB_GETBITS_T; |
1063 | 642 | } |
1064 | 266k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1065 | 279k | while(0xff == u4_bits && CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1066 | 12.6k | { |
1067 | 12.6k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1068 | 12.6k | ui4_payload_type += 255; |
1069 | 12.6k | } |
1070 | 266k | ui4_payload_type += u4_bits; |
1071 | | |
1072 | 266k | ui4_payload_size = 0; |
1073 | 266k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1074 | 623 | { |
1075 | 623 | return ERROR_EOB_GETBITS_T; |
1076 | 623 | } |
1077 | 265k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1078 | 409k | while(0xff == u4_bits && CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1079 | 143k | { |
1080 | 143k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1081 | 143k | ui4_payload_size += 255; |
1082 | 143k | } |
1083 | 265k | ui4_payload_size += u4_bits; |
1084 | | |
1085 | 265k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, (ui4_payload_size << 3))) |
1086 | 2.61k | { |
1087 | 2.61k | return ERROR_EOB_GETBITS_T; |
1088 | 2.61k | } |
1089 | 263k | i4_status = ih264d_parse_sei_payload(ps_bitstrm, ui4_payload_type, |
1090 | 263k | ui4_payload_size, ps_dec); |
1091 | 263k | if(i4_status != OK) |
1092 | 13.5k | return i4_status; |
1093 | | |
1094 | 249k | if(ih264d_check_byte_aligned(ps_bitstrm) == 0) |
1095 | 35.1k | { |
1096 | 35.1k | u4_bits = ih264d_get_bit_h264(ps_bitstrm); |
1097 | 35.1k | if(0 == u4_bits) |
1098 | 34.8k | { |
1099 | 34.8k | H264_DEC_DEBUG_PRINT("\nError in parsing SEI message"); |
1100 | 34.8k | } |
1101 | 214k | while(0 == ih264d_check_byte_aligned(ps_bitstrm) |
1102 | 179k | && CHECK_BITS_SUFFICIENT(ps_bitstrm, 1)) |
1103 | 178k | { |
1104 | 178k | u4_bits = ih264d_get_bit_h264(ps_bitstrm); |
1105 | 178k | if(u4_bits) |
1106 | 91.7k | { |
1107 | 91.7k | H264_DEC_DEBUG_PRINT("\nError in parsing SEI message"); |
1108 | 91.7k | } |
1109 | 178k | } |
1110 | 35.1k | } |
1111 | 249k | } |
1112 | 20.4k | while(MORE_RBSP_DATA(ps_bitstrm)); |
1113 | 3.02k | return (i4_status); |
1114 | 20.4k | } |
1115 | | |
1116 | | /*****************************************************************************/ |
1117 | | /* */ |
1118 | | /* Function Name : ih264d_export_sei_mdcv_params */ |
1119 | | /* */ |
1120 | | /* Description : This function populates SEI mdcv message in */ |
1121 | | /* output structure */ |
1122 | | /* Inputs : ps_sei_mdcv_op pointer to sei mdcv o\p struct */ |
1123 | | /* : ps_sei pointer to decoded sei params */ |
1124 | | /* Outputs : */ |
1125 | | /* Returns : returns 0 for success; -1 for failure */ |
1126 | | /* */ |
1127 | | /* Issues : none */ |
1128 | | /* */ |
1129 | | /* Revision History: */ |
1130 | | /* */ |
1131 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1132 | | /* */ |
1133 | | /* */ |
1134 | | /*****************************************************************************/ |
1135 | | WORD32 ih264d_export_sei_mdcv_params(ivd_sei_decode_op_t *ps_sei_decode_op, |
1136 | | sei *ps_sei, sei *ps_sei_export) |
1137 | 10.1k | { |
1138 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1139 | 4.11k | { |
1140 | 4.11k | return NOT_OK; |
1141 | 4.11k | } |
1142 | | |
1143 | 6.03k | ps_sei_export->u1_sei_mdcv_params_present_flag = ps_sei->u1_sei_mdcv_params_present_flag; |
1144 | 6.03k | ps_sei_decode_op->u1_sei_mdcv_params_present_flag = ps_sei->u1_sei_mdcv_params_present_flag; |
1145 | | |
1146 | 6.03k | if(0 == ps_sei_export->u1_sei_mdcv_params_present_flag) |
1147 | 6.03k | { |
1148 | 6.03k | memset(&ps_sei_export->s_sei_mdcv_params, 0, sizeof(sei_mdcv_params_t)); |
1149 | 6.03k | } |
1150 | 0 | else |
1151 | 0 | { |
1152 | 0 | memcpy(&ps_sei_export->s_sei_mdcv_params, &ps_sei->s_sei_mdcv_params, |
1153 | 0 | sizeof(sei_mdcv_params_t)); |
1154 | 0 | } |
1155 | | |
1156 | 6.03k | return (OK); |
1157 | 10.1k | } |
1158 | | |
1159 | | /*****************************************************************************/ |
1160 | | /* */ |
1161 | | /* Function Name : ih264d_export_sei_cll_params */ |
1162 | | /* */ |
1163 | | /* Description : This function populates SEI cll message in */ |
1164 | | /* output structure */ |
1165 | | /* Inputs : ps_sei_cll_op pointer to sei cll o\p struct */ |
1166 | | /* : ps_sei pointer to decoded sei params */ |
1167 | | /* Outputs : */ |
1168 | | /* Returns : returns 0 for success; -1 for failure */ |
1169 | | /* */ |
1170 | | /* Issues : none */ |
1171 | | /* */ |
1172 | | /* Revision History: */ |
1173 | | /* */ |
1174 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1175 | | /* */ |
1176 | | /* */ |
1177 | | /*****************************************************************************/ |
1178 | | WORD32 ih264d_export_sei_cll_params(ivd_sei_decode_op_t *ps_sei_decode_op, |
1179 | | sei *ps_sei, sei *ps_sei_export) |
1180 | 10.1k | { |
1181 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1182 | 4.11k | { |
1183 | 4.11k | return NOT_OK; |
1184 | 4.11k | } |
1185 | | |
1186 | 6.03k | ps_sei_export->u1_sei_cll_params_present_flag = ps_sei->u1_sei_cll_params_present_flag; |
1187 | 6.03k | ps_sei_decode_op->u1_sei_cll_params_present_flag = ps_sei->u1_sei_cll_params_present_flag; |
1188 | | |
1189 | 6.03k | if(0 == ps_sei_export->u1_sei_cll_params_present_flag) |
1190 | 6.03k | { |
1191 | 6.03k | memset(&ps_sei_export->s_sei_cll_params, 0, sizeof(sei_cll_params_t)); |
1192 | 6.03k | } |
1193 | 0 | else |
1194 | 0 | { |
1195 | 0 | memcpy(&ps_sei_export->s_sei_cll_params, &ps_sei->s_sei_cll_params, |
1196 | 0 | sizeof(sei_cll_params_t)); |
1197 | 0 | } |
1198 | 6.03k | return (OK); |
1199 | 10.1k | } |
1200 | | |
1201 | | /*****************************************************************************/ |
1202 | | /* */ |
1203 | | /* Function Name : ih264d_export_sei_ave_params */ |
1204 | | /* */ |
1205 | | /* Description : This function populates SEI ave message in */ |
1206 | | /* output structure */ |
1207 | | /* Inputs : ps_sei_ave_op pointer to sei ave o\p struct */ |
1208 | | /* : ps_sei pointer to decoded sei params */ |
1209 | | /* Outputs : */ |
1210 | | /* Returns : returns 0 for success; -1 for failure */ |
1211 | | /* */ |
1212 | | /* Issues : none */ |
1213 | | /* */ |
1214 | | /* Revision History: */ |
1215 | | /* */ |
1216 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1217 | | /* */ |
1218 | | /* */ |
1219 | | /*****************************************************************************/ |
1220 | | WORD32 ih264d_export_sei_ave_params(ivd_sei_decode_op_t *ps_sei_decode_op, |
1221 | | sei *ps_sei, sei *ps_sei_export) |
1222 | 10.1k | { |
1223 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1224 | 4.11k | { |
1225 | 4.11k | return NOT_OK; |
1226 | 4.11k | } |
1227 | | |
1228 | 6.03k | ps_sei_export->u1_sei_ave_params_present_flag = ps_sei->u1_sei_ave_params_present_flag; |
1229 | 6.03k | ps_sei_decode_op->u1_sei_ave_params_present_flag = ps_sei->u1_sei_ave_params_present_flag; |
1230 | | |
1231 | 6.03k | if(0 == ps_sei_export->u1_sei_ave_params_present_flag) |
1232 | 6.03k | { |
1233 | 6.03k | memset(&ps_sei_export->s_sei_ave_params, 0, sizeof(sei_ave_params_t)); |
1234 | 6.03k | } |
1235 | 0 | else |
1236 | 0 | { |
1237 | 0 | memcpy(&ps_sei_export->s_sei_ave_params, &ps_sei->s_sei_ave_params, |
1238 | 0 | sizeof(sei_ave_params_t)); |
1239 | 0 | } |
1240 | | |
1241 | 6.03k | return (OK); |
1242 | 10.1k | } |
1243 | | |
1244 | | /*****************************************************************************/ |
1245 | | /* */ |
1246 | | /* Function Name : ih264d_export_sei_ccv_params */ |
1247 | | /* */ |
1248 | | /* Description : This function populates SEI ccv message in */ |
1249 | | /* output structure */ |
1250 | | /* Inputs : ps_sei_ccv_op pointer to sei ccv o\p struct */ |
1251 | | /* : ps_sei pointer to decoded sei params */ |
1252 | | /* Outputs : */ |
1253 | | /* Returns : returns 0 for success; -1 for failure */ |
1254 | | /* */ |
1255 | | /* Issues : none */ |
1256 | | /* */ |
1257 | | /* Revision History: */ |
1258 | | /* */ |
1259 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1260 | | /* */ |
1261 | | /* */ |
1262 | | /*****************************************************************************/ |
1263 | | WORD32 ih264d_export_sei_ccv_params(ivd_sei_decode_op_t *ps_sei_decode_op, |
1264 | | sei *ps_sei, sei *ps_sei_export) |
1265 | 10.1k | { |
1266 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1267 | 4.11k | { |
1268 | 4.11k | return NOT_OK; |
1269 | 4.11k | } |
1270 | | |
1271 | 6.03k | ps_sei_export->u1_sei_ccv_params_present_flag = ps_sei->u1_sei_ccv_params_present_flag; |
1272 | 6.03k | ps_sei_decode_op->u1_sei_ccv_params_present_flag = ps_sei->u1_sei_ccv_params_present_flag; |
1273 | | |
1274 | 6.03k | if(0 == ps_sei_export->u1_sei_ccv_params_present_flag) |
1275 | 6.03k | { |
1276 | 6.03k | memset(&ps_sei_export->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t)); |
1277 | 6.03k | } |
1278 | 0 | else |
1279 | 0 | { |
1280 | 0 | memcpy(&ps_sei_export->s_sei_ccv_params, &ps_sei->s_sei_ccv_params, |
1281 | 0 | sizeof(sei_ccv_params_t)); |
1282 | 0 | } |
1283 | 6.03k | return (OK); |
1284 | 10.1k | } |
1285 | | |
1286 | | /*****************************************************************************/ |
1287 | | /* */ |
1288 | | /* Function Name : ih264d_export_sei_sii_params */ |
1289 | | /* */ |
1290 | | /* Description : This function populates SEI sii message in */ |
1291 | | /* output structure */ |
1292 | | /* Inputs : ps_sei_sii_op pointer to sei sii o\p struct */ |
1293 | | /* : ps_sei pointer to decoded sei params */ |
1294 | | /* Outputs : */ |
1295 | | /* Returns : returns 0 for success; -1 for failure */ |
1296 | | /* */ |
1297 | | /* Issues : none */ |
1298 | | /* */ |
1299 | | /* Revision History: */ |
1300 | | /* */ |
1301 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1302 | | /* */ |
1303 | | /* */ |
1304 | | /*****************************************************************************/ |
1305 | | WORD32 ih264d_export_sei_sii_params(ivd_sei_decode_op_t *ps_sei_decode_op, sei *ps_sei, |
1306 | | sei *ps_sei_export) |
1307 | 10.1k | { |
1308 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1309 | 4.11k | { |
1310 | 4.11k | return NOT_OK; |
1311 | 4.11k | } |
1312 | | |
1313 | 6.03k | ps_sei_export->u1_sei_sii_params_present_flag = ps_sei->u1_sei_sii_params_present_flag; |
1314 | 6.03k | ps_sei_decode_op->u1_sei_sii_params_present_flag = ps_sei->u1_sei_sii_params_present_flag; |
1315 | | |
1316 | 6.03k | if(0 == ps_sei_export->u1_sei_sii_params_present_flag) |
1317 | 6.03k | { |
1318 | 6.03k | memset(&ps_sei_export->s_sei_sii_params, 0, sizeof(sei_sii_params_t)); |
1319 | 6.03k | } |
1320 | 0 | else |
1321 | 0 | { |
1322 | 0 | memcpy(&ps_sei_export->s_sei_sii_params, &ps_sei->s_sei_sii_params, |
1323 | 0 | sizeof(sei_sii_params_t)); |
1324 | 0 | } |
1325 | 6.03k | return (OK); |
1326 | 10.1k | } |
1327 | | |
1328 | | /*****************************************************************************/ |
1329 | | /* */ |
1330 | | /* Function Name : ih264d_export_sei_fgc_params */ |
1331 | | /* */ |
1332 | | /* Description : This function populates SEI film grain params in */ |
1333 | | /* output structure */ |
1334 | | /* Inputs : ps_sei_fgc_op pointer to sei fgc o\p struct */ |
1335 | | /* : ps_sei pointer to decoded sei params */ |
1336 | | /* Outputs : */ |
1337 | | /* Returns : returns 0 for success; -1 for failure */ |
1338 | | /* */ |
1339 | | /* Issues : none */ |
1340 | | /* */ |
1341 | | /* Revision History: */ |
1342 | | /* */ |
1343 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1344 | | /* */ |
1345 | | /* */ |
1346 | | /*****************************************************************************/ |
1347 | | WORD32 ih264d_export_sei_fgc_params(ivd_sei_decode_op_t *ps_sei_decode_op, sei *ps_sei, |
1348 | | sei *ps_sei_export) |
1349 | 10.1k | { |
1350 | 10.1k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1351 | 4.11k | { |
1352 | 4.11k | return NOT_OK; |
1353 | 4.11k | } |
1354 | | |
1355 | 6.03k | ps_sei_export->u1_sei_fgc_params_present_flag = ps_sei->u1_sei_fgc_params_present_flag; |
1356 | 6.03k | ps_sei_decode_op->u1_sei_fgc_params_present_flag = ps_sei->u1_sei_fgc_params_present_flag; |
1357 | | |
1358 | 6.03k | if(0 == ps_sei_export->u1_sei_fgc_params_present_flag) |
1359 | 5.94k | { |
1360 | 5.94k | memset(&ps_sei_export->s_sei_fgc_params, 0, sizeof(sei_fgc_params_t)); |
1361 | 5.94k | } |
1362 | 90 | else |
1363 | 90 | { |
1364 | 90 | memcpy(&ps_sei_export->s_sei_fgc_params, &ps_sei->s_sei_fgc_params, |
1365 | 90 | sizeof(sei_fgc_params_t)); |
1366 | 90 | } |
1367 | | |
1368 | 6.03k | return (OK); |
1369 | 10.1k | } |