1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright 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 <condition_variable> 20094332d3Sopenharmony_ci#include <list> 21094332d3Sopenharmony_ci#include <map> 22094332d3Sopenharmony_ci#include <memory> 23094332d3Sopenharmony_ci#include <mutex> 24094332d3Sopenharmony_ci#include <ashmem.h> 25094332d3Sopenharmony_ci#include <buffer_handle.h> 26094332d3Sopenharmony_ci#include <OMX_Component.h> 27094332d3Sopenharmony_ci#include <OMX_Core.h> 28094332d3Sopenharmony_ci#include <OMX_VideoExt.h> 29094332d3Sopenharmony_ci#include <securec.h> 30094332d3Sopenharmony_ci#include "codec_hdi_callback.h" 31094332d3Sopenharmony_ci#include "codec_utils.h" 32094332d3Sopenharmony_ci#include "codec_omx_ext.h" 33094332d3Sopenharmony_ci#include "command_parse.h" 34094332d3Sopenharmony_ci#include "hdf_log.h" 35094332d3Sopenharmony_ci#include "sys/mman.h" 36094332d3Sopenharmony_ci#include "v3_0/codec_types.h" 37094332d3Sopenharmony_ci#include "v3_0/icodec_callback.h" 38094332d3Sopenharmony_ci#include "v3_0/icodec_component.h" 39094332d3Sopenharmony_ci#include "v3_0/icodec_component_manager.h" 40094332d3Sopenharmony_ci#include "v1_0/include/idisplay_buffer.h" 41094332d3Sopenharmony_ci 42094332d3Sopenharmony_ciusing OHOS::HDI::Codec::V3_0::OmxCodecBuffer; 43094332d3Sopenharmony_ciclass CodecHdiEncode : public ICodecHdiCallBackBase, 44094332d3Sopenharmony_ci public std::enable_shared_from_this<CodecHdiEncode> { 45094332d3Sopenharmony_ci enum class PortIndex { PORT_INDEX_INPUT = 0, PORT_INDEX_OUTPUT = 1 }; 46094332d3Sopenharmony_ci struct BufferInfo { 47094332d3Sopenharmony_ci std::shared_ptr<OmxCodecBuffer> omxBuffer; 48094332d3Sopenharmony_ci std::shared_ptr<OHOS::Ashmem> avSharedPtr; 49094332d3Sopenharmony_ci int bufferHandleId; 50094332d3Sopenharmony_ci PortIndex portIndex; 51094332d3Sopenharmony_ci BufferInfo() 52094332d3Sopenharmony_ci { 53094332d3Sopenharmony_ci omxBuffer = nullptr; 54094332d3Sopenharmony_ci avSharedPtr = nullptr; 55094332d3Sopenharmony_ci portIndex = PortIndex::PORT_INDEX_INPUT; 56094332d3Sopenharmony_ci bufferHandleId = -1; 57094332d3Sopenharmony_ci } 58094332d3Sopenharmony_ci ~BufferInfo() 59094332d3Sopenharmony_ci { 60094332d3Sopenharmony_ci omxBuffer = nullptr; 61094332d3Sopenharmony_ci if (avSharedPtr) { 62094332d3Sopenharmony_ci avSharedPtr->UnmapAshmem(); 63094332d3Sopenharmony_ci avSharedPtr->CloseAshmem(); 64094332d3Sopenharmony_ci avSharedPtr = nullptr; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci portIndex = PortIndex::PORT_INDEX_INPUT; 67094332d3Sopenharmony_ci bufferHandleId = -1; 68094332d3Sopenharmony_ci } 69094332d3Sopenharmony_ci }; 70094332d3Sopenharmony_ci using BufferInfo = struct BufferInfo; 71094332d3Sopenharmony_ci 72094332d3Sopenharmony_cipublic: 73094332d3Sopenharmony_ci CodecHdiEncode(); 74094332d3Sopenharmony_ci virtual ~CodecHdiEncode(); 75094332d3Sopenharmony_ci 76094332d3Sopenharmony_ci bool Init(const CommandOpt &opt); 77094332d3Sopenharmony_ci bool Configure(); 78094332d3Sopenharmony_ci bool UseBuffers(); 79094332d3Sopenharmony_ci int32_t UseBufferOnPort(PortIndex portIndex); 80094332d3Sopenharmony_ci void FreeBuffers(); 81094332d3Sopenharmony_ci void Run(); 82094332d3Sopenharmony_ci void Release(); 83094332d3Sopenharmony_ci void WaitForStatusChanged(); 84094332d3Sopenharmony_ci void OnStatusChanged(); 85094332d3Sopenharmony_ci bool ReadOneFrame(FILE *fp, char *buf, uint32_t &filledCount); 86094332d3Sopenharmony_ci int32_t OnEmptyBufferDone(const struct OmxCodecBuffer &buffer) override; 87094332d3Sopenharmony_ci int32_t OnFillBufferDone(const struct OmxCodecBuffer &buffer) override; 88094332d3Sopenharmony_ci int32_t EventHandler(OHOS::HDI::Codec::V3_0::CodecEventType event, 89094332d3Sopenharmony_ci const OHOS::HDI::Codec::V3_0::EventInfo &info) override; 90094332d3Sopenharmony_ci 91094332d3Sopenharmony_ciprivate: 92094332d3Sopenharmony_ci int32_t ConfigBitMode(); 93094332d3Sopenharmony_ci int32_t UseBufferOnPort(PortIndex portIndex, int bufferCount, int bufferSize); 94094332d3Sopenharmony_ci bool FillAllTheBuffer(); 95094332d3Sopenharmony_ci int GetFreeBufferId(); 96094332d3Sopenharmony_ci int32_t ConfigPortDefine(); 97094332d3Sopenharmony_ci int32_t CheckAndUseBufferHandle(); 98094332d3Sopenharmony_ci int32_t CheckSupportBufferType(PortIndex portIndex, CodecBufferType codecBufferType); 99094332d3Sopenharmony_ci int32_t CheckAndUseDMABuffer(); 100094332d3Sopenharmony_ci int32_t UseDMABuffer(PortIndex portIndex, int bufferCount, int bufferSize); 101094332d3Sopenharmony_ci int32_t UseDynaBuffer(int bufferCount, int bufferSize); 102094332d3Sopenharmony_ci bool FillCodecBuffer(std::shared_ptr<BufferInfo> bufferInfo, bool &endFlag); 103094332d3Sopenharmony_ci int32_t CreateBufferHandle(); 104094332d3Sopenharmony_ci int32_t GetComponentName(std::string &compName); 105094332d3Sopenharmony_ci uint32_t inline AlignUp(uint32_t width) 106094332d3Sopenharmony_ci { 107094332d3Sopenharmony_ci return (((width) + alignment_ - 1) & (~(alignment_ - 1))); 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_ciprivate: 111094332d3Sopenharmony_ci FILE *fpIn_; // input file 112094332d3Sopenharmony_ci FILE *fpOut_; 113094332d3Sopenharmony_ci uint32_t width_; 114094332d3Sopenharmony_ci uint32_t height_; 115094332d3Sopenharmony_ci uint32_t stride_; 116094332d3Sopenharmony_ci OHOS::sptr<OHOS::HDI::Codec::V3_0::ICodecComponent> client_; 117094332d3Sopenharmony_ci OHOS::sptr<OHOS::HDI::Codec::V3_0::ICodecCallback> callback_; 118094332d3Sopenharmony_ci OHOS::sptr<OHOS::HDI::Codec::V3_0::ICodecComponentManager> omxMgr_; 119094332d3Sopenharmony_ci uint32_t componentId_; 120094332d3Sopenharmony_ci std::map<int, std::shared_ptr<BufferInfo>> omxBuffers_; // key is bufferID 121094332d3Sopenharmony_ci std::map<int, const void *> addrs_; 122094332d3Sopenharmony_ci std::list<int> unUsedInBuffers_; 123094332d3Sopenharmony_ci std::list<int> unUsedOutBuffers_; 124094332d3Sopenharmony_ci std::mutex lockInputBuffers_; 125094332d3Sopenharmony_ci std::condition_variable statusCondition_; 126094332d3Sopenharmony_ci std::mutex statusLock_; 127094332d3Sopenharmony_ci bool exit_; 128094332d3Sopenharmony_ci std::map<int, BufferHandle *> bufferHandles_; 129094332d3Sopenharmony_ci std::list<int> freeBufferHandles_; 130094332d3Sopenharmony_ci bool useBufferHandle_; 131094332d3Sopenharmony_ci bool useDMABuffer_; 132094332d3Sopenharmony_ci static CodecUtil *util_; 133094332d3Sopenharmony_ci static constexpr uint32_t alignment_ = 16; 134094332d3Sopenharmony_ci static OHOS::HDI::Display::Buffer::V1_0::IDisplayBuffer *gralloc_; 135094332d3Sopenharmony_ci}; 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_ci#endif // CODEC_HDI_ENCODE_H