diff --git a/frameworks/innerkitsimpl/test/fuzztest/common/src/common_fuzztest_function.cpp b/frameworks/innerkitsimpl/test/fuzztest/common/src/common_fuzztest_function.cpp index 7c70d7a3a37a1ac87c80c6569c21f0d5ac4711c7..e998c6c7cbeb3a12b63fe41400cd274326287315 100644 --- a/frameworks/innerkitsimpl/test/fuzztest/common/src/common_fuzztest_function.cpp +++ b/frameworks/innerkitsimpl/test/fuzztest/common/src/common_fuzztest_function.cpp @@ -44,6 +44,7 @@ static constexpr uint32_t ALPHATYPE_MODULO = 4; static constexpr uint32_t COLORSPACE_MODULO = 17; static constexpr uint32_t DYNAMICRANGE_MODULO = 3; static constexpr uint32_t RESOLUTION_MODULO = 4; +static constexpr uint32_t ALLOCATORTYPE_MODULO = 5; using namespace OHOS::Media; int ConvertDataToFd(const uint8_t* data, size_t size, std::string encodeFormat) @@ -301,6 +302,7 @@ void SetFdpDecodeOptions(FuzzedDataProvider* fdp, OHOS::Media::DecodeOptions &de decodeOpts.resolutionQuality = static_cast(fdp->ConsumeIntegral() % RESOLUTION_MODULO); decodeOpts.isAisr = fdp->ConsumeBool(); decodeOpts.isAppUseAllocator = fdp->ConsumeBool(); + decodeOpts.allocatorType = static_cast(fdp->ConsumeIntegral() % ALLOCATORTYPE_MODULO); } void SetFdpPixelDecodeOptions(FuzzedDataProvider* fdp, OHOS::ImagePlugin::PixelDecodeOptions &plOpts) diff --git a/frameworks/innerkitsimpl/test/fuzztest/imageaccessor2_fuzzer/src/image_accessor2_fuzzer.cpp b/frameworks/innerkitsimpl/test/fuzztest/imageaccessor2_fuzzer/src/image_accessor2_fuzzer.cpp index 5049119a3f4022d957e3613fa137fcf10bc31bdf..7bb749e46f8cf3e335a6d99da506a2fc6c631908 100644 --- a/frameworks/innerkitsimpl/test/fuzztest/imageaccessor2_fuzzer/src/image_accessor2_fuzzer.cpp +++ b/frameworks/innerkitsimpl/test/fuzztest/imageaccessor2_fuzzer/src/image_accessor2_fuzzer.cpp @@ -32,6 +32,7 @@ #include "webp_exif_metadata_accessor.h" #include "file_metadata_stream.h" #include "image_log.h" +#include "exif_metadata_formatter.h" #undef LOG_DOMAIN #define LOG_DOMAIN LOG_TAG_DOMAIN_ID_IMAGE @@ -200,6 +201,18 @@ void AccessorTest002(const uint8_t *data, size_t size) std::shared_ptr metadataAccessor2 = MetadataAccessorFactory::Create(filename); MetadataAccessorFuncTest(metadataAccessor2); } + +void ExifMetadatFormatterTest() +{ + auto size = ExifMetadatFormatter::valueFormatConvertConfig.size(); + uint8_t size_checked = (size == 0) ? 1 : size; + uint8_t index = FDP->ConsumeIntegral() % size_checked; + auto it = ExifMetadatFormatter::valueFormatConvertConfig.begin(); + std::advance(it, index); + auto func = (it->second).first; + std::string value = ""; + func(value, (it->second).second); +} } // namespace Media } // namespace OHOS @@ -212,5 +225,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::Media::AccessorTest001(data, size); OHOS::Media::AccessorTest002(data, size); + OHOS::Media::ExifMetadatFormatterTest(); return 0; } diff --git a/frameworks/innerkitsimpl/test/fuzztest/imagefwkimagesource2_fuzzer/src/image_fwk_image_source2_fuzzer.cpp b/frameworks/innerkitsimpl/test/fuzztest/imagefwkimagesource2_fuzzer/src/image_fwk_image_source2_fuzzer.cpp index 90b842644953f7cca666f7f4e82ed601cc124f27..d06f06dae46ce7cc04da76e99c7a67fb97a75ea2 100644 --- a/frameworks/innerkitsimpl/test/fuzztest/imagefwkimagesource2_fuzzer/src/image_fwk_image_source2_fuzzer.cpp +++ b/frameworks/innerkitsimpl/test/fuzztest/imagefwkimagesource2_fuzzer/src/image_fwk_image_source2_fuzzer.cpp @@ -37,6 +37,8 @@ static const std::string PNG_FORMAT = "image/png"; static const std::string IMAGE_ENCODE_DEST = "/data/local/tmp/test_out.dat"; constexpr uint32_t SOURCEOPTIONS_MIMETYPE_MODULO = 3; static constexpr uint32_t ALLOCATORTYPE_MODULO = 5; +static constexpr uint32_t DYNAMICRANGE_MODULO = 4; +static constexpr uint32_t QUALITY_MODULO = 101; namespace OHOS { namespace Media { @@ -314,6 +316,9 @@ void EncodePictureTest(std::shared_ptr picture, const std::string &form ImagePacker pack; PackOption packOption; packOption.format = format; + packOption.quality = FDP->ConsumeIntegral() % DYNAMICRANGE_MODULO; + packOption.desiredDynamicRange = static_cast(FDP->ConsumeIntegral() % QUALITY_MODULO); + packOption.needsPackProperties = FDP->ConsumeBool(); if (pack.StartPacking(outputPath, packOption) != SUCCESS) { IMAGE_LOGE("%{public}s StartPacking failed.", __func__); return; @@ -339,6 +344,9 @@ void EncodePixelMapTest(std::shared_ptr pixelmap, const std::string &f ImagePacker pack; PackOption packOption; packOption.format = format; + packOption.quality = FDP->ConsumeIntegral() % DYNAMICRANGE_MODULO; + packOption.desiredDynamicRange = static_cast(FDP->ConsumeIntegral() % QUALITY_MODULO); + packOption.needsPackProperties = FDP->ConsumeBool(); if (pack.StartPacking(outputPath, packOption) != SUCCESS) { IMAGE_LOGE("%{public}s StartPacking failed.", __func__); return; diff --git a/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/BUILD.gn b/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/BUILD.gn index 3d3934c32dfefd5be208d0cbd4cda7290411ebb6..acae7579c298cdeff005ad5b64b3443bb7f44239 100644 --- a/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/BUILD.gn +++ b/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/BUILD.gn @@ -28,10 +28,17 @@ ohos_fuzztest("ImagePixelYuv2FuzzTest") { "$image_subsystem/frameworks/innerkitsimpl/test/fuzztest/common/src/common_fuzztest_function.cpp", "src/image_pixelyuv_fuzzer.cpp" ] - deps = [ "$image_subsystem/interfaces/innerkits:image_native" ] + deps = [ + "$image_subsystem/interfaces/innerkits:image_native", + "$image_subsystem/plugins/manager:pluginmanager", + "$image_subsystem/frameworks/innerkitsimpl/utils:image_utils", + "$image_subsystem/mock/native:log_mock_static", + ] external_deps = [ "c_utils:utils", "hilog:libhilog", + "ffmpeg:libohosffmpeg", + "bundle_framework:appexecfwk_core" ] fuzz_config_file = "$image_subsystem/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer" module_out_path = "multimedia_image/image_framework" diff --git a/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/src/image_pixelyuv_fuzzer.cpp b/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/src/image_pixelyuv_fuzzer.cpp index e092d9ea89a57dca327d5886ad100591b1a9ecbe..8830352256dd99caca2c2f718fd074d5301871b4 100644 --- a/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/src/image_pixelyuv_fuzzer.cpp +++ b/frameworks/innerkitsimpl/test/fuzztest/imagepixelYuv2_fuzzer/src/image_pixelyuv_fuzzer.cpp @@ -19,16 +19,22 @@ #include #include #include - +#define protected public +#define private public #include "pixel_map.h" #include "image_log.h" #include "image_source.h" +#include "pixel_yuv.h" +#include "pixel_yuv_ext_utils.h" namespace OHOS { namespace Media { FuzzedDataProvider* FDP; +static constexpr uint32_t OPT_SIZE = 40; +static constexpr uint32_t DEGREES_MODULO = 4; +static constexpr uint32_t YUVFORMATS_MODULO = 4; void PixelMapYuvFuzzTest(const uint8_t *data, size_t size) { @@ -57,6 +63,107 @@ void PixelMapYuvFuzzTest(const uint8_t *data, size_t size) pixelMap->scale(dstWidth, dstHeight, option); } +std::unique_ptr CreateYuvPixelMap(std::string pathName) +{ + SourceOptions opts; + uint32_t errorCode; + std::shared_ptr imageSource = ImageSource::CreateImageSource(pathName, opts, errorCode); + if (imageSource == nullptr) { + return nullptr; + } + DecodeOptions decodeOpts; + std::vector yuvFormats = { + PixelFormat::NV12, + PixelFormat::NV21, + PixelFormat::YCRCB_P010, + PixelFormat::YCBCR_P010, + }; + uint32_t index = FDP->ConsumeIntegral() % YUVFORMATS_MODULO; + decodeOpts.desiredPixelFormat = yuvFormats[index]; + std::unique_ptr pixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode); + return pixelMap; +} + +void PixelYuvUtilsFuzzTest(std::string pathName) +{ + std::unique_ptr pixelMap = CreateYuvPixelMap(pathName); + PixelYuv* pixelYuv = reinterpret_cast(pixelMap.get()); + Size srcSize; + srcSize.width = FDP->ConsumeIntegral(); + srcSize.height = FDP->ConsumeIntegral(); + std::vector degrees = {0, 90, 180, 270}; + int32_t count = FDP->ConsumeIntegral() % DEGREES_MODULO; + int32_t degree = degrees[count]; + Size dstSize; + dstSize.width = FDP->ConsumeIntegral(); + dstSize.height = FDP->ConsumeIntegral(); + OpenSourceLibyuv::RotationMode rotateNum; + YUVDataInfo yuvDataInfo; + pixelYuv->YuvRotateConvert(srcSize, degree, dstSize, rotateNum, yuvDataInfo); + float rotateDegrees = 90; + pixelYuv->rotate(rotateDegrees); + float xAxis = 0.5; + float yAxis = 0.5; + pixelYuv->resize(xAxis, yAxis); + bool flipxAxis = true; + bool flipyAxis = true; + pixelYuv->flip(flipxAxis, flipyAxis); +} + +void PixelYuvExtUtilsFuzzTest(std::string pathName) +{ +#ifdef EXT_PIXEL + std::unique_ptr pixelMap = CreateYuvPixelMap(pathName); + if (pixelMap == nullptr) { + return; + } + std::vector dstArgb = {}; + Size size; + PixelFormat pixelFormat = static_cast(FDP->ConsumeIntegral() % PIXELFORMAT_MODULO); + YUVDataInfo info; + PixelYuvExtUtils::Yuv420ToARGB(pixelMap->data_, dstArgb.data(), size, pixelFormat, info); + + pixelMap = CreateYuvPixelMap(pathName); + if (pixelMap == nullptr) { + return; + } + PixelSize nv12RotateSize; + OpenSourceLibyuv::RotationMode rotateNum; + std::vector dstNV12Rotate = {}; + YUVStrideInfo dstStrides; + PixelYuvExtUtils::NV12Rotate(pixelMap->data_, nv12RotateSize, info, rotateNum, dstNV12Rotate.data(), dstStrides); + + pixelMap = CreateYuvPixelMap(pathName); + if (pixelMap == nullptr) { + return; + } + const PixelFormat format = pixelMap->GetPixelFormat(); + Size dstSize; + std::vector dstYuvRotate = {}; + PixelYuvExtUtils::YuvRotate(pixelMap->data_, format, info, dstSize, dstYuvRotate.data(), dstStrides, rotateNum); + + pixelMap = CreateYuvPixelMap(pathName); + if (pixelMap == nullptr) { + return; + } + float xAxis = FDP->ConsumeFloatingPoint(); + float yAxis = FDP->ConsumeFloatingPoint(); + const AntiAliasingOption option = static_cast(FDP->ConsumeIntegral() % 11); + YuvImageInfo scaleYuvInfo; + std::vector dstYuv420 = {}; + PixelYuvExtUtils::ScaleYuv420(xAxis, yAxis, option, scaleYuvInfo, pixelMap->data_, dstYuv420.data(), dstStrides); + + pixelMap = CreateYuvPixelMap(pathName); + if (pixelMap == nullptr) { + return; + } + int32_t dstWidth = FDP->ConsumeIntegral(); + int32_t dstHeight = FDP->ConsumeIntegral(); + YuvImageInfo yuvInfo; + std::vector dst = {}; + PixelYuvExtUtils::ScaleYuv420(dstWidth, dstHeight, option, yuvInfo, pixelMap->data_, dst.data(), dstStrides); +#endif +} } // namespace Media } // namespace OHOS @@ -67,5 +174,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) FuzzedDataProvider fdp(data, size); OHOS::Media::FDP = &fdp; OHOS::Media::PixelMapYuvFuzzTest(data, size); + static const std::string pathName = "/data/local/tmp/test_decode_bmp.bmp"; + WriteDataToFile(data, size - OHOS::Media::OPT_SIZE, pathName); + OHOS::Media::PixelYuvUtilsFuzzTest(pathName); + OHOS::Media::PixelYuvExtUtilsFuzzTest(pathName); return 0; }