diff options
author | Sungtak Lee <taklee@google.com> | 2022-06-17 04:30:14 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-06-17 04:30:14 +0000 |
commit | 5b33db054b4a0423d42e5b90a2898c8da6ff52ab (patch) | |
tree | eb4f70c54f548971fb903fa37925ae2e3996c874 | |
parent | 96368f0763c70f3fa0d26efd7ea964c98e9bf52d (diff) | |
parent | 8ceef4d17fad183bafc2afb587bdca667c4cff1e (diff) | |
download | av-5b33db054b4a0423d42e5b90a2898c8da6ff52ab.tar.gz |
Merge "CCodecBufferChannel: Report an error after reallocation failures" into tm-dev
-rw-r--r-- | media/codec2/sfplugin/CCodecBufferChannel.cpp | 13 |
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); |