/****************************************************************************** * * Copyright (C) 2022 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 * isvcd_parse_cavlc.c * * @brief * This file contains UVLC related functions. * * @author * Kishore * * @par List of Functions: * - isvcd_parse_bmb_ref_index_cavlc_range1() * - isvcd_parse_bmb_ref_index_cavlc() * - isvcd_parse_pmb_ref_index_cavlc() * - isvcd_parse_pmb_ref_index_cavlc_range1() * * @remarks * None * ******************************************************************************* */ #include #include #include "ih264d_bitstrm.h" #include "isvcd_parse_cavlc.h" #include "ih264d_error_handler.h" #include "ih264d_defs.h" #include "ih264d_debug.h" #include "ih264d_cabac.h" #include "isvcd_structs.h" #include "ih264d_tables.h" #include "ih264d_tables.h" #include "ih264d_mb_utils.h" #include "ih264d_parse_cavlc.h" /*****************************************************************************/ /* */ /* Function Name : isvcd_parse_bmb_ref_index_cavlc_range1 */ /* */ /* Description : This function does the Cavlc TEV range > 1 parsing of */ /* reference index for a B MB. */ /* Range > 1 when num_ref_idx_active_minus1 > 0 */ /* */ /* Inputs : */ /* Globals : */ /* Processing : */ /* Outputs : */ /* Returns : */ /* */ /* Issues : */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 19 09 2008 Jay Draft */ /* */ /*****************************************************************************/ void isvcd_parse_bmb_ref_index_cavlc_range1( UWORD32 u4_num_part, /* Number of partitions in MB */ dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ WORD8 *pi1_ref_idx, /* pointer to reference index array */ UWORD32 u4_num_ref_idx_active_minus1, /* Not used for range 1 */ UWORD8 *pu1_motion_prediction_flag /*motion_pred_flag */ ) { UWORD32 u4_i; UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; UNUSED(u4_num_ref_idx_active_minus1); for(u4_i = 0; u4_i < u4_num_part; u4_i++) { if(pi1_ref_idx[u4_i] > -1 && (((*pu1_motion_prediction_flag >> u4_i) & 0x01) == 0)) { UWORD32 u4_ref_idx; u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf); /* Storing Reference Idx Information */ pi1_ref_idx[u4_i] = (WORD8) u4_ref_idx; } } } /*****************************************************************************/ /* */ /* Function Name : isvcd_parse_bmb_ref_index_cavlc */ /* */ /* Description : This function does the Cavlc TEV range > 1 parsing of */ /* reference index for a B MB. */ /* Range > 1 when num_ref_idx_active_minus1 > 0 */ /* */ /* Inputs : */ /* Globals : */ /* Processing : */ /* Outputs : */ /* Returns : */ /* */ /* Issues : */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 19 09 2008 Jay Draft */ /* */ /*****************************************************************************/ WORD32 isvcd_parse_bmb_ref_index_cavlc( UWORD32 u4_num_part, /* Number of partitions in MB */ dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ WORD8 *pi1_ref_idx, /* pointer to reference index array */ UWORD32 u4_num_ref_idx_active_minus1, /* Number of active references - 1 */ UWORD8 *pu1_motion_prediction_flag /*motion_pred_flag */ ) { UWORD32 u4_i; UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; for(u4_i = 0; u4_i < u4_num_part; u4_i++) { if(pi1_ref_idx[u4_i] > -1 && (((*pu1_motion_prediction_flag >> u4_i) & 0x01) == 0)) { UWORD32 u4_ref_idx; // inlining ih264d_uev UWORD32 u4_bitstream_offset = *pu4_bitstream_off; UWORD32 u4_word, u4_ldz; /***************************************************************/ /* Find leading zeros in next 32 bits */ /***************************************************************/ NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); u4_ldz = CLZ(u4_word); /* Flush the ps_bitstrm */ u4_bitstream_offset += (u4_ldz + 1); /* Read the suffix from the ps_bitstrm */ u4_word = 0; if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); *pu4_bitstream_off = u4_bitstream_offset; u4_ref_idx = ((1 << u4_ldz) + u4_word - 1); // inlining ih264d_uev if(u4_ref_idx > u4_num_ref_idx_active_minus1) return ERROR_REF_IDX; /* Storing Reference Idx Information */ pi1_ref_idx[u4_i] = (WORD8) u4_ref_idx; } } return OK; } /*****************************************************************************/ /* */ /* Function Name : isvcd_parse_pmb_ref_index_cavlc */ /* */ /* Description : This function does the Cavlc TEV range > 1 parsing of */ /* reference index for a P MB. */ /* Range > 1 when num_ref_idx_active_minus1 > 0 */ /* */ /* Inputs : */ /* Globals : */ /* Processing : */ /* Outputs : */ /* Returns : */ /* */ /* Issues : */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 19 09 2008 Jay Draft */ /* */ /*****************************************************************************/ WORD32 isvcd_parse_pmb_ref_index_cavlc( UWORD32 u4_num_part, /* Number of partitions in MB */ dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ WORD8 *pi1_ref_idx, /* pointer to reference index array */ UWORD32 u4_num_ref_idx_active_minus1, /* Number of active references - 1 */ UWORD8 *pu1_motion_prediction_flag /*motion_pred_flag_l0 */ ) { UWORD32 u4_i; UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; for(u4_i = 0; u4_i < u4_num_part; u4_i++) { if(((*pu1_motion_prediction_flag >> u4_i) & 0x01) == 0) { UWORD32 u4_ref_idx; // Inlined ih264d_uev UWORD32 u4_bitstream_offset = *pu4_bitstream_off; UWORD32 u4_word, u4_ldz; /***************************************************************/ /* Find leading zeros in next 32 bits */ /***************************************************************/ NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); u4_ldz = CLZ(u4_word); /* Flush the ps_bitstrm */ u4_bitstream_offset += (u4_ldz + 1); /* Read the suffix from the ps_bitstrm */ u4_word = 0; if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); *pu4_bitstream_off = u4_bitstream_offset; u4_ref_idx = ((1 << u4_ldz) + u4_word - 1); // Inlined ih264d_uev if(u4_ref_idx > u4_num_ref_idx_active_minus1) return ERROR_REF_IDX; /* Storing Reference Idx Information */ pi1_ref_idx[u4_i] = (WORD8) u4_ref_idx; } } return OK; } /*****************************************************************************/ /* */ /* Function Name : isvcd_parse_pmb_ref_index_cavlc_range1 */ /* */ /* Description : This function does the Cavlc TEV range =1 parsing of */ /* reference index for a P MB. Range is 1 when */ /* num_ref_idx_active_minus1 is 0 */ /* */ /* Inputs : */ /* Globals : */ /* Processing : */ /* Outputs : */ /* Returns : */ /* */ /* Issues : */ /* */ /* Revision History: */ /* */ /* DD MM YYYY Author(s) Changes (Describe the changes made) */ /* 19 09 2008 Jay Draft */ /* */ /*****************************************************************************/ void isvcd_parse_pmb_ref_index_cavlc_range1( UWORD32 u4_num_part, /* Number of partitions in MB */ dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */ WORD8 *pi1_ref_idx, /* pointer to reference index array */ UWORD32 u4_num_ref_idx_active_minus1, /* Not used for range 1 */ UWORD8 *pu1_motion_prediction_flag /*motion_pred_flag_l0 */ ) { UWORD32 u4_i; UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst; UNUSED(u4_num_ref_idx_active_minus1); for(u4_i = 0; u4_i < u4_num_part; u4_i++) { if(((*pu1_motion_prediction_flag >> u4_i) & 0x01) == 0) { UWORD32 u4_ref_idx; u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf); /* Storing Reference Idx Information */ pi1_ref_idx[u4_i] = (WORD8) u4_ref_idx; } } }