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