[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;