1 /*
2 * Copyright (c) 2021-2025 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/avbuffer_queue_producer_proxy.h"
17 #include "avbuffer_utils.h"
18 #include "common/log.h"
19
20 namespace {
21 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "AVBufferQueueProducerProxy" };
22 }
23
24 namespace OHOS {
25 namespace Media {
26
27 #define ABQ_IPC_DEFINE_VARIABLES \
28 MessageParcel arguments; \
29 MessageParcel reply; \
30 MessageOption option; \
31 FALSE_RETURN_V(arguments.WriteInterfaceToken(GetDescriptor()), \
32 Status::ERROR_IPC_WRITE_INTERFACE_TOKEN)
33
34 #define ABQ_IPC_SEND_REQUEST(command) \
35 do { \
36 NZERO_RETURN_V(Remote()->SendRequest(command, arguments, reply, option), \
37 Status::ERROR_IPC_SEND_REQUEST); \
38 NOK_RETURN(static_cast<Status>(reply.ReadInt32())); \
39 } while (0)
40
41
42 class AVBufferQueueProducerProxyImpl : public AVBufferQueueProducerProxy {
43 public:
AVBufferQueueProducerProxyImpl(const sptr<IRemoteObject> & object)44 explicit AVBufferQueueProducerProxyImpl(const sptr<IRemoteObject>& object)
45 : AVBufferQueueProducerProxy(object) { }
46 ~AVBufferQueueProducerProxyImpl() override = default;
47 AVBufferQueueProducerProxyImpl(const AVBufferQueueProducerProxyImpl&) = delete;
48 AVBufferQueueProducerProxyImpl operator=(const AVBufferQueueProducerProxyImpl&) = delete;
49
50 uint32_t GetQueueSize() override;
51 Status SetQueueSize(uint32_t size) override;
52
53 Status RequestBuffer(std::shared_ptr<AVBuffer>& outBuffer,
54 const AVBufferConfig& config, int32_t timeoutMs) override;
55 Status PushBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available) override;
56 Status ReturnBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available) override;
57
58 Status AttachBuffer(std::shared_ptr<AVBuffer>& inBuffer, bool isFilled) override;
59 Status DetachBuffer(const std::shared_ptr<AVBuffer>& outBuffer) override;
60
61 Status SetBufferFilledListener(sptr<IBrokerListener>& listener) override;
62 Status RemoveBufferFilledListener(sptr<IBrokerListener>& listener) override;
63 Status SetBufferAvailableListener(sptr<IProducerListener>& listener) override;
64 Status Clear() override;
65 Status ClearBufferIf(std::function<bool(const std::shared_ptr<AVBuffer> &)> pred) override;
66 private:
67 static inline BrokerDelegator<AVBufferQueueProducerProxyImpl> delegator_;
68 };
69
Create(const sptr<IRemoteObject> & object)70 std::shared_ptr<AVBufferQueueProducerProxy> AVBufferQueueProducerProxy::Create(const sptr<IRemoteObject>& object)
71 {
72 FALSE_RETURN_V(object != nullptr, nullptr);
73 return std::make_shared<AVBufferQueueProducerProxyImpl>(object);
74 }
75
AVBufferQueueProducerProxy(const sptr<IRemoteObject> & object)76 AVBufferQueueProducerProxy::AVBufferQueueProducerProxy(const sptr<IRemoteObject>& object)
77 : IRemoteProxy<AVBufferQueueProducer>(object) { }
78
GetQueueSize()79 uint32_t AVBufferQueueProducerProxyImpl::GetQueueSize()
80 {
81 MessageParcel arguments;
82 MessageParcel reply;
83 MessageOption option;
84 FALSE_RETURN_V(arguments.WriteInterfaceToken(GetDescriptor()), 0);
85 NZERO_RETURN_V(Remote()->SendRequest(PRODUCER_GET_QUEUE_SIZE, arguments, reply, option), 0);
86
87 return reply.ReadUint32();
88 }
89
SetQueueSize(uint32_t size)90 Status AVBufferQueueProducerProxyImpl::SetQueueSize(uint32_t size)
91 {
92 ABQ_IPC_DEFINE_VARIABLES;
93
94 arguments.WriteUint32(size);
95
96 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_QUEUE_SIZE);
97
98 return Status::OK;
99 }
100
RequestBuffer(std::shared_ptr<AVBuffer> & outBuffer,const AVBufferConfig & config,int32_t timeoutMs)101 Status AVBufferQueueProducerProxyImpl::RequestBuffer(std::shared_ptr<AVBuffer>& outBuffer,
102 const AVBufferConfig& config, int32_t timeoutMs)
103 {
104 ABQ_IPC_DEFINE_VARIABLES;
105
106 MarshallingConfig(arguments, config);
107
108 ABQ_IPC_SEND_REQUEST(PRODUCER_REQUEST_BUFFER);
109
110 outBuffer = AVBuffer::CreateAVBuffer();
111 FALSE_RETURN_V(outBuffer != nullptr, Status::ERROR_CREATE_BUFFER);
112 outBuffer->ReadFromMessageParcel(reply);
113
114 return Status::OK;
115 }
116
PushBuffer(const std::shared_ptr<AVBuffer> & inBuffer,bool available)117 Status AVBufferQueueProducerProxyImpl::PushBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available)
118 {
119 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
120
121 ABQ_IPC_DEFINE_VARIABLES;
122
123 arguments.WriteUint64(inBuffer->GetUniqueId());
124 arguments.WriteBool(available);
125
126 ABQ_IPC_SEND_REQUEST(PRODUCER_PUSH_BUFFER);
127
128 return Status::OK;
129 }
130
ReturnBuffer(const std::shared_ptr<AVBuffer> & inBuffer,bool available)131 Status AVBufferQueueProducerProxyImpl::ReturnBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available)
132 {
133 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
134
135 ABQ_IPC_DEFINE_VARIABLES;
136
137 arguments.WriteUint64(inBuffer->GetUniqueId());
138 arguments.WriteBool(available);
139
140 ABQ_IPC_SEND_REQUEST(PRODUCER_RETURN_BUFFER);
141
142 return Status::OK;
143 }
144
AttachBuffer(std::shared_ptr<AVBuffer> & inBuffer,bool isFilled)145 Status AVBufferQueueProducerProxyImpl::AttachBuffer(std::shared_ptr<AVBuffer>& inBuffer, bool isFilled)
146 {
147 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
148
149 ABQ_IPC_DEFINE_VARIABLES;
150
151 inBuffer->WriteToMessageParcel(arguments);
152 arguments.WriteBool(isFilled);
153
154 ABQ_IPC_SEND_REQUEST(PRODUCER_ATTACH_BUFFER);
155
156 return Status::OK;
157 }
158
DetachBuffer(const std::shared_ptr<AVBuffer> & outBuffer)159 Status AVBufferQueueProducerProxyImpl::DetachBuffer(const std::shared_ptr<AVBuffer>& outBuffer)
160 {
161 FALSE_RETURN_V(outBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
162
163 ABQ_IPC_DEFINE_VARIABLES;
164
165 arguments.WriteUint64(outBuffer->GetUniqueId());
166
167 ABQ_IPC_SEND_REQUEST(PRODUCER_DETACH_BUFFER);
168
169 return Status::OK;
170 }
171
SetBufferFilledListener(sptr<IBrokerListener> & listener)172 Status AVBufferQueueProducerProxyImpl::SetBufferFilledListener(sptr<IBrokerListener>& listener)
173 {
174 ABQ_IPC_DEFINE_VARIABLES;
175
176 arguments.WriteRemoteObject(listener->AsObject());
177
178 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_FILLED_LISTENER);
179
180 return Status::OK;
181 }
182
RemoveBufferFilledListener(sptr<IBrokerListener> & listener)183 Status AVBufferQueueProducerProxyImpl::RemoveBufferFilledListener(sptr<IBrokerListener>& listener)
184 {
185 ABQ_IPC_DEFINE_VARIABLES;
186
187 arguments.WriteRemoteObject(listener->AsObject());
188
189 ABQ_IPC_SEND_REQUEST(PRODUCER_REMOVE_FILLED_LISTENER);
190
191 return Status::OK;
192 }
193
SetBufferAvailableListener(sptr<IProducerListener> & listener)194 Status AVBufferQueueProducerProxyImpl::SetBufferAvailableListener(sptr<IProducerListener>& listener)
195 {
196 ABQ_IPC_DEFINE_VARIABLES;
197
198 arguments.WriteRemoteObject(listener->AsObject());
199
200 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_AVAILABLE_LISTENER);
201
202 return Status::OK;
203 }
204
Clear()205 Status AVBufferQueueProducerProxyImpl::Clear()
206 {
207 return Status::OK;
208 }
209
ClearBufferIf(std::function<bool (const std::shared_ptr<AVBuffer> &)> pred)210 Status AVBufferQueueProducerProxyImpl::ClearBufferIf(std::function<bool(const std::shared_ptr<AVBuffer> &)> pred)
211 {
212 return Status::OK;
213 }
214 } // namespace Media
215 } // namespace OHOS