1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#ifndef CODEC_FUNCTION_UTIL_H 17094332d3Sopenharmony_ci#define CODEC_FUNCTION_UTIL_H 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_ci#include <OMX_Component.h> 20094332d3Sopenharmony_ci#include <OMX_Core.h> 21094332d3Sopenharmony_ci#include <OMX_Video.h> 22094332d3Sopenharmony_ci#include <OMX_VideoExt.h> 23094332d3Sopenharmony_ci#include <list> 24094332d3Sopenharmony_ci#include <map> 25094332d3Sopenharmony_ci#include <securec.h> 26094332d3Sopenharmony_ci#include "hdf_log.h" 27094332d3Sopenharmony_ci#include "codec_omx_ext.h" 28094332d3Sopenharmony_ci#include "v3_0/codec_callback_service.h" 29094332d3Sopenharmony_ci#include "v3_0/icodec_component.h" 30094332d3Sopenharmony_ci#include "v3_0/icodec_component_manager.h" 31094332d3Sopenharmony_ci#include "v1_0/display_composer_type.h" 32094332d3Sopenharmony_ci#include "v1_0/display_buffer_type.h" 33094332d3Sopenharmony_ci#include "v1_0/include/idisplay_buffer.h" 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_ciconstexpr int32_t WIDTH = 640; 36094332d3Sopenharmony_ciconstexpr uint32_t MAX_ROLE_INDEX = 256; 37094332d3Sopenharmony_ciconstexpr int FD_DEFAULT = -1; 38094332d3Sopenharmony_ciconstexpr int64_t APP_DATA = 3; 39094332d3Sopenharmony_ciconstexpr int32_t HEIGHT = 480; 40094332d3Sopenharmony_ciconstexpr int32_t BUFFER_SIZE = WIDTH * HEIGHT * 3; 41094332d3Sopenharmony_ciconstexpr int32_t FRAMERATE = 30 << 16; 42094332d3Sopenharmony_ciconstexpr uint32_t BUFFER_ID_ERROR = 65000; 43094332d3Sopenharmony_ciconstexpr int ERROE_FENCEFD = -1; 44094332d3Sopenharmony_ciconstexpr uint32_t WAIT_TIME = 1000; 45094332d3Sopenharmony_ciconstexpr uint32_t MAX_WAIT = 50; 46094332d3Sopenharmony_ciconstexpr uint32_t DENOMINATOR = 2; 47094332d3Sopenharmony_ciconstexpr uint32_t NUMERATOR = 3; 48094332d3Sopenharmony_ciconstexpr uint32_t ALIGNMENT = 16; 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_cinamespace OHOS { 51094332d3Sopenharmony_cinamespace HDI { 52094332d3Sopenharmony_cinamespace Codec { 53094332d3Sopenharmony_cinamespace V3_0 { 54094332d3Sopenharmony_cienum class PortIndex { INDEX_INPUT = 0, INDEX_OUTPUT = 1 }; 55094332d3Sopenharmony_ciclass FunctionUtil : public RefBase { 56094332d3Sopenharmony_ci struct BufferInfo { 57094332d3Sopenharmony_ci std::shared_ptr<OmxCodecBuffer> omxBuffer; 58094332d3Sopenharmony_ci std::shared_ptr<OHOS::Ashmem> sharedMem; 59094332d3Sopenharmony_ci BufferHandle *bufferHandle; 60094332d3Sopenharmony_ci BufferInfo() 61094332d3Sopenharmony_ci { 62094332d3Sopenharmony_ci omxBuffer = nullptr; 63094332d3Sopenharmony_ci sharedMem = nullptr; 64094332d3Sopenharmony_ci bufferHandle = nullptr; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci ~BufferInfo() 67094332d3Sopenharmony_ci { 68094332d3Sopenharmony_ci omxBuffer = nullptr; 69094332d3Sopenharmony_ci if (sharedMem != nullptr) { 70094332d3Sopenharmony_ci sharedMem->UnmapAshmem(); 71094332d3Sopenharmony_ci sharedMem->CloseAshmem(); 72094332d3Sopenharmony_ci sharedMem = nullptr; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci if (bufferHandle != nullptr && buffer_ != nullptr) { 75094332d3Sopenharmony_ci buffer_->FreeMem(*bufferHandle); 76094332d3Sopenharmony_ci bufferHandle = nullptr; 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci }; 80094332d3Sopenharmony_ci 81094332d3Sopenharmony_cipublic: 82094332d3Sopenharmony_ci explicit FunctionUtil(CodecVersionType version); 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_ci ~FunctionUtil(); 85094332d3Sopenharmony_ci 86094332d3Sopenharmony_ci template <typename T> 87094332d3Sopenharmony_ci void InitParam(T ¶m) 88094332d3Sopenharmony_ci { 89094332d3Sopenharmony_ci memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 90094332d3Sopenharmony_ci param.nSize = sizeof(param); 91094332d3Sopenharmony_ci param.nVersion.nVersion = 1; 92094332d3Sopenharmony_ci } 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ci template <typename T> 95094332d3Sopenharmony_ci void InitExtParam(T ¶m) 96094332d3Sopenharmony_ci { 97094332d3Sopenharmony_ci memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 98094332d3Sopenharmony_ci param.size = sizeof(param); 99094332d3Sopenharmony_ci param.version.nVersion = 1; 100094332d3Sopenharmony_ci } 101094332d3Sopenharmony_ci 102094332d3Sopenharmony_ci template <typename T> 103094332d3Sopenharmony_ci void ObjectToVector(T ¶m, std::vector<int8_t> &vec) 104094332d3Sopenharmony_ci { 105094332d3Sopenharmony_ci int8_t *paramPointer = reinterpret_cast<int8_t *>(¶m); 106094332d3Sopenharmony_ci vec.insert(vec.end(), paramPointer, paramPointer + sizeof(param)); 107094332d3Sopenharmony_ci } 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_ci template <typename T> 110094332d3Sopenharmony_ci int32_t VectorToObject(std::vector<int8_t> &vec, T ¶m) 111094332d3Sopenharmony_ci { 112094332d3Sopenharmony_ci auto ret = memcpy_s(¶m, sizeof(param), vec.data(), vec.size()); 113094332d3Sopenharmony_ci if (ret != EOK) { 114094332d3Sopenharmony_ci HDF_LOGE("%{public}s error, memset_s ret [%{public}d", __func__, ret); 115094332d3Sopenharmony_ci return HDF_FAILURE; 116094332d3Sopenharmony_ci } 117094332d3Sopenharmony_ci vec.clear(); 118094332d3Sopenharmony_ci return HDF_SUCCESS; 119094332d3Sopenharmony_ci } 120094332d3Sopenharmony_ci 121094332d3Sopenharmony_ci uint32_t AlignUp(uint32_t width); 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ci void InitOmxCodecBuffer(OmxCodecBuffer &buffer, CodecBufferType type); 124094332d3Sopenharmony_ci 125094332d3Sopenharmony_ci void InitCodecBufferWithAshMem(enum PortIndex port, int bufferSize, std::shared_ptr<OmxCodecBuffer> omxBuffer, 126094332d3Sopenharmony_ci std::shared_ptr<OHOS::Ashmem> sharedMem); 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_ci bool InitBufferHandleParameter(sptr<ICodecComponent> component, OMX_PARAM_PORTDEFINITIONTYPE ¶m, 129094332d3Sopenharmony_ci uint32_t port, CodecBufferType bufferType); 130094332d3Sopenharmony_ci 131094332d3Sopenharmony_ci bool FillCodecBufferWithBufferHandle(std::shared_ptr<OmxCodecBuffer> omxBuffer); 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ci bool UseDynaBuffer(sptr<ICodecComponent> component, enum PortIndex port, int bufferCount, int bufferSize); 134094332d3Sopenharmony_ci 135094332d3Sopenharmony_ci bool UseHandleBuffer(sptr<ICodecComponent> component, enum PortIndex port, int bufferCount, int bufferSize); 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_ci bool UseBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port, int32_t bufferCount, 138094332d3Sopenharmony_ci int32_t bufferSize); 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_ci bool AllocateBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port, int32_t bufferCount, 141094332d3Sopenharmony_ci int32_t bufferSize); 142094332d3Sopenharmony_ci 143094332d3Sopenharmony_ci bool FreeBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port); 144094332d3Sopenharmony_ci 145094332d3Sopenharmony_ci int32_t GetPortParameter(sptr<ICodecComponent> component, PortIndex index, OMX_PARAM_PORTDEFINITIONTYPE ¶m); 146094332d3Sopenharmony_ci 147094332d3Sopenharmony_ci bool FillAndEmptyAllBuffer(sptr<ICodecComponent> component, CodecBufferType type); 148094332d3Sopenharmony_ci 149094332d3Sopenharmony_ci bool WaitState(sptr<ICodecComponent> component, CodecStateType objState); 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_ci bool PushAlongParam(OmxCodecBuffer &omxBuffer); 152094332d3Sopenharmony_ci 153094332d3Sopenharmony_ciprivate: 154094332d3Sopenharmony_ci static OHOS::HDI::Display::Buffer::V1_0::IDisplayBuffer *buffer_; 155094332d3Sopenharmony_ci CodecVersionType version_; 156094332d3Sopenharmony_ci std::map<int32_t, std::shared_ptr<BufferInfo>> inputBuffers_; 157094332d3Sopenharmony_ci std::map<int32_t, std::shared_ptr<BufferInfo>> outputBuffers_; 158094332d3Sopenharmony_ci}; 159094332d3Sopenharmony_ci} // V3_0 160094332d3Sopenharmony_ci} // Codec 161094332d3Sopenharmony_ci} // HDI 162094332d3Sopenharmony_ci} // OHOS 163094332d3Sopenharmony_ci 164094332d3Sopenharmony_ci#endif /* CODEC_FUNCTION_UTIL_H */ 165