diff options
-rw-r--r-- | include/media/stagefright/MediaAdapter.h | 4 | ||||
-rw-r--r-- | include/media/stagefright/MediaBuffer.h | 1 | ||||
-rw-r--r-- | include/media/stagefright/MediaSource.h | 1 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 4 | ||||
-rw-r--r-- | media/libstagefright/MediaAdapter.cpp | 18 |
5 files changed, 25 insertions, 3 deletions
diff --git a/include/media/stagefright/MediaAdapter.h b/include/media/stagefright/MediaAdapter.h index 369fce6..8622546 100644 --- a/include/media/stagefright/MediaAdapter.h +++ b/include/media/stagefright/MediaAdapter.h @@ -56,6 +56,8 @@ public: // deep copy, such that after pushBuffer return, the buffer can be re-used. status_t pushBuffer(MediaBuffer *buffer); + virtual void notifyError(status_t err); + private: Mutex mAdapterLock; // Make sure the read() wait for the incoming buffer. @@ -68,6 +70,8 @@ private: bool mStarted; sp<MetaData> mOutputFormat; + status_t mStatus; + DISALLOW_EVIL_CONSTRUCTORS(MediaAdapter); }; diff --git a/include/media/stagefright/MediaBuffer.h b/include/media/stagefright/MediaBuffer.h index c8a50e8..5ab266f 100644 --- a/include/media/stagefright/MediaBuffer.h +++ b/include/media/stagefright/MediaBuffer.h @@ -93,6 +93,7 @@ protected: private: friend class MediaBufferGroup; friend class OMXDecoder; + friend class MediaAdapter; // For use by OMXDecoder, reference count must be 1, drop reference // count to 0 without signalling the observer. diff --git a/include/media/stagefright/MediaSource.h b/include/media/stagefright/MediaSource.h index a653db9..7ab5f62 100644 --- a/include/media/stagefright/MediaSource.h +++ b/include/media/stagefright/MediaSource.h @@ -59,6 +59,7 @@ struct MediaSource : public virtual RefBase { virtual status_t read( MediaBuffer **buffer, const ReadOptions *options = NULL) = 0; + virtual void notifyError(status_t) {} // Options that modify read() behaviour. The default is to // a) not request a seek // b) not be late, i.e. lateness_us = 0 diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 24da000..6a8664e 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -2452,7 +2452,9 @@ status_t MPEG4Writer::Track::threadEntry() { ALOGE("timestampUs %" PRId64 " < lastTimestampUs %" PRId64 " for %s track", timestampUs, lastTimestampUs, trackName); copy->release(); - return UNKNOWN_ERROR; + err = UNKNOWN_ERROR; + mSource->notifyError(err); + return err; } // if the duration is different for this sample, see if it is close enough to the previous diff --git a/media/libstagefright/MediaAdapter.cpp b/media/libstagefright/MediaAdapter.cpp index d680e0c..ec4550f 100644 --- a/media/libstagefright/MediaAdapter.cpp +++ b/media/libstagefright/MediaAdapter.cpp @@ -27,7 +27,8 @@ namespace android { MediaAdapter::MediaAdapter(const sp<MetaData> &meta) : mCurrentMediaBuffer(NULL), mStarted(false), - mOutputFormat(meta) { + mOutputFormat(meta), + mStatus(OK) { } MediaAdapter::~MediaAdapter() { @@ -51,6 +52,9 @@ status_t MediaAdapter::stop() { // If stop() happens immediately after a pushBuffer(), we should // clean up the mCurrentMediaBuffer if (mCurrentMediaBuffer != NULL) { + mCurrentMediaBuffer->setObserver(this); + mCurrentMediaBuffer->claim(); + mCurrentMediaBuffer->setObserver(0); mCurrentMediaBuffer->release(); mCurrentMediaBuffer = NULL; } @@ -113,13 +117,23 @@ status_t MediaAdapter::pushBuffer(MediaBuffer *buffer) { ALOGE("pushBuffer called before start"); return INVALID_OPERATION; } + if (mStatus != OK) { + ALOGE("pushBuffer called when MediaAdapter in error status"); + return mStatus; + } mCurrentMediaBuffer = buffer; mBufferReadCond.signal(); ALOGV("wait for the buffer returned @ pushBuffer! %p", buffer); mBufferReturnedCond.wait(mAdapterLock); - return OK; + return mStatus; +} + +void MediaAdapter::notifyError(status_t err) { + Mutex::Autolock autoLock(mAdapterLock); + mStatus = err; + mBufferReturnedCond.signal(); } } // namespace android |