132a6e48fSopenharmony_ci/*
232a6e48fSopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License.
532a6e48fSopenharmony_ci * You may obtain a copy of the License at
632a6e48fSopenharmony_ci *
732a6e48fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
832a6e48fSopenharmony_ci *
932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and
1332a6e48fSopenharmony_ci * limitations under the License.
1432a6e48fSopenharmony_ci */
1532a6e48fSopenharmony_ci
1632a6e48fSopenharmony_ci#ifndef FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
1732a6e48fSopenharmony_ci#define FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
1832a6e48fSopenharmony_ci
1932a6e48fSopenharmony_ci#include <buffer_extra_data.h>
2032a6e48fSopenharmony_ci#include <buffer_handle_parcel.h>
2132a6e48fSopenharmony_ci#include <buffer_handle_utils.h>
2232a6e48fSopenharmony_ci#include <surface_buffer.h>
2332a6e48fSopenharmony_ci#include "egl_data.h"
2432a6e48fSopenharmony_ci#include "native_buffer.h"
2532a6e48fSopenharmony_ci#include "stdint.h"
2632a6e48fSopenharmony_ci
2732a6e48fSopenharmony_cistruct BufferWrapper {};
2832a6e48fSopenharmony_ci
2932a6e48fSopenharmony_cinamespace OHOS {
3032a6e48fSopenharmony_ciclass SurfaceBufferImpl : public SurfaceBuffer {
3132a6e48fSopenharmony_cipublic:
3232a6e48fSopenharmony_ci    SurfaceBufferImpl();
3332a6e48fSopenharmony_ci    SurfaceBufferImpl(uint32_t seqNum);
3432a6e48fSopenharmony_ci    virtual ~SurfaceBufferImpl();
3532a6e48fSopenharmony_ci
3632a6e48fSopenharmony_ci    GSError Alloc(const BufferRequestConfig &config) override;
3732a6e48fSopenharmony_ci    GSError Map() override;
3832a6e48fSopenharmony_ci    GSError Unmap() override;
3932a6e48fSopenharmony_ci    GSError FlushCache() override;
4032a6e48fSopenharmony_ci    GSError InvalidateCache() override;
4132a6e48fSopenharmony_ci
4232a6e48fSopenharmony_ci    BufferHandle *GetBufferHandle() const override;
4332a6e48fSopenharmony_ci    int32_t GetWidth() const override;
4432a6e48fSopenharmony_ci    int32_t GetHeight() const override;
4532a6e48fSopenharmony_ci    int32_t GetStride() const override;
4632a6e48fSopenharmony_ci    int32_t GetFormat() const override;
4732a6e48fSopenharmony_ci    uint64_t GetUsage() const override;
4832a6e48fSopenharmony_ci    uint64_t GetPhyAddr() const override;
4932a6e48fSopenharmony_ci    void* GetVirAddr() override;
5032a6e48fSopenharmony_ci    int32_t GetFileDescriptor() const override;
5132a6e48fSopenharmony_ci    uint32_t GetSize() const override;
5232a6e48fSopenharmony_ci
5332a6e48fSopenharmony_ci    GraphicColorGamut GetSurfaceBufferColorGamut() const override;
5432a6e48fSopenharmony_ci    GraphicTransformType GetSurfaceBufferTransform() const override;
5532a6e48fSopenharmony_ci    void SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut) override;
5632a6e48fSopenharmony_ci    void SetSurfaceBufferTransform(const GraphicTransformType& transform) override;
5732a6e48fSopenharmony_ci
5832a6e48fSopenharmony_ci    int32_t GetSurfaceBufferWidth() const override;
5932a6e48fSopenharmony_ci    int32_t GetSurfaceBufferHeight() const override;
6032a6e48fSopenharmony_ci    void SetSurfaceBufferWidth(int32_t width) override;
6132a6e48fSopenharmony_ci    void SetSurfaceBufferHeight(int32_t width) override;
6232a6e48fSopenharmony_ci
6332a6e48fSopenharmony_ci    uint32_t GetSeqNum() const override;
6432a6e48fSopenharmony_ci
6532a6e48fSopenharmony_ci    void SetExtraData(sptr<BufferExtraData> bedata) override;
6632a6e48fSopenharmony_ci    sptr<BufferExtraData> GetExtraData() const override;
6732a6e48fSopenharmony_ci
6832a6e48fSopenharmony_ci    void SetBufferHandle(BufferHandle *handle) override;
6932a6e48fSopenharmony_ci    GSError WriteToMessageParcel(MessageParcel &parcel) override;
7032a6e48fSopenharmony_ci    GSError ReadFromMessageParcel(MessageParcel &parcel) override;
7132a6e48fSopenharmony_ci
7232a6e48fSopenharmony_ci    OH_NativeBuffer* SurfaceBufferToNativeBuffer() override;
7332a6e48fSopenharmony_ci
7432a6e48fSopenharmony_ci    static GSError CheckBufferConfig(int32_t width, int32_t height,
7532a6e48fSopenharmony_ci                                     int32_t format, uint64_t usage);
7632a6e48fSopenharmony_ci
7732a6e48fSopenharmony_ci    BufferWrapper GetBufferWrapper() override;
7832a6e48fSopenharmony_ci    void SetBufferWrapper(BufferWrapper wrapper) override;
7932a6e48fSopenharmony_ci
8032a6e48fSopenharmony_ci    // metadata
8132a6e48fSopenharmony_ci    GSError SetMetadata(uint32_t key, const std::vector<uint8_t>& value) override;
8232a6e48fSopenharmony_ci    GSError GetMetadata(uint32_t key, std::vector<uint8_t>& value) override;
8332a6e48fSopenharmony_ci    GSError ListMetadataKeys(std::vector<uint32_t>& keys) override;
8432a6e48fSopenharmony_ci    GSError EraseMetadataKey(uint32_t key) override;
8532a6e48fSopenharmony_ci
8632a6e48fSopenharmony_ci    GSError WriteBufferRequestConfig(MessageParcel &parcel) override;
8732a6e48fSopenharmony_ci    GSError ReadBufferRequestConfig(MessageParcel &parcel) override;
8832a6e48fSopenharmony_ci    BufferRequestConfig GetBufferRequestConfig() const override;
8932a6e48fSopenharmony_ci    void SetBufferRequestConfig(const BufferRequestConfig &config) override;
9032a6e48fSopenharmony_ci    void SetConsumerAttachBufferFlag(bool value) override;
9132a6e48fSopenharmony_ci    bool GetConsumerAttachBufferFlag() override;
9232a6e48fSopenharmony_ci    GSError GetPlanesInfo(void **planesInfo) override;
9332a6e48fSopenharmony_ci
9432a6e48fSopenharmony_ciprivate:
9532a6e48fSopenharmony_ci    void FreeBufferHandleLocked();
9632a6e48fSopenharmony_ci    bool MetaDataCachedLocked(const uint32_t key, const std::vector<uint8_t>& value);
9732a6e48fSopenharmony_ci    GSError GetImageLayout(void *layout);
9832a6e48fSopenharmony_ci
9932a6e48fSopenharmony_ci    BufferHandle *handle_ = nullptr;
10032a6e48fSopenharmony_ci    uint32_t sequenceNumber_ = UINT32_MAX;
10132a6e48fSopenharmony_ci    sptr<BufferExtraData> bedata_ = nullptr;
10232a6e48fSopenharmony_ci    sptr<EglData> eglData_ = nullptr;
10332a6e48fSopenharmony_ci    GraphicColorGamut surfaceBufferColorGamut_ = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
10432a6e48fSopenharmony_ci    GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
10532a6e48fSopenharmony_ci    int32_t surfaceBufferWidth_ = 0;
10632a6e48fSopenharmony_ci    int32_t surfaceBufferHeight_ = 0;
10732a6e48fSopenharmony_ci    mutable std::mutex mutex_;
10832a6e48fSopenharmony_ci    OH_NativeBuffer_Planes planesInfo_ = {0, {}};
10932a6e48fSopenharmony_ci    BufferRequestConfig bufferRequestConfig_ = {0, 0, 0, 0, 0, 0};
11032a6e48fSopenharmony_ci    bool isConsumerAttachBufferFlag_ = false;
11132a6e48fSopenharmony_ci    std::map<uint32_t, std::vector<uint8_t>> metaDataCache_;
11232a6e48fSopenharmony_ci};
11332a6e48fSopenharmony_ci} // namespace OHOS
11432a6e48fSopenharmony_ci
11532a6e48fSopenharmony_ci#endif // FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
116