unplugged-system/external/libavc/decoder/svc/isvcd_parse_cavlc.c

289 lines
14 KiB
C
Raw Normal View History

/******************************************************************************
*
* 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 <string.h>
#include <stdio.h>
#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 : <What inputs does the function take?> */
/* Globals : <Does it use any global variables?> */
/* Processing : <Describe how the function operates - include algorithm */
/* description> */
/* Outputs : <What does the function produce?> */
/* Returns : <What does the function return?> */
/* */
/* Issues : <List any issues or problems with this function> */
/* */
/* 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 : <What inputs does the function take?> */
/* Globals : <Does it use any global variables?> */
/* Processing : <Describe how the function operates - include algorithm */
/* description> */
/* Outputs : <What does the function produce?> */
/* Returns : <What does the function return?> */
/* */
/* Issues : <List any issues or problems with this function> */
/* */
/* 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 : <What inputs does the function take?> */
/* Globals : <Does it use any global variables?> */
/* Processing : <Describe how the function operates - include algorithm */
/* description> */
/* Outputs : <What does the function produce?> */
/* Returns : <What does the function return?> */
/* */
/* Issues : <List any issues or problems with this function> */
/* */
/* 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 : <What inputs does the function take?> */
/* Globals : <Does it use any global variables?> */
/* Processing : <Describe how the function operates - include algorithm */
/* description> */
/* Outputs : <What does the function produce?> */
/* Returns : <What does the function return?> */
/* */
/* Issues : <List any issues or problems with this function> */
/* */
/* 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;
}
}
}