1 /*
2 * Copyright (c) 2021-2021 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 private:
66 static inline BrokerDelegator<AVBufferQueueProducerProxyImpl> delegator_;
67 };
68
Create(const sptr<IRemoteObject> & object)69 std::shared_ptr<AVBufferQueueProducerProxy> AVBufferQueueProducerProxy::Create(const sptr<IRemoteObject>& object)
70 {
71 FALSE_RETURN_V(object != nullptr, nullptr);
72 return std::make_shared<AVBufferQueueProducerProxyImpl>(object);
73 }
74
AVBufferQueueProducerProxy(const sptr<IRemoteObject> & object)75 AVBufferQueueProducerProxy::AVBufferQueueProducerProxy(const sptr<IRemoteObject>& object)
76 : IRemoteProxy<AVBufferQueueProducer>(object) { }
77
GetQueueSize()78 uint32_t AVBufferQueueProducerProxyImpl::GetQueueSize()
79 {
80 MessageParcel arguments;
81 MessageParcel reply;
82 MessageOption option;
83 FALSE_RETURN_V(arguments.WriteInterfaceToken(GetDescriptor()), 0);
84 NZERO_RETURN_V(Remote()->SendRequest(PRODUCER_GET_QUEUE_SIZE, arguments, reply, option), 0);
85
86 return reply.ReadUint32();
87 }
88
SetQueueSize(uint32_t size)89 Status AVBufferQueueProducerProxyImpl::SetQueueSize(uint32_t size)
90 {
91 ABQ_IPC_DEFINE_VARIABLES;
92
93 arguments.WriteUint32(size);
94
95 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_QUEUE_SIZE);
96
97 return Status::OK;
98 }
99
RequestBuffer(std::shared_ptr<AVBuffer> & outBuffer,const AVBufferConfig & config,int32_t timeoutMs)100 Status AVBufferQueueProducerProxyImpl::RequestBuffer(std::shared_ptr<AVBuffer>& outBuffer,
101 const AVBufferConfig& config, int32_t timeoutMs)
102 {
103 ABQ_IPC_DEFINE_VARIABLES;
104
105 MarshallingConfig(arguments, config);
106
107 ABQ_IPC_SEND_REQUEST(PRODUCER_REQUEST_BUFFER);
108
109 outBuffer = AVBuffer::CreateAVBuffer();
110 FALSE_RETURN_V(outBuffer != nullptr, Status::ERROR_CREATE_BUFFER);
111 outBuffer->ReadFromMessageParcel(reply);
112
113 return Status::OK;
114 }
115
PushBuffer(const std::shared_ptr<AVBuffer> & inBuffer,bool available)116 Status AVBufferQueueProducerProxyImpl::PushBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available)
117 {
118 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
119
120 ABQ_IPC_DEFINE_VARIABLES;
121
122 arguments.WriteUint64(inBuffer->GetUniqueId());
123 arguments.WriteBool(available);
124
125 ABQ_IPC_SEND_REQUEST(PRODUCER_PUSH_BUFFER);
126
127 return Status::OK;
128 }
129
ReturnBuffer(const std::shared_ptr<AVBuffer> & inBuffer,bool available)130 Status AVBufferQueueProducerProxyImpl::ReturnBuffer(const std::shared_ptr<AVBuffer>& inBuffer, bool available)
131 {
132 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
133
134 ABQ_IPC_DEFINE_VARIABLES;
135
136 arguments.WriteUint64(inBuffer->GetUniqueId());
137 arguments.WriteBool(available);
138
139 ABQ_IPC_SEND_REQUEST(PRODUCER_RETURN_BUFFER);
140
141 return Status::OK;
142 }
143
AttachBuffer(std::shared_ptr<AVBuffer> & inBuffer,bool isFilled)144 Status AVBufferQueueProducerProxyImpl::AttachBuffer(std::shared_ptr<AVBuffer>& inBuffer, bool isFilled)
145 {
146 FALSE_RETURN_V(inBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
147
148 ABQ_IPC_DEFINE_VARIABLES;
149
150 inBuffer->WriteToMessageParcel(arguments);
151 arguments.WriteBool(isFilled);
152
153 ABQ_IPC_SEND_REQUEST(PRODUCER_ATTACH_BUFFER);
154
155 return Status::OK;
156 }
157
DetachBuffer(const std::shared_ptr<AVBuffer> & outBuffer)158 Status AVBufferQueueProducerProxyImpl::DetachBuffer(const std::shared_ptr<AVBuffer>& outBuffer)
159 {
160 FALSE_RETURN_V(outBuffer != nullptr, Status::ERROR_NULL_POINT_BUFFER);
161
162 ABQ_IPC_DEFINE_VARIABLES;
163
164 arguments.WriteUint64(outBuffer->GetUniqueId());
165
166 ABQ_IPC_SEND_REQUEST(PRODUCER_DETACH_BUFFER);
167
168 return Status::OK;
169 }
170
SetBufferFilledListener(sptr<IBrokerListener> & listener)171 Status AVBufferQueueProducerProxyImpl::SetBufferFilledListener(sptr<IBrokerListener>& listener)
172 {
173 ABQ_IPC_DEFINE_VARIABLES;
174
175 arguments.WriteRemoteObject(listener->AsObject());
176
177 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_FILLED_LISTENER);
178
179 return Status::OK;
180 }
181
RemoveBufferFilledListener(sptr<IBrokerListener> & listener)182 Status AVBufferQueueProducerProxyImpl::RemoveBufferFilledListener(sptr<IBrokerListener>& listener)
183 {
184 ABQ_IPC_DEFINE_VARIABLES;
185
186 arguments.WriteRemoteObject(listener->AsObject());
187
188 ABQ_IPC_SEND_REQUEST(PRODUCER_REMOVE_FILLED_LISTENER);
189
190 return Status::OK;
191 }
192
SetBufferAvailableListener(sptr<IProducerListener> & listener)193 Status AVBufferQueueProducerProxyImpl::SetBufferAvailableListener(sptr<IProducerListener>& listener)
194 {
195 ABQ_IPC_DEFINE_VARIABLES;
196
197 arguments.WriteRemoteObject(listener->AsObject());
198
199 ABQ_IPC_SEND_REQUEST(PRODUCER_SET_AVAILABLE_LISTENER);
200
201 return Status::OK;
202 }
203
Clear()204 Status AVBufferQueueProducerProxyImpl::Clear()
205 {
206 return Status::OK;
207 }
208
209 } // namespace Media
210 } // namespace OHOS