123b3eb3cSopenharmony_ci/* 223b3eb3cSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 323b3eb3cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 423b3eb3cSopenharmony_ci * you may not use this file except in compliance with the License. 523b3eb3cSopenharmony_ci * You may obtain a copy of the License at 623b3eb3cSopenharmony_ci * 723b3eb3cSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 823b3eb3cSopenharmony_ci * 923b3eb3cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1023b3eb3cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1123b3eb3cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1223b3eb3cSopenharmony_ci * See the License for the specific language governing permissions and 1323b3eb3cSopenharmony_ci * limitations under the License. 1423b3eb3cSopenharmony_ci */ 1523b3eb3cSopenharmony_ci 1623b3eb3cSopenharmony_ci#include "image_source_ohos.h" 1723b3eb3cSopenharmony_ci 1823b3eb3cSopenharmony_ci#include "media_errors.h" 1923b3eb3cSopenharmony_ci 2023b3eb3cSopenharmony_ci#include "base/image/pixel_map.h" 2123b3eb3cSopenharmony_ci 2223b3eb3cSopenharmony_cinamespace OHOS::Ace { 2323b3eb3cSopenharmony_ciRefPtr<ImageSource> ImageSource::Create(int32_t fd) 2423b3eb3cSopenharmony_ci{ 2523b3eb3cSopenharmony_ci uint32_t errorCode; 2623b3eb3cSopenharmony_ci Media::SourceOptions options; 2723b3eb3cSopenharmony_ci auto src = Media::ImageSource::CreateImageSource(fd, options, errorCode); 2823b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 2923b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "create image source failed, errorCode = %{public}u", errorCode); 3023b3eb3cSopenharmony_ci return nullptr; 3123b3eb3cSopenharmony_ci } 3223b3eb3cSopenharmony_ci return MakeRefPtr<ImageSourceOhos>(std::move(src)); 3323b3eb3cSopenharmony_ci} 3423b3eb3cSopenharmony_ci 3523b3eb3cSopenharmony_ciRefPtr<ImageSource> ImageSource::Create(const uint8_t* data, uint32_t size) 3623b3eb3cSopenharmony_ci{ 3723b3eb3cSopenharmony_ci uint32_t errorCode; 3823b3eb3cSopenharmony_ci Media::SourceOptions options; 3923b3eb3cSopenharmony_ci auto src = Media::ImageSource::CreateImageSource(data, size, options, errorCode); 4023b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 4123b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "create image source failed, errorCode = %{public}u", errorCode); 4223b3eb3cSopenharmony_ci return nullptr; 4323b3eb3cSopenharmony_ci } 4423b3eb3cSopenharmony_ci return MakeRefPtr<ImageSourceOhos>(std::move(src)); 4523b3eb3cSopenharmony_ci} 4623b3eb3cSopenharmony_ci 4723b3eb3cSopenharmony_ciRefPtr<ImageSource> ImageSource::Create(const std::string& filePath) 4823b3eb3cSopenharmony_ci{ 4923b3eb3cSopenharmony_ci Media::SourceOptions opts; 5023b3eb3cSopenharmony_ci uint32_t errorCode = 0; 5123b3eb3cSopenharmony_ci auto src = Media::ImageSource::CreateImageSource(filePath, opts, errorCode); 5223b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 5323b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "create image source failed, errorCode = %{public}u", errorCode); 5423b3eb3cSopenharmony_ci return nullptr; 5523b3eb3cSopenharmony_ci } 5623b3eb3cSopenharmony_ci return MakeRefPtr<ImageSourceOhos>(std::move(src)); 5723b3eb3cSopenharmony_ci} 5823b3eb3cSopenharmony_ci 5923b3eb3cSopenharmony_cibool ImageSource::IsAstc(const uint8_t* data, size_t size) 6023b3eb3cSopenharmony_ci{ 6123b3eb3cSopenharmony_ci return Media::ImageSource::IsASTC(data, size); 6223b3eb3cSopenharmony_ci} 6323b3eb3cSopenharmony_ci 6423b3eb3cSopenharmony_ciImageSource::Size ImageSource::GetASTCInfo(const uint8_t* data, size_t size) 6523b3eb3cSopenharmony_ci{ 6623b3eb3cSopenharmony_ci Media::ASTCInfo astcInfo; 6723b3eb3cSopenharmony_ci Media::ImageSource::GetASTCInfo(data, size, astcInfo); 6823b3eb3cSopenharmony_ci return { astcInfo.size.width, astcInfo.size.height }; 6923b3eb3cSopenharmony_ci} 7023b3eb3cSopenharmony_ci 7123b3eb3cSopenharmony_cistd::string ImageSourceOhos::GetProperty(const std::string& key) 7223b3eb3cSopenharmony_ci{ 7323b3eb3cSopenharmony_ci std::string value; 7423b3eb3cSopenharmony_ci uint32_t res = imageSource_->GetImagePropertyString(0, key, value); 7523b3eb3cSopenharmony_ci if (res != Media::SUCCESS) { 7623b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "Get ImageSource property %{public}s failed, errorCode = %{public}u", 7723b3eb3cSopenharmony_ci key.c_str(), res); 7823b3eb3cSopenharmony_ci } 7923b3eb3cSopenharmony_ci return value; 8023b3eb3cSopenharmony_ci} 8123b3eb3cSopenharmony_ci 8223b3eb3cSopenharmony_ciRefPtr<PixelMap> ImageSourceOhos::CreatePixelMap(const Size& size, AIImageQuality imageQuality, bool isHdrDecoderNeed) 8323b3eb3cSopenharmony_ci{ 8423b3eb3cSopenharmony_ci return CreatePixelMap(0, size, imageQuality, isHdrDecoderNeed); 8523b3eb3cSopenharmony_ci} 8623b3eb3cSopenharmony_ci 8723b3eb3cSopenharmony_ciRefPtr<PixelMap> ImageSourceOhos::CreatePixelMap( 8823b3eb3cSopenharmony_ci uint32_t index, const Size& size, AIImageQuality imageQuality, bool isHdrDecoderNeed) 8923b3eb3cSopenharmony_ci{ 9023b3eb3cSopenharmony_ci Media::DecodeOptions options; 9123b3eb3cSopenharmony_ci options.preferDma = true; 9223b3eb3cSopenharmony_ci // only hdr image need to decoder in hdr mode 9323b3eb3cSopenharmony_ci if (isHdrDecoderNeed) { 9423b3eb3cSopenharmony_ci options.desiredDynamicRange = Media::DecodeDynamicRange::AUTO; 9523b3eb3cSopenharmony_ci } 9623b3eb3cSopenharmony_ci options.resolutionQuality = static_cast<Media::ResolutionQuality>(imageQuality); 9723b3eb3cSopenharmony_ci // Pass imageQuality to imageFramework 9823b3eb3cSopenharmony_ci if (size.first > 0 && size.second > 0) { 9923b3eb3cSopenharmony_ci options.desiredSize = { size.first, size.second }; 10023b3eb3cSopenharmony_ci } 10123b3eb3cSopenharmony_ci uint32_t errorCode; 10223b3eb3cSopenharmony_ci auto pixmap = imageSource_->CreatePixelMapEx(index, options, errorCode); 10323b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 10423b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, 10523b3eb3cSopenharmony_ci "create PixelMap from ImageSource failed, index = %{public}u, errorCode = %{public}u", index, errorCode); 10623b3eb3cSopenharmony_ci return nullptr; 10723b3eb3cSopenharmony_ci } 10823b3eb3cSopenharmony_ci return PixelMap::Create(std::move(pixmap)); 10923b3eb3cSopenharmony_ci} 11023b3eb3cSopenharmony_ci 11123b3eb3cSopenharmony_ciRefPtr<PixelMap> ImageSourceOhos::CreatePixelMap() 11223b3eb3cSopenharmony_ci{ 11323b3eb3cSopenharmony_ci uint32_t errorCode; 11423b3eb3cSopenharmony_ci Media::DecodeOptions decodeOpts; 11523b3eb3cSopenharmony_ci auto pixelMap = imageSource_->CreatePixelMap(decodeOpts, errorCode); 11623b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 11723b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, 11823b3eb3cSopenharmony_ci "create PixelMap from ImageSource failed, errorCode = %{public}u", errorCode); 11923b3eb3cSopenharmony_ci return nullptr; 12023b3eb3cSopenharmony_ci } 12123b3eb3cSopenharmony_ci return PixelMap::Create(std::move(pixelMap)); 12223b3eb3cSopenharmony_ci} 12323b3eb3cSopenharmony_ci 12423b3eb3cSopenharmony_ciImageSource::Size ImageSourceOhos::GetImageSize() 12523b3eb3cSopenharmony_ci{ 12623b3eb3cSopenharmony_ci Media::ImageInfo info; 12723b3eb3cSopenharmony_ci auto errorCode = imageSource_->GetImageInfo(info); 12823b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 12923b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "Get ImageSource info failed, errorCode = %{public}u", errorCode); 13023b3eb3cSopenharmony_ci return { 0, 0 }; 13123b3eb3cSopenharmony_ci } 13223b3eb3cSopenharmony_ci return { info.size.width, info.size.height }; 13323b3eb3cSopenharmony_ci} 13423b3eb3cSopenharmony_ci 13523b3eb3cSopenharmony_ciuint32_t ImageSourceOhos::GetFrameCount() 13623b3eb3cSopenharmony_ci{ 13723b3eb3cSopenharmony_ci uint32_t errorCode; 13823b3eb3cSopenharmony_ci auto frameCount = imageSource_->GetFrameCount(errorCode); 13923b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 14023b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "Get image frame count failed, errorCode = %{public}u", errorCode); 14123b3eb3cSopenharmony_ci return 0; 14223b3eb3cSopenharmony_ci } 14323b3eb3cSopenharmony_ci return frameCount; 14423b3eb3cSopenharmony_ci} 14523b3eb3cSopenharmony_ci 14623b3eb3cSopenharmony_cistd::string ImageSourceOhos::GetEncodedFormat() 14723b3eb3cSopenharmony_ci{ 14823b3eb3cSopenharmony_ci uint32_t errorCode; 14923b3eb3cSopenharmony_ci auto sourceInfo = imageSource_->GetSourceInfo(errorCode); 15023b3eb3cSopenharmony_ci if (errorCode != Media::SUCCESS) { 15123b3eb3cSopenharmony_ci TAG_LOGW(AceLogTag::ACE_IMAGE, "Get image source info failed, errorCode = %{public}u", errorCode); 15223b3eb3cSopenharmony_ci return ""; 15323b3eb3cSopenharmony_ci } 15423b3eb3cSopenharmony_ci return sourceInfo.encodedFormat; 15523b3eb3cSopenharmony_ci} 15623b3eb3cSopenharmony_ci} // namespace OHOS::Ace 157