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