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

Commit 77016c93 authored by Sungtak Lee's avatar Sungtak Lee Committed by Android (Google) Code Review
Browse files

Merge changes from topic "reverted-mistakenly-tv" into udc-dev

* changes:
  GraphicBufferSource: Use 64bit consumer usage
  C2BqPool: Expire waiters on Surface switching
parents 90d99d6f dbb4a302
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -1523,8 +1523,8 @@ c2_status_t Codec2Client::Component::setOutputSurface(
    uint64_t consumerUsage = kDefaultConsumerUsage;
    uint64_t consumerUsage = kDefaultConsumerUsage;
    {
    {
        if (surface) {
        if (surface) {
            int usage = 0;
            uint64_t usage = 0;
            status_t err = surface->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS, &usage);
            status_t err = surface->getConsumerUsage(&usage);
            if (err != NO_ERROR) {
            if (err != NO_ERROR) {
                ALOGD("setOutputSurface -- failed to get consumer usage bits (%d/%s). ignoring",
                ALOGD("setOutputSurface -- failed to get consumer usage bits (%d/%s). ignoring",
                        err, asString(err));
                        err, asString(err));
@@ -1537,8 +1537,7 @@ c2_status_t Codec2Client::Component::setOutputSurface(
                // they do not exist inside of C2 scope. Any buffer usage shall be communicated
                // they do not exist inside of C2 scope. Any buffer usage shall be communicated
                // through the sideband channel.
                // through the sideband channel.


                // do an unsigned conversion as bit-31 may be 1
                consumerUsage = usage | kDefaultConsumerUsage;
                consumerUsage = (uint32_t)usage | kDefaultConsumerUsage;
            }
            }
        }
        }


@@ -1562,6 +1561,8 @@ c2_status_t Codec2Client::Component::setOutputSurface(
                    static_cast<uint64_t>(blockPoolId),
                    static_cast<uint64_t>(blockPoolId),
                    bqId == 0 ? nullHgbp : igbp);
                    bqId == 0 ? nullHgbp : igbp);


    mOutputBufferQueue->expireOldWaiters();

    if (!transStatus.isOk()) {
    if (!transStatus.isOk()) {
        LOG(ERROR) << "setOutputSurface -- transaction failed.";
        LOG(ERROR) << "setOutputSurface -- transaction failed.";
        return C2_TRANSACTION_FAILED;
        return C2_TRANSACTION_FAILED;
@@ -1607,6 +1608,7 @@ void Codec2Client::Component::stopUsingOutputSurface(
                       << status << ".";
                       << status << ".";
        }
        }
    }
    }
    mOutputBufferQueue->expireOldWaiters();
}
}


c2_status_t Codec2Client::Component::connectToInputSurface(
c2_status_t Codec2Client::Component::connectToInputSurface(
+6 −0
Original line number Original line Diff line number Diff line
@@ -51,6 +51,10 @@ struct OutputBufferQueue {
                   int maxDequeueBufferCount,
                   int maxDequeueBufferCount,
                   std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj);
                   std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj);


    // If there are waiters to allocate from the old surface, wake up and expire
    // them.
    void expireOldWaiters();

    // Stop using the current output surface. Pending buffer opeations will not
    // Stop using the current output surface. Pending buffer opeations will not
    // perform anymore.
    // perform anymore.
    void stop();
    void stop();
@@ -90,6 +94,8 @@ private:
    std::weak_ptr<_C2BlockPoolData> mPoolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::weak_ptr<_C2BlockPoolData> mPoolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::shared_ptr<C2SurfaceSyncMemory> mSyncMem;
    std::shared_ptr<C2SurfaceSyncMemory> mSyncMem;
    bool mStopped;
    bool mStopped;
    std::mutex mOldMutex;
    std::shared_ptr<C2SurfaceSyncMemory> mOldMem;


    bool registerBuffer(const C2ConstGraphicBlock& block);
    bool registerBuffer(const C2ConstGraphicBlock& block);
};
};
+17 −1
Original line number Original line Diff line number Diff line
@@ -217,6 +217,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
    sp<GraphicBuffer> buffers[BufferQueueDefs::NUM_BUFFER_SLOTS];
    sp<GraphicBuffer> buffers[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::weak_ptr<_C2BlockPoolData>
    std::weak_ptr<_C2BlockPoolData>
            poolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
            poolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::shared_ptr<C2SurfaceSyncMemory> oldMem;
    {
    {
        std::scoped_lock<std::mutex> l(mMutex);
        std::scoped_lock<std::mutex> l(mMutex);
        bool stopped = mStopped;
        bool stopped = mStopped;
@@ -238,7 +239,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
            }
            }
            return false;
            return false;
        }
        }
        std::shared_ptr<C2SurfaceSyncMemory> oldMem = mSyncMem;
        oldMem = mSyncMem;
        C2SyncVariables *oldSync = mSyncMem ? mSyncMem->mem() : nullptr;
        C2SyncVariables *oldSync = mSyncMem ? mSyncMem->mem() : nullptr;
        if (oldSync) {
        if (oldSync) {
            oldSync->lock();
            oldSync->lock();
@@ -314,11 +315,26 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
            newSync->unlock();
            newSync->unlock();
        }
        }
    }
    }
    {
        std::scoped_lock<std::mutex> l(mOldMutex);
        mOldMem = oldMem;
    }
    ALOGD("remote graphic buffer migration %zu/%zu",
    ALOGD("remote graphic buffer migration %zu/%zu",
          success, tryNum);
          success, tryNum);
    return true;
    return true;
}
}


void OutputBufferQueue::expireOldWaiters() {
    std::scoped_lock<std::mutex> l(mOldMutex);
    if (mOldMem) {
        C2SyncVariables *oldSync = mOldMem->mem();
        if (oldSync) {
            oldSync->notifyAll();
        }
        mOldMem.reset();
    }
}

void OutputBufferQueue::stop() {
void OutputBufferQueue::stop() {
    std::scoped_lock<std::mutex> l(mMutex);
    std::scoped_lock<std::mutex> l(mMutex);
    mStopped = true;
    mStopped = true;