1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef IMAGE_PROCESSING_CAPI_CAPABILITY_H 17 #define IMAGE_PROCESSING_CAPI_CAPABILITY_H 18 19 #include <atomic> 20 #include <dlfcn.h> 21 #include <functional> 22 #include <mutex> 23 #include <unordered_map> 24 25 #include "algorithm_common.h" 26 #include "frame_info.h" 27 #include "image_processing_native_template.h" 28 #include "image_processing_types.h" 29 #include "pixelmap_native_impl.h" 30 #include "detail_enhancer_image.h" 31 #include "colorspace_converter.h" 32 #include "colorspace_converter_image_native.h" 33 #include "detail_enhancer_common.h" 34 #include "detail_enhancer_image_fwk.h" 35 #include "image_processing_utils.h" 36 #include "surface_buffer.h" 37 #include "surface_buffer_impl.h" 38 #include "surface_type.h" 39 #include "vpe_log.h" 40 41 namespace OHOS { 42 namespace Media { 43 namespace VideoProcessingEngine { 44 45 const std::map<OHOS::Media::PixelFormat, OHOS::GraphicPixelFormat> IMAGE_FORMAT_MAP = { 46 { OHOS::Media::PixelFormat::RGBA_8888, OHOS::GraphicPixelFormat::GRAPHIC_PIXEL_FMT_RGBA_8888 }, 47 { OHOS::Media::PixelFormat::BGRA_8888, OHOS::GraphicPixelFormat::GRAPHIC_PIXEL_FMT_BGRA_8888 }, 48 { OHOS::Media::PixelFormat::RGBA_1010102, OHOS::GraphicPixelFormat::GRAPHIC_PIXEL_FMT_RGBA_1010102 }, 49 { OHOS::Media::PixelFormat::YCBCR_P010, OHOS::GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_P010 }, 50 { OHOS::Media::PixelFormat::YCRCB_P010, OHOS::GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCRCB_P010 }, 51 }; 52 53 typedef enum { 54 NONE = 0, 55 BASE = 1, 56 GAINMAP = 2, 57 ALTERNATE = 3, 58 } ImagePixelmapHdrMetadataType; 59 60 const std::map<ImagePixelmapHdrMetadataType, 61 OHOS::HDI::Display::Graphic::Common::V1_0::CM_HDR_Metadata_Type> HDR_METADATA_TYPE_MAP = { 62 { NONE, OHOS::HDI::Display::Graphic::Common::V1_0::CM_METADATA_NONE }, 63 { BASE, OHOS::HDI::Display::Graphic::Common::V1_0::CM_IMAGE_HDR_VIVID_DUAL }, 64 { GAINMAP, OHOS::HDI::Display::Graphic::Common::V1_0::CM_IMAGE_HDR_VIVID_DUAL }, 65 { ALTERNATE, OHOS::HDI::Display::Graphic::Common::V1_0::CM_IMAGE_HDR_VIVID_SINGLE }, 66 }; 67 68 typedef enum { 69 UNKNOWN = 0, 70 ADOBE_RGB_1998 = 1, 71 DCI_P3 = 2, 72 DISPLAY_P3 = 3, 73 SRGB = 4, 74 BT709 = 5, 75 BT601_EBU = 6, 76 BT2020_HLG = 9, 77 BT2020_PQ = 10, 78 P3_HLG = 11, 79 DISPLAY_P3_LIMIT = 14, 80 SRGB_LIMIT = 15, 81 BT2020_HLG_LIMIT = 19, 82 BT2020_PQ_LIMIT = 20, 83 } ImagePixelmapColorspace; 84 85 const std::map<ImagePixelmapColorspace, OHOS::HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType> COLORSPACE_MAP = { 86 { SRGB, OHOS::HDI::Display::Graphic::Common::V1_0::CM_SRGB_FULL }, 87 { SRGB_LIMIT, OHOS::HDI::Display::Graphic::Common::V1_0::CM_SRGB_LIMIT }, 88 { DISPLAY_P3, OHOS::HDI::Display::Graphic::Common::V1_0::CM_P3_FULL }, 89 { DISPLAY_P3_LIMIT, OHOS::HDI::Display::Graphic::Common::V1_0::CM_P3_LIMIT }, 90 { BT2020_HLG, OHOS::HDI::Display::Graphic::Common::V1_0::CM_BT2020_HLG_FULL }, 91 { BT2020_HLG_LIMIT, OHOS::HDI::Display::Graphic::Common::V1_0::CM_BT2020_HLG_LIMIT }, 92 { BT2020_PQ, OHOS::HDI::Display::Graphic::Common::V1_0::CM_BT2020_PQ_FULL }, 93 { BT2020_PQ_LIMIT, OHOS::HDI::Display::Graphic::Common::V1_0::CM_BT2020_PQ_LIMIT }, 94 { P3_HLG, OHOS::HDI::Display::Graphic::Common::V1_0::CM_P3_HLG_LIMIT }, 95 { ADOBE_RGB_1998, OHOS::HDI::Display::Graphic::Common::V1_0::CM_ADOBERGB_FULL }, 96 }; 97 98 class ImageProcessingCapiCapability { 99 public: 100 static ImageProcessingCapiCapability& Get(); 101 102 ImageProcessingCapiCapability() = default; 103 virtual ~ImageProcessingCapiCapability() = default; 104 ImageProcessingCapiCapability(const ImageProcessingCapiCapability&) = delete; 105 ImageProcessingCapiCapability& operator=(const ImageProcessingCapiCapability&) = delete; 106 ImageProcessingCapiCapability(ImageProcessingCapiCapability&&) = delete; 107 ImageProcessingCapiCapability& operator=(ImageProcessingCapiCapability&&) = delete; 108 109 ImageProcessing_ErrorCode OpenCLInit(); 110 ImageProcessing_ErrorCode OpenGLInit(); 111 std::shared_ptr<OpenGLContext> GetOpenGLContext(); 112 ClContext* GetClContext(); 113 void LoadLibrary(); 114 void UnloadLibrary(); 115 bool CheckColorSpaceConversionSupport( 116 const ImageProcessing_ColorSpaceInfo* sourceImageInfo, 117 const ImageProcessing_ColorSpaceInfo* destinationImageInfo); 118 bool CheckCompositionSupport(const ImageProcessing_ColorSpaceInfo* sourceImageInfo, 119 const ImageProcessing_ColorSpaceInfo* sourceGainmapInfo, 120 const ImageProcessing_ColorSpaceInfo* destinationImageInfo); 121 bool CheckDecompositionSupport(const ImageProcessing_ColorSpaceInfo* sourceImageInfo, 122 const ImageProcessing_ColorSpaceInfo* destinationImageInfo, 123 const ImageProcessing_ColorSpaceInfo* destinationGainmapInfo); 124 bool CheckMetadataGenerationSupport(const ImageProcessing_ColorSpaceInfo* sourceImageInfo); 125 126 private: 127 using LibFunction = bool (*)(const OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo, 128 const OHOS::Media::VideoProcessingEngine::ColorSpaceInfo outputInfo); 129 using LibMetaFunction = bool (*)(const OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo); 130 131 ImageProcessing_ErrorCode LoadAlgo(); 132 133 std::shared_ptr<OpenGLContext> openglContext_{nullptr}; 134 ClContext *openclContext_{nullptr}; 135 std::mutex lock_; 136 int32_t usedInstance_ {0}; 137 void* mLibHandle{}; 138 LibFunction isDecompositionSupported_{nullptr}; 139 LibFunction isColorSpaceConversionSupported_{nullptr}; 140 LibFunction isCompositionSupported_{nullptr}; 141 LibMetaFunction isMetadataGenSupported_{nullptr}; 142 }; 143 144 } // namespace VideoProcessingEngine 145 } // namespace Media 146 } // namespace OHOS 147 148 #endif