1 /*
2 * Copyright 2022 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 #include "icodec_buffer.h"
16 #include <hdf_base.h>
17 #include <poll.h>
18 #include <securec.h>
19 #include "codec_dyna_buffer.h"
20 #include "codec_handle_buffer.h"
21 #include "codec_log_wrapper.h"
22 #include "codec_share_buffer.h"
23 #include "v1_0/codec_types.h"
24 using namespace OHOS::HDI::Codec::V1_0;
25 namespace OHOS {
26 namespace Codec {
27 namespace Omx {
ICodecBuffer(struct OmxCodecBuffer & codecBuffer)28 ICodecBuffer::ICodecBuffer(struct OmxCodecBuffer &codecBuffer)
29 {
30 codecBuffer_ = codecBuffer;
31 }
~ICodecBuffer()32 ICodecBuffer::~ICodecBuffer()
33 {}
34
CreateCodeBuffer(struct OmxCodecBuffer & codecBuffer)35 sptr<ICodecBuffer> ICodecBuffer::CreateCodeBuffer(struct OmxCodecBuffer &codecBuffer)
36 {
37 sptr<ICodecBuffer> buffer = nullptr;
38 switch (codecBuffer.bufferType) {
39 case CODEC_BUFFER_TYPE_AVSHARE_MEM_FD:
40 buffer = CodecShareBuffer::Create(codecBuffer);
41 break;
42 case CODEC_BUFFER_TYPE_HANDLE:
43 buffer = CodecHandleBuffer::Create(codecBuffer);
44 break;
45 case CODEC_BUFFER_TYPE_DYNAMIC_HANDLE:
46 buffer = CodecDynaBuffer::Create(codecBuffer);
47 break;
48 default:
49 CODEC_LOGE("bufferType[%{public}d] is unexpected", codecBuffer.bufferType);
50 break;
51 }
52 return buffer;
53 }
54
AllocateCodecBuffer(struct OmxCodecBuffer & codecBuffer)55 sptr<ICodecBuffer> ICodecBuffer::AllocateCodecBuffer(struct OmxCodecBuffer &codecBuffer)
56 {
57 sptr<ICodecBuffer> buffer = nullptr;
58 switch (codecBuffer.bufferType) {
59 case CODEC_BUFFER_TYPE_AVSHARE_MEM_FD:
60 buffer = CodecShareBuffer::Allocate(codecBuffer);
61 break;
62 default:
63 CODEC_LOGE("bufferType[%{public}d] is unexpected", codecBuffer.bufferType);
64 break;
65 }
66 return buffer;
67 }
68
GetCodecBuffer()69 struct OmxCodecBuffer &ICodecBuffer::GetCodecBuffer()
70 {
71 return codecBuffer_;
72 }
73
SetBufferId(int32_t bufferId)74 void ICodecBuffer::SetBufferId(int32_t bufferId)
75 {
76 codecBuffer_.bufferId = bufferId;
77 }
78
CheckInvalid(struct OmxCodecBuffer & codecBuffer)79 bool ICodecBuffer::CheckInvalid(struct OmxCodecBuffer &codecBuffer)
80 {
81 if (codecBuffer_.type != codecBuffer.type) {
82 CODEC_LOGE("input buffer type [%{public}d], but expect type [%{public}d]", codecBuffer.bufferType,
83 codecBuffer_.bufferType);
84 return false;
85 }
86 return true;
87 }
88
FillOmxBuffer(struct OmxCodecBuffer & codecBuffer,OMX_BUFFERHEADERTYPE & omxBuffer)89 int32_t ICodecBuffer::FillOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
90 {
91 omxBuffer.nOffset = codecBuffer.offset;
92 omxBuffer.nFilledLen = codecBuffer.filledLen;
93 omxBuffer.nFlags = codecBuffer.flag;
94 return HDF_SUCCESS;
95 }
96
EmptyOmxBuffer(struct OmxCodecBuffer & codecBuffer,OMX_BUFFERHEADERTYPE & omxBuffer)97 int32_t ICodecBuffer::EmptyOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer)
98 {
99 omxBuffer.nOffset = codecBuffer.offset;
100 omxBuffer.nFilledLen = codecBuffer.filledLen;
101 omxBuffer.nFlags = codecBuffer.flag;
102 omxBuffer.nTimeStamp = codecBuffer.pts;
103 return HDF_SUCCESS;
104 }
105
EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE & omxBuffer)106 int32_t ICodecBuffer::EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
107 {
108 codecBuffer_.offset = omxBuffer.nOffset;
109 codecBuffer_.filledLen = omxBuffer.nFilledLen;
110 return HDF_SUCCESS;
111 }
112
FillOmxBufferDone(OMX_BUFFERHEADERTYPE & omxBuffer)113 int32_t ICodecBuffer::FillOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer)
114 {
115 codecBuffer_.offset = omxBuffer.nOffset;
116 codecBuffer_.filledLen = omxBuffer.nFilledLen;
117 codecBuffer_.flag = omxBuffer.nFlags;
118 codecBuffer_.pts = omxBuffer.nTimeStamp;
119 return HDF_SUCCESS;
120 }
SyncWait(int fd,uint32_t timeout)121 int32_t ICodecBuffer::SyncWait(int fd, uint32_t timeout)
122 {
123 int retCode = -EPERM;
124 if (fd < 0) {
125 CODEC_LOGE("The fence id is invalid.");
126 return retCode;
127 }
128
129 struct pollfd pollfds = {0};
130 pollfds.fd = fd;
131 pollfds.events = POLLIN;
132
133 do {
134 retCode = poll(&pollfds, 1, timeout);
135 } while (retCode == -EPERM && (errno == EINTR || errno == EAGAIN));
136
137 if (retCode == 0) {
138 retCode = -EPERM;
139 errno = ETIME;
140 } else if (retCode > 0) {
141 if (static_cast<uint32_t>(pollfds.revents) & (POLLERR | POLLNVAL)) {
142 retCode = -EPERM;
143 errno = EINVAL;
144 }
145 }
146 return retCode < 0 ? -errno : EOK;
147 }
148 } // namespace Omx
149 } // namespace Codec
150 } // namespace OHOS