1/* 2 * Copyright (c) 2022-2023 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 "codec_handle_buffer.h" 17#include <hdf_base.h> 18#include <securec.h> 19#include <unistd.h> 20#include "codec_log_wrapper.h" 21#include "v3_0/codec_types.h" 22using namespace OHOS::HDI::Codec::V3_0; 23namespace OHOS { 24namespace Codec { 25namespace Omx { 26CodecHandleBuffer::CodecHandleBuffer(struct OmxCodecBuffer &codecBuffer) 27 : ICodecBuffer(codecBuffer) 28{ 29 buffer_ = codecBuffer.bufferhandle; 30} 31 32CodecHandleBuffer::~CodecHandleBuffer() 33{ 34} 35 36sptr<ICodecBuffer> CodecHandleBuffer::Create(struct OmxCodecBuffer &codecBuffer) 37{ 38 if (codecBuffer.bufferhandle == nullptr) { 39 CODEC_LOGE("nativebuffer is null"); 40 return nullptr; 41 } 42 BufferHandle *bufferHandle = codecBuffer.bufferhandle->GetBufferHandle(); 43 if (bufferHandle == nullptr) { 44 CODEC_LOGE("bufferHandle is null"); 45 return nullptr; 46 } 47 CodecHandleBuffer *buffer = new CodecHandleBuffer(codecBuffer); 48 codecBuffer.bufferhandle = nullptr; 49 return sptr<ICodecBuffer>(buffer); 50} 51 52int32_t CodecHandleBuffer::FillOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer) 53{ 54 if (!CheckInvalid(codecBuffer)) { 55 CODEC_LOGE("CheckInvalid return false or mem has no right to write "); 56 return HDF_ERR_INVALID_PARAM; 57 } 58 59 int fenceFd = codecBuffer.fenceFd; 60 if (fenceFd >= 0) { 61 auto ret = SyncWait(fenceFd, TIME_WAIT_MS); 62 if (ret != EOK) { 63 CODEC_LOGE("SyncWait ret err [%{public}d]", ret); 64 } 65 close(codecBuffer.fenceFd); 66 codecBuffer.fenceFd = -1; 67 } 68 return ICodecBuffer::FillOmxBuffer(codecBuffer, omxBuffer); 69} 70 71int32_t CodecHandleBuffer::EmptyOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer) 72{ 73 CODEC_LOGE("bufferHandle is not support in EmptyThisBuffer"); 74 (void)codecBuffer; 75 (void)omxBuffer; 76 return HDF_ERR_INVALID_PARAM; 77} 78 79int32_t CodecHandleBuffer::FreeBuffer(struct OmxCodecBuffer &codecBuffer) 80{ 81 if (!CheckInvalid(codecBuffer)) { 82 CODEC_LOGE("shMem_ is null or CheckInvalid return false"); 83 return HDF_ERR_INVALID_PARAM; 84 } 85 codecBuffer.bufferhandle = nullptr; 86 buffer_ = nullptr; 87 88 return HDF_SUCCESS; 89} 90 91int32_t CodecHandleBuffer::EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer) 92{ 93 CODEC_LOGE("bufferHandle is not support in EmptyThisBuffer"); 94 (void)omxBuffer; 95 return HDF_ERR_INVALID_PARAM; 96} 97 98int32_t CodecHandleBuffer::FillOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer) 99{ 100 return ICodecBuffer::FillOmxBufferDone(omxBuffer); 101} 102 103uint8_t *CodecHandleBuffer::GetBuffer() 104{ 105 if (buffer_ == nullptr) { 106 return nullptr; 107 } 108 return reinterpret_cast<uint8_t *>(buffer_->GetBufferHandle()); 109} 110 111} // namespace Omx 112} // namespace Codec 113} // namespace OHOS