diff options
author | Hamsalekha S <hamsalekha.s@ittiam.com> | 2015-03-13 21:24:58 +0530 |
---|---|---|
committer | Hamsalekha S <hamsalekha.s@ittiam.com> | 2015-04-02 15:59:02 +0530 |
commit | 8d3d303c7942ced6a987a52db8977d768dc3605f (patch) | |
tree | cc806c96794356996b13ba9970941d0aed74a97e /decoder/ih264d_vui.c | |
parent | 3956d913d37327dcb340f836e604b04bd478b158 (diff) | |
download | android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.gz android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.tar.bz2 android_external_libavc-8d3d303c7942ced6a987a52db8977d768dc3605f.zip |
Initial version
Change-Id: I7efe9a589cd24edf86e8d086b40c27cbbf8b4017
Diffstat (limited to 'decoder/ih264d_vui.c')
-rwxr-xr-x | decoder/ih264d_vui.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/decoder/ih264d_vui.c b/decoder/ih264d_vui.c new file mode 100755 index 0000000..87276bd --- /dev/null +++ b/decoder/ih264d_vui.c @@ -0,0 +1,233 @@ +/****************************************************************************** + * + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore +*/ + +/*****************************************************************************/ +/* */ +/* File Name : ih264d_vui.c */ +/* */ +/* Description : This file contains routines to parse VUI NAL's */ +/* */ +/* List of Functions : <List the functions defined in this file> */ +/* */ +/* Issues / Problems : None */ +/* */ +/* Revision History : */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 25 05 2005 NS Draft */ +/* */ +/*****************************************************************************/ + +#include "ih264_typedefs.h" +#include "ih264_macros.h" +#include "ih264_platform_macros.h" +#include "ih264d_vui.h" +#include "ih264d_bitstrm.h" +#include "ih264d_parse_cavlc.h" +#include "ih264d_structs.h" +#include "ih264d_error_handler.h" + +/*****************************************************************************/ +/* */ +/* Function Name : ih264d_parse_hrd_parametres */ +/* */ +/* Description : This function parses hrd_t parametres */ +/* Inputs : ps_hrd pointer to HRD params */ +/* ps_bitstrm Bitstream */ +/* Globals : None */ +/* Processing : Parses HRD params */ +/* Outputs : None */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 06 05 2002 NS Draft */ +/* */ +/*****************************************************************************/ + +WORD32 ih264d_parse_hrd_parametres(hrd_t *ps_hrd, + dec_bit_stream_t *ps_bitstrm) +{ + UWORD8 u1_index; + UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; + UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; + + ps_hrd->u4_cpb_cnt = 1 + + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + if(ps_hrd->u4_cpb_cnt > 31) + return ERROR_INV_SPS_PPS_T; + ps_hrd->u1_bit_rate_scale = ih264d_get_bits_h264(ps_bitstrm, 4); + ps_hrd->u1_cpb_size_scale = ih264d_get_bits_h264(ps_bitstrm, 4); + + for(u1_index = 0; u1_index < (UWORD8)ps_hrd->u4_cpb_cnt; u1_index++) + { + ps_hrd->u4_bit_rate[u1_index] = 1 + + ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_hrd->u4_cpb_size[u1_index] = 1 + + ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_hrd->u1_cbr_flag[u1_index] = ih264d_get_bits_h264(ps_bitstrm, 1); + } + + ps_hrd->u1_initial_cpb_removal_delay = 1 + + ih264d_get_bits_h264(ps_bitstrm, 5); + ps_hrd->u1_cpb_removal_delay_length = 1 + + ih264d_get_bits_h264(ps_bitstrm, 5); + ps_hrd->u1_dpb_output_delay_length = 1 + + ih264d_get_bits_h264(ps_bitstrm, 5); + ps_hrd->u1_time_offset_length = ih264d_get_bits_h264(ps_bitstrm, 5); + + return OK; +} + +/*****************************************************************************/ +/* */ +/* Function Name : ih264d_parse_vui_parametres */ +/* */ +/* Description : This function parses VUI NALs. */ +/* Inputs : ps_vu4 pointer to VUI params */ +/* ps_bitstrm Bitstream */ +/* Globals : None */ +/* Processing : Parses VUI NAL's units and stores the info */ +/* Outputs : None */ +/* Returns : None */ +/* */ +/* Issues : None */ +/* */ +/* Revision History: */ +/* */ +/* DD MM YYYY Author(s) Changes (Describe the changes made) */ +/* 06 05 2002 NS Draft */ +/* */ +/*****************************************************************************/ + +WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4, + dec_bit_stream_t *ps_bitstrm) +{ + UWORD8 u4_bits; + UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; + UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; + WORD32 ret; + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 8); + ps_vu4->u1_aspect_ratio_idc = (UWORD8)u4_bits; + if(VUI_EXTENDED_SAR == u4_bits) + { + ps_vu4->u2_sar_width = ih264d_get_bits_h264(ps_bitstrm, 16); + ps_vu4->u2_sar_height = ih264d_get_bits_h264(ps_bitstrm, 16); + } + } + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u1_overscan_appropriate_flag = ih264d_get_bits_h264( + ps_bitstrm, 1); + } + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u1_video_format = ih264d_get_bits_h264(ps_bitstrm, 3); + ps_vu4->u1_video_full_range_flag = ih264d_get_bits_h264(ps_bitstrm, + 1); + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u1_colour_primaries = ih264d_get_bits_h264(ps_bitstrm, + 8); + ps_vu4->u1_tfr_chars = ih264d_get_bits_h264(ps_bitstrm, 8); + ps_vu4->u1_matrix_coeffs = ih264d_get_bits_h264(ps_bitstrm, 8); + } + } + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u1_cr_top_field = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u1_cr_bottom_field = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + } + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u4_num_units_in_tick = ih264d_get_bits_h264(ps_bitstrm, 32); + ps_vu4->u4_time_scale = ih264d_get_bits_h264(ps_bitstrm, 32); + ps_vu4->u1_fixed_frame_rate_flag = ih264d_get_bits_h264(ps_bitstrm, + 1); + } + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + ps_vu4->u1_nal_hrd_params_present = u4_bits; + if(u4_bits) + { + ret = ih264d_parse_hrd_parametres(&ps_vu4->s_nal_hrd, ps_bitstrm); + if(ret != OK) + return ret; + } + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + ps_vu4->u1_vcl_hrd_params_present = u4_bits; + if(u4_bits) + { + ret = ih264d_parse_hrd_parametres(&ps_vu4->s_vcl_hrd, ps_bitstrm); + if(ret != OK) + return ret; + } + + if(ps_vu4->u1_nal_hrd_params_present || u4_bits) + { + ps_vu4->u1_low_delay_hrd_flag = ih264d_get_bits_h264(ps_bitstrm, 1); + } + ps_vu4->u1_pic_struct_present_flag = ih264d_get_bits_h264(ps_bitstrm, 1); + + u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1); + if(u4_bits) + { + ps_vu4->u1_mv_over_pic_boundaries_flag = ih264d_get_bits_h264( + ps_bitstrm, 1); + ps_vu4->u4_max_bytes_per_pic_denom = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u4_max_bits_per_mb_denom = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u4_log2_max_mv_length_horz = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u4_log2_max_mv_length_vert = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u4_num_reorder_frames = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + ps_vu4->u4_max_dec_frame_buffering = ih264d_uev(pu4_bitstrm_ofst, + pu4_bitstrm_buf); + } + else + { + /* Setting this to a large value if not present */ + ps_vu4->u4_num_reorder_frames = 64; + } + + return OK; +} |