1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Shenzhen Kaihong DID 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 applicable 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_HDI_DECODE_H 17094332d3Sopenharmony_ci#define CODEC_HDI_DECODE_H 18094332d3Sopenharmony_ci#include <OMX_Component.h> 19094332d3Sopenharmony_ci#include <OMX_Core.h> 20094332d3Sopenharmony_ci#include <OMX_VideoExt.h> 21094332d3Sopenharmony_ci#include <ashmem.h> 22094332d3Sopenharmony_ci#include <buffer_handle.h> 23094332d3Sopenharmony_ci#include <condition_variable> 24094332d3Sopenharmony_ci#include <hdf_log.h> 25094332d3Sopenharmony_ci#include <securec.h> 26094332d3Sopenharmony_ci#include <fstream> 27094332d3Sopenharmony_ci#include <list> 28094332d3Sopenharmony_ci#include <map> 29094332d3Sopenharmony_ci#include <memory> 30094332d3Sopenharmony_ci#include <mutex> 31094332d3Sopenharmony_ci#include "codec_component_type.h" 32094332d3Sopenharmony_ci#include "codec_packet_reader.h" 33094332d3Sopenharmony_ci#include "command_parse.h" 34094332d3Sopenharmony_ci#include "v1_0/display_composer_type.h" 35094332d3Sopenharmony_ci#include "v1_0/display_buffer_type.h" 36094332d3Sopenharmony_ci#include "v1_0/include/idisplay_buffer.h" 37094332d3Sopenharmony_cienum class PortIndex { PORT_INDEX_INPUT = 0, PORT_INDEX_OUTPUT = 1 }; 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_ciclass CodecHdiDecode { 40094332d3Sopenharmony_ci struct BufferInfo { 41094332d3Sopenharmony_ci std::shared_ptr<OmxCodecBuffer> omxBuffer; 42094332d3Sopenharmony_ci std::shared_ptr<OHOS::Ashmem> avSharedPtr; 43094332d3Sopenharmony_ci PortIndex portIndex; 44094332d3Sopenharmony_ci BufferHandle *bufferHandle; 45094332d3Sopenharmony_ci BufferInfo() 46094332d3Sopenharmony_ci { 47094332d3Sopenharmony_ci omxBuffer = nullptr; 48094332d3Sopenharmony_ci avSharedPtr = nullptr; 49094332d3Sopenharmony_ci portIndex = PortIndex::PORT_INDEX_INPUT; 50094332d3Sopenharmony_ci bufferHandle = nullptr; 51094332d3Sopenharmony_ci } 52094332d3Sopenharmony_ci ~BufferInfo() 53094332d3Sopenharmony_ci { 54094332d3Sopenharmony_ci omxBuffer = nullptr; 55094332d3Sopenharmony_ci if (avSharedPtr != nullptr) { 56094332d3Sopenharmony_ci avSharedPtr->UnmapAshmem(); 57094332d3Sopenharmony_ci avSharedPtr->CloseAshmem(); 58094332d3Sopenharmony_ci avSharedPtr = nullptr; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci if (bufferHandle != nullptr && buffer_ != nullptr) { 61094332d3Sopenharmony_ci buffer_->FreeMem(*bufferHandle); 62094332d3Sopenharmony_ci bufferHandle = nullptr; 63094332d3Sopenharmony_ci } 64094332d3Sopenharmony_ci portIndex = PortIndex::PORT_INDEX_INPUT; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci void setBufferHandle(BufferHandle *bufferHandle) 67094332d3Sopenharmony_ci { 68094332d3Sopenharmony_ci if (this->bufferHandle != nullptr) { 69094332d3Sopenharmony_ci if (buffer_ != nullptr) { 70094332d3Sopenharmony_ci buffer_->FreeMem(*this->bufferHandle); 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci } 73094332d3Sopenharmony_ci this->bufferHandle = bufferHandle; 74094332d3Sopenharmony_ci } 75094332d3Sopenharmony_ci }; 76094332d3Sopenharmony_ci 77094332d3Sopenharmony_cipublic: 78094332d3Sopenharmony_ci explicit CodecHdiDecode(); 79094332d3Sopenharmony_ci ~CodecHdiDecode(); 80094332d3Sopenharmony_ci bool Init(CommandOpt &opt); 81094332d3Sopenharmony_ci bool Configure(); 82094332d3Sopenharmony_ci bool UseBuffers(); 83094332d3Sopenharmony_ci void FreeBuffers(); 84094332d3Sopenharmony_ci void Run(); 85094332d3Sopenharmony_ci void Release(); 86094332d3Sopenharmony_ci static int32_t OnEvent(struct CodecCallbackType *self, OMX_EVENTTYPE event, struct EventInfo *info); 87094332d3Sopenharmony_ci static int32_t OnEmptyBufferDone(struct CodecCallbackType *self, int64_t appData, 88094332d3Sopenharmony_ci const struct OmxCodecBuffer *buffer); 89094332d3Sopenharmony_ci static int32_t OnFillBufferDone(struct CodecCallbackType *self, int64_t appData, 90094332d3Sopenharmony_ci const struct OmxCodecBuffer *buffer); 91094332d3Sopenharmony_ci template <typename T> 92094332d3Sopenharmony_ci inline void InitParam(T ¶m) 93094332d3Sopenharmony_ci { 94094332d3Sopenharmony_ci int32_t ret = memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 95094332d3Sopenharmony_ci if (ret != EOK) { 96094332d3Sopenharmony_ci HDF_LOGE("%{public}s: memset_s param err [%{public}d].", __func__, ret); 97094332d3Sopenharmony_ci return; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci param.nSize = sizeof(param); 100094332d3Sopenharmony_ci param.nVersion.s.nVersionMajor = 1; // mVersion.s.nVersionMajor; 101094332d3Sopenharmony_ci } 102094332d3Sopenharmony_ci template <typename T> 103094332d3Sopenharmony_ci inline void InitParamInOhos(T ¶m) 104094332d3Sopenharmony_ci { 105094332d3Sopenharmony_ci int32_t ret = memset_s(¶m, sizeof(param), 0x0, sizeof(param)); 106094332d3Sopenharmony_ci if (ret != EOK) { 107094332d3Sopenharmony_ci HDF_LOGE("%{public}s: memset_s param err [%{public}d].", __func__, ret); 108094332d3Sopenharmony_ci return; 109094332d3Sopenharmony_ci } 110094332d3Sopenharmony_ci param.size = sizeof(param); 111094332d3Sopenharmony_ci param.version.s.nVersionMajor = 1; // mVersion.s.nVersionMajor; 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci void WaitForStatusChanged(); 114094332d3Sopenharmony_ci void OnStatusChanged(); 115094332d3Sopenharmony_ci 116094332d3Sopenharmony_ciprivate: 117094332d3Sopenharmony_ci int32_t UseBufferOnPort(PortIndex portIndex); 118094332d3Sopenharmony_ci int32_t UseBufferOnPort(PortIndex portIndex, int bufferCount, int bufferSize); 119094332d3Sopenharmony_ci int32_t UseBufferHandle(int bufferCount, int bufferSize); 120094332d3Sopenharmony_ci int32_t OnEmptyBufferDone(const struct OmxCodecBuffer &buffer); 121094332d3Sopenharmony_ci int32_t OnFillBufferDone(const struct OmxCodecBuffer &buffer); 122094332d3Sopenharmony_ci int32_t CheckAndUseBufferHandle(); 123094332d3Sopenharmony_ci int GetYuvSize(); 124094332d3Sopenharmony_ci int32_t ConfigPortDefine(); 125094332d3Sopenharmony_ci bool FillAllTheBuffer(); 126094332d3Sopenharmony_ci int GetFreeBufferId(); 127094332d3Sopenharmony_ci uint32_t inline AlignUp(uint32_t width) 128094332d3Sopenharmony_ci { 129094332d3Sopenharmony_ci return (((width) + alignment_ - 1) & (~(alignment_ - 1))); 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci int32_t GetComponent(); 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ciprivate: 134094332d3Sopenharmony_ci std::ifstream ioIn_; 135094332d3Sopenharmony_ci std::ofstream ioOut_; 136094332d3Sopenharmony_ci uint32_t width_; 137094332d3Sopenharmony_ci uint32_t height_; 138094332d3Sopenharmony_ci uint32_t stride_; 139094332d3Sopenharmony_ci struct CodecComponentType *client_; 140094332d3Sopenharmony_ci struct CodecCallbackType *callback_; 141094332d3Sopenharmony_ci struct CodecComponentManager *omxMgr_; 142094332d3Sopenharmony_ci uint32_t componentId_; 143094332d3Sopenharmony_ci std::map<int, std::shared_ptr<BufferInfo>> omxBuffers_; // key is buferid 144094332d3Sopenharmony_ci std::list<int> unUsedInBuffers_; 145094332d3Sopenharmony_ci std::list<int> unUsedOutBuffers_; 146094332d3Sopenharmony_ci std::mutex lockInputBuffers_; 147094332d3Sopenharmony_ci std::condition_variable statusCondition_; 148094332d3Sopenharmony_ci std::mutex statusLock_; 149094332d3Sopenharmony_ci bool exit_; 150094332d3Sopenharmony_ci ColorFormat color_; 151094332d3Sopenharmony_ci OMX_COLOR_FORMATTYPE omxColorFormat_; 152094332d3Sopenharmony_ci CodecMime codecMime_; 153094332d3Sopenharmony_ci bool useBufferHandle_; 154094332d3Sopenharmony_ci int count_; 155094332d3Sopenharmony_ci static constexpr uint32_t alignment_ = 16; 156094332d3Sopenharmony_ci static OHOS::HDI::Display::Buffer::V1_0::IDisplayBuffer *buffer_; 157094332d3Sopenharmony_ci CodecPacketReader::Ptr reader_; 158094332d3Sopenharmony_ci}; 159094332d3Sopenharmony_ci#endif /* CODEC_HDI_DECODE_H */