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