• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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