Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d8d433e authored by Lajos Molnar's avatar Lajos Molnar Committed by android-build-merger
Browse files

Merge "stagefright: MediaCodecSource: protect output format updates" into nyc-dev

am: 1483d318

* commit '1483d318':
  stagefright: MediaCodecSource: protect output format updates
parents 389afff1 1483d318
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ struct MediaCodecSource : public MediaSource,
    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 @@ private:
    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;
+5 −0
Original line number Diff line number Diff line
@@ -110,6 +110,11 @@ public:
        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); }

+11 −2
Original line number Diff line number Diff line
@@ -358,6 +358,11 @@ status_t MediaCodecSource::pause() {
    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 @@ status_t MediaCodecSource::initEncoder() {
    }

    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 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) {
                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;