1/* 2 * Copyright (c) 2021-2021 Huawei Device 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#if !defined(OHOS_LITE) && defined(VIDEO_SUPPORT) 17#include "common/surface_memory.h" 18#include "plugin/plugin_memory.h" 19#include <utility> 20#include "inner_api/common/log.h" 21#include "surface_allocator.h" 22#include "cpp_ext/type_cast_ext.h" 23#include "osal/task/autolock.h" 24 25namespace { 26constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "SurfaceMemory" }; 27} 28 29namespace OHOS { 30namespace Media { 31namespace Plugins { 32SurfaceMemory::SurfaceMemory(size_t capacity, std::shared_ptr<Allocator> allocator, size_t align) 33 : Memory(capacity, std::move(allocator), align, MemoryType::SURFACE_MEMORY, false), 34 fence_(-1), 35 stride_(0) 36{ 37 MEDIA_LOG_DD("SurfaceMemory ctor."); 38 if (this->allocator != nullptr && this->allocator->GetMemoryType() == MemoryType::SURFACE_MEMORY) { 39 surfaceAllocator_ = ReinterpretPointerCast<SurfaceAllocator>(this->allocator); 40 AllocSurfaceBuffer(); 41 } 42} 43 44SurfaceMemory::SurfaceMemory(sptr<SurfaceBuffer> surfaceBuffer, int32_t surfaceCapacity) 45 : Memory(surfaceCapacity, nullptr, 1, MemoryType::SURFACE_MEMORY, false), // align 1 46 surfaceBuffer_(surfaceBuffer), fence_(-1), stride_(0) 47{ 48} 49 50SurfaceMemory::~SurfaceMemory() 51{ 52 MEDIA_LOG_DD("SurfaceMemory dtor."); 53 ReleaseSurfaceBuffer(); 54} 55 56void SurfaceMemory::AllocSurfaceBuffer() 57{ 58 if (surfaceAllocator_ == nullptr || surfaceBuffer_ != nullptr) { 59 MEDIA_LOG_E("No need to allocate surface buffer."); 60 return; 61 } 62 surfaceBuffer_ = surfaceAllocator_->AllocSurfaceBuffer(); 63 if (surfaceBuffer_ != nullptr) { 64 auto bufferHandle = surfaceBuffer_->GetBufferHandle(); 65 if (bufferHandle != nullptr) { 66 stride_ = bufferHandle->stride; 67 } 68 fence_ = -1; 69 } else { 70 // Surface often obtain buffer failed, but doesn't cause any problem. 71 MEDIA_LOG_DD("AllocSurfaceBuffer failed."); 72 } 73} 74 75sptr<SurfaceBuffer> SurfaceMemory::GetSurfaceBuffer() 76{ 77 OHOS::Media::AutoLock l(memMutex_); 78 if (!surfaceBuffer_ || needRender_) { 79 // request surface buffer again when old buffer flush to nullptr 80 surfaceBuffer_ = nullptr; 81 AllocSurfaceBuffer(); 82 needRender_ = false; 83 } 84 return surfaceBuffer_; 85} 86 87void SurfaceMemory::ReleaseSurfaceBuffer() 88{ 89 OHOS::Media::AutoLock l(memMutex_); 90 if (surfaceBuffer_ != nullptr && surfaceAllocator_) { 91 surfaceAllocator_->ReleaseSurfaceBuffer(surfaceBuffer_, needRender_); 92 } 93} 94 95int32_t SurfaceMemory::GetFlushFence() 96{ 97 OHOS::Media::AutoLock l(memMutex_); 98 return fence_; 99} 100 101BufferHandle *SurfaceMemory::GetBufferHandle() 102{ 103 OHOS::Media::AutoLock l(memMutex_); 104 if (surfaceBuffer_) { 105 return surfaceBuffer_->GetBufferHandle(); 106 } 107 return nullptr; 108} 109 110void SurfaceMemory::SetNeedRender(bool needRender) 111{ 112 OHOS::Media::AutoLock l(memMutex_); 113 needRender_ = needRender; 114} 115 116uint32_t SurfaceMemory::GetSurfaceBufferStride() 117{ 118 OHOS::Media::AutoLock l(memMutex_); 119 return stride_; 120} 121 122uint8_t* SurfaceMemory::GetRealAddr() const 123{ 124 OHOS::Media::AutoLock l(memMutex_); 125 if (surfaceBuffer_) { 126 return static_cast<uint8_t *>(surfaceBuffer_->GetVirAddr()); 127 } 128 return nullptr; 129} 130} // namespace Plugins 131} // namespace Media 132} // namespace OHOS 133#endif