Codec2Client: Do not overlap setOutputSurface
setOutputSurface() can race between a normal surface change and a release
surface change. stopUseOutputSurface() may race with setOutputSurface().
Guarantee they run mutually exclusively.
Bug: 202903117
Test: atest android.media.cts.MediaCodecTest#testAsyncRelease
Test: atest android.media.decoder.cts.AdaptivePlaybackTest
Change-Id: Ia1262fccd0c96530f7b8f0056ea2c3acb448a1a2
diff --git a/media/codec2/hidl/client/client.cpp b/media/codec2/hidl/client/client.cpp
index 198894d..0acf7d7 100644
--- a/media/codec2/hidl/client/client.cpp
+++ b/media/codec2/hidl/client/client.cpp
@@ -1502,6 +1502,7 @@
igbp = new B2HGraphicBufferProducer2(surface);
}
+ std::scoped_lock lock(mOutputMutex);
std::shared_ptr<SurfaceSyncObj> syncObj;
if (!surface) {
@@ -1588,6 +1589,7 @@
void Codec2Client::Component::stopUsingOutputSurface(
C2BlockPool::local_id_t blockPoolId) {
+ std::scoped_lock lock(mOutputMutex);
mOutputBufferQueue->stop();
Return<Status> transStatus = mBase1_0->setOutputSurface(
static_cast<uint64_t>(blockPoolId), nullptr);