Merge "Decoder: Fix NPD issue in mmco function" am: f667dbf470 am: e6ea12f22c am: 6913c3db5b am: 8633b1b51a

Original change: https://android-review.googlesource.com/c/platform/external/libavc/+/1428456

Change-Id: Id1e6e627983bcee16c54cdfb6050b5e30f11da7f
diff --git a/decoder/ih264d_dpb_manager.h b/decoder/ih264d_dpb_manager.h
index 3bf00b7..5747016 100644
--- a/decoder/ih264d_dpb_manager.h
+++ b/decoder/ih264d_dpb_manager.h
@@ -106,6 +106,7 @@
   WORD8 i1_gaps_deleted;
   UWORD16 u2_pic_wd;
   UWORD16 u2_pic_ht;
+  UWORD8 u1_mmco_error_in_seq;
 }dpb_manager_t;
 
 /** Structure store the MMC Commands */
diff --git a/decoder/ih264d_dpb_mgr.c b/decoder/ih264d_dpb_mgr.c
index 28c9619..ce977d7 100644
--- a/decoder/ih264d_dpb_mgr.c
+++ b/decoder/ih264d_dpb_mgr.c
@@ -88,6 +88,7 @@
     ps_dpb_mgr->ps_dpb_ht_head = NULL;
     ps_dpb_mgr->i1_gaps_deleted = 0;
     ps_dpb_mgr->i1_poc_buf_id_entries = 0;
+    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
 
     ps_dpb_mgr->u1_num_gaps = 0;
     for(i = 0; i < MAX_FRAMES; i++)
@@ -647,6 +648,7 @@
     ps_dpb_mgr->u1_num_st_ref_bufs = ps_dpb_mgr->u1_num_lt_ref_bufs = 0;
     ps_dpb_mgr->ps_dpb_st_head = NULL;
     ps_dpb_mgr->ps_dpb_ht_head = NULL;
+    ps_dpb_mgr->u1_mmco_error_in_seq = 0;
 
     /* release all gaps */
     ps_dpb_mgr->u1_num_gaps = 0;
diff --git a/decoder/ih264d_utils.c b/decoder/ih264d_utils.c
index 0893c3f..b7e68b1 100644
--- a/decoder/ih264d_utils.c
+++ b/decoder/ih264d_utils.c
@@ -501,6 +501,7 @@
     {
         if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
         {
+            ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq = 0;
             if(ps_dec->ps_dpb_cmds->u1_long_term_reference_flag == 0)
             {
                 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
@@ -538,16 +539,17 @@
             {
                 UWORD16 u2_pic_num = ps_cur_slice->u2_frame_num;
 
-                /* ignore DPB errors */
-                ih264d_do_mmco_buffer(ps_dec->ps_dpb_cmds, ps_dec->ps_dpb_mgr,
-                              ps_dec->ps_cur_sps->u1_num_ref_frames, u2_pic_num,
-                              (ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1),
-                              ps_dec->u1_nal_unit_type, ps_dec->ps_cur_pic,
-                              ps_dec->u1_pic_buf_id,
-                              ps_cur_slice->u1_field_pic_flag,
-                              ps_dec->e_dec_status);
-
-
+                if(!ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq)
+                {
+                    WORD32 ret = ih264d_do_mmco_buffer(ps_dec->ps_dpb_cmds, ps_dec->ps_dpb_mgr,
+                                               ps_dec->ps_cur_sps->u1_num_ref_frames, u2_pic_num,
+                                               (ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1),
+                                               ps_dec->u1_nal_unit_type, ps_dec->ps_cur_pic,
+                                               ps_dec->u1_pic_buf_id,
+                                               ps_cur_slice->u1_field_pic_flag,
+                                               ps_dec->e_dec_status);
+                    ps_dec->ps_dpb_mgr->u1_mmco_error_in_seq = ret != OK;
+                }
             }
         }
         ih264d_update_default_index_list(ps_dec->ps_dpb_mgr);