From f1cd41fece99e619ce151d9d71a1c34e52379103 Mon Sep 17 00:00:00 2001 From: yaozhupeng Date: Fri, 29 Mar 2024 18:16:00 +0800 Subject: [PATCH] add fast astc Signed-off-by: yaozhupeng --- .../innerkitsimpl/codec/src/image_source.cpp | 17 ++++++++++++----- .../stream/include/file_source_stream.h | 2 ++ .../stream/src/file_source_stream.cpp | 8 +++++++- interfaces/innerkits/include/image_source.h | 2 +- interfaces/innerkits/include/image_type.h | 1 + 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/frameworks/innerkitsimpl/codec/src/image_source.cpp b/frameworks/innerkitsimpl/codec/src/image_source.cpp index 5eca47086..b79c6f5c2 100644 --- a/frameworks/innerkitsimpl/codec/src/image_source.cpp +++ b/frameworks/innerkitsimpl/codec/src/image_source.cpp @@ -356,7 +356,7 @@ unique_ptr ImageSource::CreatePixelMapEx(uint32_t index, const DecodeO } } if (isAstc_.has_value() && isAstc_.value()) { - return CreatePixelMapForASTC(errorCode); + return CreatePixelMapForASTC(errorCode, opts.fastAstc); } #endif @@ -2275,7 +2275,7 @@ static bool ReadFileAndResoveAstc(size_t fileSize, size_t astcSize, unique_ptr

ImageSource::CreatePixelMapForASTC(uint32_t &errorCode) +unique_ptr ImageSource::CreatePixelMapForASTC(uint32_t &errorCode, bool fastAstc) #if defined(A_PLATFORM) || defined(IOS_PLATFORM) { errorCode = ERROR; @@ -2303,9 +2303,16 @@ unique_ptr ImageSource::CreatePixelMapForASTC(uint32_t &errorCode) IMAGE_LOGE("[ImageSource] astc GetAstcSizeBytes failed."); return nullptr; } - if (!ReadFileAndResoveAstc(fileSize, astcSize, pixelAstc, sourceStreamPtr_)) { - IMAGE_LOGE("[ImageSource] astc ReadFileAndResoveAstc failed."); - return nullptr; + if (fastAstc && sourceStreamPtr_->GetStreamType() == ImagePlugin::FILE_STREAM_TYPE && fileSize == astcSize) { + void *fdBuffer = new int32_t(); + *static_cast(fdBuffer) = static_cast(sourceStreamPtr_.get())->GetMMapFd(); + pixelAstc->SetPixelsAddr(sourceStreamPtr_->GetDataPtr(), fdBuffer, fileSize, + AllocatorType::SHARE_MEM_ALLOC, nullptr); + } else { + if (!ReadFileAndResoveAstc(fileSize, astcSize, pixelAstc, sourceStreamPtr_)) { + IMAGE_LOGE("[ImageSource] astc ReadFileAndResoveAstc failed."); + return nullptr; + } } pixelAstc->SetAstc(true); diff --git a/frameworks/innerkitsimpl/stream/include/file_source_stream.h b/frameworks/innerkitsimpl/stream/include/file_source_stream.h index de113ae6d..6c5431e93 100644 --- a/frameworks/innerkitsimpl/stream/include/file_source_stream.h +++ b/frameworks/innerkitsimpl/stream/include/file_source_stream.h @@ -43,6 +43,7 @@ public: uint8_t *GetDataPtr() override; uint32_t GetStreamType() override; ImagePlugin::OutputDataStream* ToOutputDataStream() override; + int GetMMapFd(); private: DISALLOW_COPY_AND_MOVE(FileSourceStream); @@ -56,6 +57,7 @@ private: uint8_t *readBuffer_ = nullptr; uint8_t *fileData_ = nullptr; int mmapFd_ = -1; + bool mmapFdPassedOn_ = false; }; } // namespace Media } // namespace OHOS diff --git a/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp b/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp index fe3f6d84d..ab1a30277 100644 --- a/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp +++ b/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp @@ -338,7 +338,7 @@ void FileSourceStream::ResetReadBuffer() free(readBuffer_); readBuffer_ = nullptr; } - if (fileData_ != nullptr) { + if (fileData_ != nullptr && !mmapFdPassedOn_) { #ifdef SUPPORT_MMAP ::munmap(fileData_, fileSize_); close(mmapFd_); @@ -356,5 +356,11 @@ OutputDataStream* FileSourceStream::ToOutputDataStream() } return new (std::nothrow) FilePackerStream(dupFd); } + +int FileSourceStream::GetMMapFd() +{ + mmapFdPassedOn_ = true; + return mmapFd_; +} } // namespace Media } // namespace OHOS diff --git a/interfaces/innerkits/include/image_source.h b/interfaces/innerkits/include/image_source.h index 3fbfbc9d1..dfa9071cd 100644 --- a/interfaces/innerkits/include/image_source.h +++ b/interfaces/innerkits/include/image_source.h @@ -257,7 +257,7 @@ private: bool GetImageInfoForASTC(ImageInfo& imageInfo); bool ConvertYUV420ToRGBA(uint8_t *data, uint32_t size, bool isSupportOdd, bool isAddUV, uint32_t &errorCode); std::unique_ptr CreatePixelMapForYUV(uint32_t &errorCode); - std::unique_ptr CreatePixelMapForASTC(uint32_t &errorCode); + std::unique_ptr CreatePixelMapForASTC(uint32_t &errorCode, bool fastAstc = false); uint32_t GetFormatExtended(std::string &format); static std::unique_ptr DoImageSourceCreate( std::function(void)> stream, diff --git a/interfaces/innerkits/include/image_type.h b/interfaces/innerkits/include/image_type.h index 0d0c5b8ad..160eea436 100644 --- a/interfaces/innerkits/include/image_type.h +++ b/interfaces/innerkits/include/image_type.h @@ -212,6 +212,7 @@ struct DecodeOptions { SVGDecodeOptions SVGOpts; std::shared_ptr desiredColorSpaceInfo = nullptr; bool preferDma = false; + bool fastAstc = false; }; enum class ScaleMode : int32_t { -- Gitee