• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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