diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index 2f0da2d783..ee463ce4f2 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -106,16 +106,17 @@ NuPlayer::Decoder::~Decoder() { releaseAndResetMediaBuffers(); } -sp NuPlayer::Decoder::getStats() const { +sp NuPlayer::Decoder::getStats() { + Mutex::Autolock autolock(mStatsLock); mStats->setInt64("frames-total", mNumFramesTotal); mStats->setInt64("frames-dropped-input", mNumInputFramesDropped); mStats->setInt64("frames-dropped-output", mNumOutputFramesDropped); mStats->setFloat("frame-rate-total", mFrameRateTotal); - // i'm mutexed right now. // make our own copy, so we aren't victim to any later changes. sp copiedStats = mStats->dup(); + return copiedStats; } @@ -362,13 +363,17 @@ void NuPlayer::Decoder::onConfigure(const sp &format) { CHECK_EQ((status_t)OK, mCodec->getOutputFormat(&mOutputFormat)); CHECK_EQ((status_t)OK, mCodec->getInputFormat(&mInputFormat)); - mStats->setString("mime", mime.c_str()); - mStats->setString("component-name", mComponentName.c_str()); + { + Mutex::Autolock autolock(mStatsLock); + mStats->setString("mime", mime.c_str()); + mStats->setString("component-name", mComponentName.c_str()); + } if (!mIsAudio) { int32_t width, height; if (mOutputFormat->findInt32("width", &width) && mOutputFormat->findInt32("height", &height)) { + Mutex::Autolock autolock(mStatsLock); mStats->setInt32("width", width); mStats->setInt32("height", height); } @@ -799,6 +804,7 @@ void NuPlayer::Decoder::handleOutputFormatChange(const sp &format) { int32_t width, height; if (format->findInt32("width", &width) && format->findInt32("height", &height)) { + Mutex::Autolock autolock(mStatsLock); mStats->setInt32("width", width); mStats->setInt32("height", height); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h index 3da2f0b616..4a52b0c06a 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.h @@ -34,7 +34,7 @@ struct NuPlayer::Decoder : public DecoderBase { const sp &surface = NULL, const sp &ccDecoder = NULL); - virtual sp getStats() const; + virtual sp getStats(); // sets the output surface of video decoders. virtual status_t setVideoSurface(const sp &surface); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h index d44c396668..a3e0046dd9 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.h @@ -47,7 +47,7 @@ struct NuPlayer::DecoderBase : public AHandler { void signalResume(bool notifyComplete); void initiateShutdown(); - virtual sp getStats() const { + virtual sp getStats() { return mStats; } @@ -88,6 +88,7 @@ protected: int32_t mBufferGeneration; bool mPaused; sp mStats; + Mutex mStatsLock; private: enum {