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

Commit 8965b098 authored by Wonsik Kim's avatar Wonsik Kim Committed by Lajos Molnar
Browse files

MediaCodec: propagate usage from original surface to release surface

Bug: 169968946
Bug: 160346309
Test: atest CtsSecurityTestCases:StagefrightTest#testStagefright_bug_65483665
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
Change-Id: If87053e85a3692ed4b5fbc61d45612d5dbf56eb5
parent 48e2b36f
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -315,7 +315,7 @@ MediaCodec::BufferInfo::BufferInfo() : mOwnedByClient(false) {}

class MediaCodec::ReleaseSurface {
public:
    ReleaseSurface() {
    explicit ReleaseSurface(uint64_t usage) {
        BufferQueue::createBufferQueue(&mProducer, &mConsumer);
        mSurface = new Surface(mProducer, false /* controlledByApp */);
        struct ConsumerListener : public BnConsumerListener {
@@ -326,6 +326,7 @@ public:
        sp<ConsumerListener> listener{new ConsumerListener};
        mConsumer->consumerConnect(listener, false);
        mConsumer->setConsumerName(String8{"MediaCodec.release"});
        mConsumer->setConsumerUsageBits(usage);
    }

    const sp<Surface> &getSurface() {
@@ -3083,7 +3084,11 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
            if (asyncNotify != nullptr) {
                if (mSurface != NULL) {
                    if (!mReleaseSurface) {
                        mReleaseSurface.reset(new ReleaseSurface);
                        uint64_t usage = 0;
                        if (mSurface->getConsumerUsage(&usage) != OK) {
                            usage = 0;
                        }
                        mReleaseSurface.reset(new ReleaseSurface(usage));
                    }
                    if (mSurface != mReleaseSurface->getSurface()) {
                        status_t err = connectToSurface(mReleaseSurface->getSurface());