289 lines
14 KiB
C
289 lines
14 KiB
C
|
|
/******************************************************************************
|
||
|
|
*
|
||
|
|
* 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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|