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