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);