• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_vui.c                                                */
24 /*                                                                           */
25 /*  Description       : This file contains routines to parse VUI 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 "ih264_typedefs.h"
39 #include "ih264_macros.h"
40 #include "ih264_platform_macros.h"
41 #include "ih264d_vui.h"
42 #include "ih264d_bitstrm.h"
43 #include "ih264d_parse_cavlc.h"
44 #include "ih264d_structs.h"
45 #include "ih264d_error_handler.h"
46 
47 /*****************************************************************************/
48 /*                                                                           */
49 /*  Function Name : ih264d_parse_hrd_parametres                                     */
50 /*                                                                           */
51 /*  Description   : This function parses hrd_t parametres                      */
52 /*  Inputs        : ps_hrd          pointer to HRD params                    */
53 /*                  ps_bitstrm   Bitstream                                */
54 /*  Globals       : None                                                     */
55 /*  Processing    : Parses HRD params                                        */
56 /*  Outputs       : None                                                     */
57 /*  Returns       : None                                                     */
58 /*                                                                           */
59 /*  Issues        : None                                                     */
60 /*                                                                           */
61 /*  Revision History:                                                        */
62 /*                                                                           */
63 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
64 /*         06 05 2002   NS              Draft                                */
65 /*                                                                           */
66 /*****************************************************************************/
67 
ih264d_parse_hrd_parametres(hrd_t * ps_hrd,dec_bit_stream_t * ps_bitstrm)68 WORD32 ih264d_parse_hrd_parametres(hrd_t *ps_hrd,
69                                    dec_bit_stream_t *ps_bitstrm)
70 {
71     UWORD8 u1_index;
72     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
73     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
74 
75     ps_hrd->u4_cpb_cnt = 1
76                     + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
77     if(ps_hrd->u4_cpb_cnt > 31)
78         return ERROR_INV_SPS_PPS_T;
79     ps_hrd->u1_bit_rate_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
80     ps_hrd->u1_cpb_size_scale = ih264d_get_bits_h264(ps_bitstrm, 4);
81 
82     for(u1_index = 0; u1_index < (UWORD8)ps_hrd->u4_cpb_cnt; u1_index++)
83     {
84         ps_hrd->u4_bit_rate[u1_index] = 1
85                         + ih264d_uev(pu4_bitstrm_ofst,
86                                      pu4_bitstrm_buf);
87         ps_hrd->u4_cpb_size[u1_index] = 1
88                         + ih264d_uev(pu4_bitstrm_ofst,
89                                      pu4_bitstrm_buf);
90         ps_hrd->u1_cbr_flag[u1_index] = ih264d_get_bits_h264(ps_bitstrm, 1);
91     }
92 
93     ps_hrd->u1_initial_cpb_removal_delay = 1
94                     + ih264d_get_bits_h264(ps_bitstrm, 5);
95     ps_hrd->u1_cpb_removal_delay_length = 1
96                     + ih264d_get_bits_h264(ps_bitstrm, 5);
97     ps_hrd->u1_dpb_output_delay_length = 1
98                     + ih264d_get_bits_h264(ps_bitstrm, 5);
99     ps_hrd->u1_time_offset_length = ih264d_get_bits_h264(ps_bitstrm, 5);
100 
101     return OK;
102 }
103 
104 /*****************************************************************************/
105 /*                                                                           */
106 /*  Function Name : ih264d_parse_vui_parametres                                     */
107 /*                                                                           */
108 /*  Description   : This function parses VUI NALs.                           */
109 /*  Inputs        : ps_vu4          pointer to VUI params                    */
110 /*                  ps_bitstrm   Bitstream                                */
111 /*  Globals       : None                                                     */
112 /*  Processing    : Parses VUI NAL's units and stores the info               */
113 /*  Outputs       : None                                                     */
114 /*  Returns       : None                                                     */
115 /*                                                                           */
116 /*  Issues        : None                                                     */
117 /*                                                                           */
118 /*  Revision History:                                                        */
119 /*                                                                           */
120 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
121 /*         06 05 2002   NS              Draft                                */
122 /*                                                                           */
123 /*****************************************************************************/
124 
ih264d_parse_vui_parametres(vui_t * ps_vu4,dec_bit_stream_t * ps_bitstrm)125 WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4,
126                                    dec_bit_stream_t *ps_bitstrm)
127 {
128     UWORD8 u4_bits;
129     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
130     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
131     WORD32 ret;
132 
133     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
134     if(u4_bits)
135     {
136         u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8);
137         ps_vu4->u1_aspect_ratio_idc = (UWORD8)u4_bits;
138         if(VUI_EXTENDED_SAR == u4_bits)
139         {
140             ps_vu4->u2_sar_width = ih264d_get_bits_h264(ps_bitstrm, 16);
141             ps_vu4->u2_sar_height = ih264d_get_bits_h264(ps_bitstrm, 16);
142         }
143     }
144 
145     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
146     if(u4_bits)
147     {
148         ps_vu4->u1_overscan_appropriate_flag = ih264d_get_bits_h264(
149                         ps_bitstrm, 1);
150     }
151     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
152     /* Initialize to unspecified (5 for video_format and
153        2 for colour_primaries, tfr_chars, matrix_coeffs  */
154     ps_vu4->u1_video_format = 5;
155     ps_vu4->u1_video_full_range_flag = 0;
156     ps_vu4->u1_colour_primaries = 2;
157     ps_vu4->u1_tfr_chars = 2;
158     ps_vu4->u1_matrix_coeffs = 2;
159 
160     if(u4_bits)
161     {
162         ps_vu4->u1_video_format = ih264d_get_bits_h264(ps_bitstrm, 3);
163         ps_vu4->u1_video_full_range_flag = ih264d_get_bits_h264(ps_bitstrm,
164                                                                 1);
165         u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
166         if(u4_bits)
167         {
168             ps_vu4->u1_colour_primaries = ih264d_get_bits_h264(ps_bitstrm,
169                                                                8);
170             ps_vu4->u1_tfr_chars = ih264d_get_bits_h264(ps_bitstrm, 8);
171             ps_vu4->u1_matrix_coeffs = ih264d_get_bits_h264(ps_bitstrm, 8);
172         }
173     }
174 
175     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
176     if(u4_bits)
177     {
178         ps_vu4->u1_cr_top_field = ih264d_uev(pu4_bitstrm_ofst,
179                                              pu4_bitstrm_buf);
180         ps_vu4->u1_cr_bottom_field = ih264d_uev(pu4_bitstrm_ofst,
181                                                 pu4_bitstrm_buf);
182     }
183 
184     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
185     if(u4_bits)
186     {
187         ps_vu4->u4_num_units_in_tick = ih264d_get_bits_h264(ps_bitstrm, 32);
188         ps_vu4->u4_time_scale = ih264d_get_bits_h264(ps_bitstrm, 32);
189         ps_vu4->u1_fixed_frame_rate_flag = ih264d_get_bits_h264(ps_bitstrm,
190                                                                 1);
191     }
192 
193     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
194     ps_vu4->u1_nal_hrd_params_present = u4_bits;
195     if(u4_bits)
196     {
197         ret = ih264d_parse_hrd_parametres(&ps_vu4->s_nal_hrd, ps_bitstrm);
198         if(ret != OK)
199             return ret;
200     }
201     u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
202     ps_vu4->u1_vcl_hrd_params_present = u4_bits;
203     if(u4_bits)
204     {
205         ret = ih264d_parse_hrd_parametres(&ps_vu4->s_vcl_hrd, ps_bitstrm);
206         if(ret != OK)
207             return ret;
208     }
209 
210     if(ps_vu4->u1_nal_hrd_params_present || u4_bits)
211     {
212         ps_vu4->u1_low_delay_hrd_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
213     }
214     ps_vu4->u1_pic_struct_present_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
215 
216     ps_vu4->u1_bitstream_restriction_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
217 
218     if(ps_vu4->u1_bitstream_restriction_flag)
219     {
220         ps_vu4->u1_mv_over_pic_boundaries_flag = ih264d_get_bits_h264(
221                         ps_bitstrm, 1);
222         ps_vu4->u4_max_bytes_per_pic_denom = ih264d_uev(pu4_bitstrm_ofst,
223                                                         pu4_bitstrm_buf);
224         ps_vu4->u4_max_bits_per_mb_denom = ih264d_uev(pu4_bitstrm_ofst,
225                                                       pu4_bitstrm_buf);
226         ps_vu4->u4_log2_max_mv_length_horz = ih264d_uev(pu4_bitstrm_ofst,
227                                                         pu4_bitstrm_buf);
228         ps_vu4->u4_log2_max_mv_length_vert = ih264d_uev(pu4_bitstrm_ofst,
229                                                         pu4_bitstrm_buf);
230         ps_vu4->u4_num_reorder_frames = ih264d_uev(pu4_bitstrm_ofst,
231                                                    pu4_bitstrm_buf);
232         ps_vu4->u4_max_dec_frame_buffering = ih264d_uev(pu4_bitstrm_ofst,
233                                                         pu4_bitstrm_buf);
234         if((ps_vu4->u4_max_dec_frame_buffering > (H264_MAX_REF_PICS * 2)) ||
235            (ps_vu4->u4_num_reorder_frames > ps_vu4->u4_max_dec_frame_buffering))
236         {
237             return ERROR_INV_SPS_PPS_T;
238         }
239     }
240     else
241     {
242         /* Setting this to a large value if not present */
243         ps_vu4->u4_num_reorder_frames = 64;
244         ps_vu4->u4_max_dec_frame_buffering = 64;
245     }
246 
247     return OK;
248 }
249