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