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