Coverage Report

Created: 2026-11-12 06:31

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