[PORT FROM MAIN] libmix: fix the crash issue when playing corrupted clips

BZ: 69519

Enhance the error handling to fix the crash issue when playing corrupted clips
Signed-off-by: Weian Chen <weian.chen@intel.com>

Change-Id: Ic8e5510d6154cd282b125d03697104fe80d6b232
Reviewed-on: http://android.intel.com:8080/80840
Reviewed-by: Ding, Haitao <haitao.ding@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: cactus <cactus@intel.com>
Tested-by: cactus <cactus@intel.com>
diff --git a/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_videoobjectlayer.c b/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_videoobjectlayer.c
index f5784c3..93aed35 100644
--- a/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_videoobjectlayer.c
+++ b/mix_vbp/viddec_fw/fw/codecs/mp4/parser/viddec_mp4_videoobjectlayer.c
@@ -442,6 +442,11 @@
     int32_t                 getbits=0;
 
 //DEB("entering mp4_Parse_VideoObjectLayer: bs_err: %d, ret: %d\n", parser->bitstream_error, ret);
+
+    // Trying to parse more header data as it is more important than frame data
+    if (parser->bitstream_error > MP4_HDR_ERROR_MASK)
+        return ret;
+
     do {
         vidObjLay->VideoObjectPlane.sprite_transmit_mode = MP4_SPRITE_TRANSMIT_MODE_PIECE;
 
@@ -579,8 +584,10 @@
     } while (0);
 
     mp4_set_hdr_bitstream_error(parser, true, ret);
-    if (ret != MP4_STATUS_OK)
+    if (ret != MP4_STATUS_OK) {
         parser->bitstream_error |= MP4_BS_ERROR_HDR_NONDEC;
+        return ret;
+    }
 //DEB("before wkld mp4_Parse_VideoObjectLayer: bs_err: %d, ret: %d\n", parser->bitstream_error, ret);
 
     // POPULATE WORKLOAD ITEM
diff --git a/mix_vbp/viddec_fw/fw/parser/vbp_mp42_parser.c b/mix_vbp/viddec_fw/fw/parser/vbp_mp42_parser.c
index 5e4c887..abe9f82 100644
--- a/mix_vbp/viddec_fw/fw/parser/vbp_mp42_parser.c
+++ b/mix_vbp/viddec_fw/fw/parser/vbp_mp42_parser.c
@@ -199,7 +199,8 @@
                 {
                     // this should never happen!!!!
                     WTRACE ("Short video header is parsed.\n");
-                    vbp_on_vop_svh_mp42(pcontext, list_index);
+                    // vbp_on_vop_svh_mp42(pcontext, list_index);
+                    return VBP_TYPE;
                 }
             }
             break;
diff --git a/videodecoder/VideoDecoderMPEG4.cpp b/videodecoder/VideoDecoderMPEG4.cpp
index 2ec6123..5843b47 100644
--- a/videodecoder/VideoDecoderMPEG4.cpp
+++ b/videodecoder/VideoDecoderMPEG4.cpp
@@ -495,6 +495,9 @@
         case MP4_VOP_TYPE_B:
             picParam->vop_fields.bits.backward_reference_vop_coding_type = mLastVOPCodingType;
             // WEIRD, CHECK AGAIN !!!!!!!
+            if (mLastReference == NULL || mForwardReference == NULL) {
+                return DECODE_NO_REFERENCE;
+            }
             picParam->forward_reference_picture = mLastReference->renderBuffer.surface;
             picParam->backward_reference_picture = mForwardReference->renderBuffer.surface;
             break;