Loading media/codec2/components/avc/C2SoftAvcEnc.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -216,7 +216,7 @@ public: }; uint64_t mbs = uint64_t((size.v.width + 15) / 16) * ((size.v.height + 15) / 16); float mbsPerSec = float(mbs) / frameRate.v.value; float mbsPerSec = float(mbs) * frameRate.v.value; // Check if the supplied level meets the MB / bitrate requirements. If // not, update the level with the lowest level meeting the requirements. Loading media/codec2/sfplugin/CCodec.cpp +32 −2 Original line number Diff line number Diff line Loading @@ -1024,7 +1024,7 @@ status_t CCodec::setupInputSurface(const std::shared_ptr<InputSurfaceWrapper> &s ALOGD("ISConfig: no configuration"); } return surface->start(); return OK; } void CCodec::initiateSetInputSurface(const sp<PersistentSurface> &surface) { Loading Loading @@ -1111,12 +1111,20 @@ void CCodec::start() { } sp<AMessage> inputFormat; sp<AMessage> outputFormat; status_t err2 = OK; { Mutexed<Config>::Locked config(mConfig); inputFormat = config->mInputFormat; outputFormat = config->mOutputFormat; if (config->mInputSurface) { err2 = config->mInputSurface->start(); } } if (err2 != OK) { mCallback->onError(err2, ACTION_CODE_FATAL); return; } status_t err2 = mChannel->start(inputFormat, outputFormat); err2 = mChannel->start(inputFormat, outputFormat); if (err2 != OK) { mCallback->onError(err2, ACTION_CODE_FATAL); return; Loading Loading @@ -1190,6 +1198,13 @@ void CCodec::stop() { mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL); } { Mutexed<Config>::Locked config(mConfig); if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; } } { Mutexed<State>::Locked state(mState); if (state->get() == STOPPING) { Loading @@ -1200,6 +1215,7 @@ void CCodec::stop() { } void CCodec::initiateRelease(bool sendCallback /* = true */) { bool clearInputSurfaceIfNeeded = false; { Mutexed<State>::Locked state(mState); if (state->get() == RELEASED || state->get() == RELEASING) { Loading @@ -1221,9 +1237,23 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) { } return; } if (state->get() == STARTING || state->get() == RUNNING || state->get() == STOPPING) { // Input surface may have been started, so clean up is needed. clearInputSurfaceIfNeeded = true; } state->set(RELEASING); } if (clearInputSurfaceIfNeeded) { Mutexed<Config>::Locked config(mConfig); if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; } } mChannel->stop(); // thiz holds strong ref to this while the thread is running. sp<CCodec> thiz(this); Loading media/codec2/sfplugin/CCodecBufferChannel.cpp +65 −32 Original line number Diff line number Diff line Loading @@ -128,7 +128,9 @@ public: * and released successfully. */ virtual bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) = 0; const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) = 0; /** * Release the buffer that is no longer used by the codec process. Return Loading Loading @@ -455,13 +457,18 @@ public: * \return true if the buffer is successfully released from a slot * false otherwise */ bool releaseSlot(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) { bool releaseSlot( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) { sp<Codec2Buffer> clientBuffer; size_t index = mBuffers.size(); for (size_t i = 0; i < mBuffers.size(); ++i) { if (mBuffers[i].clientBuffer == buffer) { clientBuffer = mBuffers[i].clientBuffer; if (release) { mBuffers[i].clientBuffer.clear(); } index = i; break; } Loading @@ -470,8 +477,11 @@ public: ALOGV("[%s] %s: No matching buffer found", mName, __func__); return false; } std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer(); std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock(); if (!result) { result = clientBuffer->asC2Buffer(); mBuffers[index].compBuffer = result; } if (c2buffer) { *c2buffer = result; } Loading @@ -485,8 +495,8 @@ public: if (!compBuffer || compBuffer != c2buffer) { continue; } mBuffers[i].clientBuffer = nullptr; mBuffers[i].compBuffer.reset(); ALOGV("[%s] codec released buffer #%zu", mName, i); return true; } ALOGV("[%s] codec released an unknown buffer", mName); Loading Loading @@ -597,7 +607,10 @@ public: * \return true if the buffer is successfully returned * false otherwise */ bool returnBuffer(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) { bool returnBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) { sp<Codec2Buffer> clientBuffer; size_t index = mBuffers.size(); for (size_t i = 0; i < mBuffers.size(); ++i) { Loading @@ -606,7 +619,9 @@ public: ALOGD("[%s] Client returned a buffer it does not own according to our record: %zu", mName, i); } clientBuffer = mBuffers[i].clientBuffer; if (release) { mBuffers[i].ownedByClient = false; } index = i; break; } Loading @@ -616,8 +631,11 @@ public: return false; } ALOGV("[%s] %s: matching buffer found (index=%zu)", mName, __func__, index); std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer(); std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock(); if (!result) { result = clientBuffer->asC2Buffer(); mBuffers[index].compBuffer = result; } if (c2buffer) { *c2buffer = result; } Loading @@ -636,9 +654,9 @@ public: // This should not happen. ALOGD("[%s] codec released a buffer owned by client " "(index %zu)", mName, i); mBuffers[i].ownedByClient = false; } mBuffers[i].compBuffer.reset(); ALOGV("[%s] codec released buffer #%zu(array mode)", mName, i); return true; } } Loading Loading @@ -723,8 +741,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.returnBuffer(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.returnBuffer(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -765,8 +785,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -801,7 +823,7 @@ public: return std::move(array); } virtual sp<Codec2Buffer> alloc(size_t size) const { virtual sp<Codec2Buffer> alloc(size_t size) { C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }; std::shared_ptr<C2LinearBlock> block; Loading Loading @@ -850,11 +872,12 @@ public: ~EncryptedLinearInputBuffers() override { } sp<Codec2Buffer> alloc(size_t size) const override { sp<Codec2Buffer> alloc(size_t size) override { sp<IMemory> memory; for (const Entry &entry : mMemoryVector) { if (entry.block.expired()) { memory = entry.memory; size_t slot = 0; for (; slot < mMemoryVector.size(); ++slot) { if (mMemoryVector[slot].block.expired()) { memory = mMemoryVector[slot].memory; break; } } Loading @@ -864,10 +887,11 @@ public: std::shared_ptr<C2LinearBlock> block; c2_status_t err = mPool->fetchLinearBlock(size, mUsage, &block); if (err != C2_OK) { if (err != C2_OK || block == nullptr) { return nullptr; } mMemoryVector[slot].block = block; return new EncryptedLinearBlockBuffer(mFormat, block, memory, mHeapSeqNum); } Loading Loading @@ -907,8 +931,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -971,14 +997,17 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( const std::shared_ptr<C2Buffer> &c2buffer) override { return mImpl.expireComponentBuffer(c2buffer); } void flush() override { // This is no-op by default unless we're in array mode where we need to keep // track of the flushed work. Loading Loading @@ -1016,7 +1045,7 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *) override { const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *, bool) override { return false; } Loading Loading @@ -1111,7 +1140,7 @@ public: bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.returnBuffer(buffer, c2buffer); return mImpl.returnBuffer(buffer, c2buffer, true); } void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) override { Loading Loading @@ -1193,8 +1222,9 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer, true); } void flush( Loading Loading @@ -1626,7 +1656,7 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer if (buffer->size() > 0u) { Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); std::shared_ptr<C2Buffer> c2buffer; if (!(*buffers)->releaseBuffer(buffer, &c2buffer)) { if (!(*buffers)->releaseBuffer(buffer, &c2buffer, false)) { return -ENOENT; } work->input.buffers.push_back(c2buffer); Loading Loading @@ -1664,6 +1694,10 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer } if (err == C2_OK) { mCCodecCallback->onWorkQueued(eos); Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); bool released = (*buffers)->releaseBuffer(buffer, nullptr, true); ALOGV("[%s] queueInputBuffer: buffer %sreleased", mName, released ? "" : "not "); } feedInputBufferIfAvailableInternal(); Loading Loading @@ -1992,7 +2026,7 @@ status_t CCodecBufferChannel::discardBuffer(const sp<MediaCodecBuffer> &buffer) bool released = false; { Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr)) { if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr, true)) { buffers.unlock(); released = true; mAvailablePipelineCapacity.freeInputSlots(1, "discardBuffer"); Loading Loading @@ -2457,7 +2491,6 @@ void CCodecBufferChannel::stop() { mSync.stop(); mFirstValidFrameIndex = mFrameIndex.load(std::memory_order_relaxed); if (mInputSurface != nullptr) { mInputSurface->disconnect(); mInputSurface.reset(); } } Loading media/codec2/sfplugin/Codec2InfoBuilder.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <cutils/native_handle.h> #include <media/omx/1.0/WOmxNode.h> #include <media/stagefright/MediaCodecConstants.h> #include <media/stagefright/foundation/ALookup.h> #include <media/stagefright/foundation/MediaDefs.h> #include <media/stagefright/omx/OMXUtils.h> #include <media/stagefright/xmlparser/MediaCodecsXmlParser.h> Loading Loading @@ -299,7 +300,6 @@ void buildOmxInfo(const MediaCodecsXmlParser& parser, // OMX components don't have aliases for (const MediaCodecsXmlParser::Type &type : properties.typeMap) { const std::string &mediaType = type.first; std::unique_ptr<MediaCodecInfo::CapabilitiesWriter> caps = info->addMediaType(mediaType.c_str()); const MediaCodecsXmlParser::AttributeMap &attrMap = type.second; Loading Loading @@ -376,7 +376,7 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) { } bool surfaceTest(Codec2Client::CreateInputSurface()); if (option == 0 || !surfaceTest) { if (option == 0 || (option != 4 && !surfaceTest)) { buildOmxInfo(parser, writer); } Loading media/codec2/sfplugin/utils/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,10 @@ cc_library_shared { "libutils", ], static_libs: [ "libyuv_static", ], sanitize: { cfi: true, misc_undefined: [ Loading Loading
media/codec2/components/avc/C2SoftAvcEnc.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -216,7 +216,7 @@ public: }; uint64_t mbs = uint64_t((size.v.width + 15) / 16) * ((size.v.height + 15) / 16); float mbsPerSec = float(mbs) / frameRate.v.value; float mbsPerSec = float(mbs) * frameRate.v.value; // Check if the supplied level meets the MB / bitrate requirements. If // not, update the level with the lowest level meeting the requirements. Loading
media/codec2/sfplugin/CCodec.cpp +32 −2 Original line number Diff line number Diff line Loading @@ -1024,7 +1024,7 @@ status_t CCodec::setupInputSurface(const std::shared_ptr<InputSurfaceWrapper> &s ALOGD("ISConfig: no configuration"); } return surface->start(); return OK; } void CCodec::initiateSetInputSurface(const sp<PersistentSurface> &surface) { Loading Loading @@ -1111,12 +1111,20 @@ void CCodec::start() { } sp<AMessage> inputFormat; sp<AMessage> outputFormat; status_t err2 = OK; { Mutexed<Config>::Locked config(mConfig); inputFormat = config->mInputFormat; outputFormat = config->mOutputFormat; if (config->mInputSurface) { err2 = config->mInputSurface->start(); } } if (err2 != OK) { mCallback->onError(err2, ACTION_CODE_FATAL); return; } status_t err2 = mChannel->start(inputFormat, outputFormat); err2 = mChannel->start(inputFormat, outputFormat); if (err2 != OK) { mCallback->onError(err2, ACTION_CODE_FATAL); return; Loading Loading @@ -1190,6 +1198,13 @@ void CCodec::stop() { mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL); } { Mutexed<Config>::Locked config(mConfig); if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; } } { Mutexed<State>::Locked state(mState); if (state->get() == STOPPING) { Loading @@ -1200,6 +1215,7 @@ void CCodec::stop() { } void CCodec::initiateRelease(bool sendCallback /* = true */) { bool clearInputSurfaceIfNeeded = false; { Mutexed<State>::Locked state(mState); if (state->get() == RELEASED || state->get() == RELEASING) { Loading @@ -1221,9 +1237,23 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) { } return; } if (state->get() == STARTING || state->get() == RUNNING || state->get() == STOPPING) { // Input surface may have been started, so clean up is needed. clearInputSurfaceIfNeeded = true; } state->set(RELEASING); } if (clearInputSurfaceIfNeeded) { Mutexed<Config>::Locked config(mConfig); if (config->mInputSurface) { config->mInputSurface->disconnect(); config->mInputSurface = nullptr; } } mChannel->stop(); // thiz holds strong ref to this while the thread is running. sp<CCodec> thiz(this); Loading
media/codec2/sfplugin/CCodecBufferChannel.cpp +65 −32 Original line number Diff line number Diff line Loading @@ -128,7 +128,9 @@ public: * and released successfully. */ virtual bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) = 0; const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) = 0; /** * Release the buffer that is no longer used by the codec process. Return Loading Loading @@ -455,13 +457,18 @@ public: * \return true if the buffer is successfully released from a slot * false otherwise */ bool releaseSlot(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) { bool releaseSlot( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) { sp<Codec2Buffer> clientBuffer; size_t index = mBuffers.size(); for (size_t i = 0; i < mBuffers.size(); ++i) { if (mBuffers[i].clientBuffer == buffer) { clientBuffer = mBuffers[i].clientBuffer; if (release) { mBuffers[i].clientBuffer.clear(); } index = i; break; } Loading @@ -470,8 +477,11 @@ public: ALOGV("[%s] %s: No matching buffer found", mName, __func__); return false; } std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer(); std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock(); if (!result) { result = clientBuffer->asC2Buffer(); mBuffers[index].compBuffer = result; } if (c2buffer) { *c2buffer = result; } Loading @@ -485,8 +495,8 @@ public: if (!compBuffer || compBuffer != c2buffer) { continue; } mBuffers[i].clientBuffer = nullptr; mBuffers[i].compBuffer.reset(); ALOGV("[%s] codec released buffer #%zu", mName, i); return true; } ALOGV("[%s] codec released an unknown buffer", mName); Loading Loading @@ -597,7 +607,10 @@ public: * \return true if the buffer is successfully returned * false otherwise */ bool returnBuffer(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) { bool returnBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) { sp<Codec2Buffer> clientBuffer; size_t index = mBuffers.size(); for (size_t i = 0; i < mBuffers.size(); ++i) { Loading @@ -606,7 +619,9 @@ public: ALOGD("[%s] Client returned a buffer it does not own according to our record: %zu", mName, i); } clientBuffer = mBuffers[i].clientBuffer; if (release) { mBuffers[i].ownedByClient = false; } index = i; break; } Loading @@ -616,8 +631,11 @@ public: return false; } ALOGV("[%s] %s: matching buffer found (index=%zu)", mName, __func__, index); std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer(); std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock(); if (!result) { result = clientBuffer->asC2Buffer(); mBuffers[index].compBuffer = result; } if (c2buffer) { *c2buffer = result; } Loading @@ -636,9 +654,9 @@ public: // This should not happen. ALOGD("[%s] codec released a buffer owned by client " "(index %zu)", mName, i); mBuffers[i].ownedByClient = false; } mBuffers[i].compBuffer.reset(); ALOGV("[%s] codec released buffer #%zu(array mode)", mName, i); return true; } } Loading Loading @@ -723,8 +741,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.returnBuffer(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.returnBuffer(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -765,8 +785,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -801,7 +823,7 @@ public: return std::move(array); } virtual sp<Codec2Buffer> alloc(size_t size) const { virtual sp<Codec2Buffer> alloc(size_t size) { C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE }; std::shared_ptr<C2LinearBlock> block; Loading Loading @@ -850,11 +872,12 @@ public: ~EncryptedLinearInputBuffers() override { } sp<Codec2Buffer> alloc(size_t size) const override { sp<Codec2Buffer> alloc(size_t size) override { sp<IMemory> memory; for (const Entry &entry : mMemoryVector) { if (entry.block.expired()) { memory = entry.memory; size_t slot = 0; for (; slot < mMemoryVector.size(); ++slot) { if (mMemoryVector[slot].block.expired()) { memory = mMemoryVector[slot].memory; break; } } Loading @@ -864,10 +887,11 @@ public: std::shared_ptr<C2LinearBlock> block; c2_status_t err = mPool->fetchLinearBlock(size, mUsage, &block); if (err != C2_OK) { if (err != C2_OK || block == nullptr) { return nullptr; } mMemoryVector[slot].block = block; return new EncryptedLinearBlockBuffer(mFormat, block, memory, mHeapSeqNum); } Loading Loading @@ -907,8 +931,10 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( Loading Loading @@ -971,14 +997,17 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer, bool release) override { return mImpl.releaseSlot(buffer, c2buffer, release); } bool expireComponentBuffer( const std::shared_ptr<C2Buffer> &c2buffer) override { return mImpl.expireComponentBuffer(c2buffer); } void flush() override { // This is no-op by default unless we're in array mode where we need to keep // track of the flushed work. Loading Loading @@ -1016,7 +1045,7 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *) override { const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *, bool) override { return false; } Loading Loading @@ -1111,7 +1140,7 @@ public: bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.returnBuffer(buffer, c2buffer); return mImpl.returnBuffer(buffer, c2buffer, true); } void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) override { Loading Loading @@ -1193,8 +1222,9 @@ public: } bool releaseBuffer( const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer); const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override { return mImpl.releaseSlot(buffer, c2buffer, true); } void flush( Loading Loading @@ -1626,7 +1656,7 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer if (buffer->size() > 0u) { Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); std::shared_ptr<C2Buffer> c2buffer; if (!(*buffers)->releaseBuffer(buffer, &c2buffer)) { if (!(*buffers)->releaseBuffer(buffer, &c2buffer, false)) { return -ENOENT; } work->input.buffers.push_back(c2buffer); Loading Loading @@ -1664,6 +1694,10 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer } if (err == C2_OK) { mCCodecCallback->onWorkQueued(eos); Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); bool released = (*buffers)->releaseBuffer(buffer, nullptr, true); ALOGV("[%s] queueInputBuffer: buffer %sreleased", mName, released ? "" : "not "); } feedInputBufferIfAvailableInternal(); Loading Loading @@ -1992,7 +2026,7 @@ status_t CCodecBufferChannel::discardBuffer(const sp<MediaCodecBuffer> &buffer) bool released = false; { Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers); if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr)) { if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr, true)) { buffers.unlock(); released = true; mAvailablePipelineCapacity.freeInputSlots(1, "discardBuffer"); Loading Loading @@ -2457,7 +2491,6 @@ void CCodecBufferChannel::stop() { mSync.stop(); mFirstValidFrameIndex = mFrameIndex.load(std::memory_order_relaxed); if (mInputSurface != nullptr) { mInputSurface->disconnect(); mInputSurface.reset(); } } Loading
media/codec2/sfplugin/Codec2InfoBuilder.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <cutils/native_handle.h> #include <media/omx/1.0/WOmxNode.h> #include <media/stagefright/MediaCodecConstants.h> #include <media/stagefright/foundation/ALookup.h> #include <media/stagefright/foundation/MediaDefs.h> #include <media/stagefright/omx/OMXUtils.h> #include <media/stagefright/xmlparser/MediaCodecsXmlParser.h> Loading Loading @@ -299,7 +300,6 @@ void buildOmxInfo(const MediaCodecsXmlParser& parser, // OMX components don't have aliases for (const MediaCodecsXmlParser::Type &type : properties.typeMap) { const std::string &mediaType = type.first; std::unique_ptr<MediaCodecInfo::CapabilitiesWriter> caps = info->addMediaType(mediaType.c_str()); const MediaCodecsXmlParser::AttributeMap &attrMap = type.second; Loading Loading @@ -376,7 +376,7 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) { } bool surfaceTest(Codec2Client::CreateInputSurface()); if (option == 0 || !surfaceTest) { if (option == 0 || (option != 4 && !surfaceTest)) { buildOmxInfo(parser, writer); } Loading
media/codec2/sfplugin/utils/Android.bp +4 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,10 @@ cc_library_shared { "libutils", ], static_libs: [ "libyuv_static", ], sanitize: { cfi: true, misc_undefined: [ Loading