diff --git a/media/codec2/sfplugin/CCodecBuffers.cpp b/media/codec2/sfplugin/CCodecBuffers.cpp index 5ebd5bd317..26c702ddc0 100644 --- a/media/codec2/sfplugin/CCodecBuffers.cpp +++ b/media/codec2/sfplugin/CCodecBuffers.cpp @@ -439,6 +439,10 @@ size_t BuffersArrayImpl::numClientBuffers() const { }); } +size_t BuffersArrayImpl::arraySize() const { + return mBuffers.size(); +} + // InputBuffersArray void InputBuffersArray::initialize( @@ -883,11 +887,24 @@ void OutputBuffersArray::realloc(const std::shared_ptr &c2buffer) { mAlloc = [format = mFormat, size] { return new LocalLinearBuffer(format, new ABuffer(size)); }; + ALOGD("[%s] reallocating with linear buffer of size %u", mName, size); break; } - // TODO: add support - case C2BufferData::GRAPHIC: [[fallthrough]]; + case C2BufferData::GRAPHIC: { + // This is only called for RawGraphicOutputBuffers. + mAlloc = [format = mFormat, + lbp = LocalBufferPool::Create(kMaxLinearBufferSize * mImpl.arraySize())] { + return ConstGraphicBlockBuffer::AllocateEmpty( + format, + [lbp](size_t capacity) { + return lbp->newBuffer(capacity); + }); + }; + ALOGD("[%s] reallocating with graphic buffer: format = %s", + mName, mFormat->debugString().c_str()); + break; + } case C2BufferData::INVALID: [[fallthrough]]; case C2BufferData::LINEAR_CHUNKS: [[fallthrough]]; diff --git a/media/codec2/sfplugin/CCodecBuffers.h b/media/codec2/sfplugin/CCodecBuffers.h index e4f2809456..2cb6b813c1 100644 --- a/media/codec2/sfplugin/CCodecBuffers.h +++ b/media/codec2/sfplugin/CCodecBuffers.h @@ -478,6 +478,11 @@ public: */ size_t numClientBuffers() const; + /** + * Return the size of the array. + */ + size_t arraySize() const; + private: std::string mImplName; ///< name for debugging const char *mName; ///< C-string version of name