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 "avbuffer_utils.h"
17 #include "avbuffer_queue_producer_impl.h"
18 #include "common/log.h"
19 
20 namespace {
21 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "AVBufferQueueProducerStub" };
22 }
23 
24 namespace OHOS {
25 namespace Media {
26 
AVBufferQueueProducerStub()27 AVBufferQueueProducerStub::AVBufferQueueProducerStub()
28 {
29     stubFuncMap_[PRODUCER_GET_QUEUE_SIZE] = &AVBufferQueueProducerStub::OnGetQueueSize;
30     stubFuncMap_[PRODUCER_SET_QUEUE_SIZE] = &AVBufferQueueProducerStub::OnSetQueueSize;
31     stubFuncMap_[PRODUCER_REQUEST_BUFFER] = &AVBufferQueueProducerStub::OnRequestBuffer;
32     stubFuncMap_[PRODUCER_PUSH_BUFFER] = &AVBufferQueueProducerStub::OnPushBuffer;
33     stubFuncMap_[PRODUCER_RETURN_BUFFER] = &AVBufferQueueProducerStub::OnReturnBuffer;
34     stubFuncMap_[PRODUCER_ATTACH_BUFFER] = &AVBufferQueueProducerStub::OnAttachBuffer;
35     stubFuncMap_[PRODUCER_DETACH_BUFFER] = &AVBufferQueueProducerStub::OnDetachBuffer;
36     stubFuncMap_[PRODUCER_SET_FILLED_LISTENER] = &AVBufferQueueProducerStub::OnSetBufferFilledListener;
37     stubFuncMap_[PRODUCER_REMOVE_FILLED_LISTENER] = &AVBufferQueueProducerStub::OnRemoveBufferFilledListener;
38     stubFuncMap_[PRODUCER_SET_AVAILABLE_LISTENER] = &AVBufferQueueProducerStub::OnSetBufferAvailableListener;
39 }
40 
OnRemoteRequest(uint32_t code,MessageParcel & arguments,MessageParcel & reply,MessageOption & option)41 int AVBufferQueueProducerStub::OnRemoteRequest(
42     uint32_t code, MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
43 {
44     auto it = stubFuncMap_.find(code);
45     FALSE_RETURN_V(it != stubFuncMap_.end(), IPC_STUB_INVALID_DATA_ERR);
46     FALSE_RETURN_V(it->second != nullptr, IPC_STUB_ERR);
47     FALSE_RETURN_V(GetDescriptor() == arguments.ReadInterfaceToken(), ERR_INVALID_STATE);
48 
49     return (this->*(it->second))(arguments, reply, option);
50 }
51 
OnGetQueueSize(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)52 int32_t AVBufferQueueProducerStub::OnGetQueueSize(
53     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
54 {
55     auto size = GetQueueSize();
56 
57     reply.WriteInt32(0);
58     reply.WriteUint32(size);
59 
60     return 0;
61 }
62 
OnSetQueueSize(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)63 int32_t AVBufferQueueProducerStub::OnSetQueueSize(
64     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
65 {
66     auto size = arguments.ReadUint32();
67     auto ret = SetQueueSize(size);
68 
69     reply.WriteInt32(static_cast<int32_t>(ret));
70 
71     return 0;
72 }
73 
OnRequestBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)74 int32_t AVBufferQueueProducerStub::OnRequestBuffer(
75     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
76 {
77     std::shared_ptr<AVBuffer> buffer = nullptr;
78     AVBufferConfig config;
79     UnmarshallingConfig(arguments, config);
80     auto timeoutMs = arguments.ReadInt32();
81 
82     auto ret = RequestBuffer(buffer, config, timeoutMs);
83 
84     reply.WriteInt32(static_cast<int32_t>(ret));
85     if (ret == Status::OK) {
86         buffer->WriteToMessageParcel(reply);
87     }
88 
89     return 0;
90 }
91 
OnPushBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)92 int32_t AVBufferQueueProducerStub::OnPushBuffer(
93     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
94 {
95     auto uniqueId = arguments.ReadUint64();
96     auto available = arguments.ReadBool();
97 
98     auto ret = PushBuffer(uniqueId, available);
99     reply.WriteInt32(static_cast<int32_t>(ret));
100 
101     return 0;
102 }
103 
OnReturnBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)104 int32_t AVBufferQueueProducerStub::OnReturnBuffer(
105     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
106 {
107     auto uniqueId = arguments.ReadUint64();
108     auto available = arguments.ReadBool();
109 
110     auto ret = ReturnBuffer(uniqueId, available);
111     reply.WriteInt32(static_cast<int32_t>(ret));
112 
113     return 0;
114 }
115 
OnAttachBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)116 int32_t AVBufferQueueProducerStub::OnAttachBuffer(
117     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
118 {
119     auto buffer = AVBuffer::CreateAVBuffer();
120     if (buffer == nullptr) {
121         reply.WriteInt32(static_cast<int32_t>(Status::ERROR_NO_MEMORY));
122         return 0;
123     }
124     buffer->ReadFromMessageParcel(arguments);
125     auto isFilled = arguments.ReadBool();
126 
127     auto ret = AttachBuffer(buffer, isFilled);
128     reply.WriteInt32(static_cast<int32_t>(ret));
129 
130     return 0;
131 }
132 
OnDetachBuffer(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)133 int32_t AVBufferQueueProducerStub::OnDetachBuffer(
134     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
135 {
136     auto uniqueId = arguments.ReadUint64();
137 
138     auto ret = DetachBuffer(uniqueId);
139     reply.WriteInt32(static_cast<int32_t>(ret));
140 
141     return 0;
142 }
143 
OnSetBufferFilledListener(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)144 int32_t AVBufferQueueProducerStub::OnSetBufferFilledListener(
145     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
146 {
147     auto listenerObject = arguments.ReadRemoteObject();
148     sptr<IBrokerListener> listener = iface_cast<IBrokerListener>(listenerObject);
149     FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");
150 
151     auto ret = SetBufferFilledListener(listener);
152     reply.WriteInt32(static_cast<int32_t>(ret));
153 
154     return 0;
155 }
156 
OnRemoveBufferFilledListener(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)157 int32_t AVBufferQueueProducerStub::OnRemoveBufferFilledListener(
158     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
159 {
160     auto listenerObject = arguments.ReadRemoteObject();
161     sptr<IBrokerListener> listener = iface_cast<IBrokerListener>(listenerObject);
162     FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");
163 
164     auto ret = RemoveBufferFilledListener(listener);
165     reply.WriteInt32(static_cast<int32_t>(ret));
166 
167     return 0;
168 }
169 
OnSetBufferAvailableListener(MessageParcel & arguments,MessageParcel & reply,MessageOption & option)170 int32_t AVBufferQueueProducerStub::OnSetBufferAvailableListener(
171     MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
172 {
173     auto listenerObject = arguments.ReadRemoteObject();
174     sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
175     FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");
176     auto ret = SetBufferAvailableListener(listener);
177     reply.WriteInt32(static_cast<int32_t>(ret));
178 
179     return 0;
180 }
181 
182 } // namespace Media
183 } // namespace OHOS
184