C2BqPool: Do not call cancelBuffer() after invalidated
Do not call IGBP::cancelBuffer() from C2BqPool based blocks after the
Pool is invalidated.
Bug: 304183768
Test: atest android.media.decoder.cts.AdaptivePlaybackTest
Change-Id: Ic03a42077c5e752722c3c7c654e03c4f6fedde4d
diff --git a/media/codec2/vndk/platform/C2BqBuffer.cpp b/media/codec2/vndk/platform/C2BqBuffer.cpp
index 960fa79..62b0ab5 100644
--- a/media/codec2/vndk/platform/C2BqBuffer.cpp
+++ b/media/codec2/vndk/platform/C2BqBuffer.cpp
@@ -35,6 +35,7 @@
#include <C2FenceFactory.h>
#include <C2SurfaceSyncObj.h>
+#include <atomic>
#include <list>
#include <map>
#include <mutex>
@@ -753,8 +754,8 @@
}
void invalidate() {
- std::scoped_lock<std::mutex> lock(mMutex);
mInvalidated = true;
+ mIgbpValidityToken.reset();
}
private:
@@ -794,7 +795,7 @@
// if the token has been expired, the buffers will not call IGBP::cancelBuffer()
// when they are no longer used.
std::shared_ptr<int> mIgbpValidityToken;
- bool mInvalidated{false};
+ std::atomic<bool> mInvalidated{false};
};
C2BufferQueueBlockPoolData::C2BufferQueueBlockPoolData(