1 /*
2  * Copyright (c) 2020 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 #include "buffer_producer_wrapper.h"
17 #include "camera_types_c_if.h"
18 #include "surface.h"
19 #include <map>
20 
21 static std::map<int, OHOS::sptr<OHOS::Surface>> g_producerMap;
22 static std::map<GraphicBufferCIF*, OHOS::sptr<OHOS::SurfaceBuffer>> g_surfaceBufferMap;
23 
BindBufferProducer(int id,OHOS::sptr<OHOS::IBufferProducer> & producer)24 void BindBufferProducer(int id, OHOS::sptr<OHOS::IBufferProducer>& producer)
25 {
26     g_producerMap[id] = OHOS::Surface::CreateSurfaceAsProducer(producer);
27     return;
28 }
29 
BufferProducerRequestBuffer(GraphicBufferCIF * buffer)30 int BufferProducerRequestBuffer(GraphicBufferCIF* buffer)
31 {
32     if (buffer == nullptr) {
33         return -1;
34     }
35 
36     OHOS::sptr<OHOS::SurfaceBuffer> sb = nullptr;
37     int fence = 0;
38     OHOS::BufferRequestConfig requestConfig = {};
39     requestConfig.width = buffer->width;
40     requestConfig.height = buffer->height;
41     requestConfig.strideAlignment = 8;
42     requestConfig.format = buffer->format;
43     requestConfig.usage = buffer->usage;
44     requestConfig.timeout = 0;
45 
46     OHOS::sptr<OHOS::Surface> producer = g_producerMap[buffer->streamId];
47     if (producer == nullptr) {
48         return -1;
49     }
50     OHOS::SurfaceError ret = producer->RequestBuffer(sb, fence, requestConfig);
51     BufferHandle* handle = sb->GetBufferHandle();
52     if (handle == nullptr) {
53         return -1;
54     }
55 
56     buffer->fd = handle->fd;
57     buffer->width = handle->width;
58     buffer->stride = handle->stride;
59     buffer->height = handle->height;
60     buffer->size = handle->size;
61     buffer->format = handle->format;
62     buffer->usage = handle->usage;
63     buffer->virAddr = handle->virAddr;
64     buffer->phyAddr = handle->phyAddr;
65     buffer->fence = fence;
66 
67     g_surfaceBufferMap[buffer] = sb;
68     return static_cast<int>(ret);
69 }
70 
BufferProducerCancelBuffer(GraphicBufferCIF * buffer)71 int BufferProducerCancelBuffer(GraphicBufferCIF* buffer)
72 {
73     if (buffer == nullptr) {
74         return -1;
75     }
76     OHOS::sptr<OHOS::Surface> producer = g_producerMap[buffer->streamId];
77     if (producer == nullptr) {
78         return -1;
79     }
80     OHOS::sptr<OHOS::SurfaceBuffer> sb = g_surfaceBufferMap[buffer];
81     if (sb == nullptr) {
82         return -1;
83     }
84 
85     OHOS::SurfaceError ret = producer->CancelBuffer(sb);
86     g_surfaceBufferMap.erase(buffer);
87     return static_cast<int>(ret);
88 }
89 
BufferProducerFlushBuffer(GraphicBufferCIF * buffer)90 int BufferProducerFlushBuffer(GraphicBufferCIF* buffer)
91 {
92     if (buffer == nullptr) {
93         return -1;
94     }
95 
96     OHOS::BufferFlushConfig flushConfig = {};
97     flushConfig.damage.x = 0;
98     flushConfig.damage.y = 0;
99     flushConfig.damage.w = buffer->width;
100     flushConfig.damage.h = buffer->height;
101     flushConfig.timestamp = 0;
102 
103     OHOS::sptr<OHOS::Surface> producer = g_producerMap[buffer->streamId];
104     if (producer == nullptr) {
105         return -1;
106     }
107     OHOS::sptr<OHOS::SurfaceBuffer> sb = g_surfaceBufferMap[buffer];
108     if (sb == nullptr) {
109         return -1;
110     }
111 
112     OHOS::SurfaceError ret = producer->FlushBuffer(sb, -1, flushConfig);
113     g_surfaceBufferMap.erase(buffer);
114     return static_cast<int>(ret);
115 }
116 
BufferProducerGetQueueSize(int streamId)117 int BufferProducerGetQueueSize(int streamId)
118 {
119     OHOS::sptr<OHOS::Surface> producer = g_producerMap[streamId];
120     if (producer == nullptr) {
121         return -1;
122     }
123 
124     return producer->GetQueueSize();
125 }
126 
BufferProducerSetQueueSize(int streamId,int size)127 unsigned int BufferProducerSetQueueSize(int streamId, int size)
128 {
129     OHOS::sptr<OHOS::Surface> producer = g_producerMap[streamId];
130     if (producer == nullptr) {
131         return -1;
132     }
133 
134     return producer->SetQueueSize(size);
135 }
136 
BufferProducerDetachBufferProducer(int id)137 void BufferProducerDetachBufferProducer(int id)
138 {
139     OHOS::sptr<OHOS::Surface> producer = g_producerMap[id];
140     if (producer == nullptr) {
141         return;
142     }
143 
144     g_producerMap.erase(id);
145 
146 }
147