CCodecBufferChannel: Report an error after reallocation failures
Output buffer conversion failures trigger endless reallocations of
output buffers. Report an error in the case.
Bug: 235610661
Bug: 236087159
Change-Id: Id2b6a25f4fdfa244dc64b15fc19c2fa899a61bae
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index dc9f848..5ecb130 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -2041,6 +2041,9 @@
sp<MediaCodecBuffer> outBuffer;
std::shared_ptr<C2Buffer> c2Buffer;
+ constexpr int kMaxReallocTry = 5;
+ int reallocTryNum = 0;
+
while (true) {
Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
@@ -2048,6 +2051,9 @@
}
action = output->buffers->popFromStashAndRegister(
&c2Buffer, &index, &outBuffer);
+ if (action != OutputBuffers::REALLOCATE) {
+ reallocTryNum = 0;
+ }
switch (action) {
case OutputBuffers::SKIP:
return;
@@ -2058,6 +2064,13 @@
mCallback->onOutputBufferAvailable(index, outBuffer);
break;
case OutputBuffers::REALLOCATE:
+ if (++reallocTryNum > kMaxReallocTry) {
+ output.unlock();
+ ALOGE("[%s] sendOutputBuffers: tried %d realloc and failed",
+ mName, kMaxReallocTry);
+ mCCodecCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
+ return;
+ }
if (!output->buffers->isArrayMode()) {
output->buffers =
output->buffers->toArrayMode(output->numSlots);