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
16 #include "component_node.h"
17 #include <ashmem.h>
18 #include <hdf_log.h>
19 #include <securec.h>
20 #include <unistd.h>
21 #include "icodec_buffer.h"
22
23 #define HDF_LOG_TAG codec_hdi_server
24 #define FD_SIZE sizeof(int)
25 namespace {
26 constexpr int ROLE_MAX_LEN = 256;
27 }
28
29 namespace OHOS {
30 namespace Codec {
31 namespace Omx {
OnEvent(OMX_HANDLETYPE component,void * appData,OMX_EVENTTYPE event,uint32_t data1,uint32_t data2,void * eventData)32 OMX_ERRORTYPE ComponentNode::OnEvent(OMX_HANDLETYPE component, void *appData, OMX_EVENTTYPE event, uint32_t data1,
33 uint32_t data2, void *eventData)
34 {
35 ComponentNode *node = static_cast<ComponentNode *>(appData);
36 (void)component;
37 if (node != nullptr) {
38 node->OnEvent(event, data1, data2, eventData);
39 }
40
41 return OMX_ErrorNone;
42 }
43
OnEmptyBufferDone(OMX_HANDLETYPE component,void * appData,OMX_BUFFERHEADERTYPE * buffer)44 OMX_ERRORTYPE ComponentNode::OnEmptyBufferDone(OMX_HANDLETYPE component, void *appData, OMX_BUFFERHEADERTYPE *buffer)
45 {
46 ComponentNode *node = static_cast<ComponentNode *>(appData);
47 (void)component;
48 if (node != nullptr) {
49 node->OnEmptyBufferDone(buffer);
50 }
51 return OMX_ErrorNone;
52 }
53
OnFillBufferDone(OMX_HANDLETYPE component,void * appData,OMX_BUFFERHEADERTYPE * buffer)54 OMX_ERRORTYPE ComponentNode::OnFillBufferDone(OMX_HANDLETYPE component, void *appData, OMX_BUFFERHEADERTYPE *buffer)
55 {
56 ComponentNode *node = static_cast<ComponentNode *>(appData);
57 (void)component;
58 if (node != nullptr) {
59 node->OnFillBufferDone(buffer);
60 }
61 return OMX_ErrorNone;
62 }
63
64 OMX_CALLBACKTYPE ComponentNode::callbacks_ = {&ComponentNode::OnEvent, &ComponentNode::OnEmptyBufferDone,
65 &ComponentNode::OnFillBufferDone};
66
ComponentNode(struct CodecCallbackType * callback,int64_t appData)67 ComponentNode::ComponentNode(struct CodecCallbackType *callback, int64_t appData)
68 {
69 appData_ = appData;
70 comp_ = nullptr;
71 codecBufferMap_.clear();
72 bufferHeaderMap_.clear();
73 omxCallback_ = callback;
74 bufferIdCount_ = 0;
75 }
76
~ComponentNode()77 ComponentNode::~ComponentNode()
78 {
79 if (omxCallback_ != nullptr) {
80 CodecCallbackTypeRelease(omxCallback_);
81 omxCallback_ = nullptr;
82 }
83 codecBufferMap_.clear();
84 bufferHeaderMap_.clear();
85 bufferIdCount_ = 0;
86 }
87
GetComponentVersion(struct CompVerInfo & verInfo)88 int32_t ComponentNode::GetComponentVersion(struct CompVerInfo &verInfo)
89 {
90 if (comp_ == nullptr) {
91 HDF_LOGE("%{public}s error, comp_ is null or verInfo is null", __func__);
92 return OMX_ErrorInvalidComponent;
93 }
94 int32_t err =
95 OMX_GetComponentVersion(comp_, verInfo.compName, &verInfo.compVersion, &verInfo.specVersion, &verInfo.compUUID);
96 if (err != OMX_ErrorNone) {
97 HDF_LOGE("%{public}s error, OMX_GetComponentVersion err = %{public}d ", __func__, err);
98 return err;
99 }
100 return err;
101 }
102
SendCommand(OMX_COMMANDTYPE cmd,uint32_t param,int8_t * cmdData,uint32_t cmdDataLen)103 int32_t ComponentNode::SendCommand(OMX_COMMANDTYPE cmd, uint32_t param, int8_t *cmdData, uint32_t cmdDataLen)
104 {
105 if (comp_ == nullptr) {
106 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
107 return OMX_ErrorInvalidComponent;
108 }
109 (void)cmdDataLen;
110 return OMX_SendCommand(comp_, cmd, param, cmdData);
111 }
112
GetParameter(OMX_INDEXTYPE paramIndex,int8_t * param,uint32_t paramLen)113 int32_t ComponentNode::GetParameter(OMX_INDEXTYPE paramIndex, int8_t *param, uint32_t paramLen)
114 {
115 if (comp_ == nullptr) {
116 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
117 return OMX_ErrorInvalidComponent;
118 }
119 (void)paramLen;
120 return OMX_GetParameter(comp_, paramIndex, param);
121 }
122
SetParameter(OMX_INDEXTYPE paramIndex,int8_t * param,uint32_t paramLen)123 int32_t ComponentNode::SetParameter(OMX_INDEXTYPE paramIndex, int8_t *param, uint32_t paramLen)
124 {
125 if (comp_ == nullptr || param == nullptr) {
126 HDF_LOGE("%{public}s error, comp_ is null or param is null ", __func__);
127 return OMX_ErrorInvalidComponent;
128 }
129 (void)paramLen;
130 return OMX_SetParameter(comp_, paramIndex, param);
131 }
132
GetConfig(OMX_INDEXTYPE index,int8_t * config,uint32_t configLen)133 int32_t ComponentNode::GetConfig(OMX_INDEXTYPE index, int8_t *config, uint32_t configLen)
134 {
135 if (comp_ == nullptr) {
136 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
137 return OMX_ErrorInvalidComponent;
138 }
139 (void)configLen;
140 return OMX_GetConfig(comp_, index, config);
141 }
142
SetConfig(OMX_INDEXTYPE index,int8_t * config,uint32_t configLen)143 int32_t ComponentNode::SetConfig(OMX_INDEXTYPE index, int8_t *config, uint32_t configLen)
144 {
145 if (comp_ == nullptr) {
146 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
147 return OMX_ErrorInvalidComponent;
148 }
149 (void)configLen;
150 return OMX_SetConfig(comp_, index, config);
151 }
152
GetExtensionIndex(const char * parameterName,OMX_INDEXTYPE * indexType)153 int32_t ComponentNode::GetExtensionIndex(const char *parameterName, OMX_INDEXTYPE *indexType)
154 {
155 if (comp_ == nullptr) {
156 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
157 return OMX_ErrorInvalidComponent;
158 }
159 // change name
160 return OMX_GetExtensionIndex(comp_, const_cast<char *>(parameterName), indexType);
161 }
162
GetState(OMX_STATETYPE * state)163 int32_t ComponentNode::GetState(OMX_STATETYPE *state)
164 {
165 if (comp_ == nullptr) {
166 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
167 return OMX_ErrorInvalidComponent;
168 }
169
170 return OMX_GetState(comp_, state);
171 }
172
ComponentTunnelRequest(uint32_t port,int32_t omxHandleTypeTunneledComp,uint32_t tunneledPort,struct OMX_TUNNELSETUPTYPE * tunnelSetup)173 int32_t ComponentNode::ComponentTunnelRequest(uint32_t port, int32_t omxHandleTypeTunneledComp, uint32_t tunneledPort,
174 struct OMX_TUNNELSETUPTYPE *tunnelSetup)
175 {
176 if (comp_ == nullptr) {
177 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
178 return OMX_ErrorInvalidComponent;
179 }
180 OMX_COMPONENTTYPE *comType = static_cast<OMX_COMPONENTTYPE *>(comp_);
181 unsigned long tunneledComp = (unsigned long)omxHandleTypeTunneledComp;
182 return comType->ComponentTunnelRequest(comp_, port, (OMX_HANDLETYPE)tunneledComp, tunneledPort, tunnelSetup);
183 }
184
SetCallbacks(struct CodecCallbackType * omxCallback,int64_t appData)185 int32_t ComponentNode::SetCallbacks(struct CodecCallbackType *omxCallback, int64_t appData)
186 {
187 // release this->omxCallback_
188 if (this->omxCallback_ != nullptr) {
189 CodecCallbackTypeRelease(this->omxCallback_);
190 this->omxCallback_ = nullptr;
191 }
192 this->omxCallback_ = omxCallback;
193 this->appData_ = appData;
194 return OMX_ErrorNone;
195 }
196
UseEglImage(struct OmxCodecBuffer & buffer,uint32_t portIndex,int8_t * eglImage,uint32_t eglImageLen)197 int32_t ComponentNode::UseEglImage(struct OmxCodecBuffer &buffer, uint32_t portIndex, int8_t *eglImage,
198 uint32_t eglImageLen)
199 {
200 OMX_BUFFERHEADERTYPE *pBufferHdrType = nullptr;
201
202 auto err = OMX_UseEGLImage(comp_, &pBufferHdrType, portIndex, 0, eglImage);
203 if (err != OMX_ErrorNone) {
204 HDF_LOGE("%{public}s OMX_UseEGLImage error[0x%{public}x]", __func__, err);
205 return err;
206 }
207 (void)buffer;
208 (void)eglImageLen;
209 return OMX_ErrorNotImplemented;
210 }
211
ComponentRoleEnum(uint8_t * role,uint32_t roleLen,uint32_t index)212 int32_t ComponentNode::ComponentRoleEnum(uint8_t *role, uint32_t roleLen, uint32_t index)
213 {
214 if (comp_ == nullptr) {
215 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
216 return OMX_ErrorInvalidComponent;
217 }
218 uint8_t omxRole[ROLE_MAX_LEN] = {0};
219 OMX_COMPONENTTYPE *comType = static_cast<OMX_COMPONENTTYPE *>(comp_);
220 int32_t err = comType->ComponentRoleEnum(comp_, omxRole, index);
221 if (err != OMX_ErrorNone) {
222 HDF_LOGE("%{public}s error, ComponentRoleEnum ret err [0x%{public}x] ", __func__, err);
223 return err;
224 }
225
226 size_t omxRoleLen = strlen(reinterpret_cast<const char *>(omxRole));
227 if (omxRoleLen == 0) {
228 HDF_LOGW("%{public}s error, omxRoleLen is 0 [%{public}zu] ", __func__, omxRoleLen);
229 } else {
230 int32_t ret = memcpy_s(role, roleLen, omxRole, omxRoleLen);
231 if (ret != EOK) {
232 HDF_LOGE("%{public}s error, memcpy_s ret [%{public}d]", __func__, ret);
233 return HDF_ERR_INVALID_PARAM;
234 }
235 }
236
237 return OMX_ErrorNone;
238 }
239
DeInit()240 int32_t ComponentNode::DeInit()
241 {
242 if (comp_ == nullptr) {
243 HDF_LOGE("%{public}s error, comp_ is null ", __func__);
244 return OMX_ErrorInvalidComponent;
245 }
246 OMX_COMPONENTTYPE *comType = static_cast<OMX_COMPONENTTYPE *>(comp_);
247 return comType->ComponentDeInit(comp_);
248 }
249
OnEvent(OMX_EVENTTYPE event,uint32_t data1,uint32_t data2,void * eventData)250 int32_t ComponentNode::OnEvent(OMX_EVENTTYPE event, uint32_t data1, uint32_t data2, void *eventData)
251 {
252 if (omxCallback_ == nullptr) {
253 HDF_LOGE("%{public}s omxCallback_ is null", __func__);
254 return OMX_ErrorNone;
255 }
256 HDF_LOGD("%{public}s, event [%d], data1 [%d],data2 [%d]", __func__, event, data1, data2);
257 struct EventInfo info = {.appData = appData_,
258 .data1 = data1,
259 .data2 = data2,
260 .eventData = static_cast<int8_t *>(eventData),
261 .eventDataLen = 0};
262 (void)omxCallback_->EventHandler(omxCallback_, event, &info);
263
264 return OMX_ErrorNone;
265 }
266
OnEmptyBufferDone(OMX_BUFFERHEADERTYPE * buffer)267 int32_t ComponentNode::OnEmptyBufferDone(OMX_BUFFERHEADERTYPE *buffer)
268 {
269 if ((omxCallback_ == nullptr) || (buffer == nullptr)) {
270 HDF_LOGE("%{public}s error, omxCallback_ or buffer is null", __func__);
271 return OMX_ErrorNone;
272 }
273 sptr<ICodecBuffer> codecBuffer = GetBufferInfoByHeader(buffer);
274 if (codecBuffer == nullptr || codecBuffer->EmptyOmxBufferDone(*buffer) != HDF_SUCCESS) {
275 HDF_LOGE("%{public}s codecBuffer is null or EmptyOmxBufferDone error", __func__);
276 return OMX_ErrorNone;
277 }
278 struct OmxCodecBuffer &codecOmxBuffer = codecBuffer->GetCodecBuffer();
279 (void)omxCallback_->EmptyBufferDone(omxCallback_, appData_, &codecOmxBuffer);
280 return OMX_ErrorNone;
281 }
282
OnFillBufferDone(OMX_BUFFERHEADERTYPE * buffer)283 int32_t ComponentNode::OnFillBufferDone(OMX_BUFFERHEADERTYPE *buffer)
284 {
285 if ((omxCallback_ == nullptr) || (buffer == nullptr)) {
286 HDF_LOGE("%{public}s error, omxCallback_ or buffer is null", __func__);
287 return OMX_ErrorNone;
288 }
289
290 sptr<ICodecBuffer> codecBuffer = GetBufferInfoByHeader(buffer);
291 if (codecBuffer == nullptr || codecBuffer->FillOmxBufferDone(*buffer) != HDF_SUCCESS) {
292 HDF_LOGE("%{public}s codecBuffer is null or EmptyOmxBufferDone error", __func__);
293 return OMX_ErrorNone;
294 }
295
296 struct OmxCodecBuffer &codecOmxBuffer = codecBuffer->GetCodecBuffer();
297 (void)omxCallback_->FillBufferDone(omxCallback_, appData_, &codecOmxBuffer);
298 return OMX_ErrorNone;
299 }
300
UseBuffer(uint32_t portIndex,struct OmxCodecBuffer & buffer)301 int32_t ComponentNode::UseBuffer(uint32_t portIndex, struct OmxCodecBuffer &buffer)
302 {
303 if (comp_ == nullptr) {
304 HDF_LOGE("%{public}s error, comp_ is null", __func__);
305 return OMX_ErrorInvalidComponent;
306 }
307 if (buffer.fenceFd >= 0) {
308 close(buffer.fenceFd);
309 buffer.fenceFd = -1;
310 }
311
312 int32_t err = OMX_ErrorBadParameter;
313 sptr<ICodecBuffer> codecBuffer = ICodecBuffer::CreateCodeBuffer(buffer);
314 if (codecBuffer == nullptr) {
315 HDF_LOGE("%{public}s error, comp_ is null", __func__);
316 return OMX_ErrorInvalidComponent;
317 }
318 OMX_BUFFERHEADERTYPE *bufferHdrType = nullptr;
319 if (buffer.bufferType == CODEC_BUFFER_TYPE_AVSHARE_MEM_FD) {
320 err = OMX_AllocateBuffer(static_cast<OMX_HANDLETYPE>(comp_), &bufferHdrType, portIndex, 0, buffer.allocLen);
321 } else {
322 err = OMX_UseBuffer(static_cast<OMX_HANDLETYPE>(comp_), &bufferHdrType, portIndex, 0, buffer.allocLen,
323 codecBuffer->GetBuffer());
324 }
325
326 if (err != OMX_ErrorNone) {
327 HDF_LOGE("%{public}s : type [%{public}d] OMX_AllocateBuffer or OMX_UseBuffer ret err[%{public}x]", __func__,
328 buffer.bufferType, err);
329 codecBuffer = nullptr;
330 return err;
331 }
332 uint32_t bufferId = GenerateBufferId();
333 buffer.bufferId = bufferId;
334 codecBuffer->SetBufferId(bufferId);
335 codecBufferMap_.emplace(std::make_pair(bufferId, codecBuffer));
336 bufferHeaderMap_.emplace(std::make_pair(bufferHdrType, bufferId));
337
338 return err;
339 }
340
AllocateBuffer(uint32_t portIndex,struct OmxCodecBuffer & buffer)341 int32_t ComponentNode::AllocateBuffer(uint32_t portIndex, struct OmxCodecBuffer &buffer)
342 {
343 if (comp_ == nullptr) {
344 HDF_LOGE("%{public}s error, comp_ is null", __func__);
345 return OMX_ErrorInvalidComponent;
346 }
347 OMX_BUFFERHEADERTYPE *bufferHdrType = 0;
348 int32_t err = OMX_AllocateBuffer(static_cast<OMX_HANDLETYPE>(comp_), &bufferHdrType, portIndex, 0, buffer.allocLen);
349 if (err != OMX_ErrorNone) {
350 HDF_LOGE("%{public}s ,OMX_AllocateBuffer error, err = %{public}x", __func__, err);
351 return err;
352 }
353
354 buffer.allocLen = bufferHdrType->nAllocLen;
355 sptr<ICodecBuffer> codecBuffer = ICodecBuffer::AllocateCodecBuffer(buffer);
356 if (codecBuffer == nullptr) {
357 HDF_LOGE("%{public}s error, comp_ is null", __func__);
358 (void)OMX_FreeBuffer(static_cast<OMX_HANDLETYPE>(comp_), portIndex, bufferHdrType);
359 return OMX_ErrorInvalidComponent;
360 }
361
362 uint32_t bufferId = GenerateBufferId();
363 buffer.bufferId = bufferId;
364 codecBufferMap_.emplace(std::make_pair(bufferId, codecBuffer));
365 bufferHeaderMap_.emplace(std::make_pair(bufferHdrType, bufferId));
366 return OMX_ErrorNone;
367 }
368
FreeBuffer(uint32_t portIndex,struct OmxCodecBuffer & buffer)369 int32_t ComponentNode::FreeBuffer(uint32_t portIndex, struct OmxCodecBuffer &buffer)
370 {
371 if (comp_ == nullptr) {
372 HDF_LOGE("%{public}s error, comp_ = %{public}p", __func__, comp_);
373 return OMX_ErrorInvalidComponent;
374 }
375
376 int32_t err = OMX_ErrorBadParameter;
377 sptr<ICodecBuffer> codecBufer = nullptr;
378 OMX_BUFFERHEADERTYPE *bufferHdrType = nullptr;
379 if (!GetBufferById(buffer.bufferId, codecBufer, bufferHdrType)) {
380 HDF_LOGE("%{public}s error, GetBufferById return false", __func__);
381 return err;
382 }
383
384 err = OMX_FreeBuffer(static_cast<OMX_HANDLETYPE>(comp_), portIndex, bufferHdrType);
385 if (err != OMX_ErrorNone) {
386 HDF_LOGE("%{public}s error, OMX_FreeBuffer err [%{public}x]", __func__, err);
387 return err;
388 }
389
390 auto iterOmxBuffer = bufferHeaderMap_.begin();
391 while (iterOmxBuffer != bufferHeaderMap_.end()) {
392 if (iterOmxBuffer->first == bufferHdrType) {
393 bufferHeaderMap_.erase(iterOmxBuffer);
394 break;
395 }
396 iterOmxBuffer++;
397 }
398
399 auto iter = codecBufferMap_.find(buffer.bufferId);
400 if (iter != codecBufferMap_.end()) {
401 codecBufferMap_.erase(iter);
402 }
403 (void)codecBufer->FreeBuffer(buffer);
404
405 return err;
406 }
407
EmptyThisBuffer(struct OmxCodecBuffer & buffer)408 int32_t ComponentNode::EmptyThisBuffer(struct OmxCodecBuffer &buffer)
409 {
410 if (comp_ == nullptr) {
411 HDF_LOGE("%{public}s error, comp_ = %{public}p", __func__, comp_);
412 return OMX_ErrorInvalidComponent;
413 }
414 int32_t err = OMX_ErrorBadParameter;
415 OMX_BUFFERHEADERTYPE *bufferHdrType = nullptr;
416 sptr<ICodecBuffer> codecBuffer = nullptr;
417 if (!GetBufferById(buffer.bufferId, codecBuffer, bufferHdrType)) {
418 HDF_LOGE("%{public}s error, GetBufferById return false", __func__);
419 return err;
420 }
421 err = codecBuffer->EmptyOmxBuffer(buffer, *bufferHdrType);
422 if (err != HDF_SUCCESS) {
423 HDF_LOGE("%{public}s EmptyOmxBuffer err [%{public}d]", __func__, err);
424 return err;
425 }
426
427 err = OMX_EmptyThisBuffer(static_cast<OMX_HANDLETYPE>(comp_), bufferHdrType);
428 return err;
429 }
430
FillThisBuffer(struct OmxCodecBuffer & buffer)431 int32_t ComponentNode::FillThisBuffer(struct OmxCodecBuffer &buffer)
432 {
433 if (comp_ == nullptr) {
434 HDF_LOGE("%{public}s error, comp_ = %{public}p", __func__, comp_);
435 return OMX_ErrorInvalidComponent;
436 }
437 int32_t err = OMX_ErrorBadParameter;
438 OMX_BUFFERHEADERTYPE *bufferHdrType = nullptr;
439 sptr<ICodecBuffer> codecBuffer = nullptr;
440 if (!GetBufferById(buffer.bufferId, codecBuffer, bufferHdrType)) {
441 HDF_LOGE("%{public}s error, GetBufferById return false", __func__);
442 return err;
443 }
444
445 err = codecBuffer->FillOmxBuffer(buffer, *bufferHdrType);
446 if (err != HDF_SUCCESS) {
447 HDF_LOGE("%{public}s FillOmxBuffer err [%{public}d]", __func__, err);
448 return err;
449 }
450
451 err = OMX_FillThisBuffer(static_cast<OMX_HANDLETYPE>(comp_), bufferHdrType);
452 return err;
453 }
454
GenerateBufferId()455 uint32_t ComponentNode::GenerateBufferId()
456 {
457 uint32_t bufferId = 0;
458 do {
459 if (++bufferIdCount_ == 0) {
460 ++bufferIdCount_;
461 }
462 bufferId = bufferIdCount_;
463 } while (codecBufferMap_.find(bufferId) != codecBufferMap_.end());
464 return bufferId;
465 }
466
GetBufferInfoByHeader(OMX_BUFFERHEADERTYPE * buffer)467 sptr<ICodecBuffer> ComponentNode::GetBufferInfoByHeader(OMX_BUFFERHEADERTYPE *buffer)
468 {
469 if (buffer == nullptr) {
470 HDF_LOGE("%{public}s buffer is null", __func__);
471 return nullptr;
472 }
473
474 auto iterHead = bufferHeaderMap_.find(buffer);
475 if (iterHead == bufferHeaderMap_.end()) {
476 HDF_LOGE("%{public}s can not find bufferID by pHeaderType = 0x%{public}p", __func__, buffer);
477 return nullptr;
478 }
479
480 uint32_t nBufferID = iterHead->second;
481 auto iter = codecBufferMap_.find(nBufferID);
482 if (iter == codecBufferMap_.end()) {
483 HDF_LOGE("%{public}s can not find bufferInfo by nBufferID = %{public}d", __func__, nBufferID);
484 return nullptr;
485 }
486 return iter->second;
487 }
488
GetBufferById(uint32_t bufferId,sptr<ICodecBuffer> & codecBuffer,OMX_BUFFERHEADERTYPE * & bufferHdrType)489 bool ComponentNode::GetBufferById(uint32_t bufferId, sptr<ICodecBuffer> &codecBuffer,
490 OMX_BUFFERHEADERTYPE *&bufferHdrType)
491 {
492 auto iter = codecBufferMap_.find(bufferId);
493 if ((iter == codecBufferMap_.end()) || (iter->second == nullptr)) {
494 HDF_LOGE("%{public}s error, can not find bufferIndo by bufferID [%{public}d]", __func__, bufferId);
495 return false;
496 }
497
498 auto iterHead = bufferHeaderMap_.begin();
499 for (; iterHead != bufferHeaderMap_.end(); iterHead++) {
500 if (iterHead->second == bufferId) {
501 break;
502 }
503 }
504 if ((iterHead == bufferHeaderMap_.end()) || (iterHead->first == nullptr)) {
505 HDF_LOGE("%{public}s error, can not find bufferHeaderType by bufferID [%{public}d] or iterHead->first is null",
506 __func__, bufferId);
507 return false;
508 }
509 bufferHdrType = iterHead->first;
510 codecBuffer = iter->second;
511 return true;
512 }
513 } // namespace Omx
514 } // namespace Codec
515 } // namespace OHOS