1 /*
2  * Copyright (c) 2021-2023 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 FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
17 #define FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
18 
19 #include <buffer_extra_data.h>
20 #include <buffer_handle_parcel.h>
21 #include <buffer_handle_utils.h>
22 #include <surface_buffer.h>
23 #include "egl_data.h"
24 #include "native_buffer.h"
25 #include "stdint.h"
26 
27 struct BufferWrapper {};
28 
29 namespace OHOS {
30 class SurfaceBufferImpl : public SurfaceBuffer {
31 public:
32     SurfaceBufferImpl();
33     SurfaceBufferImpl(uint32_t seqNum);
34     virtual ~SurfaceBufferImpl();
35 
36     GSError Alloc(const BufferRequestConfig &config) override;
37     GSError Map() override;
38     GSError Unmap() override;
39     GSError FlushCache() override;
40     GSError InvalidateCache() override;
41 
42     BufferHandle *GetBufferHandle() const override;
43     int32_t GetWidth() const override;
44     int32_t GetHeight() const override;
45     int32_t GetStride() const override;
46     int32_t GetFormat() const override;
47     uint64_t GetUsage() const override;
48     uint64_t GetPhyAddr() const override;
49     void* GetVirAddr() override;
50     int32_t GetFileDescriptor() const override;
51     uint32_t GetSize() const override;
52 
53     GraphicColorGamut GetSurfaceBufferColorGamut() const override;
54     GraphicTransformType GetSurfaceBufferTransform() const override;
55     void SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut) override;
56     void SetSurfaceBufferTransform(const GraphicTransformType& transform) override;
57 
58     int32_t GetSurfaceBufferWidth() const override;
59     int32_t GetSurfaceBufferHeight() const override;
60     void SetSurfaceBufferWidth(int32_t width) override;
61     void SetSurfaceBufferHeight(int32_t width) override;
62 
63     uint32_t GetSeqNum() const override;
64 
65     sptr<EglData> GetEglData() const override;
66     void SetEglData(const sptr<EglData>& data) override;
67 
68     void SetExtraData(sptr<BufferExtraData> bedata) override;
69     sptr<BufferExtraData> GetExtraData() const override;
70 
71     void SetBufferHandle(BufferHandle *handle) override;
72     GSError WriteToMessageParcel(MessageParcel &parcel) override;
73     GSError ReadFromMessageParcel(MessageParcel &parcel) override;
74 
75     OH_NativeBuffer* SurfaceBufferToNativeBuffer() override;
76 
77     static GSError CheckBufferConfig(int32_t width, int32_t height,
78                                      int32_t format, uint64_t usage);
79 
80     BufferWrapper GetBufferWrapper() override;
81     void SetBufferWrapper(BufferWrapper wrapper) override;
82 
83     // metadata
84     GSError SetMetadata(uint32_t key, const std::vector<uint8_t>& value, bool enableCache = true) override;
85     GSError GetMetadata(uint32_t key, std::vector<uint8_t>& value) override;
86     GSError ListMetadataKeys(std::vector<uint32_t>& keys) override;
87     GSError EraseMetadataKey(uint32_t key) override;
88 
89     GSError WriteBufferRequestConfig(MessageParcel &parcel) override;
90     GSError ReadBufferRequestConfig(MessageParcel &parcel) override;
91     BufferRequestConfig GetBufferRequestConfig() const override;
92     void SetBufferRequestConfig(const BufferRequestConfig &config) override;
93     void SetConsumerAttachBufferFlag(bool value) override;
94     bool GetConsumerAttachBufferFlag() override;
95     GSError GetPlanesInfo(void **planesInfo) override;
96     void SetSurfaceBufferScalingMode(const ScalingMode &scalingMode) override;
97     ScalingMode GetSurfaceBufferScalingMode() const override;
98 
99 private:
100     void FreeBufferHandleLocked();
101     bool MetaDataCachedLocked(const uint32_t key, const std::vector<uint8_t>& value);
102     GSError GetImageLayout(void *layout);
103 
104     BufferHandle *handle_ = nullptr;
105     uint32_t sequenceNumber_ = UINT32_MAX;
106     sptr<BufferExtraData> bedata_ = nullptr;
107     sptr<EglData> eglData_ = nullptr;
108     GraphicColorGamut surfaceBufferColorGamut_ = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
109     GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
110     ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
111     int32_t surfaceBufferWidth_ = 0;
112     int32_t surfaceBufferHeight_ = 0;
113     mutable std::mutex mutex_;
114     OH_NativeBuffer_Planes planesInfo_ = {0, {}};
115     BufferRequestConfig bufferRequestConfig_ = {0, 0, 0, 0, 0, 0};
116     bool isConsumerAttachBufferFlag_ = false;
117     std::map<uint32_t, std::vector<uint8_t>> metaDataCache_;
118 };
119 } // namespace OHOS
120 
121 #endif // FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
122