diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-02-09 08:06:10 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-02-09 08:06:10 +0000 |
commit | da0c6e7c231c6254360d396c9ded5654aade24d5 (patch) | |
tree | cd553f5673ad56bbca57fdb51975c83db760cd6a | |
parent | 5ad762183344b4a84040a8cf0dbec825e1b2e219 (diff) | |
parent | dea9f57872d225ce6f3cdb3d63112acebc8f924a (diff) | |
download | av-android12-mainline-resolv-release.tar.gz |
Snap for 8164116 from dea9f57872d225ce6f3cdb3d63112acebc8f924a to mainline-resolv-releaseandroid-mainline-12.0.0_r94android12-mainline-resolv-release
Change-Id: I878e24745644cc929c48748855c4585434d4dd18
-rw-r--r-- | media/codec2/components/gav1/C2SoftGav1Dec.cpp | 11 | ||||
-rw-r--r-- | media/codec2/components/hevc/C2SoftHevcDec.cpp | 8 | ||||
-rw-r--r-- | media/codec2/vndk/C2AllocatorIon.cpp | 37 | ||||
-rw-r--r-- | media/libheif/HeifDecoderImpl.cpp | 9 |
4 files changed, 41 insertions, 24 deletions
diff --git a/media/codec2/components/gav1/C2SoftGav1Dec.cpp b/media/codec2/components/gav1/C2SoftGav1Dec.cpp index 7bd33581d9..386e097612 100644 --- a/media/codec2/components/gav1/C2SoftGav1Dec.cpp +++ b/media/codec2/components/gav1/C2SoftGav1Dec.cpp @@ -36,6 +36,8 @@ constexpr uint8_t NEUTRAL_UV_VALUE = 128; // codecname set and passed in as a compile flag from Android.bp constexpr char COMPONENT_NAME[] = CODECNAME; +constexpr size_t kMinInputBufferSize = 2 * 1024 * 1024; + class C2SoftGav1Dec::IntfImpl : public SimpleInterface<void>::BaseParams { public: explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper) @@ -114,8 +116,7 @@ class C2SoftGav1Dec::IntfImpl : public SimpleInterface<void>::BaseParams { .build()); addParameter(DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE) - .withDefault(new C2StreamMaxBufferSizeInfo::input( - 0u, 320 * 240 * 3 / 4)) + .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, kMinInputBufferSize)) .withFields({ C2F(mMaxInputSize, value).any(), }) @@ -231,9 +232,9 @@ class C2SoftGav1Dec::IntfImpl : public SimpleInterface<void>::BaseParams { bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me, const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) { (void)mayBlock; - // assume compression ratio of 2 - me.set().value = - (((maxSize.v.width + 63) / 64) * ((maxSize.v.height + 63) / 64) * 3072); + // assume compression ratio of 2, but enforce a floor + me.set().value = c2_max((((maxSize.v.width + 63) / 64) + * ((maxSize.v.height + 63) / 64) * 3072), kMinInputBufferSize); return C2R::Ok(); } diff --git a/media/codec2/components/hevc/C2SoftHevcDec.cpp b/media/codec2/components/hevc/C2SoftHevcDec.cpp index 5f5b2efc46..2a6adcab3b 100644 --- a/media/codec2/components/hevc/C2SoftHevcDec.cpp +++ b/media/codec2/components/hevc/C2SoftHevcDec.cpp @@ -34,6 +34,7 @@ namespace { constexpr char COMPONENT_NAME[] = "c2.android.hevc.decoder"; constexpr uint32_t kDefaultOutputDelay = 8; constexpr uint32_t kMaxOutputDelay = 16; +constexpr size_t kMinInputBufferSize = 2 * 1024 * 1024; } // namespace class C2SoftHevcDec::IntfImpl : public SimpleInterface<void>::BaseParams { @@ -108,7 +109,7 @@ public: addParameter( DefineParam(mMaxInputSize, C2_PARAMKEY_INPUT_MAX_BUFFER_SIZE) - .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, 320 * 240 * 3 / 4)) + .withDefault(new C2StreamMaxBufferSizeInfo::input(0u, kMinInputBufferSize)) .withFields({ C2F(mMaxInputSize, value).any(), }) @@ -220,8 +221,9 @@ public: static C2R MaxInputSizeSetter(bool mayBlock, C2P<C2StreamMaxBufferSizeInfo::input> &me, const C2P<C2StreamMaxPictureSizeTuning::output> &maxSize) { (void)mayBlock; - // assume compression ratio of 2 - me.set().value = (((maxSize.v.width + 63) / 64) * ((maxSize.v.height + 63) / 64) * 3072); + // assume compression ratio of 2, but enforce a floor + me.set().value = c2_max((((maxSize.v.width + 63) / 64) + * ((maxSize.v.height + 63) / 64) * 3072), kMinInputBufferSize); return C2R::Ok(); } diff --git a/media/codec2/vndk/C2AllocatorIon.cpp b/media/codec2/vndk/C2AllocatorIon.cpp index 77b265a8ec..7b593eeeeb 100644 --- a/media/codec2/vndk/C2AllocatorIon.cpp +++ b/media/codec2/vndk/C2AllocatorIon.cpp @@ -207,6 +207,7 @@ public: c2_status_t err = mapInternal(mapSize, mapOffset, alignmentBytes, prot, flags, &(map.addr), addr); if (map.addr) { + std::lock_guard<std::mutex> guard(mMutexMappings); mMappings.push_back(map); } return err; @@ -217,22 +218,26 @@ public: ALOGD("tried to unmap unmapped buffer"); return C2_NOT_FOUND; } - for (auto it = mMappings.begin(); it != mMappings.end(); ++it) { - if (addr != (uint8_t *)it->addr + it->alignmentBytes || - size + it->alignmentBytes != it->size) { - continue; + { // Scope for the lock_guard of mMutexMappings. + std::lock_guard<std::mutex> guard(mMutexMappings); + for (auto it = mMappings.begin(); it != mMappings.end(); ++it) { + if (addr != (uint8_t *)it->addr + it->alignmentBytes || + size + it->alignmentBytes != it->size) { + continue; + } + int err = munmap(it->addr, it->size); + if (err != 0) { + ALOGD("munmap failed"); + return c2_map_errno<EINVAL>(errno); + } + if (fence) { + *fence = C2Fence(); // not using fences + } + (void)mMappings.erase(it); + ALOGV("successfully unmapped: addr=%p size=%zu fd=%d", addr, size, + mHandle.bufferFd()); + return C2_OK; } - int err = munmap(it->addr, it->size); - if (err != 0) { - ALOGD("munmap failed"); - return c2_map_errno<EINVAL>(errno); - } - if (fence) { - *fence = C2Fence(); // not using fences - } - (void)mMappings.erase(it); - ALOGV("successfully unmapped: addr=%p size=%zu fd=%d", addr, size, mHandle.bufferFd()); - return C2_OK; } ALOGD("unmap failed to find specified map"); return C2_BAD_VALUE; @@ -241,6 +246,7 @@ public: virtual ~Impl() { if (!mMappings.empty()) { ALOGD("Dangling mappings!"); + std::lock_guard<std::mutex> guard(mMutexMappings); for (const Mapping &map : mMappings) { (void)munmap(map.addr, map.size); } @@ -320,6 +326,7 @@ protected: size_t size; }; std::list<Mapping> mMappings; + std::mutex mMutexMappings; }; class C2AllocationIon::ImplV2 : public C2AllocationIon::Impl { diff --git a/media/libheif/HeifDecoderImpl.cpp b/media/libheif/HeifDecoderImpl.cpp index 273d91ccde..4a96e7b093 100644 --- a/media/libheif/HeifDecoderImpl.cpp +++ b/media/libheif/HeifDecoderImpl.cpp @@ -25,6 +25,7 @@ #include <binder/IMemory.h> #include <binder/MemoryDealer.h> #include <drm/drm_framework_common.h> +#include <log/log.h> #include <media/mediametadataretriever.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/foundation/ADebug.h> @@ -421,7 +422,13 @@ bool HeifDecoderImpl::reinit(HeifFrameInfo* frameInfo) { initFrameInfo(&mSequenceInfo, videoFrame); - mSequenceLength = atoi(mRetriever->extractMetadata(METADATA_KEY_VIDEO_FRAME_COUNT)); + const char* frameCount = mRetriever->extractMetadata(METADATA_KEY_VIDEO_FRAME_COUNT); + if (frameCount == nullptr) { + android_errorWriteWithInfoLog(0x534e4554, "215002587", -1, NULL, 0); + ALOGD("No valid sequence information in metadata"); + return false; + } + mSequenceLength = atoi(frameCount); if (defaultInfo == nullptr) { defaultInfo = &mSequenceInfo; |