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