/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @addtogroup Surface * @{ * * @brief Provides the capabilities of applying for and releasing shared memory in multimedia and graphics scenarios. * * @since 1.0 * @version 1.0 */ /** * @file surface.h * * @brief Provides the capabilities of applying for and releasing shared memory in multimedia and graphics scenarios. * * By default, a surface can apply for a shared buffer. You can call {@link SetQueueSize} to set the maximum number * of buffers that can be applied for. \n * * @since 1.0 * @version 1.0 */ #ifndef GRAPHIC_LITE_SURFACE_H #define GRAPHIC_LITE_SURFACE_H #include "ibuffer_consumer_listener.h" #include "surface_buffer.h" #include "surface_type.h" namespace OHOS { /** * @brief Defines the consumer listener used to notify consumers when the surface status is updated. * * @since 1.0 * @version 1.0 */ class Surface { public: /** * @brief A constructor used to create a {@link Surface} object for consumers to use. * * In multi-process scenarios, this function is provided for consumers to obtain buffers generated by producers * for consumption. \n * In single-process scenarios, this function can be used by both consumers and producers. \n * * @since 1.0 * @version 1.0 */ static Surface* CreateSurface(); /** * @brief A destructor used to delete the Surface instance. * * This function releases the surface and all buffers applied for the surface. * * @since 1.0 * @version 1.0 */ virtual ~Surface(); /** * @brief Sets the number of buffers that can be allocated to the surface. * The default value is 1. The value range is [1, 10]. * * @param queueSize Indicates the number of buffers to set. * @since 1.0 * @version 1.0 */ virtual void SetQueueSize(uint8_t queueSize) = 0; /** * @brief Obtains the number of surface buffers that can be allocated to the surface. * The default value is 1. The value range is [1, 10]. * * @return Returns the number of buffers. * @since 1.0 * @version 1.0 */ virtual uint8_t GetQueueSize() = 0; /** * @brief Sets the width and height of the surface for calculating its stride and size. * The default value range of width and height is (0,7680]. * * @param width Indicates the surface width, in pixels. * @param height Indicates the surface height, in pixels. * @since 1.0 * @version 1.0 */ virtual void SetWidthAndHeight(uint32_t width, uint32_t height) = 0; /** * @brief Obtains the width of the surface. * * @return Returns the surface width, in pixels. * @since 1.0 * @version 1.0 */ virtual uint32_t GetWidth() = 0; /** * @brief Obtains the height of the surface. * * @return Returns the surface height, in pixels. * @since 1.0 * @version 1.0 */ virtual uint32_t GetHeight() = 0; /** * @brief Sets the pixel format of the surface. For details, see {@link ImageFormat}. * The default pixel format is {@link IMAGE_PIXEL_FORMAT_RGB565}. * * * @param format Indicates the pixel format to be set. * @since 1.0 * @version 1.0 */ virtual void SetFormat(uint32_t format) = 0; /** * @brief Obtains the pixel format of the surface. For details, see {@link ImageFormat}. * The default pixel format is {@link IMAGE_PIXEL_FORMAT_RGB565}. * * @return Returns the pixel format. * @since 1.0 * @version 1.0 */ virtual uint32_t GetFormat() = 0; /** * @brief Sets the number of bytes for stride alignment. * * By default, 4-byte aligned is used. The value range is [4,32]. * * @param strideAlignment Indicates the number of bytes for stride alignment. * @since 1.0 * @version 1.0 */ virtual void SetStrideAlignment(uint32_t strideAlignment) = 0; /** * @brief Obtains the number of bytes for stride alignment. By default, 4-byte aligned is used. * * @return Returns the number of bytes for stride alignment. * @since 1.0 * @version 1.0 */ virtual uint32_t GetStrideAlignment() = 0; /** * @brief Obtains the stride of the surface. * * @return Returns the stride. * @since 1.0 * @version 1.0 */ virtual uint32_t GetStride() = 0; /** * @brief Sets the size of the shared memory to allocate. * * * @param size Indicates the size of the shared memory. The value range is (0,58982400]. * @since 1.0 * @version 1.0 */ virtual void SetSize(uint32_t size) = 0; /** * @brief Obtains the size of the shared memory to allocate. * * @return Returns the size of the shared memory. * @since 1.0 * @version 1.0 */ virtual uint32_t GetSize() = 0; /** * @brief Sets the usage scenario of the buffer. Physically contiguous memory and virtual memory (by default) * are supported. By default, virtual memory is allocated. * * @param usage Indicates the usage scenario of the buffer. For details, see {@link BUFFER_CONSUMER_USAGE}. * @since 1.0 * @version 1.0 */ virtual void SetUsage(uint32_t usage) = 0; /** * @brief Obtains the usage scenario of the buffer. Physically contiguous memory and virtual memory are supported. * * @return Returns the usage scenario of the buffer. For details, see {@link BUFFER_CONSUMER_USAGE}. * @since 1.0 * @version 1.0 */ virtual uint32_t GetUsage() = 0; /** * @brief Sets surface user data, which is stored in the format of . * * @param key Indicates the key of a key-value pair to store. * @param value Indicates the value of the key-value pair to store. * @since 1.0 * @version 1.0 */ virtual void SetUserData(const std::string& key, const std::string& value) = 0; /** * @brief Obtains surface user data. * * @param key Indicates the key of a key-value pair for which the value is to be obtained. * @return Returns the value of the key-value pair obtained. * @since 1.0 * @version 1.0 */ virtual std::string GetUserData(const std::string& key) = 0; /** * @brief Obtains a buffer to write data. * * * @param wait Specifies whether the function waits for an available buffer. If wait is 1, * the function waits until there is an available buffer in the free queue before returning a pointer. * If the wait is 0, the function does not wait and returns nullptr if there is no buffer * in the free queue. The default value is 0. * @return Returns the pointer to the buffer if the operation is successful; returns nullptr otherwise. * @since 1.0 * @version 1.0 */ virtual SurfaceBuffer* RequestBuffer(uint8_t wait = 0) = 0; /** * @brief Flushes a buffer to the dirty queue for consumers to use. * * * * @param SurfaceBuffer Indicates the pointer to the buffer flushed by producers. * @return Returns 0 if the operation is successful; returns -1 otherwise. * @since 1.0 * @version 1.0 */ virtual int32_t FlushBuffer(SurfaceBuffer* buffer) = 0; /** * @brief Obtains a buffer. * * Consumers can use this function to obtain the buffer placed in the dirty queue by producers. * If there is no buffer in the queue, nullptr is returned. * * @return Returns the pointer to the {@link SurfaceBuffer} object. * @since 1.0 * @version 1.0 */ virtual SurfaceBuffer* AcquireBuffer() = 0; /** * @brief Releases the consumed buffer. * * After a consumer has used a {@link SurfaceBuffer} object, the consumer can release it through * {@link ReleaseBuffer}. The released object is placed into the free queue so that producers can * apply for the object. * * @param SurfaceBuffer Indicates the pointer to the buffer released. * @return Returns true if the buffer is released; returns false otherwise. * @since 1.0 * @version 1.0 */ virtual bool ReleaseBuffer(SurfaceBuffer* buffer) = 0; /** * @brief Releases a buffer to the free queue. * * * @param SurfaceBuffer Indicates the pointer to the buffer to be released by producers. * @since 1.0 * @version 1.0 */ virtual void CancelBuffer(SurfaceBuffer* buffer) = 0; /** * @brief Registers a consumer listener. * * When a buffer is placed in the dirty queue, {@link OnBufferAvailable} is called to notify consumers. * If the listener is repeatedly registered, only the latest one is retained. * * @param IBufferConsumerListener Indicates the listener to register. * @since 1.0 * @version 1.0 */ virtual void RegisterConsumerListener(IBufferConsumerListener& listener) = 0; /** * @brief Unregisters the consumer listener. * * After the listener is unregistered, no callback is triggered when a buffer is placed in the dirty queue. * * @since 1.0 * @version 1.0 */ virtual void UnregisterConsumerListener() = 0; protected: Surface() {} }; } // end namespace #endif