• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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