xref: /aosp_15_r20/external/libavc/decoder/ih264d_vui.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /*                                                                           */
23*495ae853SAndroid Build Coastguard Worker /*  File Name         : ih264d_vui.c                                                */
24*495ae853SAndroid Build Coastguard Worker /*                                                                           */
25*495ae853SAndroid Build Coastguard Worker /*  Description       : This file contains routines to parse VUI NAL's       */
26*495ae853SAndroid Build Coastguard Worker /*                                                                           */
27*495ae853SAndroid Build Coastguard Worker /*  List of Functions : <List the functions defined in this file>            */
28*495ae853SAndroid Build Coastguard Worker /*                                                                           */
29*495ae853SAndroid Build Coastguard Worker /*  Issues / Problems : None                                                 */
30*495ae853SAndroid Build Coastguard Worker /*                                                                           */
31*495ae853SAndroid Build Coastguard Worker /*  Revision History  :                                                      */
32*495ae853SAndroid Build Coastguard Worker /*                                                                           */
33*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
34*495ae853SAndroid Build Coastguard Worker /*         25 05 2005   NS              Draft                                */
35*495ae853SAndroid Build Coastguard Worker /*                                                                           */
36*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
37*495ae853SAndroid Build Coastguard Worker 
38*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
39*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
40*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264d_vui.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
46*495ae853SAndroid Build Coastguard Worker 
47*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
48*495ae853SAndroid Build Coastguard Worker /*                                                                           */
49*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_parse_hrd_parametres                                     */
50*495ae853SAndroid Build Coastguard Worker /*                                                                           */
51*495ae853SAndroid Build Coastguard Worker /*  Description   : This function parses hrd_t parametres                      */
52*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_hrd          pointer to HRD params                    */
53*495ae853SAndroid Build Coastguard Worker /*                  ps_bitstrm   Bitstream                                */
54*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
55*495ae853SAndroid Build Coastguard Worker /*  Processing    : Parses HRD params                                        */
56*495ae853SAndroid Build Coastguard Worker /*  Outputs       : None                                                     */
57*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
58*495ae853SAndroid Build Coastguard Worker /*                                                                           */
59*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
60*495ae853SAndroid Build Coastguard Worker /*                                                                           */
61*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
62*495ae853SAndroid Build Coastguard Worker /*                                                                           */
63*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
64*495ae853SAndroid Build Coastguard Worker /*         06 05 2002   NS              Draft                                */
65*495ae853SAndroid Build Coastguard Worker /*                                                                           */
66*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
67*495ae853SAndroid Build Coastguard Worker 
ih264d_parse_hrd_parametres(hrd_t * ps_hrd,dec_bit_stream_t * ps_bitstrm)68*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_hrd_parametres(hrd_t *ps_hrd,
69*495ae853SAndroid Build Coastguard Worker                                    dec_bit_stream_t *ps_bitstrm)
70*495ae853SAndroid Build Coastguard Worker {
71*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_index;
72*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
73*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
74*495ae853SAndroid Build Coastguard Worker 
75*495ae853SAndroid Build Coastguard Worker     ps_hrd->u4_cpb_cnt = 1
76*495ae853SAndroid Build Coastguard Worker                     + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
77*495ae853SAndroid Build Coastguard Worker     if(ps_hrd->u4_cpb_cnt > 31)
78*495ae853SAndroid Build Coastguard Worker         return ERROR_INV_SPS_PPS_T;
79*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_bit_rate_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
80*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_cpb_size_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
81*495ae853SAndroid Build Coastguard Worker 
82*495ae853SAndroid Build Coastguard Worker     for(u1_index = 0; u1_index < (UWORD8)ps_hrd->u4_cpb_cnt; u1_index++)
83*495ae853SAndroid Build Coastguard Worker     {
84*495ae853SAndroid Build Coastguard Worker         ps_hrd->u4_bit_rate[u1_index] = 1
85*495ae853SAndroid Build Coastguard Worker                         + ih264d_uev(pu4_bitstrm_ofst,
86*495ae853SAndroid Build Coastguard Worker                                      pu4_bitstrm_buf);
87*495ae853SAndroid Build Coastguard Worker         ps_hrd->u4_cpb_size[u1_index] = 1
88*495ae853SAndroid Build Coastguard Worker                         + ih264d_uev(pu4_bitstrm_ofst,
89*495ae853SAndroid Build Coastguard Worker                                      pu4_bitstrm_buf);
90*495ae853SAndroid Build Coastguard Worker         ps_hrd->u1_cbr_flag[u1_index] = ih264d_get_bits_h264(ps_bitstrm, 1);
91*495ae853SAndroid Build Coastguard Worker     }
92*495ae853SAndroid Build Coastguard Worker 
93*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_initial_cpb_removal_delay = 1
94*495ae853SAndroid Build Coastguard Worker                     + ih264d_get_bits_h264(ps_bitstrm, 5);
95*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_cpb_removal_delay_length = 1
96*495ae853SAndroid Build Coastguard Worker                     + ih264d_get_bits_h264(ps_bitstrm, 5);
97*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_dpb_output_delay_length = 1
98*495ae853SAndroid Build Coastguard Worker                     + ih264d_get_bits_h264(ps_bitstrm, 5);
99*495ae853SAndroid Build Coastguard Worker     ps_hrd->u1_time_offset_length = ih264d_get_bits_h264(ps_bitstrm, 5);
100*495ae853SAndroid Build Coastguard Worker 
101*495ae853SAndroid Build Coastguard Worker     return OK;
102*495ae853SAndroid Build Coastguard Worker }
103*495ae853SAndroid Build Coastguard Worker 
104*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
105*495ae853SAndroid Build Coastguard Worker /*                                                                           */
106*495ae853SAndroid Build Coastguard Worker /*  Function Name : ih264d_parse_vui_parametres                                     */
107*495ae853SAndroid Build Coastguard Worker /*                                                                           */
108*495ae853SAndroid Build Coastguard Worker /*  Description   : This function parses VUI NALs.                           */
109*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_vu4          pointer to VUI params                    */
110*495ae853SAndroid Build Coastguard Worker /*                  ps_bitstrm   Bitstream                                */
111*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
112*495ae853SAndroid Build Coastguard Worker /*  Processing    : Parses VUI NAL's units and stores the info               */
113*495ae853SAndroid Build Coastguard Worker /*  Outputs       : None                                                     */
114*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
115*495ae853SAndroid Build Coastguard Worker /*                                                                           */
116*495ae853SAndroid Build Coastguard Worker /*  Issues        : None                                                     */
117*495ae853SAndroid Build Coastguard Worker /*                                                                           */
118*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
119*495ae853SAndroid Build Coastguard Worker /*                                                                           */
120*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
121*495ae853SAndroid Build Coastguard Worker /*         06 05 2002   NS              Draft                                */
122*495ae853SAndroid Build Coastguard Worker /*                                                                           */
123*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
124*495ae853SAndroid Build Coastguard Worker 
ih264d_parse_vui_parametres(vui_t * ps_vu4,dec_bit_stream_t * ps_bitstrm)125*495ae853SAndroid Build Coastguard Worker WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4,
126*495ae853SAndroid Build Coastguard Worker                                    dec_bit_stream_t *ps_bitstrm)
127*495ae853SAndroid Build Coastguard Worker {
128*495ae853SAndroid Build Coastguard Worker     UWORD8 u4_bits;
129*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
130*495ae853SAndroid Build Coastguard Worker     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
131*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
134*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
135*495ae853SAndroid Build Coastguard Worker     {
136*495ae853SAndroid Build Coastguard Worker         u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8);
137*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_aspect_ratio_idc = (UWORD8)u4_bits;
138*495ae853SAndroid Build Coastguard Worker         if(VUI_EXTENDED_SAR == u4_bits)
139*495ae853SAndroid Build Coastguard Worker         {
140*495ae853SAndroid Build Coastguard Worker             ps_vu4->u2_sar_width = ih264d_get_bits_h264(ps_bitstrm, 16);
141*495ae853SAndroid Build Coastguard Worker             ps_vu4->u2_sar_height = ih264d_get_bits_h264(ps_bitstrm, 16);
142*495ae853SAndroid Build Coastguard Worker         }
143*495ae853SAndroid Build Coastguard Worker     }
144*495ae853SAndroid Build Coastguard Worker 
145*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
146*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
147*495ae853SAndroid Build Coastguard Worker     {
148*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_overscan_appropriate_flag = ih264d_get_bits_h264(
149*495ae853SAndroid Build Coastguard Worker                         ps_bitstrm, 1);
150*495ae853SAndroid Build Coastguard Worker     }
151*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
152*495ae853SAndroid Build Coastguard Worker     /* Initialize to unspecified (5 for video_format and
153*495ae853SAndroid Build Coastguard Worker        2 for colour_primaries, tfr_chars, matrix_coeffs  */
154*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_video_format = 5;
155*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_video_full_range_flag = 0;
156*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_colour_primaries = 2;
157*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_tfr_chars = 2;
158*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_matrix_coeffs = 2;
159*495ae853SAndroid Build Coastguard Worker 
160*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
161*495ae853SAndroid Build Coastguard Worker     {
162*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_video_format = ih264d_get_bits_h264(ps_bitstrm, 3);
163*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_video_full_range_flag = ih264d_get_bits_h264(ps_bitstrm,
164*495ae853SAndroid Build Coastguard Worker                                                                 1);
165*495ae853SAndroid Build Coastguard Worker         u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
166*495ae853SAndroid Build Coastguard Worker         if(u4_bits)
167*495ae853SAndroid Build Coastguard Worker         {
168*495ae853SAndroid Build Coastguard Worker             ps_vu4->u1_colour_primaries = ih264d_get_bits_h264(ps_bitstrm,
169*495ae853SAndroid Build Coastguard Worker                                                                8);
170*495ae853SAndroid Build Coastguard Worker             ps_vu4->u1_tfr_chars = ih264d_get_bits_h264(ps_bitstrm, 8);
171*495ae853SAndroid Build Coastguard Worker             ps_vu4->u1_matrix_coeffs = ih264d_get_bits_h264(ps_bitstrm, 8);
172*495ae853SAndroid Build Coastguard Worker         }
173*495ae853SAndroid Build Coastguard Worker     }
174*495ae853SAndroid Build Coastguard Worker 
175*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
176*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
177*495ae853SAndroid Build Coastguard Worker     {
178*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_cr_top_field = ih264d_uev(pu4_bitstrm_ofst,
179*495ae853SAndroid Build Coastguard Worker                                              pu4_bitstrm_buf);
180*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_cr_bottom_field = ih264d_uev(pu4_bitstrm_ofst,
181*495ae853SAndroid Build Coastguard Worker                                                 pu4_bitstrm_buf);
182*495ae853SAndroid Build Coastguard Worker     }
183*495ae853SAndroid Build Coastguard Worker 
184*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
185*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
186*495ae853SAndroid Build Coastguard Worker     {
187*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_num_units_in_tick = ih264d_get_bits_h264(ps_bitstrm, 32);
188*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_time_scale = ih264d_get_bits_h264(ps_bitstrm, 32);
189*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_fixed_frame_rate_flag = ih264d_get_bits_h264(ps_bitstrm,
190*495ae853SAndroid Build Coastguard Worker                                                                 1);
191*495ae853SAndroid Build Coastguard Worker     }
192*495ae853SAndroid Build Coastguard Worker 
193*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
194*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_nal_hrd_params_present = u4_bits;
195*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
196*495ae853SAndroid Build Coastguard Worker     {
197*495ae853SAndroid Build Coastguard Worker         ret = ih264d_parse_hrd_parametres(&ps_vu4->s_nal_hrd, ps_bitstrm);
198*495ae853SAndroid Build Coastguard Worker         if(ret != OK)
199*495ae853SAndroid Build Coastguard Worker             return ret;
200*495ae853SAndroid Build Coastguard Worker     }
201*495ae853SAndroid Build Coastguard Worker     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
202*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_vcl_hrd_params_present = u4_bits;
203*495ae853SAndroid Build Coastguard Worker     if(u4_bits)
204*495ae853SAndroid Build Coastguard Worker     {
205*495ae853SAndroid Build Coastguard Worker         ret = ih264d_parse_hrd_parametres(&ps_vu4->s_vcl_hrd, ps_bitstrm);
206*495ae853SAndroid Build Coastguard Worker         if(ret != OK)
207*495ae853SAndroid Build Coastguard Worker             return ret;
208*495ae853SAndroid Build Coastguard Worker     }
209*495ae853SAndroid Build Coastguard Worker 
210*495ae853SAndroid Build Coastguard Worker     if(ps_vu4->u1_nal_hrd_params_present || u4_bits)
211*495ae853SAndroid Build Coastguard Worker     {
212*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_low_delay_hrd_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
213*495ae853SAndroid Build Coastguard Worker     }
214*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_pic_struct_present_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
215*495ae853SAndroid Build Coastguard Worker 
216*495ae853SAndroid Build Coastguard Worker     ps_vu4->u1_bitstream_restriction_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
217*495ae853SAndroid Build Coastguard Worker 
218*495ae853SAndroid Build Coastguard Worker     if(ps_vu4->u1_bitstream_restriction_flag)
219*495ae853SAndroid Build Coastguard Worker     {
220*495ae853SAndroid Build Coastguard Worker         ps_vu4->u1_mv_over_pic_boundaries_flag = ih264d_get_bits_h264(
221*495ae853SAndroid Build Coastguard Worker                         ps_bitstrm, 1);
222*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_max_bytes_per_pic_denom = ih264d_uev(pu4_bitstrm_ofst,
223*495ae853SAndroid Build Coastguard Worker                                                         pu4_bitstrm_buf);
224*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_max_bits_per_mb_denom = ih264d_uev(pu4_bitstrm_ofst,
225*495ae853SAndroid Build Coastguard Worker                                                       pu4_bitstrm_buf);
226*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_log2_max_mv_length_horz = ih264d_uev(pu4_bitstrm_ofst,
227*495ae853SAndroid Build Coastguard Worker                                                         pu4_bitstrm_buf);
228*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_log2_max_mv_length_vert = ih264d_uev(pu4_bitstrm_ofst,
229*495ae853SAndroid Build Coastguard Worker                                                         pu4_bitstrm_buf);
230*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_num_reorder_frames = ih264d_uev(pu4_bitstrm_ofst,
231*495ae853SAndroid Build Coastguard Worker                                                    pu4_bitstrm_buf);
232*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_max_dec_frame_buffering = ih264d_uev(pu4_bitstrm_ofst,
233*495ae853SAndroid Build Coastguard Worker                                                         pu4_bitstrm_buf);
234*495ae853SAndroid Build Coastguard Worker         if((ps_vu4->u4_max_dec_frame_buffering > (H264_MAX_REF_PICS * 2)) ||
235*495ae853SAndroid Build Coastguard Worker            (ps_vu4->u4_num_reorder_frames > ps_vu4->u4_max_dec_frame_buffering))
236*495ae853SAndroid Build Coastguard Worker         {
237*495ae853SAndroid Build Coastguard Worker             return ERROR_INV_SPS_PPS_T;
238*495ae853SAndroid Build Coastguard Worker         }
239*495ae853SAndroid Build Coastguard Worker     }
240*495ae853SAndroid Build Coastguard Worker     else
241*495ae853SAndroid Build Coastguard Worker     {
242*495ae853SAndroid Build Coastguard Worker         /* Setting this to a large value if not present */
243*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_num_reorder_frames = 64;
244*495ae853SAndroid Build Coastguard Worker         ps_vu4->u4_max_dec_frame_buffering = 64;
245*495ae853SAndroid Build Coastguard Worker     }
246*495ae853SAndroid Build Coastguard Worker 
247*495ae853SAndroid Build Coastguard Worker     return OK;
248*495ae853SAndroid Build Coastguard Worker }
249