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