diff --git a/frameworks/innerkitsimpl/common/src/pixel_yuv_ext.cpp b/frameworks/innerkitsimpl/common/src/pixel_yuv_ext.cpp index b31b003615dca1a0c936243753d63541049279ba..6057ef66865a4d1ffb2e4d7c0bf9fde32047ffd9 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_yuv_ext.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_yuv_ext.cpp @@ -149,9 +149,6 @@ void PixelYuvExt::scale(float xAxis, float yAxis, const AntiAliasingOption &opti GetImageInfo(imageInfo); int32_t dstW = (imageInfo.size.width * xAxis + ROUND_FLOAT_NUMBER); int32_t dstH = (imageInfo.size.height * yAxis + ROUND_FLOAT_NUMBER); - YUVStrideInfo dstStrides; - auto m = CreateMemory(imageInfo.pixelFormat, "Trans ImageData", dstW, dstH, dstStrides); - CHECK_ERROR_RETURN_LOG(m == nullptr, "scale CreateMemory failed"); int64_t dstBufferSizeOverflow = static_cast(dstW) * static_cast(dstH); bool cond = ImageUtils::GetPixelBytes(imageInfo.pixelFormat) == 0; CHECK_ERROR_RETURN_LOG(cond, "invalid pixelFormat:[%{public}d]", imageInfo.pixelFormat); @@ -159,6 +156,9 @@ void PixelYuvExt::scale(float xAxis, float yAxis, const AntiAliasingOption &opti cond = abs(dstBufferSizeOverflow) > maxDstBufferSize; CHECK_ERROR_RETURN_LOG(cond, "scale target size too large, srcWidth(%{public}d) * xAxis(%{public}.2f), " "srcHeight(%{public}d) * yAxis(%{public}.2f)", imageInfo.size.width, xAxis, imageInfo.size.height, yAxis); + YUVStrideInfo dstStrides; + auto m = CreateMemory(imageInfo.pixelFormat, "Trans ImageData", dstW, dstH, dstStrides); + CHECK_ERROR_RETURN_LOG(m == nullptr, "scale CreateMemory failed"); uint8_t *dst = reinterpret_cast(m->data.data); YUVDataInfo yuvDataInfo; diff --git a/frameworks/innerkitsimpl/picture/picture.cpp b/frameworks/innerkitsimpl/picture/picture.cpp index 5cd0a73d714536e7227a708afe0776df815b3ac5..2834b2856a11ca7893f9708ff112761f2448513e 100644 --- a/frameworks/innerkitsimpl/picture/picture.cpp +++ b/frameworks/innerkitsimpl/picture/picture.cpp @@ -194,13 +194,21 @@ static void SetYuvDataInfo(std::unique_ptr &pixelMap, sptrplaneCount <= NUM_1; CHECK_ERROR_RETURN_LOG(cond, "Get planesInfo failed, retVal:%{public}d", retVal); + info.yWidth = static_cast(width); + info.uvWidth = static_cast(width / NUM_2); + info.yHeight = static_cast(height); + info.uvHeight = static_cast(height / NUM_2); if (planes->planeCount >= NUM_2) { - info.yWidth = static_cast(info.imageSize.width); - info.yHeight = static_cast(info.imageSize.height); - info.yStride = planes->planes[NUM_0].columnStride; - info.uvStride = planes->planes[NUM_1].columnStride; - info.yOffset = planes->planes[NUM_0].offset; - info.uvOffset = planes->planes[NUM_1].offset - NUM_1; + int32_t pixelFmt = sBuffer->GetFormat(); + bool isYuvP010 = (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_P010 || pixelFmt == GRAPHIC_PIXEL_FMT_YCRCB_P010); + int uvPlaneOffset = (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_420_SP || + pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_P010) ? NUM_1 : NUM_2; + info.yStride = isYuvP010 ? (planes->planes[NUM_0].columnStride / NUM_2) : (planes->planes[NUM_0].columnStride); + info.uvStride = isYuvP010 ? (planes->planes[uvPlaneOffset].columnStride / NUM_2) : + (planes->planes[uvPlaneOffset].columnStride); + info.yOffset = isYuvP010 ? (planes->planes[NUM_0].offset / NUM_2) : (planes->planes[NUM_0].offset); + info.uvOffset = + isYuvP010 ? (planes->planes[uvPlaneOffset].offset / NUM_2) : (planes->planes[uvPlaneOffset].offset); } pixelMap->SetImageYUVInfo(info); } diff --git a/frameworks/innerkitsimpl/test/unittest/image_utils_test.cpp b/frameworks/innerkitsimpl/test/unittest/image_utils_test.cpp index 45bd906e13aa83c3dfc20e3541de9e53e4e4d962..d73e535db51cc4e1fa492ac32bfa581edd16ec89 100644 --- a/frameworks/innerkitsimpl/test/unittest/image_utils_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/image_utils_test.cpp @@ -531,7 +531,8 @@ HWTEST_F(ImageUtilsTest, GetLocalTimeTest001, TestSize.Level3) auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 1000; std::time_t t = std::chrono::system_clock::to_time_t(now); - std::tm tm = *std::localtime(&t); + std::tm tm; + ASSERT_NE(localtime_r(&t, &tm), nullptr); std::stringstream ss; int millSecondWidth = 3; diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index f33ae97c7bdba12913088cab2bf9ce3aa497f21e..4c8beeb51319bda4934a3b7b3e778f13f60ab760 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -805,15 +805,15 @@ std::string ImageUtils::GetLocalTime() auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 1000; std::time_t t = std::chrono::system_clock::to_time_t(now); - std::tm* tm = std::localtime(&t); - if (tm == nullptr) { - IMAGE_LOGE("ImageUtils::GetLocalTime error, returned nullptr"); + std::tm tm; + if (localtime_r(&t, &tm) == nullptr) { + IMAGE_LOGE("ImageUtils::GetLocalTime error, localtime_r failed"); return ""; } std::stringstream ss; int millSecondWidth = 3; - ss << std::put_time(tm, "%Y-%m-%d %H_%M_%S.") << std::setfill('0') << std::setw(millSecondWidth) << ms.count(); + ss << std::put_time(&tm, "%Y-%m-%d %H_%M_%S.") << std::setfill('0') << std::setw(millSecondWidth) << ms.count(); return ss.str(); }