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 "surface_memory.h"
18 #include <utility>
19 #include "foundation/log.h"
20 #include "surface_allocator.h"
21
22 namespace OHOS {
23 namespace Media {
24 namespace Plugin {
SurfaceMemory(size_t capacity,std::shared_ptr<Allocator> allocator,size_t align)25 SurfaceMemory::SurfaceMemory(size_t capacity, std::shared_ptr<Allocator> allocator, size_t align)
26 : Memory(capacity, std::move(allocator), align, MemoryType::SURFACE_BUFFER, false),
27 fence_(-1),
28 stride_(0)
29 {
30 bufferSize_ = align ? (capacity + align - 1) : capacity;
31 if (this->allocator != nullptr && this->allocator->GetMemoryType() == MemoryType::SURFACE_BUFFER) {
32 surfaceAllocator_ = ReinterpretPointerCast<SurfaceAllocator>(this->allocator);
33 AllocSurfaceBuffer();
34 }
35 }
36
~SurfaceMemory()37 SurfaceMemory::~SurfaceMemory()
38 {
39 ReleaseSurfaceBuffer();
40 }
41
AllocSurfaceBuffer()42 void SurfaceMemory::AllocSurfaceBuffer()
43 {
44 if (surfaceAllocator_ == nullptr || bufferSize_ == 0 || surfaceBuffer_ != nullptr) {
45 return;
46 }
47 surfaceBuffer_ = surfaceAllocator_->AllocSurfaceBuffer(bufferSize_);
48 if (surfaceBuffer_ != nullptr) {
49 auto bufferHandle = surfaceBuffer_->GetBufferHandle();
50 if (bufferHandle != nullptr) {
51 stride_ = bufferHandle->stride;
52 }
53 fence_ = -1;
54 }
55 }
56
GetSurfaceBuffer()57 sptr<SurfaceBuffer> SurfaceMemory::GetSurfaceBuffer()
58 {
59 OSAL::ScopedLock l(memMutex_);
60 if (surfaceBuffer_ != nullptr) {
61 return surfaceBuffer_;
62 }
63 // request surface buffer again when old buffer flush to nullptr
64 AllocSurfaceBuffer();
65 return surfaceBuffer_;
66 }
67
ReleaseSurfaceBuffer()68 void SurfaceMemory::ReleaseSurfaceBuffer()
69 {
70 OSAL::ScopedLock l(memMutex_);
71 surfaceBuffer_ = nullptr;
72 }
73
GetFlushFence()74 int32_t SurfaceMemory::GetFlushFence()
75 {
76 OSAL::ScopedLock l(memMutex_);
77 return fence_;
78 }
79
GetBufferHandle()80 BufferHandle *SurfaceMemory::GetBufferHandle()
81 {
82 OSAL::ScopedLock l(memMutex_);
83 if (surfaceBuffer_) {
84 return surfaceBuffer_->GetBufferHandle();
85 }
86 return nullptr;
87 }
88
GetSurfaceBufferStride()89 uint32_t SurfaceMemory::GetSurfaceBufferStride()
90 {
91 OSAL::ScopedLock l(memMutex_);
92 return stride_;
93 }
94
GetRealAddr() const95 uint8_t* SurfaceMemory::GetRealAddr() const
96 {
97 OSAL::ScopedLock l(memMutex_);
98 if (surfaceBuffer_) {
99 return static_cast<uint8_t *>(surfaceBuffer_->GetVirAddr());
100 }
101 return nullptr;
102 }
103
GetCapacity()104 size_t SurfaceMemory::GetCapacity()
105 {
106 OSAL::ScopedLock l(memMutex_);
107 if (surfaceBuffer_) {
108 return static_cast<size_t>(surfaceBuffer_->GetSize());
109 }
110 return 0;
111 }
112 } // namespace Plugin
113 } // namespace Media
114 } // namespace OHOS
115 #endif