Merge changes from topic 'b35583675-mnc-dr' into mnc-dr-dev

* changes:
  DO NOT MERGE Fixed bug in the case of resolution change.
  DO NOT MERGE Handle level/profile/num_ref_frames/num_reorder change at the same resolution
This commit is contained in:
Ray Essick 2017-05-12 17:42:21 +00:00 committed by Android (Google) Code Review
commit 126058dcb2

View file

@ -494,7 +494,7 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
UWORD32 u2_crop_offset_y = 0; UWORD32 u2_crop_offset_y = 0;
UWORD32 u2_crop_offset_uv = 0; UWORD32 u2_crop_offset_uv = 0;
WORD32 ret; WORD32 ret;
UWORD32 u4_num_reorder_frames;
/* High profile related syntax element */ /* High profile related syntax element */
WORD32 i4_i; WORD32 i4_i;
/* G050 */ /* G050 */
@ -567,6 +567,18 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
if(NULL == ps_dec->ps_cur_sps) if(NULL == ps_dec->ps_cur_sps)
ps_dec->ps_cur_sps = ps_seq; ps_dec->ps_cur_sps = ps_seq;
if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_profile_idc != u1_profile_idc))
{
ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED;
}
if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_level_idc != u1_level_idc))
{
ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED;
}
ps_seq->u1_profile_idc = u1_profile_idc; ps_seq->u1_profile_idc = u1_profile_idc;
ps_seq->u1_level_idc = u1_level_idc; ps_seq->u1_level_idc = u1_level_idc;
ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id; ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
@ -733,6 +745,14 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
{ {
return ERROR_NUM_REF; return ERROR_NUM_REF;
} }
/* Compare with older num_ref_frames is header is already once */
if((ps_dec->i4_header_decoded & 1) && (ps_seq->u1_num_ref_frames != u4_temp))
{
ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED;
}
ps_seq->u1_num_ref_frames = u4_temp; ps_seq->u1_num_ref_frames = u4_temp;
COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames); COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
@ -877,12 +897,12 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
return ERROR_INV_SPS_PPS_T; return ERROR_INV_SPS_PPS_T;
} }
if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_wd != u2_pic_wd)) if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_wd != u2_pic_wd))
{ {
ps_dec->u1_res_changed = 1; ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED; return IVD_RES_CHANGED;
} }
if((3 == ps_dec->i4_header_decoded) && (ps_dec->u2_pic_ht != u2_pic_ht)) if((ps_dec->i4_header_decoded & 1) && (ps_dec->u2_pic_ht != u2_pic_ht))
{ {
ps_dec->u1_res_changed = 1; ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED; return IVD_RES_CHANGED;
@ -909,6 +929,17 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
} }
/* Backup u4_num_reorder_frames if header is already decoded */
if((ps_dec->i4_header_decoded & 1) &&
(1 == ps_seq->u1_vui_parameters_present_flag) &&
(1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
{
u4_num_reorder_frames = ps_seq->s_vui.u4_num_reorder_frames;
}
else
{
u4_num_reorder_frames = -1;
}
if(1 == ps_seq->u1_vui_parameters_present_flag) if(1 == ps_seq->u1_vui_parameters_present_flag)
{ {
ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm); ret = ih264d_parse_vui_parametres(&ps_seq->s_vui, ps_bitstrm);
@ -916,6 +947,17 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
return ret; return ret;
} }
/* Compare older u4_num_reorder_frames with the new one if header is already decoded */
if((ps_dec->i4_header_decoded & 1) &&
(-1 != (WORD32)u4_num_reorder_frames) &&
(1 == ps_seq->u1_vui_parameters_present_flag) &&
(1 == ps_seq->s_vui.u1_bitstream_restriction_flag) &&
(ps_seq->s_vui.u4_num_reorder_frames != u4_num_reorder_frames))
{
ps_dec->u1_res_changed = 1;
return IVD_RES_CHANGED;
}
ps_dec->u2_pic_wd = u2_pic_wd; ps_dec->u2_pic_wd = u2_pic_wd;
ps_dec->u2_pic_ht = u2_pic_ht; ps_dec->u2_pic_ht = u2_pic_ht;