• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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