1 /*
2  * Copyright (C) 2024 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 #ifndef IMAGE_EFFECT_EFFECT_MEMORY_H
17 #define IMAGE_EFFECT_EFFECT_MEMORY_H
18 
19 #include <memory>
20 #include "effect_info.h"
21 #include "effect_type.h"
22 #include "error_code.h"
23 #include "surface_buffer.h"
24 #include "effect_buffer.h"
25 #include "image_effect_marco_define.h"
26 
27 namespace OHOS {
28 namespace Media {
29 namespace Effect {
30 struct MemoryInfo {
31     bool isAutoRelease = true; // alloc memory is auto release or not.
32     BufferInfo bufferInfo;
33     void *extra = nullptr;
34     BufferType bufferType = BufferType::DEFAULT;
35 };
36 
37 struct MemoryData {
38     void *data = nullptr; // buffer addr
39     MemoryInfo memoryInfo;
40 };
41 
42 class AbsMemory {
43 public:
44     virtual ~AbsMemory() = default;
45     virtual std::shared_ptr<MemoryData> Alloc(MemoryInfo &memoryInfo) = 0;
46     virtual ErrorCode Release() = 0;
GetBufferType()47     virtual BufferType GetBufferType()
48     {
49         return BufferType::DEFAULT;
50     }
51 };
52 
53 struct HeapMemoryData : public MemoryData {
54     ~HeapMemoryData();
55     void *heapData = nullptr;
56 };
57 
58 class HeapMemory : public AbsMemory {
59 public:
60     ~HeapMemory() override = default;
61     std::shared_ptr<MemoryData> Alloc(MemoryInfo &memoryInfo) override;
62     ErrorCode Release() override;
GetBufferType()63     BufferType GetBufferType() override
64     {
65         return BufferType::HEAP_MEMORY;
66     }
67 private:
68     std::shared_ptr<HeapMemoryData> memoryData_ = nullptr;
69 };
70 
71 struct DmaMemoryData : public MemoryData {
72     ~DmaMemoryData();
73     SurfaceBuffer *surfaceBuffer = nullptr;
74 };
75 
76 class DmaMemory : public AbsMemory {
77 public:
78     ~DmaMemory() override = default;
79     std::shared_ptr<MemoryData> Alloc(MemoryInfo &memoryInfo) override;
80     ErrorCode Release() override;
GetBufferType()81     BufferType GetBufferType() override
82     {
83         return BufferType::DMA_BUFFER;
84     }
85 private:
86     std::shared_ptr<DmaMemoryData> memoryData_ = nullptr;
87 };
88 
89 struct SharedMemoryData : public MemoryData {
90     ~SharedMemoryData();
91     int* fdPtr = nullptr;
92     size_t len = 0;
93 };
94 
95 class SharedMemory : public AbsMemory {
96 public:
97     ~SharedMemory() override = default;
98     std::shared_ptr<MemoryData> Alloc(MemoryInfo &memoryInfo) override;
99     ErrorCode Release() override;
GetBufferType()100     BufferType GetBufferType() override
101     {
102         return BufferType::SHARED_MEMORY;
103     }
104 private:
105     std::shared_ptr<SharedMemoryData> memoryData_ = nullptr;
106 };
107 
108 class EffectMemory {
109 public:
110     IMAGE_EFFECT_EXPORT static std::unique_ptr<AbsMemory> CreateMemory(BufferType type);
111 };
112 
113 } // namespace Effect
114 } // namespace Media
115 } // namespace OHOS
116 
117 #endif // IMAGE_EFFECT_EFFECT_MEMORY_H
118