1/*
2 * Copyright (c) 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#ifndef INTERFACES_INNERKITS_SURFACE_SURFACE_BUFFER_H
17#define INTERFACES_INNERKITS_SURFACE_SURFACE_BUFFER_H
18
19#include <functional>
20
21#include <memory>
22#include <refbase.h>
23
24#include "buffer_handle_utils.h"
25#include "surface_type.h"
26#include "egl_data.h"
27#include "buffer_extra_data.h"
28#include "native_buffer.h"
29
30struct BufferWrapper;
31
32namespace OHOS {
33class MessageParcel;
34class SyncFence;
35class SurfaceBuffer : public RefBase {
36public:
37    virtual BufferHandle *GetBufferHandle() const = 0;
38    virtual int32_t GetWidth() const = 0;
39    virtual int32_t GetHeight() const = 0;
40    virtual int32_t GetStride() const = 0;
41    virtual int32_t GetFormat() const = 0;
42    virtual uint64_t GetUsage() const = 0;
43    virtual uint64_t GetPhyAddr() const = 0;
44    virtual void* GetVirAddr() = 0;
45    virtual int32_t GetFileDescriptor() const = 0;
46    virtual uint32_t GetSize() const = 0;
47
48    virtual GraphicColorGamut GetSurfaceBufferColorGamut() const = 0;
49    virtual GraphicTransformType GetSurfaceBufferTransform() const = 0;
50    virtual void SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut) = 0;
51    virtual void SetSurfaceBufferTransform(const GraphicTransformType& transform) = 0;
52
53    virtual int32_t GetSurfaceBufferWidth() const = 0;
54    virtual int32_t GetSurfaceBufferHeight() const = 0;
55    virtual void SetSurfaceBufferWidth(int32_t width) = 0;
56    virtual void SetSurfaceBufferHeight(int32_t width) = 0;
57
58    virtual uint32_t GetSeqNum() const = 0;
59
60    virtual void SetExtraData(sptr<BufferExtraData> bedata) = 0;
61    virtual sptr<BufferExtraData> GetExtraData() const = 0;
62    virtual GSError WriteToMessageParcel(MessageParcel &parcel) = 0;
63    virtual GSError ReadFromMessageParcel(MessageParcel &parcel) = 0;
64    virtual void SetBufferHandle(BufferHandle *handle) = 0;
65
66    virtual BufferWrapper GetBufferWrapper() = 0;
67    virtual void SetBufferWrapper(BufferWrapper wrapper) = 0;
68
69    // gralloc
70    virtual GSError Alloc(const BufferRequestConfig &config) = 0;
71    virtual GSError Map() = 0;
72    virtual GSError Unmap() = 0;
73    virtual GSError FlushCache() = 0;
74    virtual GSError InvalidateCache() = 0;
75
76    // metadata
77    virtual GSError SetMetadata(uint32_t key, const std::vector<uint8_t>& value) = 0;
78    virtual GSError GetMetadata(uint32_t key, std::vector<uint8_t>& value) = 0;
79    virtual GSError ListMetadataKeys(std::vector<uint32_t>& keys) = 0;
80    virtual GSError EraseMetadataKey(uint32_t key) = 0;
81
82    static SurfaceBuffer* NativeBufferToSurfaceBuffer(OH_NativeBuffer* buffer)
83    {
84        return reinterpret_cast<SurfaceBuffer *>(buffer);
85    };
86
87    static const SurfaceBuffer* NativeBufferToSurfaceBuffer(OH_NativeBuffer const* buffer)
88    {
89        return reinterpret_cast<SurfaceBuffer const*>(buffer);
90    };
91
92    virtual OH_NativeBuffer* SurfaceBufferToNativeBuffer() = 0;
93
94    static sptr<SurfaceBuffer> Create();
95
96    virtual GSError WriteBufferRequestConfig(MessageParcel &parcel)
97    {
98        (void)parcel;
99        return GSERROR_OK;
100    };
101    virtual GSError ReadBufferRequestConfig(MessageParcel &parcel)
102    {
103        (void)parcel;
104        return GSERROR_OK;
105    };
106    virtual BufferRequestConfig GetBufferRequestConfig() const = 0;
107    virtual void SetBufferRequestConfig(const BufferRequestConfig &config)
108    {
109        (void)config;
110    };
111    virtual void SetConsumerAttachBufferFlag(bool value)
112    {
113        (void)value;
114    };
115    virtual bool GetConsumerAttachBufferFlag()
116    {
117        return false;
118    };
119    virtual GSError GetPlanesInfo(void **planesInfo)
120    {
121        (void)planesInfo;
122        return GSERROR_OK;
123    };
124
125protected:
126    SurfaceBuffer() {}
127    SurfaceBuffer(const SurfaceBuffer&) = delete;
128    SurfaceBuffer& operator=(const SurfaceBuffer&) = delete;
129    virtual ~SurfaceBuffer() {}
130};
131
132using OnReleaseFunc = std::function<GSError(sptr<SurfaceBuffer> &)>;
133using OnDeleteBufferFunc = std::function<void(int32_t)>;
134using OnReleaseFuncWithFence = std::function<GSError(const sptr<SurfaceBuffer>&, const sptr<SyncFence>&)>;
135using OnUserDataChangeFunc = std::function<void(const std::string& key, const std::string& value)>;
136} // namespace OHOS
137
138#endif // INTERFACES_INNERKITS_SURFACE_SURFACE_BUFFER_H
139