1 /*
2  * Copyright (c) 2020-2022 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 GRAPHIC_LITE_BUFFER_CLIENT_PRODUCER_H
17 #define GRAPHIC_LITE_BUFFER_CLIENT_PRODUCER_H
18 
19 #include <pthread.h>
20 #include "buffer_producer.h"
21 #include "buffer_queue.h"
22 #include "ipc_skeleton.h"
23 #include "serializer.h"
24 #include "surface_buffer.h"
25 namespace OHOS {
26 /**
27  * @brief Surface producer client class in multi process. Surface Client invoke these method to send ipc
28  *        request to BufferQueueProducer for request buffer, flush buffer, cancel buffer and set buffer attr.
29  */
30 class BufferClientProducer : public BufferProducer {
31 public:
32     /**
33      * @brief Surface Buffer Client Producer Constructor.
34      * @param [in] SvcIdentity sid, Surface consumer sid, for sending ipc request.
35      */
36     explicit BufferClientProducer(const SvcIdentity& sid);
37 
38     /**
39      * @brief Surface Buffer Client Producer Destructor.
40      */
41     ~BufferClientProducer();
42 
43     /**
44      * @brief Request buffer. Surface client producer sends ipc message(code=REQUEST_BUFFER) to requests buffer.
45      *        BufferQueueProducer does the request and return Buffer handle, then map the handle with virtual address
46      *        to write data.
47      * @param [in] whether waiting or not.
48      *        wait = 1. waiting util get surface buffer.
49      *        wait = 0. No wait to get surface buffer.
50      * @returns buffer pointer.
51      */
52     SurfaceBufferImpl* RequestBuffer(uint8_t wait) override;
53 
54     /**
55      * @brief Flush buffer for consumer acquire. Client producer sends request(code=FLUSH_BUFFER) to flush buffer,
56      *        BufferQueueProducer push buffer to dirty list, and call back to consumer that buffer is available to
57      *        acquire.
58      * @param [in] SurfaceBufferImpl pointer, Which buffer could acquire for consumer.
59      * @returns Flush buffer succeed or not.
60      *        0 is succeed; other is failed.
61      */
62     int32_t FlushBuffer(SurfaceBufferImpl* buffer) override;
63 
64     /**
65      * @brief Cancel buffer. Client Producer sends request(CANCEL_BUFFER) to cancel this buffer.
66      *        BufferQueueProducer push push buffer to free list for request it again.
67      * @param [in] SurfaceBufferImpl pointer, push it back to free list for request it.
68      */
69     void Cancel(SurfaceBufferImpl* buffer) override;
70 
71     /**
72      * @brief Set queue size. Client Producer sends request(SET_QUEUE_SIZE) to set max buffer count.
73      * @param [in] queueSize. Could allocate buffer count.
74      */
75     void SetQueueSize(uint8_t queueSize) override;
76 
77     /**
78      * @brief Get queue size. Client Producer sends request(GET_QUEUE_SIZE) to get max buffer count.
79      * @returns queue size.
80      */
81     uint8_t GetQueueSize() override;
82 
83     /**
84      * @brief Client Producer sends request(SET_WIDTH_AND_HEIGHT) to set width and height to calculate the buffer size.
85      * @param [in] width, Buffer width.
86      * @param [in] height, Buffer height.
87      */
88     void SetWidthAndHeight(uint32_t width, uint32_t height) override;
89 
90     /**
91      * @brief Client Producer sends request(GET_WIDTH) to get width, buffer width to calculate the buffer size..
92      * @returns width, Buffer width.
93      */
94     uint32_t GetWidth() override;
95 
96     /**
97      * @brief Client Producer sends request(GET_HEIGHT) to get height, buffer height to calculate the buffer size..
98      * @returns height, Buffer height.
99      */
100     uint32_t GetHeight() override;
101 
102     /**
103      * @brief Client Producer sends request(SET_FORMAT) to set format, to calculate the buffer size.
104      *        Default is IMAGE_PIXEL_FORMAT_RGB565. See all formats in OHOS::ImageFormat
105      * @param [in] format, Buffer format.
106      */
107     void SetFormat(uint32_t format) override;
108 
109     /**
110      * @brief Client Producer sends request(GET_FORMAT) to get format, buffer format to calculate the buffer size..
111      * @returns format, Buffer format.
112      */
113     uint32_t GetFormat() override;
114 
115     /**
116      * @brief Client Producer sends request(SET_STRIDE_ALIGNMENT) to set stride alignment bytes.
117      *        Default alignment is 4 bytes.
118      * @param [in] strideAlignment, Buffer stride alignment
119      */
120     void SetStrideAlignment(uint32_t strideAlignment) override;
121 
122     /**
123      * @brief Client Producer sends request(GET_STRIDE_ALIGNMENT) to get stride alignment bytes.
124      *        Default alignment is 4 bytes.
125      * @returns strideAlignment, Buffer stride alignment.
126      */
127     uint32_t GetStrideAlignment() override;
128 
129     /**
130      * @brief Client Producer sends request(GET_STRIDE) to get bytes of one stride which calculate by width,
131      *        format and stride alignment.
132      * @returns The stride
133      */
134     uint32_t GetStride() override;
135 
136     /**
137      * @brief Client Producer sends request(SET_SIZE) to set buffer size. Surface alloc buffer size, no need
138      *        to calculate by width, height, format...
139      * @param [in] The buffer size
140      */
141     void SetSize(uint32_t size) override;
142 
143     /**
144      * @brief Client Producer sends request(GET_SIZE) to get buffer size. Surface alloc buffer size.
145      *        The size is setted by SetSize() or calculated by width, height, format...
146      * @returns The buffer size.
147      */
148     uint32_t GetSize() override;
149 
150     /**
151      * @brief Client Producer sends request(SET_USAGE) to set buffer usage. Surface alloc physical or
152      *        virtual memory buffer. Support usage see detail in OHOS::BUFFER_CONSUMER_USAGE.
153      *        Default is BUFFER_CONSUMER_USAGE_SORTWARE, which will alloc virtual memory buffer.
154      * @param [in] The buffer usage.
155      */
156     void SetUsage(uint32_t usage) override;
157 
158     /**
159      * @brief Client Producer sends request(GET_USAGE) to get buffer usage. Surface alloc physical or
160      *        virtual memory buffer. All usage sees detail in OHOS::BUFFER_CONSUMER_USAGE.
161      * @returns The buffer usage.
162      */
163     uint32_t GetUsage() override;
164 
165     /**
166      * @brief Set user data. Construct a local map to store all the user-data.
167      * @param [in] key.
168      * @param [in] value.
169      */
170     void SetUserData(const std::string& key, const std::string& value) override;
171 
172     /**
173      * @brief Get user data. Get the value from local map.
174      * @returns value refers to the key.
175      */
176     std::string GetUserData(const std::string& key) override;
177 
178 private:
179     uint32_t GetAttr(uint32_t code);
180     void SetAttr(uint32_t code, uint32_t value);
181     SvcIdentity sid_;
182     IpcObjectStub objectStub_;
183 };
184 } // end namespace
185 
186 #endif
187