blob: 71d16f6b6d6b53720bb690fe80d84c8af369a2d9 [file] [log] [blame]
//#define H264_PARSE_SLICE_HDR
//#ifdef H264_PARSE_SLICE_HDR
#include "h264.h"
#include "h264parse.h"
#include <vbp_trace.h>
extern int32_t viddec_pm_get_au_pos(void *parent, uint32_t *bit, uint32_t *byte, unsigned char *is_emul);
/*-----------------------------------------------------------------------------------------*/
// Slice header 1----
// 1) first_mb_in_slice, slice_type, pic_parameter_id
/*-----------------------------------------------------------------------------------------*/
h264_Status h264_Parse_Slice_Header_1(void *parent,h264_Info* pInfo, h264_Slice_Header_t *SliceHeader)
{
h264_Status ret = H264_STATUS_ERROR;
//h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader;
int32_t slice_type =0;
uint32_t data =0;
do {
///// first_mb_in_slice
SliceHeader->first_mb_in_slice = h264_GetVLCElement(parent, pInfo, false);
///// slice_type
slice_type = h264_GetVLCElement(parent, pInfo, false);
SliceHeader->slice_type = (slice_type % 5);
if (SliceHeader->slice_type > h264_PtypeI)
{
WTRACE("Slice type (%d) is not supported", SliceHeader->slice_type);
ret = H264_STATUS_NOTSUPPORT;
break;
}
////// pic_parameter_id
data = h264_GetVLCElement(parent, pInfo, false);
if (data > MAX_PIC_PARAMS)
{
WTRACE("pic_parameter_id is invalid", data);
ret = H264_PPS_INVALID_PIC_ID;
break;
}
SliceHeader->pic_parameter_id = (uint8_t)data;
ret = H264_STATUS_OK;
} while (0);
return ret;
}
/*-----------------------------------------------------------------------------------------*/
// slice header 2
// frame_num
// field_pic_flag, structure
// idr_pic_id
// pic_order_cnt_lsb, delta_pic_order_cnt_bottom
/*-----------------------------------------------------------------------------------------*/
h264_Status h264_Parse_Slice_Header_2(void *parent, h264_Info* pInfo, h264_Slice_Header_t *SliceHeader)
{
h264_Status ret = H264_SliceHeader_ERROR;
//h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader;
uint32_t code;
int32_t max_mb_num=0;
do {
//////////////////////////////////// Slice header part 2//////////////////
/// Frame_num
viddec_pm_get_bits(parent, &code, pInfo->active_SPS.log2_max_frame_num_minus4 + 4);
SliceHeader->frame_num = (int32_t)code;
/// Picture structure
SliceHeader->structure = FRAME;
SliceHeader->field_pic_flag = 0;
SliceHeader->bottom_field_flag = 0;
if (!(pInfo->active_SPS.sps_disp.frame_mbs_only_flag))
{
/// field_pic_flag
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->field_pic_flag = (uint8_t)code;
if (SliceHeader->field_pic_flag)
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->bottom_field_flag = (uint8_t)code;
SliceHeader->structure = SliceHeader->bottom_field_flag ? BOTTOM_FIELD: TOP_FIELD;
}
}
////// Check valid or not of first_mb_in_slice
if (SliceHeader->structure == FRAME)
{
max_mb_num = pInfo->img.FrameHeightInMbs * pInfo->img.PicWidthInMbs;
}
else
{
max_mb_num = pInfo->img.FrameHeightInMbs * pInfo->img.PicWidthInMbs / 2;
}
///if(pInfo->img.MbaffFrameFlag)
if (pInfo->active_SPS.sps_disp.mb_adaptive_frame_field_flag & (!(pInfo->SliceHeader.field_pic_flag)))
{
SliceHeader->first_mb_in_slice <<= 1;
}
if (SliceHeader->first_mb_in_slice >= max_mb_num)
break;
if (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR)
{
SliceHeader->idr_pic_id = h264_GetVLCElement(parent, pInfo, false);
}
if (pInfo->active_SPS.pic_order_cnt_type == 0)
{
viddec_pm_get_bits(parent, &code , pInfo->active_SPS.log2_max_pic_order_cnt_lsb_minus4 + 4);
SliceHeader->pic_order_cnt_lsb = (uint32_t)code;
if ((pInfo->active_PPS.pic_order_present_flag) && !(SliceHeader->field_pic_flag))
{
SliceHeader->delta_pic_order_cnt_bottom = h264_GetVLCElement(parent, pInfo, true);
}
else
{
SliceHeader->delta_pic_order_cnt_bottom = 0;
}
}
if ((pInfo->active_SPS.pic_order_cnt_type == 1) && !(pInfo->active_SPS.delta_pic_order_always_zero_flag))
{
SliceHeader->delta_pic_order_cnt[0] = h264_GetVLCElement(parent, pInfo, true);
if ((pInfo->active_PPS.pic_order_present_flag) && !(SliceHeader->field_pic_flag))
{
SliceHeader->delta_pic_order_cnt[1] = h264_GetVLCElement(parent, pInfo, true);
}
}
if (pInfo->active_PPS.redundant_pic_cnt_present_flag)
{
SliceHeader->redundant_pic_cnt = h264_GetVLCElement(parent, pInfo, false);
if (SliceHeader->redundant_pic_cnt > 127)
break;
}
else
{
SliceHeader->redundant_pic_cnt = 0;
}
ret = H264_STATUS_OK;
} while (0);
//////////// FMO is not supported curently, so comment out the following code
//if((pInfo->active_PPS.num_slice_groups_minus1 > 0) && (pInfo->active_PPS.slice_group_map_type >= 3) && (pInfo->active_PPS.slice_group_map_type <= 5) )
//{
// SliceHeader->slice_group_change_cycle = 0; //one of the variables is not known in the high profile
//}
return ret;
}
/*-----------------------------------------------------------------------------------------*/
// slice header 3
// (direct_spatial_mv_pred_flag, num_ref_idx, pic_list_reorder, PWT, ref_pic_remark, alpha, beta, etc)
/*-----------------------------------------------------------------------------------------*/
h264_Status h264_Parse_Slice_Header_3(void *parent, h264_Info* pInfo, h264_Slice_Header_t *SliceHeader)
{
h264_Status ret = H264_SliceHeader_ERROR;
//h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader;
int32_t slice_alpha_c0_offset, slice_beta_offset;
uint32_t code;
uint32_t bits_offset =0, byte_offset =0;
uint8_t is_emul =0;
do {
/// direct_spatial_mv_pred_flag
if (SliceHeader->slice_type == h264_PtypeB)
{
viddec_pm_get_bits(parent, &code , 1);
SliceHeader->direct_spatial_mv_pred_flag = (uint8_t)code;
}
else
{
SliceHeader->direct_spatial_mv_pred_flag = 0;
}
//
// Reset ref_idx and Overide it if exist
//
SliceHeader->num_ref_idx_l0_active = pInfo->active_PPS.num_ref_idx_l0_active;
SliceHeader->num_ref_idx_l1_active = pInfo->active_PPS.num_ref_idx_l1_active;
if ((SliceHeader->slice_type == h264_PtypeP) || (SliceHeader->slice_type == h264_PtypeSP) || (SliceHeader->slice_type == h264_PtypeB))
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->num_ref_idx_active_override_flag = (uint8_t)code;
if (SliceHeader->num_ref_idx_active_override_flag)
{
SliceHeader->num_ref_idx_l0_active = h264_GetVLCElement(parent, pInfo, false) + 1;
if (SliceHeader->slice_type == h264_PtypeB)
{
SliceHeader->num_ref_idx_l1_active = h264_GetVLCElement(parent, pInfo, false) + 1;
}
}
}
if (SliceHeader->slice_type != h264_PtypeB)
{
SliceHeader->num_ref_idx_l1_active = 0;
}
if ((SliceHeader->num_ref_idx_l0_active > MAX_NUM_REF_FRAMES) || (SliceHeader->num_ref_idx_l1_active > MAX_NUM_REF_FRAMES))
{
WTRACE("ref index greater than expected during slice header parsing.");
break;
}
#ifdef USE_AVC_SHORT_FORMAT
bool keepParsing = false;
keepParsing = h264_is_new_picture_start(pInfo, *SliceHeader, pInfo->SliceHeader) && (SliceHeader->nal_ref_idc != 0);
if (!keepParsing)
{
ITRACE("short format parsing: no need to go on!");
ret = H264_STATUS_OK;
break;
}
#endif
if (h264_Parse_Ref_Pic_List_Reordering(parent, pInfo, SliceHeader) != H264_STATUS_OK)
{
WTRACE("ref list reordering failed during slice header parsing.");
break;
}
////
//// Parse Pred_weight_table but not store it becasue it will be reparsed in HW
////
if (((pInfo->active_PPS.weighted_pred_flag) && ((SliceHeader->slice_type == h264_PtypeP) || (SliceHeader->slice_type == h264_PtypeSP))) || ((pInfo->active_PPS.weighted_bipred_idc == 1) && (SliceHeader->slice_type == h264_PtypeB)))
{
viddec_pm_get_au_pos(parent, &bits_offset, &byte_offset, &is_emul);
pInfo->h264_pwt_enabled = 1;
pInfo->h264_pwt_start_byte_offset = byte_offset;
pInfo->h264_pwt_start_bit_offset = bits_offset;
if (h264_Parse_Pred_Weight_Table(parent, pInfo, SliceHeader) != H264_STATUS_OK)
{
break;
}
viddec_pm_get_au_pos(parent, &bits_offset, &byte_offset, &is_emul);
if (0 == bits_offset)
{
pInfo->h264_pwt_end_byte_offset = byte_offset-1;
pInfo->h264_pwt_end_bit_offset = 8;
}
else
{
pInfo->h264_pwt_end_byte_offset = byte_offset;
pInfo->h264_pwt_end_bit_offset = bits_offset;
}
}
////
//// Parse Ref_pic marking if there
////
if (SliceHeader->nal_ref_idc != 0)
{
if (h264_Parse_Dec_Ref_Pic_Marking(parent, pInfo, SliceHeader) != H264_STATUS_OK)
{
WTRACE("ref pic marking failed during slice header parsing.");
break;
}
}
if ((pInfo->active_PPS.entropy_coding_mode_flag) && (SliceHeader->slice_type != h264_PtypeI) && (SliceHeader->slice_type != h264_PtypeSI))
{
SliceHeader->cabac_init_idc = h264_GetVLCElement(parent, pInfo, false);
}
else
{
SliceHeader->cabac_init_idc = 0;
}
if (SliceHeader->cabac_init_idc > 2)
{
break;
}
SliceHeader->slice_qp_delta = h264_GetVLCElement(parent, pInfo, true);
if ((SliceHeader->slice_qp_delta > (25 - pInfo->active_PPS.pic_init_qp_minus26)) || (SliceHeader->slice_qp_delta < -(26 + pInfo->active_PPS.pic_init_qp_minus26)))
{
WTRACE("slice_qp_delta value is invalid.");
break;
}
if ((SliceHeader->slice_type == h264_PtypeSP) || (SliceHeader->slice_type == h264_PtypeSI))
{
if (SliceHeader->slice_type == h264_PtypeSP)
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sp_for_switch_flag = (uint8_t)code;
}
SliceHeader->slice_qs_delta = h264_GetVLCElement(parent, pInfo, true);
if ((SliceHeader->slice_qs_delta > (25 - pInfo->active_PPS.pic_init_qs_minus26)) || (SliceHeader->slice_qs_delta < -(26+pInfo->active_PPS.pic_init_qs_minus26)) )
{
WTRACE("slice_qp_delta value is invalid.");
break;
}
}
if (pInfo->active_PPS.deblocking_filter_control_present_flag)
{
SliceHeader->disable_deblocking_filter_idc = h264_GetVLCElement(parent, pInfo, false);
if (SliceHeader->disable_deblocking_filter_idc != 1)
{
SliceHeader->slice_alpha_c0_offset_div2 = h264_GetVLCElement(parent, pInfo, true);
slice_alpha_c0_offset = SliceHeader->slice_alpha_c0_offset_div2 << 1;
if (slice_alpha_c0_offset < -12 || slice_alpha_c0_offset > 12)
{
break;
}
SliceHeader->slice_beta_offset_div2 = h264_GetVLCElement(parent, pInfo, true);
slice_beta_offset = SliceHeader->slice_beta_offset_div2 << 1;
if (slice_beta_offset < -12 || slice_beta_offset > 12)
{
break;
}
}
else
{
SliceHeader->slice_alpha_c0_offset_div2 = 0;
SliceHeader->slice_beta_offset_div2 = 0;
}
}
ret = H264_STATUS_OK;
} while (0);
//////////// FMO is not supported curently, so comment out the following code
//if((pInfo->active_PPS.num_slice_groups_minus1 > 0) && (pInfo->active_PPS.slice_group_map_type >= 3) && (pInfo->active_PPS.slice_group_map_type <= 5) )
//{
// SliceHeader->slice_group_change_cycle = 0; //one of the variables is not known in the high profile
//}
return ret;
}
/*--------------------------------------------------------------------------------------------------*/
//
// The syntax elements reordering_of_pic_nums_idc, abs_diff_pic_num_minus1, and long_term_pic_num
// specify the change from the initial reference picture lists to the reference picture lists to be used
// for decoding the slice
// reordering_of_pic_nums_idc:
// 0: abs_diff_pic_num_minus1 is present and corresponds to a difference to subtract from a picture number prediction value
// 1: abs_diff_pic_num_minus1 is present and corresponds to a difference to add to a picture number prediction value
// 2: long_term_pic_num is present and specifies the long-term picture number for a reference picture
// 3: End loop for reordering of the initial reference picture list
//
/*--------------------------------------------------------------------------------------------------*/
h264_Status h264_Parse_Ref_Pic_List_Reordering(void *parent, h264_Info* pInfo,h264_Slice_Header_t *SliceHeader)
{
//h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader;
int32_t reorder= -1;
uint32_t code;
if ((SliceHeader->slice_type != h264_PtypeI) && (SliceHeader->slice_type != h264_PtypeSI))
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sh_refpic_l0.ref_pic_list_reordering_flag = (uint8_t)code;
if (SliceHeader->sh_refpic_l0.ref_pic_list_reordering_flag)
{
reorder = -1;
do
{
reorder++;
if (reorder > MAX_NUM_REF_FRAMES)
{
return H264_SliceHeader_ERROR;
}
SliceHeader->sh_refpic_l0.reordering_of_pic_nums_idc[reorder] = h264_GetVLCElement(parent, pInfo, false);
if ((SliceHeader->sh_refpic_l0.reordering_of_pic_nums_idc[reorder] == 0) || (SliceHeader->sh_refpic_l0.reordering_of_pic_nums_idc[reorder] == 1))
{
SliceHeader->sh_refpic_l0.list_reordering_num[reorder].abs_diff_pic_num_minus1 = h264_GetVLCElement(parent, pInfo, false);
}
else if (SliceHeader->sh_refpic_l0.reordering_of_pic_nums_idc[reorder] == 2)
{
SliceHeader->sh_refpic_l0.list_reordering_num[reorder].long_term_pic_num = h264_GetVLCElement(parent, pInfo, false);
}
} while (SliceHeader->sh_refpic_l0.reordering_of_pic_nums_idc[reorder] != 3);
}
}
if (SliceHeader->slice_type == h264_PtypeB)
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sh_refpic_l1.ref_pic_list_reordering_flag = (uint8_t)code;
if (SliceHeader->sh_refpic_l1.ref_pic_list_reordering_flag)
{
reorder = -1;
do
{
reorder++;
if (reorder > MAX_NUM_REF_FRAMES)
{
return H264_SliceHeader_ERROR;
}
SliceHeader->sh_refpic_l1.reordering_of_pic_nums_idc[reorder] = h264_GetVLCElement(parent, pInfo, false);
if ((SliceHeader->sh_refpic_l1.reordering_of_pic_nums_idc[reorder] == 0) || (SliceHeader->sh_refpic_l1.reordering_of_pic_nums_idc[reorder] == 1))
{
SliceHeader->sh_refpic_l1.list_reordering_num[reorder].abs_diff_pic_num_minus1 = h264_GetVLCElement(parent, pInfo, false);
}
else if (SliceHeader->sh_refpic_l1.reordering_of_pic_nums_idc[reorder] == 2)
{
SliceHeader->sh_refpic_l1.list_reordering_num[reorder].long_term_pic_num = h264_GetVLCElement(parent, pInfo, false);
}
} while (SliceHeader->sh_refpic_l1.reordering_of_pic_nums_idc[reorder] != 3);
}
}
//currently just two reference frames but in case mroe than two, then should use an array for the above structures that is why reorder
return H264_STATUS_OK;
}
h264_Status h264_Parse_Pred_Weight_Table(void *parent, h264_Info* pInfo,h264_Slice_Header_t *SliceHeader)
{
uint32_t i = 0, j = 0;
uint32_t flag;
SliceHeader->sh_predwttbl.luma_log2_weight_denom = h264_GetVLCElement(parent, pInfo, false);
if (pInfo->active_SPS.sps_disp.chroma_format_idc != 0)
{
SliceHeader->sh_predwttbl.chroma_log2_weight_denom = h264_GetVLCElement(parent,pInfo, false);
}
for (i = 0; i < SliceHeader->num_ref_idx_l0_active; i++)
{
viddec_pm_get_bits(parent, (uint32_t *)&flag, 1);
SliceHeader->sh_predwttbl.luma_weight_l0_flag = flag;
if (SliceHeader->sh_predwttbl.luma_weight_l0_flag)
{
SliceHeader->sh_predwttbl.luma_weight_l0[i] = h264_GetVLCElement(parent, pInfo, true);
SliceHeader->sh_predwttbl.luma_offset_l0[i] = h264_GetVLCElement(parent, pInfo, true);
}
else
{
SliceHeader->sh_predwttbl.luma_weight_l0[i] = (1 << SliceHeader->sh_predwttbl.luma_log2_weight_denom);
SliceHeader->sh_predwttbl.luma_offset_l0[i] = 0;
}
if (pInfo->active_SPS.sps_disp.chroma_format_idc != 0)
{
viddec_pm_get_bits(parent, (uint32_t *)&flag, 1);
SliceHeader->sh_predwttbl.chroma_weight_l0_flag = flag;
if (SliceHeader->sh_predwttbl.chroma_weight_l0_flag)
{
for (j = 0; j < 2; j++)
{
SliceHeader->sh_predwttbl.chroma_weight_l0[i][j] = h264_GetVLCElement(parent, pInfo, true);
SliceHeader->sh_predwttbl.chroma_offset_l0[i][j] = h264_GetVLCElement(parent, pInfo, true);
}
}
else
{
for (j = 0; j < 2; j++)
{
SliceHeader->sh_predwttbl.chroma_weight_l0[i][j] = (1 << SliceHeader->sh_predwttbl.chroma_log2_weight_denom);
SliceHeader->sh_predwttbl.chroma_offset_l0[i][j] = 0;
}
}
}
}
if (SliceHeader->slice_type == h264_PtypeB)
{
for (i = 0; i < SliceHeader->num_ref_idx_l1_active; i++)
{
viddec_pm_get_bits(parent, (uint32_t *)&flag, 1);
SliceHeader->sh_predwttbl.luma_weight_l1_flag = flag;
if (SliceHeader->sh_predwttbl.luma_weight_l1_flag)
{
SliceHeader->sh_predwttbl.luma_weight_l1[i] = h264_GetVLCElement(parent, pInfo, true);
SliceHeader->sh_predwttbl.luma_offset_l1[i] = h264_GetVLCElement(parent, pInfo, true);
}
else
{
SliceHeader->sh_predwttbl.luma_weight_l1[i] = (1 << SliceHeader->sh_predwttbl.luma_log2_weight_denom);
SliceHeader->sh_predwttbl.luma_offset_l1[i] = 0;
}
if (pInfo->active_SPS.sps_disp.chroma_format_idc != 0)
{
viddec_pm_get_bits(parent, (uint32_t *)&flag, 1);
SliceHeader->sh_predwttbl.chroma_weight_l1_flag = flag;
if (SliceHeader->sh_predwttbl.chroma_weight_l1_flag)
{
for (j = 0; j < 2; j++)
{
SliceHeader->sh_predwttbl.chroma_weight_l1[i][j] = h264_GetVLCElement(parent, pInfo, true);
SliceHeader->sh_predwttbl.chroma_offset_l1[i][j] = h264_GetVLCElement(parent, pInfo, true);
}
}
else
{
for (j = 0; j < 2; j++)
{
SliceHeader->sh_predwttbl.chroma_weight_l1[i][j] = (1 << SliceHeader->sh_predwttbl.chroma_log2_weight_denom);
SliceHeader->sh_predwttbl.chroma_offset_l1[i][j] = 0;
}
}
}
}
}
return H264_STATUS_OK;
} ///// End of h264_Parse_Pred_Weight_Table
/*--------------------------------------------------------------------------------------------------*/
// The syntax elements specify marking of the reference pictures.
// 1)IDR: no_output_of_prior_pics_flag,
// long_term_reference_flag,
// 2)NonIDR: adaptive_ref_pic_marking_mode_flag,
// memory_management_control_operation,
// difference_of_pic_nums_minus1,
// long_term_frame_idx,
// long_term_pic_num, and
// max_long_term_frame_idx_plus1
//
//The marking of a reference picture can be "unused for reference", "used for short-term reference", or "used for longterm
// reference", but only one among these three.
/*--------------------------------------------------------------------------------------------------*/
h264_Status h264_Parse_Dec_Ref_Pic_Marking(void *parent, h264_Info* pInfo,h264_Slice_Header_t *SliceHeader)
{
//h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader;
uint8_t i = 0;
uint32_t code = 0;
if (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR)
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sh_dec_refpic.no_output_of_prior_pics_flag = (uint8_t)code;
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sh_dec_refpic.long_term_reference_flag = (uint8_t)code;
pInfo->img.long_term_reference_flag = (uint8_t)code;
}
else
{
viddec_pm_get_bits(parent, &code, 1);
SliceHeader->sh_dec_refpic.adaptive_ref_pic_marking_mode_flag = (uint8_t)code;
///////////////////////////////////////////////////////////////////////////////////////
//adaptive_ref_pic_marking_mode_flag Reference picture marking mode specified
// 0 Sliding window reference picture marking mode: A marking mode
// providing a first-in first-out mechanism for short-term reference pictures.
// 1 Adaptive reference picture marking mode: A reference picture
// marking mode providing syntax elements to specify marking of
// reference pictures as �unused for reference?and to assign long-term
// frame indices.
///////////////////////////////////////////////////////////////////////////////////////
if (SliceHeader->sh_dec_refpic.adaptive_ref_pic_marking_mode_flag)
{
do
{
if (i < NUM_MMCO_OPERATIONS)
{
SliceHeader->sh_dec_refpic.memory_management_control_operation[i] = h264_GetVLCElement(parent, pInfo, false);
if ((SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 1) || (SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 3))
{
SliceHeader->sh_dec_refpic.difference_of_pic_num_minus1[i] = h264_GetVLCElement(parent, pInfo, false);
}
if (SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 2)
{
SliceHeader->sh_dec_refpic.long_term_pic_num[i] = h264_GetVLCElement(parent, pInfo, false);
}
if ((SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 3) || (SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 6))
{
SliceHeader->sh_dec_refpic.long_term_frame_idx[i] = h264_GetVLCElement(parent, pInfo, false);
}
if (SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 4)
{
SliceHeader->sh_dec_refpic.max_long_term_frame_idx_plus1[i] = h264_GetVLCElement(parent, pInfo, false);
}
if (SliceHeader->sh_dec_refpic.memory_management_control_operation[i] == 5)
{
pInfo->img.curr_has_mmco_5 = 1;
}
}
if (i >= NUM_MMCO_OPERATIONS) {
return H264_STATUS_ERROR;
}
} while (SliceHeader->sh_dec_refpic.memory_management_control_operation[i++] != 0);
}
}
SliceHeader->sh_dec_refpic.dec_ref_pic_marking_count = i;
return H264_STATUS_OK;
}
//#endif