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 
22 namespace OHOS {
23 namespace Codec {
24 namespace Omx {
CodecHandleBuffer(struct OmxCodecBuffer & codecBuffer)25 CodecHandleBuffer::CodecHandleBuffer(struct OmxCodecBuffer &codecBuffer) : ICodecBuffer(codecBuffer)
26 {}
27 
~CodecHandleBuffer()28 CodecHandleBuffer::~CodecHandleBuffer()
29 {
30     if (bufferHandle_ != nullptr) {
31         FreeBufferHandle(bufferHandle_);
32         bufferHandle_ = nullptr;
33     }
34 }
35 
Create(struct OmxCodecBuffer & codecBuffer)36 sptr<ICodecBuffer> CodecHandleBuffer::Create(struct OmxCodecBuffer &codecBuffer)
37 {
38     auto bufferHandle = reinterpret_cast<BufferHandle *>(codecBuffer.buffer);
39     if (bufferHandle == nullptr) {
40         CODEC_LOGE("bufferHandle is null");
41         return nullptr;
42     }
43     codecBuffer.buffer = nullptr;
44     codecBuffer.bufferLen = 0;
45 
46     CodecHandleBuffer *buffer = new CodecHandleBuffer(codecBuffer);
47     buffer->bufferHandle_ = bufferHandle;
48     sptr<ICodecBuffer> pBuffer = sptr<ICodecBuffer>(buffer);
49     return pBuffer;
50 }
51 
FillOmxBuffer(struct OmxCodecBuffer & codecBuffer,OMX_BUFFERHEADERTYPE & omxBuffer)52 int32_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     ResetBuffer(codecBuffer, omxBuffer);
59 
60     int fenceFd = codecBuffer.fenceFd;
61     if (fenceFd >= 0) {
62         auto ret = SyncWait(fenceFd, TIME_WAIT_MS);
63         if (ret != EOK) {
64             CODEC_LOGW("SyncWait ret err");
65         }
66         close(codecBuffer.fenceFd);
67         codecBuffer.fenceFd = -1;
68     }
69     return ICodecBuffer::FillOmxBuffer(codecBuffer, omxBuffer);
70 }
71 
EmptyOmxBuffer(struct OmxCodecBuffer & codecBuffer,OMX_BUFFERHEADERTYPE & omxBuffer)72 int32_t CodecHandleBuffer::EmptyOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
73 {
74     CODEC_LOGE(" bufferHandle is not support in EmptyThisBuffer");
75     (void)codecBuffer;
76     (void)omxBuffer;
77     return HDF_ERR_INVALID_PARAM;
78 }
79 
FreeBuffer(struct OmxCodecBuffer & codecBuffer)80 int32_t CodecHandleBuffer::FreeBuffer(struct OmxCodecBuffer &codecBuffer)
81 {
82     if (!CheckInvalid(codecBuffer)) {
83         CODEC_LOGE("shMem_ is null or CheckInvalid return false");
84         return HDF_ERR_INVALID_PARAM;
85     }
86 
87     if (codecBuffer.buffer != nullptr) {
88         auto bufferHandle = reinterpret_cast<BufferHandle *>(codecBuffer.buffer);
89         FreeBufferHandle(bufferHandle);
90         codecBuffer.buffer = nullptr;
91         codecBuffer.bufferLen = 0;
92     }
93 
94     if (bufferHandle_ != nullptr) {
95         FreeBufferHandle(bufferHandle_);
96         bufferHandle_ = nullptr;
97     }
98 
99     return HDF_SUCCESS;
100 }
101 
EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE & omxBuffer)102 int32_t CodecHandleBuffer::EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
103 {
104     CODEC_LOGE(" bufferHandle is not support in EmptyThisBuffer");
105     (void)omxBuffer;
106     return HDF_ERR_INVALID_PARAM;
107 }
108 
FillOmxBufferDone(OMX_BUFFERHEADERTYPE & omxBuffer)109 int32_t CodecHandleBuffer::FillOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
110 {
111     return ICodecBuffer::FillOmxBufferDone(omxBuffer);
112 }
113 
GetBuffer()114 uint8_t *CodecHandleBuffer::GetBuffer()
115 {
116     return reinterpret_cast<uint8_t *>(bufferHandle_);
117 }
118 
CheckInvalid(struct OmxCodecBuffer & codecBuffer)119 bool CodecHandleBuffer::CheckInvalid(struct OmxCodecBuffer &codecBuffer)
120 {
121     if (!ICodecBuffer::CheckInvalid(codecBuffer) || bufferHandle_ == nullptr) {
122         CODEC_LOGE("bufferHandle_ is null or CheckInvalid return false");
123         return false;
124     }
125     return true;
126 }
127 
ResetBuffer(struct OmxCodecBuffer & codecBuffer,OMX_BUFFERHEADERTYPE & omxBuffer)128 void CodecHandleBuffer::ResetBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
129 {
130     if (codecBuffer.buffer != nullptr) {
131         auto bufferHandle = reinterpret_cast<BufferHandle *>(codecBuffer.buffer);
132         // if recv new BufferHandle, save it, and save the new bufferhandle to omxbuffer
133         if (bufferHandle_ != nullptr) {
134             FreeBufferHandle(bufferHandle_);
135         }
136         bufferHandle_ = bufferHandle;
137 
138         omxBuffer.pBuffer = reinterpret_cast<uint8_t *>(bufferHandle_);
139         codecBuffer.buffer = nullptr;
140         codecBuffer.bufferLen = 0;
141     }
142 }
143 }  // namespace Omx
144 }  // namespace Codec
145 }  // namespace OHOS