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