1/* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 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 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_dma_buffer.h" 17#include <hdf_base.h> 18#include <securec.h> 19#include <unistd.h> 20#include <hdf_remote_service.h> 21#include "codec_log_wrapper.h" 22#include "v3_0/codec_types.h" 23using namespace OHOS::HDI::Codec::V3_0; 24namespace OHOS { 25namespace Codec { 26namespace Omx { 27CodecDMABuffer::CodecDMABuffer(struct OmxCodecBuffer &codecBuffer) : ICodecBuffer(codecBuffer) 28{} 29 30CodecDMABuffer::~CodecDMABuffer() 31{} 32 33sptr<ICodecBuffer> CodecDMABuffer::Create(struct OmxCodecBuffer &codecBuffer) 34{ 35 if (codecBuffer.fd < 0) { 36 CODEC_LOGE("codecBuffer.fd is invalid"); 37 return sptr<ICodecBuffer>(); 38 } 39 40 CodecDMABuffer *buffer = new CodecDMABuffer(codecBuffer); 41 return sptr<ICodecBuffer>(buffer); 42} 43 44sptr<ICodecBuffer> CodecDMABuffer::Allocate(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer) 45{ 46 if (omxBuffer.pAppPrivate == nullptr) { 47 CODEC_LOGE("omxBuffer.pAppPrivate is invalid!"); 48 return sptr<ICodecBuffer>(); 49 } 50 bool isIpcMode = (HdfRemoteGetCallingPid() == getpid() ? false : true); 51 codecBuffer.bufferType = CODEC_BUFFER_TYPE_DMA_MEM_FD; 52 codecBuffer.offset = 0; 53 codecBuffer.filledLen = 0; 54 OMXBufferAppPrivateData *privateData = static_cast<OMXBufferAppPrivateData *>(omxBuffer.pAppPrivate); 55 if (isIpcMode) { 56 codecBuffer.fd = privateData->fd; 57 } else { 58 codecBuffer.fd = dup(privateData->fd); 59 } 60 struct OmxCodecBuffer codecBufferToStore = codecBuffer; 61 codecBufferToStore.fd = -1; 62 CodecDMABuffer *buffer = new CodecDMABuffer(codecBufferToStore); 63 return sptr<ICodecBuffer>(buffer); 64} 65 66int32_t CodecDMABuffer::FillOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer) 67{ 68 if (!CheckInvalid(codecBuffer)) { 69 CODEC_LOGE("CheckInvalid return false or mem has no right to write "); 70 return HDF_ERR_INVALID_PARAM; 71 } 72 73 return ICodecBuffer::FillOmxBuffer(codecBuffer, omxBuffer); 74} 75 76int32_t CodecDMABuffer::EmptyOmxBuffer(struct OmxCodecBuffer &codecBuffer, OMX_BUFFERHEADERTYPE &omxBuffer) 77{ 78 if (!CheckInvalid(codecBuffer)) { 79 CODEC_LOGE("CheckInvalid return false or mem has no right to write "); 80 return HDF_ERR_INVALID_PARAM; 81 } 82 83 return ICodecBuffer::EmptyOmxBuffer(codecBuffer, omxBuffer); 84} 85 86int32_t CodecDMABuffer::FreeBuffer(struct OmxCodecBuffer &codecBuffer) 87{ 88 if (!CheckInvalid(codecBuffer)) { 89 CODEC_LOGE("shMem_ is null or CheckInvalid return false"); 90 return HDF_ERR_INVALID_PARAM; 91 } 92 93 return HDF_SUCCESS; 94} 95 96int32_t CodecDMABuffer::EmptyOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer) 97{ 98 return ICodecBuffer::EmptyOmxBufferDone(omxBuffer); 99} 100 101int32_t CodecDMABuffer::FillOmxBufferDone(OMX_BUFFERHEADERTYPE &omxBuffer) 102{ 103 return ICodecBuffer::FillOmxBufferDone(omxBuffer); 104} 105 106uint8_t *CodecDMABuffer::GetBuffer() 107{ 108 return nullptr; 109} 110 111bool CodecDMABuffer::CheckInvalid(struct OmxCodecBuffer &codecBuffer) 112{ 113 return ICodecBuffer::CheckInvalid(codecBuffer); 114} 115} // namespace Omx 116} // namespace Codec 117} // namespace OHOS