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