diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-04-13 11:29:53 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-04-13 11:29:53 +0000 |
commit | eee620e977c982cd7eb055308fadbe536fabc954 (patch) | |
tree | 649c82018c416bf124fa67c92f023268066f2194 | |
parent | 1142c3f4b2c2cb428bf6b55288af94b0288c3102 (diff) | |
parent | 415ead8f180142493fae4fe7744cd5fc9a3979ec (diff) | |
download | av-android11-mainline-networkstack-release.tar.gz |
Snap for 7278887 from 415ead8f180142493fae4fe7744cd5fc9a3979ec to mainline-networkstack-releaseandroid-mainline-11.0.0_r41android11-mainline-networkstack-release
Change-Id: I0a3e11ac3ea000f78ac1ac633d456c629b3193b1
-rw-r--r-- | media/codec2/vndk/C2AllocatorBlob.cpp | 72 | ||||
-rwxr-xr-x | media/extractors/mp4/MPEG4Extractor.cpp | 28 |
2 files changed, 84 insertions, 16 deletions
diff --git a/media/codec2/vndk/C2AllocatorBlob.cpp b/media/codec2/vndk/C2AllocatorBlob.cpp index 50c9e59af8..aa054998f8 100644 --- a/media/codec2/vndk/C2AllocatorBlob.cpp +++ b/media/codec2/vndk/C2AllocatorBlob.cpp @@ -17,6 +17,8 @@ // #define LOG_NDEBUG 0 #define LOG_TAG "C2AllocatorBlob" +#include <set> + #include <C2AllocatorBlob.h> #include <C2PlatformSupport.h> @@ -67,6 +69,10 @@ public: private: const std::shared_ptr<C2GraphicAllocation> mGraphicAllocation; const C2Allocator::id_t mAllocatorId; + + std::mutex mMapLock; + std::multiset<std::pair<size_t, size_t>> mMappedOffsetSize; + uint8_t *mMappedAddr; }; C2AllocationBlob::C2AllocationBlob( @@ -74,20 +80,74 @@ C2AllocationBlob::C2AllocationBlob( C2Allocator::id_t allocatorId) : C2LinearAllocation(capacity), mGraphicAllocation(std::move(graphicAllocation)), - mAllocatorId(allocatorId) {} + mAllocatorId(allocatorId), + mMappedAddr(nullptr) {} -C2AllocationBlob::~C2AllocationBlob() {} +C2AllocationBlob::~C2AllocationBlob() { + if (mMappedAddr) { + C2Rect rect(capacity(), kLinearBufferHeight); + mGraphicAllocation->unmap(&mMappedAddr, rect, nullptr); + } +} c2_status_t C2AllocationBlob::map(size_t offset, size_t size, C2MemoryUsage usage, C2Fence* fence, void** addr /* nonnull */) { + *addr = nullptr; + if (size > capacity() || offset > capacity() || offset > capacity() - size) { + ALOGV("C2AllocationBlob: map: bad offset / size: offset=%zu size=%zu capacity=%u", + offset, size, capacity()); + return C2_BAD_VALUE; + } + std::unique_lock<std::mutex> lock(mMapLock); + if (mMappedAddr) { + *addr = mMappedAddr + offset; + mMappedOffsetSize.insert({offset, size}); + ALOGV("C2AllocationBlob: mapped from existing mapping: offset=%zu size=%zu capacity=%u", + offset, size, capacity()); + return C2_OK; + } C2PlanarLayout layout; - C2Rect rect = C2Rect(size, kLinearBufferHeight).at(offset, 0u); - return mGraphicAllocation->map(rect, usage, fence, &layout, reinterpret_cast<uint8_t**>(addr)); + C2Rect rect = C2Rect(capacity(), kLinearBufferHeight); + c2_status_t err = mGraphicAllocation->map(rect, usage, fence, &layout, &mMappedAddr); + if (err != C2_OK) { + ALOGV("C2AllocationBlob: map failed: offset=%zu size=%zu capacity=%u err=%d", + offset, size, capacity(), err); + mMappedAddr = nullptr; + return err; + } + *addr = mMappedAddr + offset; + mMappedOffsetSize.insert({offset, size}); + ALOGV("C2AllocationBlob: new map succeeded: offset=%zu size=%zu capacity=%u", + offset, size, capacity()); + return C2_OK; } c2_status_t C2AllocationBlob::unmap(void* addr, size_t size, C2Fence* fenceFd) { - C2Rect rect(size, kLinearBufferHeight); - return mGraphicAllocation->unmap(reinterpret_cast<uint8_t**>(&addr), rect, fenceFd); + std::unique_lock<std::mutex> lock(mMapLock); + uint8_t *u8Addr = static_cast<uint8_t *>(addr); + if (u8Addr < mMappedAddr || mMappedAddr + capacity() < u8Addr + size) { + ALOGV("C2AllocationBlob: unmap: Bad addr / size: addr=%p size=%zu capacity=%u", + addr, size, capacity()); + return C2_BAD_VALUE; + } + auto it = mMappedOffsetSize.find(std::make_pair(u8Addr - mMappedAddr, size)); + if (it == mMappedOffsetSize.end()) { + ALOGV("C2AllocationBlob: unrecognized map: addr=%p size=%zu capacity=%u", + addr, size, capacity()); + return C2_BAD_VALUE; + } + mMappedOffsetSize.erase(it); + if (!mMappedOffsetSize.empty()) { + ALOGV("C2AllocationBlob: still maintain mapping: addr=%p size=%zu capacity=%u", + addr, size, capacity()); + return C2_OK; + } + C2Rect rect(capacity(), kLinearBufferHeight); + c2_status_t err = mGraphicAllocation->unmap(&mMappedAddr, rect, fenceFd); + ALOGV("C2AllocationBlob: last unmap: addr=%p size=%zu capacity=%u err=%d", + addr, size, capacity(), err); + mMappedAddr = nullptr; + return err; } /* ====================================== BLOB ALLOCATOR ====================================== */ diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index a976a2b12a..c820ea06f6 100755 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -2324,7 +2324,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { if (mLastTrack == NULL) return ERROR_MALFORMED; - AMediaFormat_setBuffer(mLastTrack->meta, + AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_ESDS, &buffer[4], chunk_data_size - 4); if (mPath.size() >= 2 @@ -2406,7 +2406,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { if (mLastTrack == NULL) return ERROR_MALFORMED; - AMediaFormat_setBuffer(mLastTrack->meta, + AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_AVC, buffer.get(), chunk_data_size); break; @@ -2428,7 +2428,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { if (mLastTrack == NULL) return ERROR_MALFORMED; - AMediaFormat_setBuffer(mLastTrack->meta, + AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_HEVC, buffer.get(), chunk_data_size); *offset += chunk_size; @@ -3978,13 +3978,13 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) { // custom genre string buffer[size] = '\0'; - AMediaFormat_setString(mFileMetaData, + AMediaFormat_setString(mFileMetaData, metadataKey, (const char *)buffer + 8); } } else { buffer[size] = '\0'; - AMediaFormat_setString(mFileMetaData, + AMediaFormat_setString(mFileMetaData, metadataKey, (const char *)buffer + 8); } } @@ -6104,9 +6104,13 @@ media_status_t MPEG4Source::read( if (newBuffer) { if (mIsPcm) { // The twos' PCM block reader assumes that all samples has the same size. - - uint32_t samplesToRead = mSampleTable->getLastSampleIndexInChunk() - - mCurrentSampleIndex + 1; + uint32_t lastSampleIndexInChunk = mSampleTable->getLastSampleIndexInChunk(); + if (lastSampleIndexInChunk < mCurrentSampleIndex) { + mBuffer->release(); + mBuffer = nullptr; + return AMEDIA_ERROR_UNKNOWN; + } + uint32_t samplesToRead = lastSampleIndexInChunk - mCurrentSampleIndex + 1; if (samplesToRead > kMaxPcmFrameSize) { samplesToRead = kMaxPcmFrameSize; } @@ -6115,13 +6119,17 @@ media_status_t MPEG4Source::read( samplesToRead, size, mCurrentSampleIndex, mSampleTable->getLastSampleIndexInChunk()); - size_t totalSize = samplesToRead * size; + size_t totalSize = samplesToRead * size; + if (mBuffer->size() < totalSize) { + mBuffer->release(); + mBuffer = nullptr; + return AMEDIA_ERROR_UNKNOWN; + } uint8_t* buf = (uint8_t *)mBuffer->data(); ssize_t bytesRead = mDataSource->readAt(offset, buf, totalSize); if (bytesRead < (ssize_t)totalSize) { mBuffer->release(); mBuffer = NULL; - return AMEDIA_ERROR_IO; } |