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 &param)
889762338dSopenharmony_ci    {
899762338dSopenharmony_ci        memset_s(&param, 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 &param)
969762338dSopenharmony_ci    {
979762338dSopenharmony_ci        memset_s(&param, 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 &param, std::vector<int8_t> &vec)
1049762338dSopenharmony_ci    {
1059762338dSopenharmony_ci        int8_t *paramPointer = reinterpret_cast<int8_t *>(&param);
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 &param)
1119762338dSopenharmony_ci    {
1129762338dSopenharmony_ci        auto ret = memcpy_s(&param, 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 &param,
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 &param);
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