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