diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 72fb4e95196475ee8ef450ac34fc6a68dc11ee62..07556c77ab861229bd0524b6632f03a2f0cf84ea 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -97,9 +97,6 @@ constexpr uint8_t BGRA_BYTES = 4; constexpr uint8_t RGBA_F16_BYTES = 8; constexpr uint8_t PER_PIXEL_LEN = 1; constexpr uint32_t MAX_READ_COUNT = 2048; -static constexpr int32_t PLANE_Y = 0; -static constexpr int32_t PLANE_U = 1; -static constexpr int32_t PLANE_V = 2; constexpr uint8_t FILL_NUMBER = 3; constexpr uint8_t ALIGN_NUMBER = 4; @@ -4101,70 +4098,6 @@ bool PixelMap::GetToSdrColorSpaceIsSRGB() return toSdrColorIsSRGB_; } -#if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) -static void GetYUVStrideInfo(int32_t pixelFmt, OH_NativeBuffer_Planes *planes, YUVStrideInfo &dstStrides) -{ - if (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_420_SP) { - auto yStride = planes->planes[PLANE_Y].columnStride; - auto uvStride = planes->planes[PLANE_U].columnStride; - auto yOffset = planes->planes[PLANE_Y].offset; - auto uvOffset = planes->planes[PLANE_U].offset; - dstStrides = {yStride, uvStride, yOffset, uvOffset}; - } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCRCB_420_SP) { - auto yStride = planes->planes[PLANE_Y].columnStride; - auto uvStride = planes->planes[PLANE_V].columnStride; - auto yOffset = planes->planes[PLANE_Y].offset; - auto uvOffset = planes->planes[PLANE_V].offset; - dstStrides = {yStride, uvStride, yOffset, uvOffset}; - } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_P010) { - auto yStride = planes->planes[PLANE_Y].columnStride / 2; - auto uvStride = planes->planes[PLANE_U].columnStride / 2; - auto yOffset = planes->planes[PLANE_Y].offset / 2; - auto uvOffset = planes->planes[PLANE_U].offset / 2; - dstStrides = {yStride, uvStride, yOffset, uvOffset}; - } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCRCB_P010) { - auto yStride = planes->planes[PLANE_Y].columnStride / 2; - auto uvStride = planes->planes[PLANE_V].columnStride / 2; - auto yOffset = planes->planes[PLANE_Y].offset / 2; - auto uvOffset = planes->planes[PLANE_V].offset / 2; - dstStrides = {yStride, uvStride, yOffset, uvOffset}; - } -} -#endif - -static void UpdateSdrYuvStrides(const ImageInfo &imageInfo, YUVStrideInfo &dstStrides, - void *context, AllocatorType dstType) -{ - int32_t dstWidth = imageInfo.size.width; - int32_t dstHeight = imageInfo.size.height; - int32_t dstYStride = dstWidth; - int32_t dstUvStride = (dstWidth + 1) / NUM_2 * NUM_2; - int32_t dstYOffset = 0; - int32_t dstUvOffset = dstYStride * dstHeight; - dstStrides = {dstYStride, dstUvStride, dstYOffset, dstUvOffset}; - -#if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) - if (context == nullptr) { - return; - } - if (dstType == AllocatorType::DMA_ALLOC) { - auto sb = static_cast(context); - if (sb == nullptr) { - IMAGE_LOGE("get SurfaceBuffer failed"); - return; - } - OH_NativeBuffer_Planes *planes = nullptr; - GSError retVal = sb->GetPlanesInfo(reinterpret_cast(&planes)); - if (retVal != OHOS::GSERROR_OK || planes == nullptr) { - IMAGE_LOGE("UpdateSdrYuvStrides Get planesInfo failed, retVal:%{public}d", retVal); - } else if (planes->planeCount >= NUM_2) { - int32_t pixelFmt = sb->GetFormat(); - GetYUVStrideInfo(pixelFmt, planes, dstStrides); - } - } -#endif -} - std::unique_ptr PixelMap::CreateSdrMemory(ImageInfo &imageInfo, PixelFormat format, AllocatorType dstType, uint32_t &errorCode, bool toSRGB) { @@ -4269,8 +4202,7 @@ uint32_t PixelMap::ToSdr() } else if (imageInfo.pixelFormat == PixelFormat::YCRCB_P010) { outFormat = PixelFormat::NV21; } - bool toSRGB = toSdrColorIsSRGB_; - return ToSdr(outFormat, toSRGB); + return ToSdr(outFormat, toSdrColorIsSRGB_); } uint32_t PixelMap::ToSdr(PixelFormat format, bool toSRGB) @@ -4300,7 +4232,7 @@ uint32_t PixelMap::ToSdr(PixelFormat format, bool toSRGB) imageInfo.pixelFormat = sdrMemory->data.format; SetImageInfo(imageInfo, true); YUVStrideInfo dstStrides; - UpdateSdrYuvStrides(imageInfo, dstStrides, sdrMemory->extend.data, dstType); + ImageUtils::UpdateSdrYuvStrides(imageInfo, dstStrides, sdrMemory->extend.data, dstType); UpdateYUVDataInfo(sdrMemory->data.format, imageInfo.size.width, imageInfo.size.height, dstStrides); #ifdef IMAGE_COLORSPACE_FLAG InnerSetColorSpace(OHOS::ColorManager::ColorSpace(toSRGB ? ColorManager::SRGB : ColorManager::DISPLAY_P3)); diff --git a/frameworks/innerkitsimpl/utils/include/image_utils.h b/frameworks/innerkitsimpl/utils/include/image_utils.h index 16c1f973d5a4aef0808a7c42ed1375e975ec52a5..76029ff029938aeee6e0f31699283fb1111c8527 100644 --- a/frameworks/innerkitsimpl/utils/include/image_utils.h +++ b/frameworks/innerkitsimpl/utils/include/image_utils.h @@ -89,6 +89,8 @@ public: static bool HasOverflowed(uint32_t num1, uint32_t num2); static int32_t GetAPIVersion(); static std::string GetEncodedHeifFormat(); + static void UpdateSdrYuvStrides(const ImageInfo &imageInfo, YUVStrideInfo &dstStrides, + void *context, AllocatorType dstType); template static bool CheckMulOverflow(const T& num1, const T& num2) diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index f140cc40574816d17b549726a87bdaa91e48b99a..735aa0536e66ee6b49e02269039e36fee99beb23 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -102,6 +102,9 @@ static const uint8_t NUM_6 = 6; static const uint8_t NUM_7 = 7; static const uint8_t INT_255 = 255; static const string FILE_DIR_IN_THE_SANDBOX = "/data/storage/el2/base/files/"; +static constexpr int32_t PLANE_Y = 0; +static constexpr int32_t PLANE_U = 1; +static constexpr int32_t PLANE_V = 2; bool ImageUtils::GetFileSize(const string &pathName, size_t &size) { @@ -983,5 +986,69 @@ int32_t ImageUtils::GetAPIVersion() return FAULT_API_VERSION; #endif } + +static void GetYUVStrideInfo(int32_t pixelFmt, OH_NativeBuffer_Planes *planes, YUVStrideInfo &dstStrides) +{ +#if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) + if (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_420_SP) { + auto yStride = planes->planes[PLANE_Y].columnStride; + auto uvStride = planes->planes[PLANE_U].columnStride; + auto yOffset = planes->planes[PLANE_Y].offset; + auto uvOffset = planes->planes[PLANE_U].offset; + dstStrides = {yStride, uvStride, yOffset, uvOffset}; + } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCRCB_420_SP) { + auto yStride = planes->planes[PLANE_Y].columnStride; + auto uvStride = planes->planes[PLANE_V].columnStride; + auto yOffset = planes->planes[PLANE_Y].offset; + auto uvOffset = planes->planes[PLANE_V].offset; + dstStrides = {yStride, uvStride, yOffset, uvOffset}; + } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_P010) { + auto yStride = planes->planes[PLANE_Y].columnStride / 2; + auto uvStride = planes->planes[PLANE_U].columnStride / 2; + auto yOffset = planes->planes[PLANE_Y].offset / 2; + auto uvOffset = planes->planes[PLANE_U].offset / 2; + dstStrides = {yStride, uvStride, yOffset, uvOffset}; + } else if (pixelFmt == GRAPHIC_PIXEL_FMT_YCRCB_P010) { + auto yStride = planes->planes[PLANE_Y].columnStride / 2; + auto uvStride = planes->planes[PLANE_V].columnStride / 2; + auto yOffset = planes->planes[PLANE_Y].offset / 2; + auto uvOffset = planes->planes[PLANE_V].offset / 2; + dstStrides = {yStride, uvStride, yOffset, uvOffset}; + } +#endif +} + +void ImageUtils::UpdateSdrYuvStrides(const ImageInfo &imageInfo, YUVStrideInfo &dstStrides, + void *context, AllocatorType dstType) +{ + int32_t dstWidth = imageInfo.size.width; + int32_t dstHeight = imageInfo.size.height; + int32_t dstYStride = dstWidth; + int32_t dstUvStride = (dstWidth + 1) / NUM_2 * NUM_2; + int32_t dstYOffset = 0; + int32_t dstUvOffset = dstYStride * dstHeight; + dstStrides = {dstYStride, dstUvStride, dstYOffset, dstUvOffset}; + +#if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) + if (context == nullptr) { + return; + } + if (dstType == AllocatorType::DMA_ALLOC) { + auto sb = static_cast(context); + if (sb == nullptr) { + IMAGE_LOGE("get SurfaceBuffer failed"); + return; + } + OH_NativeBuffer_Planes *planes = nullptr; + GSError retVal = sb->GetPlanesInfo(reinterpret_cast(&planes)); + if (retVal != OHOS::GSERROR_OK || planes == nullptr) { + IMAGE_LOGE("UpdateSdrYuvStrides Get planesInfo failed, retVal:%{public}d", retVal); + } else if (planes->planeCount >= NUM_2) { + int32_t pixelFmt = sb->GetFormat(); + GetYUVStrideInfo(pixelFmt, planes, dstStrides); + } + } +#endif +} } // namespace Media } // namespace OHOS