Merge "stagefright: MediaCodecSource: protect output format updates" into nyc-dev
diff --git a/include/media/stagefright/MediaCodecSource.h b/include/media/stagefright/MediaCodecSource.h
index 5f10487..035e8ae 100644
--- a/include/media/stagefright/MediaCodecSource.h
+++ b/include/media/stagefright/MediaCodecSource.h
@@ -56,7 +56,7 @@
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
virtual status_t pause();
- virtual sp<MetaData> getFormat() { return mMeta; }
+ virtual sp<MetaData> getFormat();
virtual status_t read(
MediaBuffer **buffer,
const ReadOptions *options = NULL);
@@ -105,7 +105,7 @@
sp<ALooper> mCodecLooper;
sp<AHandlerReflector<MediaCodecSource> > mReflector;
sp<AMessage> mOutputFormat;
- sp<MetaData> mMeta;
+ Mutexed<sp<MetaData>> mMeta;
sp<Puller> mPuller;
sp<MediaCodec> mEncoder;
uint32_t mFlags;
diff --git a/include/media/stagefright/foundation/Mutexed.h b/include/media/stagefright/foundation/Mutexed.h
index d4fd905..e905d86 100644
--- a/include/media/stagefright/foundation/Mutexed.h
+++ b/include/media/stagefright/foundation/Mutexed.h
@@ -110,6 +110,11 @@
inline T* operator->() const { return mLocked ? &mTreasure : nullptr; }
inline T& operator*() const { return mLocked ? mTreasure : *(T*)nullptr; }
+ // same as *
+ inline T& get() const { return mLocked ? mTreasure : *(T*)nullptr; }
+ // sets structure. this will abort if mLocked is false.
+ inline void set(T& o) const { get() = o; }
+
// Wait on the condition variable using lock. Must be locked.
inline status_t waitForCondition(Condition &cond) { return cond.wait(mLock); }
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index 0a052d2..1acfca0 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -358,6 +358,11 @@
return OK;
}
+sp<MetaData> MediaCodecSource::getFormat() {
+ Mutexed<sp<MetaData>>::Locked meta(mMeta);
+ return *meta;
+}
+
sp<IGraphicBufferProducer> MediaCodecSource::getGraphicBufferProducer() {
CHECK(mFlags & FLAG_USE_SURFACE_INPUT);
return mGraphicBufferProducer;
@@ -493,7 +498,9 @@
}
mEncoder->getOutputFormat(&mOutputFormat);
- convertMessageToMetaData(mOutputFormat, mMeta);
+ sp<MetaData> meta = new MetaData;
+ convertMessageToMetaData(mOutputFormat, meta);
+ mMeta.lock().set(meta);
if (mFlags & FLAG_USE_SURFACE_INPUT) {
CHECK(mIsVideo);
@@ -787,7 +794,9 @@
signalEOS(err);
break;
}
- convertMessageToMetaData(mOutputFormat, mMeta);
+ sp<MetaData> meta = new MetaData;
+ convertMessageToMetaData(mOutputFormat, meta);
+ mMeta.lock().set(meta);
} else if (cbID == MediaCodec::CB_OUTPUT_AVAILABLE) {
int32_t index;
size_t offset;