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