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