1/*
2 * Copyright (c) 2022-2023 Shenzhen Kaihong DID Co., Ltd..
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *      http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "codec_handle_buffer.h"
17#include <hdf_base.h>
18#include <securec.h>
19#include <unistd.h>
20#include "codec_log_wrapper.h"
21#include "v3_0/codec_types.h"
22using namespace OHOS::HDI::Codec::V3_0;
23namespace OHOS {
24namespace Codec {
25namespace Omx {
26CodecHandleBuffer::CodecHandleBuffer(struct OmxCodecBuffer &codecBuffer)
27    : ICodecBuffer(codecBuffer)
28{
29    buffer_ = codecBuffer.bufferhandle;
30}
31
32CodecHandleBuffer::~CodecHandleBuffer()
33{
34}
35
36sptr<ICodecBuffer> CodecHandleBuffer::Create(struct OmxCodecBuffer &codecBuffer)
37{
38    if (codecBuffer.bufferhandle == nullptr) {
39        CODEC_LOGE("nativebuffer is null");
40        return nullptr;
41    }
42    BufferHandle *bufferHandle = codecBuffer.bufferhandle->GetBufferHandle();
43    if (bufferHandle == nullptr) {
44        CODEC_LOGE("bufferHandle is null");
45        return nullptr;
46    }
47    CodecHandleBuffer *buffer = new CodecHandleBuffer(codecBuffer);
48    codecBuffer.bufferhandle = nullptr;
49    return sptr<ICodecBuffer>(buffer);
50}
51
52int32_t CodecHandleBuffer::FillOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
53{
54    if (!CheckInvalid(codecBuffer)) {
55        CODEC_LOGE("CheckInvalid return false or mem has no right to write ");
56        return HDF_ERR_INVALID_PARAM;
57    }
58
59    int fenceFd = codecBuffer.fenceFd;
60    if (fenceFd >= 0) {
61        auto ret = SyncWait(fenceFd, TIME_WAIT_MS);
62        if (ret != EOK) {
63            CODEC_LOGE("SyncWait ret err [%{public}d]", ret);
64        }
65        close(codecBuffer.fenceFd);
66        codecBuffer.fenceFd = -1;
67    }
68    return ICodecBuffer::FillOmxBuffer(codecBuffer, omxBuffer);
69}
70
71int32_t CodecHandleBuffer::EmptyOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
72{
73    CODEC_LOGE("bufferHandle is not support in EmptyThisBuffer");
74    (void)codecBuffer;
75    (void)omxBuffer;
76    return HDF_ERR_INVALID_PARAM;
77}
78
79int32_t CodecHandleBuffer::FreeBuffer(struct OmxCodecBuffer &codecBuffer)
80{
81    if (!CheckInvalid(codecBuffer)) {
82        CODEC_LOGE("shMem_ is null or CheckInvalid return false");
83        return HDF_ERR_INVALID_PARAM;
84    }
85    codecBuffer.bufferhandle = nullptr;
86    buffer_ = nullptr;
87
88    return HDF_SUCCESS;
89}
90
91int32_t CodecHandleBuffer::EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
92{
93    CODEC_LOGE("bufferHandle is not support in EmptyThisBuffer");
94    (void)omxBuffer;
95    return HDF_ERR_INVALID_PARAM;
96}
97
98int32_t CodecHandleBuffer::FillOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
99{
100    return ICodecBuffer::FillOmxBufferDone(omxBuffer);
101}
102
103uint8_t *CodecHandleBuffer::GetBuffer()
104{
105    if (buffer_ == nullptr) {
106        return nullptr;
107    }
108    return reinterpret_cast<uint8_t *>(buffer_->GetBufferHandle());
109}
110
111}  // namespace Omx
112}  // namespace Codec
113}  // namespace OHOS