/src/libavc/decoder/ih264d_sei.c
Line | Count | Source (jump to first uncovered line) |
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 | 3.03k | { |
75 | 3.03k | UWORD8 u1_seq_parameter_set_id; |
76 | 3.03k | dec_seq_params_t *ps_seq; |
77 | 3.03k | UWORD8 u1_nal_hrd_present, u1_vcl_hrd_present; |
78 | 3.03k | UWORD32 i; |
79 | 3.03k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
80 | 3.03k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
81 | 3.03k | UNUSED(ps_buf_prd); |
82 | 3.03k | u1_seq_parameter_set_id = ih264d_uev(pu4_bitstrm_ofst, |
83 | 3.03k | pu4_bitstrm_buf); |
84 | 3.03k | if(u1_seq_parameter_set_id >= MAX_NUM_SEQ_PARAMS) |
85 | 2 | return ERROR_INVALID_SEQ_PARAM; |
86 | 3.02k | ps_seq = &ps_dec->ps_sps[u1_seq_parameter_set_id]; |
87 | 3.02k | if(TRUE != ps_seq->u1_is_valid) |
88 | 2 | return ERROR_INVALID_SEQ_PARAM; |
89 | | |
90 | 3.02k | ps_dec->ps_sei->u1_seq_param_set_id = u1_seq_parameter_set_id; |
91 | 3.02k | ps_dec->ps_cur_sps = ps_seq; |
92 | 3.02k | if(FALSE == ps_seq->u1_is_valid) |
93 | 0 | return ERROR_INVALID_SEQ_PARAM; |
94 | 3.02k | if(1 == ps_seq->u1_vui_parameters_present_flag) |
95 | 1.04k | { |
96 | 1.04k | u1_nal_hrd_present = ps_seq->s_vui.u1_nal_hrd_params_present; |
97 | 1.04k | if(u1_nal_hrd_present) |
98 | 359 | { |
99 | 1.44k | for(i = 0; i < ps_seq->s_vui.s_nal_hrd.u4_cpb_cnt; i++) |
100 | 1.08k | { |
101 | 1.08k | ih264d_get_bits_h264( |
102 | 1.08k | ps_bitstrm, |
103 | 1.08k | ps_seq->s_vui.s_nal_hrd.u1_initial_cpb_removal_delay); |
104 | 1.08k | ih264d_get_bits_h264( |
105 | 1.08k | ps_bitstrm, |
106 | 1.08k | ps_seq->s_vui.s_nal_hrd.u1_initial_cpb_removal_delay); |
107 | 1.08k | } |
108 | 359 | } |
109 | | |
110 | 1.04k | u1_vcl_hrd_present = ps_seq->s_vui.u1_vcl_hrd_params_present; |
111 | 1.04k | if(u1_vcl_hrd_present) |
112 | 360 | { |
113 | 1.37k | for(i = 0; i < ps_seq->s_vui.s_vcl_hrd.u4_cpb_cnt; i++) |
114 | 1.01k | { |
115 | 1.01k | ih264d_get_bits_h264( |
116 | 1.01k | ps_bitstrm, |
117 | 1.01k | ps_seq->s_vui.s_vcl_hrd.u1_initial_cpb_removal_delay); |
118 | 1.01k | ih264d_get_bits_h264( |
119 | 1.01k | ps_bitstrm, |
120 | 1.01k | ps_seq->s_vui.s_vcl_hrd.u1_initial_cpb_removal_delay); |
121 | 1.01k | } |
122 | 360 | } |
123 | 1.04k | } |
124 | 3.02k | return (OK); |
125 | 3.02k | } |
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 | 971 | { |
152 | 971 | sei *ps_sei; |
153 | 971 | vui_t *ps_vu4; |
154 | 971 | UWORD8 u1_cpb_dpb_present; |
155 | 971 | UWORD8 u1_pic_struct_present_flag; |
156 | 971 | UWORD32 u4_start_offset, u4_bits_consumed; |
157 | 971 | UWORD8 u1_cpb_removal_delay_length, u1_dpb_output_delay_length; |
158 | | |
159 | 971 | ps_sei = (sei *)ps_dec->ps_sei; |
160 | 971 | ps_vu4 = &ps_dec->ps_cur_sps->s_vui; |
161 | | |
162 | 971 | u1_cpb_dpb_present = ps_vu4->u1_vcl_hrd_params_present |
163 | 971 | + ps_vu4->u1_nal_hrd_params_present; |
164 | | |
165 | 971 | if(ps_vu4->u1_vcl_hrd_params_present) |
166 | 331 | { |
167 | 331 | u1_cpb_removal_delay_length = |
168 | 331 | ps_vu4->s_vcl_hrd.u1_cpb_removal_delay_length; |
169 | 331 | u1_dpb_output_delay_length = |
170 | 331 | ps_vu4->s_vcl_hrd.u1_dpb_output_delay_length; |
171 | 331 | } |
172 | 640 | else if(ps_vu4->u1_nal_hrd_params_present) |
173 | 228 | { |
174 | 228 | u1_cpb_removal_delay_length = |
175 | 228 | ps_vu4->s_nal_hrd.u1_cpb_removal_delay_length; |
176 | 228 | u1_dpb_output_delay_length = |
177 | 228 | ps_vu4->s_nal_hrd.u1_dpb_output_delay_length; |
178 | 228 | } |
179 | 412 | else |
180 | 412 | { |
181 | 412 | u1_cpb_removal_delay_length = 24; |
182 | 412 | u1_dpb_output_delay_length = 24; |
183 | | |
184 | 412 | } |
185 | | |
186 | 971 | u4_start_offset = ps_bitstrm->u4_ofst; |
187 | 971 | if(u1_cpb_dpb_present) |
188 | 559 | { |
189 | 559 | ih264d_get_bits_h264(ps_bitstrm, u1_cpb_removal_delay_length); |
190 | 559 | ih264d_get_bits_h264(ps_bitstrm, u1_dpb_output_delay_length); |
191 | 559 | } |
192 | | |
193 | 971 | u1_pic_struct_present_flag = ps_vu4->u1_pic_struct_present_flag; |
194 | 971 | if(u1_pic_struct_present_flag) |
195 | 409 | { |
196 | 409 | ps_sei->u1_pic_struct = ih264d_get_bits_h264(ps_bitstrm, 4); |
197 | 409 | ps_dec->u1_pic_struct_copy = ps_sei->u1_pic_struct; |
198 | 409 | ps_sei->u1_is_valid = 1; |
199 | 409 | } |
200 | 971 | u4_bits_consumed = ps_bitstrm->u4_ofst - u4_start_offset; |
201 | | |
202 | 971 | if((ui4_payload_size << 3) < u4_bits_consumed) |
203 | 1 | return ERROR_CORRUPTED_SLICE; |
204 | | |
205 | 970 | ih264d_flush_bits_h264(ps_bitstrm, |
206 | 970 | (ui4_payload_size << 3) - u4_bits_consumed); |
207 | | |
208 | 970 | return (OK); |
209 | 971 | } |
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 | 32.3k | { |
236 | 32.3k | sei *ps_sei = ps_dec->ps_sei; |
237 | 32.3k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
238 | 32.3k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
239 | 32.3k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
240 | 32.3k | UNUSED(ui4_payload_size); |
241 | 32.3k | ps_sei->u2_recovery_frame_cnt = ih264d_uev(pu4_bitstrm_ofst, |
242 | 32.3k | pu4_bitstrm_buf); |
243 | 32.3k | ps_err->u4_frm_sei_sync = ps_err->u4_cur_frm |
244 | 32.3k | + ps_sei->u2_recovery_frame_cnt; |
245 | 32.3k | ps_sei->u1_exact_match_flag = ih264d_get_bit_h264(ps_bitstrm); |
246 | 32.3k | ps_sei->u1_broken_link_flag = ih264d_get_bit_h264(ps_bitstrm); |
247 | 32.3k | ps_sei->u1_changing_slice_grp_idc = ih264d_get_bits_h264(ps_bitstrm, 2); |
248 | | |
249 | 32.3k | return (OK); |
250 | 32.3k | } |
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 | 166 | { |
277 | 166 | sei *ps_sei = ps_dec->ps_sei_parse; |
278 | 166 | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
279 | 166 | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
280 | 166 | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
281 | 166 | UWORD32 u4_count; |
282 | 166 | UNUSED(ui4_payload_size); |
283 | | |
284 | 166 | if((ps_dec == NULL) || (ps_sei == NULL)) |
285 | 0 | { |
286 | 0 | return NOT_OK; |
287 | 0 | } |
288 | | |
289 | 166 | ps_sei->u1_sei_mdcv_params_present_flag = 1; |
290 | | |
291 | | /* display primaries x */ |
292 | 593 | for(u4_count = 0; u4_count < NUM_SEI_MDCV_PRIMARIES; u4_count++) |
293 | 455 | { |
294 | 455 | ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] = |
295 | 455 | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
296 | | |
297 | 455 | if((ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] > |
298 | 455 | DISPLAY_PRIMARIES_X_UPPER_LIMIT) || |
299 | 455 | (ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] < |
300 | 454 | DISPLAY_PRIMARIES_X_LOWER_LIMIT) || |
301 | 455 | ((ps_sei->s_sei_mdcv_params.au2_display_primaries_x[u4_count] % |
302 | 449 | DISPLAY_PRIMARIES_X_DIVISION_FACTOR) != 0)) |
303 | 16 | { |
304 | 16 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
305 | 16 | return ERROR_INV_SEI_MDCV_PARAMS; |
306 | 16 | } |
307 | | |
308 | 439 | ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] = |
309 | 439 | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
310 | | |
311 | 439 | if((ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] > |
312 | 439 | DISPLAY_PRIMARIES_Y_UPPER_LIMIT) || |
313 | 439 | (ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] < |
314 | 437 | DISPLAY_PRIMARIES_Y_LOWER_LIMIT) || |
315 | 439 | ((ps_sei->s_sei_mdcv_params.au2_display_primaries_y[u4_count] % |
316 | 436 | DISPLAY_PRIMARIES_Y_DIVISION_FACTOR) != 0)) |
317 | 12 | { |
318 | 12 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
319 | 12 | return ERROR_INV_SEI_MDCV_PARAMS; |
320 | 12 | } |
321 | 439 | } |
322 | | |
323 | | /* white point x */ |
324 | 138 | ps_sei->s_sei_mdcv_params.u2_white_point_x = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
325 | | |
326 | 138 | if((ps_sei->s_sei_mdcv_params.u2_white_point_x > WHITE_POINT_X_UPPER_LIMIT) || |
327 | 138 | (ps_sei->s_sei_mdcv_params.u2_white_point_x < WHITE_POINT_X_LOWER_LIMIT) || |
328 | 138 | ((ps_sei->s_sei_mdcv_params.u2_white_point_x % WHITE_POINT_X_DIVISION_FACTOR) != 0)) |
329 | 5 | { |
330 | 5 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
331 | 5 | return ERROR_INV_SEI_MDCV_PARAMS; |
332 | 5 | } |
333 | | /* white point y */ |
334 | 133 | ps_sei->s_sei_mdcv_params.u2_white_point_y = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
335 | | |
336 | 133 | if((ps_sei->s_sei_mdcv_params.u2_white_point_y > WHITE_POINT_Y_UPPER_LIMIT) || |
337 | 133 | (ps_sei->s_sei_mdcv_params.u2_white_point_y < WHITE_POINT_Y_LOWER_LIMIT) || |
338 | 133 | ((ps_sei->s_sei_mdcv_params.u2_white_point_y % WHITE_POINT_Y_DIVISION_FACTOR) != 0)) |
339 | 11 | { |
340 | 11 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
341 | 11 | return ERROR_INV_SEI_MDCV_PARAMS; |
342 | 11 | } |
343 | | /* max display mastering luminance */ |
344 | 122 | ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance = |
345 | 122 | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
346 | | |
347 | 122 | if((ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance > |
348 | 122 | MAX_DISPLAY_MASTERING_LUMINANCE_UPPER_LIMIT) || |
349 | 122 | (ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance < |
350 | 103 | MAX_DISPLAY_MASTERING_LUMINANCE_LOWER_LIMIT) || |
351 | 122 | ((ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance % |
352 | 96 | MAX_DISPLAY_MASTERING_LUMINANCE_DIVISION_FACTOR) != 0)) |
353 | 49 | { |
354 | 49 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
355 | 49 | return ERROR_INV_SEI_MDCV_PARAMS; |
356 | 49 | } |
357 | | /* min display mastering luminance */ |
358 | 73 | ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance = |
359 | 73 | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
360 | | |
361 | 73 | if((ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance > |
362 | 73 | MIN_DISPLAY_MASTERING_LUMINANCE_UPPER_LIMIT) || |
363 | 73 | (ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance < |
364 | 72 | MIN_DISPLAY_MASTERING_LUMINANCE_LOWER_LIMIT)) |
365 | 3 | { |
366 | 3 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
367 | 3 | return ERROR_INV_SEI_MDCV_PARAMS; |
368 | 3 | } |
369 | 70 | if(ps_sei->s_sei_mdcv_params.u4_max_display_mastering_luminance <= |
370 | 70 | ps_sei->s_sei_mdcv_params.u4_min_display_mastering_luminance) |
371 | 0 | { |
372 | 0 | ps_sei->u1_sei_mdcv_params_present_flag = 0; |
373 | 0 | return ERROR_INV_SEI_MDCV_PARAMS; |
374 | 0 | } |
375 | 70 | return (OK); |
376 | 70 | } |
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 | 861 | { |
403 | 861 | sei *ps_sei = ps_dec->ps_sei_parse; |
404 | 861 | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
405 | 861 | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
406 | 861 | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
407 | 861 | UNUSED(ui4_payload_size); |
408 | | |
409 | 861 | if((ps_dec == NULL) || (ps_sei == NULL)) |
410 | 0 | { |
411 | 0 | return NOT_OK; |
412 | 0 | } |
413 | | |
414 | 861 | ps_sei->u1_sei_cll_params_present_flag = 1; |
415 | | |
416 | 861 | ps_sei->s_sei_cll_params.u2_max_content_light_level = |
417 | 861 | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
418 | 861 | ps_sei->s_sei_cll_params.u2_max_pic_average_light_level = |
419 | 861 | (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
420 | | /*No any sanity checks done for CLL params*/ |
421 | | |
422 | 861 | return (OK); |
423 | 861 | } |
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 | 1.92k | { |
450 | 1.92k | sei *ps_sei = ps_dec->ps_sei_parse; |
451 | 1.92k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
452 | 1.92k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
453 | 1.92k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
454 | 1.92k | UNUSED(ui4_payload_size); |
455 | | |
456 | 1.92k | if((ps_dec == NULL) || (ps_sei == NULL)) |
457 | 0 | { |
458 | 0 | return NOT_OK; |
459 | 0 | } |
460 | | |
461 | 1.92k | ps_sei->u1_sei_ave_params_present_flag = 1; |
462 | | |
463 | 1.92k | ps_sei->s_sei_ave_params.u4_ambient_illuminance = (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
464 | 1.92k | if(0 == ps_sei->s_sei_ave_params.u4_ambient_illuminance) |
465 | 1 | { |
466 | 1 | ps_sei->u1_sei_ave_params_present_flag = 0; |
467 | 1 | return ERROR_INV_SEI_AVE_PARAMS; |
468 | 1 | } |
469 | | |
470 | 1.92k | ps_sei->s_sei_ave_params.u2_ambient_light_x = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
471 | 1.92k | if(ps_sei->s_sei_ave_params.u2_ambient_light_x > AMBIENT_LIGHT_X_UPPER_LIMIT) |
472 | 12 | { |
473 | 12 | ps_sei->u1_sei_ave_params_present_flag = 0; |
474 | 12 | return ERROR_INV_SEI_AVE_PARAMS; |
475 | 12 | } |
476 | | |
477 | 1.90k | ps_sei->s_sei_ave_params.u2_ambient_light_y = (UWORD16)ih264d_get_bits_h264(ps_bitstrm, 16); |
478 | 1.90k | if(ps_sei->s_sei_ave_params.u2_ambient_light_y > AMBIENT_LIGHT_Y_UPPER_LIMIT) |
479 | 8 | { |
480 | 8 | ps_sei->u1_sei_ave_params_present_flag = 0; |
481 | 8 | return ERROR_INV_SEI_AVE_PARAMS; |
482 | 8 | } |
483 | 1.90k | return (OK); |
484 | 1.90k | } |
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 | 821k | { |
511 | 821k | sei *ps_sei = ps_dec->ps_sei_parse; |
512 | 821k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
513 | 821k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
514 | 821k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
515 | 821k | UWORD32 u4_count; |
516 | 821k | UNUSED(ui4_payload_size); |
517 | | |
518 | 821k | if((ps_dec == NULL) || (ps_sei == NULL)) |
519 | 0 | { |
520 | 0 | return NOT_OK; |
521 | 0 | } |
522 | | |
523 | 821k | ps_sei->u1_sei_ccv_params_present_flag = 0; |
524 | | |
525 | 821k | ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag = (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
526 | | |
527 | 821k | 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 | 821k | if(0 == ps_sei->s_sei_ccv_params.u1_ccv_cancel_flag) |
532 | 49.3k | { |
533 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_persistence_flag = |
534 | 49.3k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
535 | 49.3k | 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 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag = |
540 | 49.3k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
541 | 49.3k | 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 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag = |
546 | 49.3k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
547 | 49.3k | 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 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag = |
552 | 49.3k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
553 | 49.3k | 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 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag = |
558 | 49.3k | (UWORD8)ih264d_get_bit_h264(ps_bitstrm); |
559 | 49.3k | 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 | 49.3k | if((ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag == 0) && |
565 | 49.3k | (ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag == 0) && |
566 | 49.3k | (ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag == 0) && |
567 | 49.3k | (ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag == 0)) |
568 | 4 | { |
569 | 4 | return ERROR_INV_SEI_CCV_PARAMS; |
570 | 4 | } |
571 | | |
572 | 49.3k | ps_sei->s_sei_ccv_params.u1_ccv_reserved_zero_2bits = |
573 | 49.3k | (UWORD8)ih264d_get_bits_h264(ps_bitstrm, 2); |
574 | 49.3k | if((ps_sei->s_sei_ccv_params.u1_ccv_reserved_zero_2bits != 0)) |
575 | 8 | { |
576 | 8 | return ERROR_INV_SEI_CCV_PARAMS; |
577 | 8 | } |
578 | | |
579 | | /* ccv primaries */ |
580 | 49.3k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_primaries_present_flag) |
581 | 745 | { |
582 | 2.77k | for(u4_count = 0; u4_count < NUM_SEI_CCV_PRIMARIES; u4_count++) |
583 | 2.11k | { |
584 | 2.11k | ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] = |
585 | 2.11k | (WORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
586 | 2.11k | if((ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] > |
587 | 2.11k | CCV_PRIMARIES_X_UPPER_LIMIT) || |
588 | 2.11k | (ps_sei->s_sei_ccv_params.ai4_ccv_primaries_x[u4_count] < |
589 | 2.10k | CCV_PRIMARIES_X_LOWER_LIMIT)) |
590 | 42 | { |
591 | 42 | return ERROR_INV_SEI_CCV_PARAMS; |
592 | 42 | } |
593 | | |
594 | 2.06k | ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] = |
595 | 2.06k | (WORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
596 | 2.06k | if((ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] > |
597 | 2.06k | CCV_PRIMARIES_Y_UPPER_LIMIT) || |
598 | 2.06k | (ps_sei->s_sei_ccv_params.ai4_ccv_primaries_y[u4_count] < |
599 | 2.06k | CCV_PRIMARIES_Y_LOWER_LIMIT)) |
600 | 36 | { |
601 | 36 | return ERROR_INV_SEI_CCV_PARAMS; |
602 | 36 | } |
603 | 2.06k | } |
604 | 745 | } |
605 | | |
606 | 49.2k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) |
607 | 46.3k | { |
608 | 46.3k | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value = |
609 | 46.3k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
610 | 46.3k | } |
611 | | |
612 | 49.2k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag) |
613 | 46.9k | { |
614 | 46.9k | ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value = |
615 | 46.9k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
616 | 46.9k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) && |
617 | 46.9k | (ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value < |
618 | 46.1k | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value)) |
619 | 24 | { |
620 | 24 | return ERROR_INV_SEI_CCV_PARAMS; |
621 | 24 | } |
622 | 46.9k | } |
623 | 49.2k | if(1 == ps_sei->s_sei_ccv_params.u1_ccv_avg_luminance_value_present_flag) |
624 | 3.36k | { |
625 | 3.36k | ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value = |
626 | 3.36k | (UWORD32)ih264d_get_bits_h264(ps_bitstrm, 32); |
627 | 3.36k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_min_luminance_value_present_flag) && |
628 | 3.36k | (ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value < |
629 | 724 | ps_sei->s_sei_ccv_params.u4_ccv_min_luminance_value)) |
630 | 37 | { |
631 | 37 | return ERROR_INV_SEI_CCV_PARAMS; |
632 | 37 | } |
633 | 3.32k | if((1 == ps_sei->s_sei_ccv_params.u1_ccv_max_luminance_value_present_flag) && |
634 | 3.32k | (ps_sei->s_sei_ccv_params.u4_ccv_max_luminance_value < |
635 | 1.17k | ps_sei->s_sei_ccv_params.u4_ccv_avg_luminance_value)) |
636 | 23 | { |
637 | 23 | return ERROR_INV_SEI_CCV_PARAMS; |
638 | 23 | } |
639 | 3.32k | } |
640 | 49.2k | } |
641 | 821k | ps_sei->u1_sei_ccv_params_present_flag = 1; |
642 | 821k | return (OK); |
643 | 821k | } |
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 | 23.6k | { |
669 | 23.6k | sei *ps_sei; |
670 | 23.6k | dec_err_status_t *ps_err; |
671 | 23.6k | int i; |
672 | 23.6k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
673 | 23.6k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
674 | 23.6k | UNUSED(ui4_payload_size); |
675 | | |
676 | 23.6k | if(ps_dec == NULL) |
677 | 0 | { |
678 | 0 | return NOT_OK; |
679 | 0 | } |
680 | 23.6k | ps_sei = ps_dec->ps_sei_parse; |
681 | | |
682 | 23.6k | if(ps_sei == NULL) |
683 | 0 | { |
684 | 0 | return NOT_OK; |
685 | 0 | } |
686 | 23.6k | ps_err = ps_dec->ps_dec_err_status; |
687 | | |
688 | 23.6k | ps_sei->u1_sei_sii_params_present_flag = 0; |
689 | 23.6k | memset(&ps_sei->s_sei_sii_params, 0, sizeof(ps_sei->s_sei_sii_params)); |
690 | | |
691 | 23.6k | ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
692 | | |
693 | 23.6k | if(0 == ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx) |
694 | 23.5k | { |
695 | 23.5k | ps_sei->s_sei_sii_params.u1_shutter_interval_info_present_flag = |
696 | 23.5k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
697 | | |
698 | 23.5k | if(1 == ps_sei->s_sei_sii_params.u1_shutter_interval_info_present_flag) |
699 | 2.07k | { |
700 | 2.07k | ps_sei->s_sei_sii_params.u4_sii_time_scale = |
701 | 2.07k | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
702 | | |
703 | 2.07k | ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag = |
704 | 2.07k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
705 | | |
706 | 2.07k | if(1 == ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag) |
707 | 372 | { |
708 | 372 | ps_sei->s_sei_sii_params.u4_sii_num_units_in_shutter_interval = |
709 | 372 | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
710 | 372 | } |
711 | 1.69k | else |
712 | 1.69k | { |
713 | 1.69k | ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1 = |
714 | 1.69k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
715 | 10.7k | for(i = 0; i <= ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1; i++) |
716 | 9.03k | { |
717 | 9.03k | ps_sei->s_sei_sii_params.au4_sub_layer_num_units_in_shutter_interval[i] = |
718 | 9.03k | (UWORD32) ih264d_get_bits_h264(ps_bitstrm, 32); |
719 | 9.03k | } |
720 | 1.69k | } |
721 | 2.07k | } |
722 | 23.5k | } |
723 | | |
724 | 23.6k | if((ps_sei->s_sei_sii_params.u4_sii_sub_layer_idx > |
725 | 23.6k | ps_sei->s_sei_sii_params.u1_sii_max_sub_layers_minus1) && |
726 | 23.6k | (ps_sei->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag == 0)) |
727 | 64 | { |
728 | 64 | return ERROR_INV_SEI_SII_PARAMS; |
729 | 64 | } |
730 | | |
731 | 23.5k | ps_sei->u1_sei_sii_params_present_flag = 1; |
732 | 23.5k | return (OK); |
733 | 23.6k | } |
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 | 10.3k | { |
759 | 10.3k | sei *ps_sei = ps_dec->ps_sei_parse; |
760 | 10.3k | dec_err_status_t *ps_err = ps_dec->ps_dec_err_status; |
761 | 10.3k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
762 | 10.3k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
763 | 10.3k | UWORD32 u4_count; |
764 | 10.3k | WORD32 i4_luma_bitdepth, i4_chroma_bitdepth; |
765 | 10.3k | UWORD32 c, i, j; |
766 | 10.3k | UNUSED(ui4_payload_size); |
767 | | |
768 | 10.3k | if((ps_dec == NULL) || (ps_sei == NULL)) |
769 | 0 | { |
770 | 0 | return NOT_OK; |
771 | 0 | } |
772 | | |
773 | 10.3k | ps_sei->u1_sei_fgc_params_present_flag = 0; |
774 | | |
775 | 10.3k | ps_sei->s_sei_fgc_params.u1_film_grain_characteristics_cancel_flag = |
776 | 10.3k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
777 | | |
778 | 10.3k | if(0 == ps_sei->s_sei_fgc_params.u1_film_grain_characteristics_cancel_flag) |
779 | 9.72k | { |
780 | 9.72k | ps_sei->s_sei_fgc_params.u1_film_grain_model_id = |
781 | 9.72k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 2); |
782 | 9.72k | if(ps_sei->s_sei_fgc_params.u1_film_grain_model_id > 1) |
783 | 1 | { |
784 | 1 | return ERROR_INV_SEI_FGC_PARAMS; |
785 | 1 | } |
786 | 9.72k | ps_sei->s_sei_fgc_params.u1_separate_colour_description_present_flag = |
787 | 9.72k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
788 | | |
789 | 9.72k | if(ps_sei->s_sei_fgc_params.u1_separate_colour_description_present_flag) |
790 | 954 | { |
791 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_luma_minus8 = |
792 | 954 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
793 | | |
794 | 954 | i4_luma_bitdepth = ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_luma_minus8 + 8; |
795 | | |
796 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_chroma_minus8 = |
797 | 954 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
798 | | |
799 | 954 | i4_chroma_bitdepth = ps_sei->s_sei_fgc_params.u1_film_grain_bit_depth_chroma_minus8 + 8; |
800 | | |
801 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_full_range_flag = |
802 | 954 | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
803 | | |
804 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_colour_primaries = |
805 | 954 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
806 | | |
807 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_transfer_characteristics = |
808 | 954 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
809 | | |
810 | 954 | ps_sei->s_sei_fgc_params.u1_film_grain_matrix_coefficients = |
811 | 954 | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
812 | 954 | } |
813 | 8.76k | else |
814 | 8.76k | { |
815 | 8.76k | if(ps_dec->ps_cur_sps == NULL) |
816 | 0 | { |
817 | 0 | return NOT_OK; |
818 | 0 | } |
819 | 8.76k | i4_luma_bitdepth = ps_dec->ps_cur_sps->i4_bit_depth_luma_minus8 + 8; |
820 | 8.76k | i4_chroma_bitdepth = ps_dec->ps_cur_sps->i4_bit_depth_chroma_minus8 + 8; |
821 | 8.76k | } |
822 | 9.72k | ps_sei->s_sei_fgc_params.u1_blending_mode_id = (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 2); |
823 | | |
824 | 9.72k | if(ps_sei->s_sei_fgc_params.u1_blending_mode_id > 1) |
825 | 8 | { |
826 | 8 | return ERROR_INV_SEI_FGC_PARAMS; |
827 | 8 | } |
828 | | |
829 | 9.71k | ps_sei->s_sei_fgc_params.u1_log2_scale_factor = |
830 | 9.71k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 4); |
831 | | |
832 | 38.8k | for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++) |
833 | 29.1k | { |
834 | 29.1k | ps_sei->s_sei_fgc_params.au1_comp_model_present_flag[c] = |
835 | 29.1k | (UWORD8) ih264d_get_bit_h264(ps_bitstrm); |
836 | 29.1k | } |
837 | | |
838 | 38.2k | for(c = 0; c < SEI_FGC_NUM_COLOUR_COMPONENTS; c++) |
839 | 28.7k | { |
840 | 28.7k | if(ps_sei->s_sei_fgc_params.au1_comp_model_present_flag[c]) |
841 | 7.37k | { |
842 | 7.37k | ps_sei->s_sei_fgc_params.au1_num_intensity_intervals_minus1[c] = |
843 | 7.37k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
844 | | |
845 | 7.37k | ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c] = |
846 | 7.37k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 3); |
847 | | |
848 | 7.37k | if(ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c] > |
849 | 7.37k | (SEI_FGC_MAX_NUM_MODEL_VALUES - 1)) |
850 | 1 | { |
851 | 1 | return ERROR_INV_SEI_FGC_PARAMS; |
852 | 1 | } |
853 | | |
854 | 45.4k | for(i = 0; i <= ps_sei->s_sei_fgc_params.au1_num_intensity_intervals_minus1[c]; i++) |
855 | 38.3k | { |
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 | 38.3k | if((ps_bitstrm->u4_ofst + 8 + 8) >= ps_bitstrm->u4_max_ofst) |
860 | 47 | { |
861 | 47 | return ERROR_INV_SEI_FGC_PARAMS; |
862 | 47 | } |
863 | | |
864 | 38.2k | ps_sei->s_sei_fgc_params.au1_intensity_interval_lower_bound[c][i] = |
865 | 38.2k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
866 | | |
867 | 38.2k | ps_sei->s_sei_fgc_params.au1_intensity_interval_upper_bound[c][i] = |
868 | 38.2k | (UWORD8) ih264d_get_bits_h264(ps_bitstrm, 8); |
869 | | |
870 | 225k | for(j = 0; j <= ps_sei->s_sei_fgc_params.au1_num_model_values_minus1[c]; j++) |
871 | 187k | { |
872 | 187k | ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] = |
873 | 187k | (WORD32) ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
874 | 187k | if(0 == ps_sei->s_sei_fgc_params.u1_film_grain_model_id) |
875 | 4.87k | { |
876 | 4.87k | if((1 == j) || (2 == j)) |
877 | 2.03k | { |
878 | 2.03k | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
879 | 2.03k | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > 16)) |
880 | 13 | return ERROR_INV_SEI_FGC_PARAMS; |
881 | 2.03k | } |
882 | 2.83k | else if((3 == j) || (4 == j)) |
883 | 1.27k | { |
884 | 1.27k | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
885 | 1.27k | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > |
886 | 1.23k | ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j - 2])) |
887 | 46 | return ERROR_INV_SEI_FGC_PARAMS; |
888 | 1.27k | } |
889 | 1.56k | else |
890 | 1.56k | { |
891 | 1.56k | WORD32 max_lim = (c == 0) ? (1 << i4_luma_bitdepth) - 1 |
892 | 1.56k | : (1 << i4_chroma_bitdepth) - 1; |
893 | | |
894 | 1.56k | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < 0) || |
895 | 1.56k | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] > |
896 | 1.53k | max_lim)) |
897 | 83 | { |
898 | 83 | return ERROR_INV_SEI_FGC_PARAMS; |
899 | 83 | } |
900 | 1.56k | } |
901 | 4.87k | } |
902 | 182k | else |
903 | 182k | { |
904 | 182k | WORD32 max_lim = (c == 0) ? (1 << (i4_luma_bitdepth - 1)) |
905 | 182k | : (1 << (i4_chroma_bitdepth - 1)); |
906 | | |
907 | 182k | if((ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] < |
908 | 182k | -max_lim) || |
909 | 182k | (ps_sei->s_sei_fgc_params.ai4_comp_model_value[c][i][j] >= max_lim)) |
910 | 70 | { |
911 | 70 | return ERROR_INV_SEI_FGC_PARAMS; |
912 | 70 | } |
913 | 182k | } |
914 | 187k | } |
915 | 38.2k | } |
916 | 7.37k | } |
917 | 28.7k | } |
918 | | |
919 | 9.45k | ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period = |
920 | 9.45k | (UWORD32) ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
921 | | |
922 | 9.45k | if(ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period < 0 || |
923 | 9.45k | ps_sei->s_sei_fgc_params.u4_film_grain_characteristics_repetition_period > 16384) |
924 | 33 | { |
925 | 33 | return ERROR_INV_SEI_FGC_PARAMS; |
926 | 33 | } |
927 | | |
928 | 9.42k | ps_sei->u1_sei_fgc_params_present_flag = 1; |
929 | 9.42k | } |
930 | | |
931 | 10.0k | return (OK); |
932 | 10.3k | } |
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 | 979k | { |
962 | 979k | sei *ps_sei; |
963 | 979k | WORD32 i4_status = 0; |
964 | 979k | ps_sei = (sei *)ps_dec->ps_sei_parse; |
965 | | |
966 | 979k | if(ui4_payload_size == 0) |
967 | 31 | return -1; |
968 | 979k | if(NULL == ps_bitstrm) |
969 | 0 | { |
970 | 0 | return NOT_OK; |
971 | 0 | } |
972 | | |
973 | 979k | switch(ui4_payload_type) |
974 | 979k | { |
975 | 3.03k | case SEI_BUF_PERIOD: |
976 | | |
977 | 3.03k | i4_status = ih264d_parse_buffering_period(&ps_sei->s_buf_period, |
978 | 3.03k | ps_bitstrm, ps_dec); |
979 | 3.03k | break; |
980 | 971 | case SEI_PIC_TIMING: |
981 | 971 | if(NULL == ps_dec->ps_cur_sps) |
982 | 0 | i4_status = ih264d_flush_bits_h264(ps_bitstrm, (ui4_payload_size << 3)); |
983 | 971 | else |
984 | 971 | i4_status = ih264d_parse_pic_timing(ps_bitstrm, ps_dec, |
985 | 971 | ui4_payload_size); |
986 | 971 | break; |
987 | 32.3k | case SEI_RECOVERY_PT: |
988 | 32.3k | i4_status = ih264d_parse_recovery_point(ps_bitstrm, ps_dec, |
989 | 32.3k | ui4_payload_size); |
990 | 32.3k | break; |
991 | 166 | case SEI_MASTERING_DISP_COL_VOL: |
992 | | |
993 | 166 | i4_status = ih264d_parse_mdcv(ps_bitstrm, ps_dec, |
994 | 166 | ui4_payload_size); |
995 | 166 | break; |
996 | 861 | case SEI_CONTENT_LIGHT_LEVEL_DATA: |
997 | | |
998 | 861 | i4_status = ih264d_parse_cll(ps_bitstrm, ps_dec, |
999 | 861 | ui4_payload_size); |
1000 | 861 | break; |
1001 | 1.92k | case SEI_AMBIENT_VIEWING_ENVIRONMENT: |
1002 | | |
1003 | 1.92k | i4_status = ih264d_parse_ave(ps_bitstrm, ps_dec, |
1004 | 1.92k | ui4_payload_size); |
1005 | 1.92k | break; |
1006 | 821k | case SEI_CONTENT_COLOR_VOLUME: |
1007 | | |
1008 | 821k | i4_status = ih264d_parse_ccv(ps_bitstrm, ps_dec, |
1009 | 821k | ui4_payload_size); |
1010 | 821k | break; |
1011 | 23.6k | case SEI_SHUTTER_INTERVAL_INFO: |
1012 | | |
1013 | 23.6k | i4_status = ih264d_parse_sii(ps_bitstrm, ps_dec, ui4_payload_size); |
1014 | 23.6k | break; |
1015 | | |
1016 | 10.3k | case SEI_FILM_GRAIN_CHARACTERISTICS: |
1017 | 10.3k | i4_status = ih264d_parse_fgc(ps_bitstrm, ps_dec, ui4_payload_size); |
1018 | | |
1019 | 10.3k | break; |
1020 | 84.9k | default: |
1021 | 84.9k | i4_status = ih264d_flush_bits_h264(ps_bitstrm, (ui4_payload_size << 3)); |
1022 | 84.9k | break; |
1023 | 979k | } |
1024 | 979k | return (i4_status); |
1025 | 979k | } |
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 | 3.54k | { |
1052 | 3.54k | UWORD32 ui4_payload_type, ui4_payload_size; |
1053 | 3.54k | UWORD32 u4_bits; |
1054 | 3.54k | WORD32 i4_status = 0; |
1055 | | |
1056 | 3.54k | do |
1057 | 980k | { |
1058 | 980k | ui4_payload_type = 0; |
1059 | | |
1060 | 980k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1061 | 85 | { |
1062 | 85 | return ERROR_EOB_GETBITS_T; |
1063 | 85 | } |
1064 | 980k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1065 | 1.24M | while(0xff == u4_bits && CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1066 | 266k | { |
1067 | 266k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1068 | 266k | ui4_payload_type += 255; |
1069 | 266k | } |
1070 | 980k | ui4_payload_type += u4_bits; |
1071 | | |
1072 | 980k | ui4_payload_size = 0; |
1073 | 980k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1074 | 66 | { |
1075 | 66 | return ERROR_EOB_GETBITS_T; |
1076 | 66 | } |
1077 | 980k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1078 | 1.09M | while(0xff == u4_bits && CHECK_BITS_SUFFICIENT(ps_bitstrm, 8)) |
1079 | 118k | { |
1080 | 118k | u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); |
1081 | 118k | ui4_payload_size += 255; |
1082 | 118k | } |
1083 | 980k | ui4_payload_size += u4_bits; |
1084 | | |
1085 | 980k | if(!CHECK_BITS_SUFFICIENT(ps_bitstrm, (ui4_payload_size << 3))) |
1086 | 123 | { |
1087 | 123 | return ERROR_EOB_GETBITS_T; |
1088 | 123 | } |
1089 | 979k | i4_status = ih264d_parse_sei_payload(ps_bitstrm, ui4_payload_type, |
1090 | 979k | ui4_payload_size, ps_dec); |
1091 | 979k | if(i4_status != OK) |
1092 | 693 | return i4_status; |
1093 | | |
1094 | 979k | if(ih264d_check_byte_aligned(ps_bitstrm) == 0) |
1095 | 837k | { |
1096 | 837k | u4_bits = ih264d_get_bit_h264(ps_bitstrm); |
1097 | 837k | if(0 == u4_bits) |
1098 | 820k | { |
1099 | 820k | H264_DEC_DEBUG_PRINT("\nError in parsing SEI message"); |
1100 | 820k | } |
1101 | 5.64M | while(0 == ih264d_check_byte_aligned(ps_bitstrm) |
1102 | 5.64M | && CHECK_BITS_SUFFICIENT(ps_bitstrm, 1)) |
1103 | 4.80M | { |
1104 | 4.80M | u4_bits = ih264d_get_bit_h264(ps_bitstrm); |
1105 | 4.80M | if(u4_bits) |
1106 | 2.42M | { |
1107 | 2.42M | H264_DEC_DEBUG_PRINT("\nError in parsing SEI message"); |
1108 | 2.42M | } |
1109 | 4.80M | } |
1110 | 837k | } |
1111 | 979k | } |
1112 | 3.54k | while(MORE_RBSP_DATA(ps_bitstrm)); |
1113 | 2.57k | return (i4_status); |
1114 | 3.54k | } |
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 | 12.3k | { |
1138 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1139 | 11.5k | { |
1140 | 11.5k | return NOT_OK; |
1141 | 11.5k | } |
1142 | | |
1143 | 878 | ps_sei_export->u1_sei_mdcv_params_present_flag = ps_sei->u1_sei_mdcv_params_present_flag; |
1144 | 878 | ps_sei_decode_op->u1_sei_mdcv_params_present_flag = ps_sei->u1_sei_mdcv_params_present_flag; |
1145 | | |
1146 | 878 | if(0 == ps_sei_export->u1_sei_mdcv_params_present_flag) |
1147 | 878 | { |
1148 | 878 | memset(&ps_sei_export->s_sei_mdcv_params, 0, sizeof(sei_mdcv_params_t)); |
1149 | 878 | } |
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 | 878 | return (OK); |
1157 | 12.3k | } |
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 | 12.3k | { |
1181 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1182 | 11.5k | { |
1183 | 11.5k | return NOT_OK; |
1184 | 11.5k | } |
1185 | | |
1186 | 878 | ps_sei_export->u1_sei_cll_params_present_flag = ps_sei->u1_sei_cll_params_present_flag; |
1187 | 878 | ps_sei_decode_op->u1_sei_cll_params_present_flag = ps_sei->u1_sei_cll_params_present_flag; |
1188 | | |
1189 | 878 | if(0 == ps_sei_export->u1_sei_cll_params_present_flag) |
1190 | 878 | { |
1191 | 878 | memset(&ps_sei_export->s_sei_cll_params, 0, sizeof(sei_cll_params_t)); |
1192 | 878 | } |
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 | 878 | return (OK); |
1199 | 12.3k | } |
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 | 12.3k | { |
1223 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1224 | 11.5k | { |
1225 | 11.5k | return NOT_OK; |
1226 | 11.5k | } |
1227 | | |
1228 | 878 | ps_sei_export->u1_sei_ave_params_present_flag = ps_sei->u1_sei_ave_params_present_flag; |
1229 | 878 | ps_sei_decode_op->u1_sei_ave_params_present_flag = ps_sei->u1_sei_ave_params_present_flag; |
1230 | | |
1231 | 878 | if(0 == ps_sei_export->u1_sei_ave_params_present_flag) |
1232 | 878 | { |
1233 | 878 | memset(&ps_sei_export->s_sei_ave_params, 0, sizeof(sei_ave_params_t)); |
1234 | 878 | } |
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 | 878 | return (OK); |
1242 | 12.3k | } |
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 | 12.3k | { |
1266 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1267 | 11.5k | { |
1268 | 11.5k | return NOT_OK; |
1269 | 11.5k | } |
1270 | | |
1271 | 878 | ps_sei_export->u1_sei_ccv_params_present_flag = ps_sei->u1_sei_ccv_params_present_flag; |
1272 | 878 | ps_sei_decode_op->u1_sei_ccv_params_present_flag = ps_sei->u1_sei_ccv_params_present_flag; |
1273 | | |
1274 | 878 | if(0 == ps_sei_export->u1_sei_ccv_params_present_flag) |
1275 | 878 | { |
1276 | 878 | memset(&ps_sei_export->s_sei_ccv_params, 0, sizeof(sei_ccv_params_t)); |
1277 | 878 | } |
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 | 878 | return (OK); |
1284 | 12.3k | } |
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 | 12.3k | { |
1308 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1309 | 11.5k | { |
1310 | 11.5k | return NOT_OK; |
1311 | 11.5k | } |
1312 | | |
1313 | 878 | ps_sei_export->u1_sei_sii_params_present_flag = ps_sei->u1_sei_sii_params_present_flag; |
1314 | 878 | ps_sei_decode_op->u1_sei_sii_params_present_flag = ps_sei->u1_sei_sii_params_present_flag; |
1315 | | |
1316 | 878 | if(0 == ps_sei_export->u1_sei_sii_params_present_flag) |
1317 | 878 | { |
1318 | 878 | memset(&ps_sei_export->s_sei_sii_params, 0, sizeof(sei_sii_params_t)); |
1319 | 878 | } |
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 | 878 | return (OK); |
1326 | 12.3k | } |
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 | 12.3k | { |
1350 | 12.3k | if((ps_sei_export == NULL) || (ps_sei == NULL)) |
1351 | 11.5k | { |
1352 | 11.5k | return NOT_OK; |
1353 | 11.5k | } |
1354 | | |
1355 | 878 | ps_sei_export->u1_sei_fgc_params_present_flag = ps_sei->u1_sei_fgc_params_present_flag; |
1356 | 878 | ps_sei_decode_op->u1_sei_fgc_params_present_flag = ps_sei->u1_sei_fgc_params_present_flag; |
1357 | | |
1358 | 878 | if(0 == ps_sei_export->u1_sei_fgc_params_present_flag) |
1359 | 878 | { |
1360 | 878 | memset(&ps_sei_export->s_sei_fgc_params, 0, sizeof(sei_fgc_params_t)); |
1361 | 878 | } |
1362 | 0 | else |
1363 | 0 | { |
1364 | 0 | memcpy(&ps_sei_export->s_sei_fgc_params, &ps_sei->s_sei_fgc_params, |
1365 | 0 | sizeof(sei_fgc_params_t)); |
1366 | 0 | } |
1367 | | |
1368 | 878 | return (OK); |
1369 | 12.3k | } |