1 /*
2 * Copyright (c) 2023 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 #include "algorithm_common.h"
17 #include "securec.h"
18 #include "vpe_log.h"
19 #include "vpe_context.h"
20
21 namespace OHOS {
22 namespace Media {
23 namespace VideoProcessingEngine {
24
SetupOpengl(std::shared_ptr<OpenGLContext> & openglHandle)25 int SetupOpengl(std::shared_ptr<OpenGLContext> &openglHandle)
26 {
27 std::shared_ptr<OpenGLContext> openglContextPtr = std::make_shared<OpenGLContext>();
28 openglContextPtr->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
29 if (openglContextPtr->display == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS) {
30 VPE_LOGE("Get display failed!");
31 return VPE_ALGO_ERR_OPERATION_NOT_SUPPORTED;
32 }
33 EGLint major;
34 EGLint minor;
35 if (eglInitialize(openglContextPtr->display, &major, &minor) == EGL_FALSE || eglGetError() != EGL_SUCCESS) {
36 VPE_LOGE("eglInitialize failed!");
37 return VPE_ALGO_ERR_OPERATION_NOT_SUPPORTED;
38 }
39 openglHandle = openglContextPtr;
40 return static_cast<int>(VPE_ALGO_ERR_OK);
41 }
42
Create(const sptr<SurfaceBuffer> & buffer,ColorSpaceDescription & desc)43 VPEAlgoErrCode ColorSpaceDescription::Create(const sptr<SurfaceBuffer> &buffer, ColorSpaceDescription &desc)
44 {
45 CHECK_AND_RETURN_RET_LOG(nullptr != buffer, VPE_ALGO_ERR_INVALID_VAL, "Get an invalid buffer");
46
47 std::vector<uint8_t> vec;
48 int32_t err = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, vec);
49 CHECK_AND_RETURN_RET_LOG(GSERROR_OK == err, VPE_ALGO_ERR_OPERATION_NOT_SUPPORTED,
50 "Get metadata colorspace info failed, err: %{public}d", err);
51 CHECK_AND_RETURN_RET_LOG(sizeof(desc.colorSpaceInfo) == (vec.size()), VPE_ALGO_ERR_INVALID_VAL,
52 "memcpy_s failed, desc.colorSpaceInfo size != vec size;");
53 errno_t ret = memcpy_s(&desc.colorSpaceInfo, sizeof(desc.colorSpaceInfo), vec.data(), vec.size());
54 if (ret != EOK) {
55 VPE_LOGE("memcpy_s failed, err = %d\n", ret);
56 return VPE_ALGO_ERR_INVALID_VAL;
57 }
58
59 vec.clear();
60 err = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, vec);
61 CHECK_AND_RETURN_RET_LOG(GSERROR_OK == err, VPE_ALGO_ERR_OPERATION_NOT_SUPPORTED,
62 "Get hdr metadata type failed, err: %{public}d", err);
63 CHECK_AND_RETURN_RET_LOG(sizeof(desc.metadataType) == (vec.size()), VPE_ALGO_ERR_INVALID_VAL,
64 "memcpy_s failed, desc.metadataType size != vec size;");
65 ret = memcpy_s(&desc.metadataType, sizeof(desc.metadataType), vec.data(), vec.size());
66 if (ret != EOK) {
67 VPE_LOGE("memcpy_s failed, err = %d\n", ret);
68 return VPE_ALGO_ERR_INVALID_VAL;
69 }
70
71 return VPE_ALGO_ERR_OK;
72 }
73
GetColorSpaceType(const CM_ColorSpaceInfo & colorSpaceInfo)74 uint32_t GetColorSpaceType(const CM_ColorSpaceInfo &colorSpaceInfo)
75 {
76 CHECK_AND_LOG(colorSpaceInfo.primaries <= CM_ColorPrimaries::COLORPRIMARIES_ADOBERGB &&
77 colorSpaceInfo.transfunc <= CM_TransFunc::TRANSFUNC_GAMMA2_4 &&
78 colorSpaceInfo.matrix <= CM_Matrix::MATRIX_BT2100_ICTCP &&
79 colorSpaceInfo.range <= CM_Range::RANGE_EXTEND,
80 "Invalid colorSpaceInfo, primaries : %{public}d, transfunc: %{public}d, matrix: %{public}d, range: %{public}d",
81 colorSpaceInfo.primaries, colorSpaceInfo.transfunc, colorSpaceInfo.matrix, colorSpaceInfo.range);
82 return ((static_cast<unsigned int>(colorSpaceInfo.primaries) << COLORPRIMARIES_OFFSET) +
83 (static_cast<unsigned int>(colorSpaceInfo.transfunc) << TRANSFUNC_OFFSET) +
84 (static_cast<unsigned int>(colorSpaceInfo.matrix) << MATRIX_OFFSET) +
85 (static_cast<unsigned int>(colorSpaceInfo.range) << RANGE_OFFSET));
86 }
87
GetColorSpaceInfo(const uint32_t colorSpaceType)88 CM_ColorSpaceInfo GetColorSpaceInfo(const uint32_t colorSpaceType)
89 {
90 CM_ColorSpaceInfo info;
91 info.primaries = static_cast<CM_ColorPrimaries>((colorSpaceType & COLORPRIMARIES_MASK) >> COLORPRIMARIES_OFFSET);
92 info.transfunc = static_cast<CM_TransFunc>((colorSpaceType & TRANSFUNC_MASK) >> TRANSFUNC_OFFSET);
93 info.matrix = static_cast<CM_Matrix>((colorSpaceType & MATRIX_MASK) >> MATRIX_OFFSET);
94 info.range = static_cast<CM_Range>((colorSpaceType & RANGE_MASK) >> RANGE_OFFSET);
95 return info;
96 }
97
operator <(const ColorSpaceDescription & desc) const98 bool ColorSpaceDescription::operator < (const ColorSpaceDescription &desc) const
99 {
100 uint32_t thisColorSpaceType = GetColorSpaceType(colorSpaceInfo);
101 uint32_t descColorSpaceType = GetColorSpaceType(desc.colorSpaceInfo);
102 return (thisColorSpaceType < descColorSpaceType ||
103 ((thisColorSpaceType == descColorSpaceType) && (metadataType < desc.metadataType)));
104 }
105 } // namespace VideoProcessingEngine
106 } // namespace Media
107 } // namespace OHOS
108