19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci 169762338dSopenharmony_ci#ifndef CODEC_FUNCTION_UTIL_H 179762338dSopenharmony_ci#define CODEC_FUNCTION_UTIL_H 189762338dSopenharmony_ci 199762338dSopenharmony_ci#include <OMX_Component.h> 209762338dSopenharmony_ci#include <OMX_Core.h> 219762338dSopenharmony_ci#include <OMX_Video.h> 229762338dSopenharmony_ci#include <OMX_VideoExt.h> 239762338dSopenharmony_ci#include <list> 249762338dSopenharmony_ci#include <map> 259762338dSopenharmony_ci#include <securec.h> 269762338dSopenharmony_ci#include "hdf_log.h" 279762338dSopenharmony_ci#include "codec_omx_ext.h" 289762338dSopenharmony_ci#include "v3_0/codec_callback_service.h" 299762338dSopenharmony_ci#include "v3_0/icodec_component.h" 309762338dSopenharmony_ci#include "v3_0/icodec_component_manager.h" 319762338dSopenharmony_ci#include "v1_0/display_composer_type.h" 329762338dSopenharmony_ci#include "v1_0/display_buffer_type.h" 339762338dSopenharmony_ci#include "v1_0/include/idisplay_buffer.h" 349762338dSopenharmony_ci 359762338dSopenharmony_ciconstexpr int32_t WIDTH = 640; 369762338dSopenharmony_ciconstexpr uint32_t MAX_ROLE_INDEX = 256; 379762338dSopenharmony_ciconstexpr int FD_DEFAULT = -1; 389762338dSopenharmony_ciconstexpr int64_t APP_DATA = 3; 399762338dSopenharmony_ciconstexpr int32_t HEIGHT = 480; 409762338dSopenharmony_ciconstexpr int32_t BUFFER_SIZE = WIDTH * HEIGHT * 3; 419762338dSopenharmony_ciconstexpr int32_t FRAMERATE = 30 << 16; 429762338dSopenharmony_ciconstexpr uint32_t BUFFER_ID_ERROR = 65000; 439762338dSopenharmony_ciconstexpr int ERROE_FENCEFD = -1; 449762338dSopenharmony_ciconstexpr uint32_t WAIT_TIME = 1000; 459762338dSopenharmony_ciconstexpr uint32_t MAX_WAIT = 50; 469762338dSopenharmony_ciconstexpr uint32_t DENOMINATOR = 2; 479762338dSopenharmony_ciconstexpr uint32_t NUMERATOR = 3; 489762338dSopenharmony_ciconstexpr uint32_t ALIGNMENT = 16; 499762338dSopenharmony_ci 509762338dSopenharmony_cinamespace OHOS { 519762338dSopenharmony_cinamespace HDI { 529762338dSopenharmony_cinamespace Codec { 539762338dSopenharmony_cinamespace V3_0 { 549762338dSopenharmony_cienum class PortIndex { INDEX_INPUT = 0, INDEX_OUTPUT = 1 }; 559762338dSopenharmony_ciclass FunctionUtil : public RefBase { 569762338dSopenharmony_ci struct BufferInfo { 579762338dSopenharmony_ci std::shared_ptr<OmxCodecBuffer> omxBuffer; 589762338dSopenharmony_ci std::shared_ptr<OHOS::Ashmem> sharedMem; 599762338dSopenharmony_ci BufferHandle *bufferHandle; 609762338dSopenharmony_ci BufferInfo() 619762338dSopenharmony_ci { 629762338dSopenharmony_ci omxBuffer = nullptr; 639762338dSopenharmony_ci sharedMem = nullptr; 649762338dSopenharmony_ci bufferHandle = nullptr; 659762338dSopenharmony_ci } 669762338dSopenharmony_ci ~BufferInfo() 679762338dSopenharmony_ci { 689762338dSopenharmony_ci omxBuffer = nullptr; 699762338dSopenharmony_ci if (sharedMem != nullptr) { 709762338dSopenharmony_ci sharedMem->UnmapAshmem(); 719762338dSopenharmony_ci sharedMem->CloseAshmem(); 729762338dSopenharmony_ci sharedMem = nullptr; 739762338dSopenharmony_ci } 749762338dSopenharmony_ci if (bufferHandle != nullptr && buffer_ != nullptr) { 759762338dSopenharmony_ci buffer_->FreeMem(*bufferHandle); 769762338dSopenharmony_ci bufferHandle = nullptr; 779762338dSopenharmony_ci } 789762338dSopenharmony_ci } 799762338dSopenharmony_ci }; 809762338dSopenharmony_ci 819762338dSopenharmony_cipublic: 829762338dSopenharmony_ci explicit FunctionUtil(CodecVersionType version); 839762338dSopenharmony_ci 849762338dSopenharmony_ci ~FunctionUtil(); 859762338dSopenharmony_ci 869762338dSopenharmony_ci template <typename T> 879762338dSopenharmony_ci void InitParam(T ¶m) 889762338dSopenharmony_ci { 899762338dSopenharmony_ci memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 909762338dSopenharmony_ci param.nSize = sizeof(param); 919762338dSopenharmony_ci param.nVersion.nVersion = 1; 929762338dSopenharmony_ci } 939762338dSopenharmony_ci 949762338dSopenharmony_ci template <typename T> 959762338dSopenharmony_ci void InitExtParam(T ¶m) 969762338dSopenharmony_ci { 979762338dSopenharmony_ci memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 989762338dSopenharmony_ci param.size = sizeof(param); 999762338dSopenharmony_ci param.version.nVersion = 1; 1009762338dSopenharmony_ci } 1019762338dSopenharmony_ci 1029762338dSopenharmony_ci template <typename T> 1039762338dSopenharmony_ci void ObjectToVector(T ¶m, std::vector<int8_t> &vec) 1049762338dSopenharmony_ci { 1059762338dSopenharmony_ci int8_t *paramPointer = reinterpret_cast<int8_t *>(¶m); 1069762338dSopenharmony_ci vec.insert(vec.end(), paramPointer, paramPointer + sizeof(param)); 1079762338dSopenharmony_ci } 1089762338dSopenharmony_ci 1099762338dSopenharmony_ci template <typename T> 1109762338dSopenharmony_ci int32_t VectorToObject(std::vector<int8_t> &vec, T ¶m) 1119762338dSopenharmony_ci { 1129762338dSopenharmony_ci auto ret = memcpy_s(¶m, sizeof(param), vec.data(), vec.size()); 1139762338dSopenharmony_ci if (ret != EOK) { 1149762338dSopenharmony_ci HDF_LOGE("%{public}s error, memset_s ret [%{public}d", __func__, ret); 1159762338dSopenharmony_ci return HDF_FAILURE; 1169762338dSopenharmony_ci } 1179762338dSopenharmony_ci vec.clear(); 1189762338dSopenharmony_ci return HDF_SUCCESS; 1199762338dSopenharmony_ci } 1209762338dSopenharmony_ci 1219762338dSopenharmony_ci uint32_t AlignUp(uint32_t width); 1229762338dSopenharmony_ci 1239762338dSopenharmony_ci void InitOmxCodecBuffer(OmxCodecBuffer &buffer, CodecBufferType type); 1249762338dSopenharmony_ci 1259762338dSopenharmony_ci void InitCodecBufferWithAshMem(enum PortIndex port, int bufferSize, std::shared_ptr<OmxCodecBuffer> omxBuffer, 1269762338dSopenharmony_ci std::shared_ptr<OHOS::Ashmem> sharedMem); 1279762338dSopenharmony_ci 1289762338dSopenharmony_ci bool InitBufferHandleParameter(sptr<ICodecComponent> component, OMX_PARAM_PORTDEFINITIONTYPE ¶m, 1299762338dSopenharmony_ci uint32_t port, CodecBufferType bufferType); 1309762338dSopenharmony_ci 1319762338dSopenharmony_ci bool FillCodecBufferWithBufferHandle(std::shared_ptr<OmxCodecBuffer> omxBuffer); 1329762338dSopenharmony_ci 1339762338dSopenharmony_ci bool UseDynaBuffer(sptr<ICodecComponent> component, enum PortIndex port, int bufferCount, int bufferSize); 1349762338dSopenharmony_ci 1359762338dSopenharmony_ci bool UseHandleBuffer(sptr<ICodecComponent> component, enum PortIndex port, int bufferCount, int bufferSize); 1369762338dSopenharmony_ci 1379762338dSopenharmony_ci bool UseBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port, int32_t bufferCount, 1389762338dSopenharmony_ci int32_t bufferSize); 1399762338dSopenharmony_ci 1409762338dSopenharmony_ci bool AllocateBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port, int32_t bufferCount, 1419762338dSopenharmony_ci int32_t bufferSize); 1429762338dSopenharmony_ci 1439762338dSopenharmony_ci bool FreeBufferOnPort(sptr<ICodecComponent> component, enum PortIndex port); 1449762338dSopenharmony_ci 1459762338dSopenharmony_ci int32_t GetPortParameter(sptr<ICodecComponent> component, PortIndex index, OMX_PARAM_PORTDEFINITIONTYPE ¶m); 1469762338dSopenharmony_ci 1479762338dSopenharmony_ci bool FillAndEmptyAllBuffer(sptr<ICodecComponent> component, CodecBufferType type); 1489762338dSopenharmony_ci 1499762338dSopenharmony_ci bool WaitState(sptr<ICodecComponent> component, CodecStateType objState); 1509762338dSopenharmony_ci 1519762338dSopenharmony_ci bool PushAlongParam(OmxCodecBuffer &omxBuffer); 1529762338dSopenharmony_ci 1539762338dSopenharmony_ciprivate: 1549762338dSopenharmony_ci static OHOS::HDI::Display::Buffer::V1_0::IDisplayBuffer *buffer_; 1559762338dSopenharmony_ci CodecVersionType version_; 1569762338dSopenharmony_ci std::map<int32_t, std::shared_ptr<BufferInfo>> inputBuffers_; 1579762338dSopenharmony_ci std::map<int32_t, std::shared_ptr<BufferInfo>> outputBuffers_; 1589762338dSopenharmony_ci}; 1599762338dSopenharmony_ci} // V3_0 1609762338dSopenharmony_ci} // Codec 1619762338dSopenharmony_ci} // HDI 1629762338dSopenharmony_ci} // OHOS 1639762338dSopenharmony_ci 1649762338dSopenharmony_ci#endif /* CODEC_FUNCTION_UTIL_H */ 165