summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSungtak Lee <taklee@google.com>2022-06-17 04:30:14 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-06-17 04:30:14 +0000
commit5b33db054b4a0423d42e5b90a2898c8da6ff52ab (patch)
treeeb4f70c54f548971fb903fa37925ae2e3996c874
parent96368f0763c70f3fa0d26efd7ea964c98e9bf52d (diff)
parent8ceef4d17fad183bafc2afb587bdca667c4cff1e (diff)
downloadav-5b33db054b4a0423d42e5b90a2898c8da6ff52ab.tar.gz
Merge "CCodecBufferChannel: Report an error after reallocation failures" into tm-dev
-rw-r--r--media/codec2/sfplugin/CCodecBufferChannel.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index dc9f84842f..5ecb1307f0 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -2041,6 +2041,9 @@ void CCodecBufferChannel::sendOutputBuffers() {
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 @@ void CCodecBufferChannel::sendOutputBuffers() {
}
action = output->buffers->popFromStashAndRegister(
&c2Buffer, &index, &outBuffer);
+ if (action != OutputBuffers::REALLOCATE) {
+ reallocTryNum = 0;
+ }
switch (action) {
case OutputBuffers::SKIP:
return;
@@ -2058,6 +2064,13 @@ void CCodecBufferChannel::sendOutputBuffers() {
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);