Codec2: Re-enable blocking allocator
Handle initial output surface configuration with destruction of old
blockpool.
Bug: 157111613
Test: atest CtsMediaTestCases:android.media.cts.AdaptivePlaybackTest
Change-Id: Ibf16cece0d7191fad24e7c8b64628fdc591e8a59
diff --git a/media/codec2/hidl/client/client.cpp b/media/codec2/hidl/client/client.cpp
index d49141c..71857e0 100644
--- a/media/codec2/hidl/client/client.cpp
+++ b/media/codec2/hidl/client/client.cpp
@@ -1482,7 +1482,8 @@
c2_status_t Codec2Client::Component::setOutputSurface(
C2BlockPool::local_id_t blockPoolId,
const sp<IGraphicBufferProducer>& surface,
- uint32_t generation) {
+ uint32_t generation,
+ int maxDequeueCount) {
uint64_t bqId = 0;
sp<IGraphicBufferProducer> nullIgbp;
sp<HGraphicBufferProducer2> nullHgbp;
@@ -1496,14 +1497,15 @@
std::shared_ptr<SurfaceSyncObj> syncObj;
if (!surface) {
- mOutputBufferQueue->configure(nullIgbp, generation, 0, nullptr);
+ mOutputBufferQueue->configure(nullIgbp, generation, 0, maxDequeueCount, nullptr);
} else if (surface->getUniqueId(&bqId) != OK) {
LOG(ERROR) << "setOutputSurface -- "
"cannot obtain bufferqueue id.";
bqId = 0;
- mOutputBufferQueue->configure(nullIgbp, generation, 0, nullptr);
+ mOutputBufferQueue->configure(nullIgbp, generation, 0, maxDequeueCount, nullptr);
} else {
- mOutputBufferQueue->configure(surface, generation, bqId, nullptr);
+ mOutputBufferQueue->configure(surface, generation, bqId, maxDequeueCount, mBase1_2 ?
+ &syncObj : nullptr);
}
ALOGD("surface generation remote change %u HAL ver: %s",
generation, syncObj ? "1.2" : "1.0");
diff --git a/media/codec2/hidl/client/include/codec2/hidl/client.h b/media/codec2/hidl/client/include/codec2/hidl/client.h
index eca268e..347e58a 100644
--- a/media/codec2/hidl/client/include/codec2/hidl/client.h
+++ b/media/codec2/hidl/client/include/codec2/hidl/client.h
@@ -384,7 +384,8 @@
c2_status_t setOutputSurface(
C2BlockPool::local_id_t blockPoolId,
const sp<IGraphicBufferProducer>& surface,
- uint32_t generation);
+ uint32_t generation,
+ int maxDequeueBufferCount);
// Extract a slot number from of the block, then call
// IGraphicBufferProducer::queueBuffer().
diff --git a/media/codec2/hidl/client/include/codec2/hidl/output.h b/media/codec2/hidl/client/include/codec2/hidl/output.h
index 0f03b36..877148a 100644
--- a/media/codec2/hidl/client/include/codec2/hidl/output.h
+++ b/media/codec2/hidl/client/include/codec2/hidl/output.h
@@ -47,6 +47,7 @@
bool configure(const sp<IGraphicBufferProducer>& igbp,
uint32_t generation,
uint64_t bqId,
+ int maxDequeueBufferCount,
std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj);
// Render a graphic block to current surface.
diff --git a/media/codec2/hidl/client/output.cpp b/media/codec2/hidl/client/output.cpp
index 7df0da2..283ed8d 100644
--- a/media/codec2/hidl/client/output.cpp
+++ b/media/codec2/hidl/client/output.cpp
@@ -178,6 +178,7 @@
bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
uint32_t generation,
uint64_t bqId,
+ int maxDequeueBufferCount,
std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj) {
uint64_t consumerUsage = 0;
if (igbp->getConsumerUsage(&consumerUsage) != OK) {
@@ -219,6 +220,20 @@
{
std::scoped_lock<std::mutex> l(mMutex);
if (generation == mGeneration) {
+ // case of old BlockPool destruction
+ C2SyncVariables *var = mSyncMem ? mSyncMem->mem() : nullptr;
+ if (var) {
+ *syncObj = std::make_shared<V1_2::SurfaceSyncObj>();
+ (*syncObj)->bqId = bqId;
+ (*syncObj)->syncMemory = mSyncMem->handle();
+ (*syncObj)->generationId = generation;
+ (*syncObj)->consumerUsage = consumerUsage;
+ mMaxDequeueBufferCount = maxDequeueBufferCount;
+ var->lock();
+ var->setSyncStatusLocked(C2SyncVariables::STATUS_INIT);
+ var->setInitialDequeueCountLocked(mMaxDequeueBufferCount, 0);
+ var->unlock();
+ }
return false;
}
std::shared_ptr<C2SurfaceSyncMemory> oldMem = mSyncMem;
@@ -238,6 +253,7 @@
mGeneration = generation;
mBqId = bqId;
mOwner = std::make_shared<int>(0);
+ mMaxDequeueBufferCount = maxDequeueBufferCount;
for (int i = 0; i < BufferQueueDefs::NUM_BUFFER_SLOTS; ++i) {
if (mBqId == 0 || !mBuffers[i]) {
continue;
@@ -288,7 +304,9 @@
mPoolDatas[i] = poolDatas[i];
}
if (newSync) {
- newSync->setInitialDequeueCount(mMaxDequeueBufferCount, success);
+ newSync->lock();
+ newSync->setInitialDequeueCountLocked(mMaxDequeueBufferCount, success);
+ newSync->unlock();
}
}
ALOGD("remote graphic buffer migration %zu/%zu",
@@ -452,6 +470,7 @@
syncVar->unlock();
}
mMutex.unlock();
+ ALOGD("set max dequeue count %d from update", maxDequeueBufferCount);
}
} // namespace c2