summaryrefslogtreecommitdiffstats
path: root/decoder/ih264d_vui.c
diff options
context:
space:
mode:
authorHamsalekha S <hamsalekha.s@ittiam.com>2015-03-13 21:24:58 +0530
committerHamsalekha S <hamsalekha.s@ittiam.com>2015-04-02 15:59:02 +0530
commit8d3d303c7942ced6a987a52db8977d768dc3605f (patch)
treecc806c96794356996b13ba9970941d0aed74a97e /decoder/ih264d_vui.c
parent3956d913d37327dcb340f836e604b04bd478b158 (diff)
downloadandroid_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-xdecoder/ih264d_vui.c233
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;
+}