diff options
-rw-r--r-- | include/media/stagefright/OMXCodec.h | 2 | ||||
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 20 |
2 files changed, 16 insertions, 6 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index bb9e595..e6739ae 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -354,6 +354,8 @@ private: const void *data, size_t size, unsigned *profile, unsigned *level); + status_t stopOmxComponent_l(); + OMXCodec(const OMXCodec &); OMXCodec &operator=(const OMXCodec &); }; diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 5615d0f..d0e306c 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -3621,7 +3621,11 @@ status_t OMXCodec::start(MetaData *meta) { } params->setInt32(kKeyNumBuffers, mPortBuffers[kPortIndexInput].size()); - return mSource->start(params.get()); + err = mSource->start(params.get()); + if (err != OK) { + stopOmxComponent_l(); + } + return err; } // Decoder case @@ -3633,8 +3637,16 @@ status_t OMXCodec::start(MetaData *meta) { status_t OMXCodec::stop() { CODEC_LOGV("stop mState=%d", mState); - Mutex::Autolock autoLock(mLock); + status_t err = stopOmxComponent_l(); + mSource->stop(); + + CODEC_LOGV("stopped in state %d", mState); + return err; +} + +status_t OMXCodec::stopOmxComponent_l() { + CODEC_LOGV("stopOmxComponent_l mState=%d", mState); while (isIntermediateState(mState)) { mAsyncCompletion.wait(mLock); @@ -3732,10 +3744,6 @@ status_t OMXCodec::stop() { mLeftOverBuffer = NULL; } - mSource->stop(); - - CODEC_LOGV("stopped in state %d", mState); - return OK; } |