From 1919e5af3d8eb8bcf08e50efae2e79eaf065cf6b Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Thu, 20 May 2010 10:37:06 -0700 Subject: Better handling of codec initialization failure in the player and thumbnail extractor. Return a runtime error instead of asserting if the software MPEG4/H.263 decoder fails to initialize. Change-Id: I5cba02ee85a41e43c2623053de40f26e2cf2efe4 related-to-bug: 2699505 --- cmds/stagefright/stagefright.cpp | 7 ++++++- media/libstagefright/AwesomePlayer.cpp | 7 ++++++- media/libstagefright/StagefrightMetadataRetriever.cpp | 7 +++++-- media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp | 11 +++++++++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index 4405da6f81ad..b838f320776f 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -75,7 +75,12 @@ static void playSource(OMXClient *client, const sp &source) { } } - rawSource->start(); + status_t err = rawSource->start(); + + if (err != OK) { + fprintf(stderr, "rawSource returned error %d (0x%08x)\n", err, err); + return; + } if (gPlaybackAudio) { AudioPlayer *player = new AudioPlayer(NULL); diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index f668caacc239..274dad930bad 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -822,7 +822,12 @@ status_t AwesomePlayer::initVideoDecoder() { CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth)); CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight)); - mVideoSource->start(); + status_t err = mVideoSource->start(); + + if (err != OK) { + mVideoSource.clear(); + return err; + } } return mVideoSource != NULL ? OK : UNKNOWN_ERROR; diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index 29689177b711..258be7486748 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -120,7 +120,11 @@ static VideoFrame *extractVideoFrameWithCodecFlags( return NULL; } - decoder->start(); + status_t err = decoder->start(); + if (err != OK) { + LOGW("OMXCodec::start returned error %d (0x%08x)\n", err, err); + return NULL; + } // Read one output buffer, ignore format change notifications // and spurious empty buffers. @@ -134,7 +138,6 @@ static VideoFrame *extractVideoFrameWithCodecFlags( } MediaBuffer *buffer = NULL; - status_t err; do { if (buffer != NULL) { buffer->release(); diff --git a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp index 40009f8f316a..8350f7a57c9e 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp +++ b/media/libstagefright/codecs/m4v_h263/dec/M4vH263Decoder.cpp @@ -120,9 +120,16 @@ status_t M4vH263Decoder::start(MetaData *) { vol_size = 0; } - CHECK_EQ(PV_TRUE, PVInitVideoDecoder( - mHandle, vol_data, &vol_size, 1, mWidth, mHeight, mode)); + + Bool success = PVInitVideoDecoder( + mHandle, vol_data, &vol_size, 1, mWidth, mHeight, mode); if (vol_data[0]) free(vol_data[0]); + + if (success != PV_TRUE) { + LOGW("PVInitVideoDecoder failed. Unsupported content?"); + return ERROR_UNSUPPORTED; + } + MP4DecodingMode actualMode = PVGetDecBitstreamMode(mHandle); CHECK_EQ(mode, actualMode); -- cgit v1.2.3-59-g8ed1b