2 * Copyright (c) 2022 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "MediaTransporterCallback.h"
20 #include "MediaTransporterLog.h"
22 using namespace tizen_media_transporter;
24 InvokablePtr CallbackFactory::createTrackAddedCallback(void* handle, mtprTrackAddedCallback cb, void* userdata)
26 return InvokablePtr(new TrackAddedCallback(handle, cb, userdata));
29 InvokablePtr CallbackFactory::createNoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback cb, void* userdata)
31 return InvokablePtr(new NoMoreTrackCallback(handle, cb, userdata));
34 InvokablePtr CallbackFactory::createPacketCallback(void* handle, mtprMediaType type, mtprPacketCallback cb, void* userdata)
36 return InvokablePtr(new PacketCallback(handle, type, cb, userdata));
39 InvokablePtr CallbackFactory::createErrorCallback(void* handle, mtprErrorCallback cb, void* userdata)
41 return InvokablePtr(new ErrorCallback(handle, cb, userdata));
44 InvokablePtr CallbackFactory::createPacketSourceBufferStateCallback(void* handle, mtprPacketSourceBufferStateCallback cb, void* userdata)
46 return InvokablePtr(new PacketSourceBufferStateCallback(handle, cb, userdata));
49 InvokablePtr CallbackFactory::createConnectionStatsCallback(void* handle, mtprConnectionStatsCallback cb, void* userdata)
51 return InvokablePtr(new ConnectionStatsCallback(handle, cb, userdata));
54 TrackAddedCallback::TrackAddedCallback(void* handle, mtprTrackAddedCallback cb, void* userdata)
55 : AbstractCallback(handle, userdata), _callback(cb)
57 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
58 cb, handle, userdata);
61 void TrackAddedCallback::invoke(VariantData data1, VariantData data2)
63 auto mediaType = std::get<mtprMediaType>(data1);
64 auto trackId = std::get<unsigned int>(data2);
66 LOG_DEBUG(">>> callback[%p], mediaType[%d], trackId[%u], handle[%p], user_data[%p]",
67 _callback, mediaType, trackId, _handle, _userdata);
69 _callback(_handle, mediaType, trackId, _userdata);
72 NoMoreTrackCallback::NoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback cb, void* userdata)
73 : AbstractCallback(handle, userdata), _callback(cb)
75 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
76 cb, handle, userdata);
79 void NoMoreTrackCallback::invoke()
81 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p]",
82 _callback, _handle, _userdata);
84 _callback(_handle, _userdata);
87 PacketCallback::PacketCallback(void* handle, mtprMediaType type, mtprPacketCallback cb, void* userdata)
88 : AbstractCallback(handle, userdata), _type(type), _callback(cb)
90 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
91 cb, handle, userdata);
94 void PacketCallback::invoke(VariantData data1, VariantData data2)
96 auto trackId = std::get<unsigned int>(data1);
97 auto packet = std::get<media_packet_h>(data2);
99 LOG_VERBOSE(">>> callback[%p], handle[%p], type[%d], id[%d], packet[%p], user_data[%p]",
100 _callback, _handle, _type, trackId, packet, _userdata);
102 _callback(_handle, _type, trackId, packet, _userdata);
105 ErrorCallback::ErrorCallback(void* handle, mtprErrorCallback cb, void* userdata)
106 : AbstractCallback(handle, userdata), _callback(cb)
108 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
109 cb, handle, userdata);
112 void ErrorCallback::invoke(VariantData data)
114 auto error = std::get<mtprError>(data);
116 LOG_DEBUG(">>> callback[%p], handle[%p], error[%d], user_data[%p]",
117 _callback, _handle, error, _userdata);
119 _callback(_handle, error, _userdata);
122 PacketSourceBufferStateCallback::PacketSourceBufferStateCallback(void* handle, mtprPacketSourceBufferStateCallback cb, void* userdata)
123 : AbstractCallback(handle, userdata), _callback(cb)
125 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
126 cb, handle, userdata);
129 void PacketSourceBufferStateCallback::invoke(VariantData data1, VariantData data2)
131 auto sourceId = std::get<unsigned int>(data1);
132 auto state = std::get<mtprPacketSourceBufferState>(data2);
134 LOG_DEBUG(">>> callback[%p], handle[%p], sourcdId[%d], state[%d], user_data[%p]",
135 _callback, _handle, sourceId, state, _userdata);
137 _callback(sourceId, state, _userdata);
140 ConnectionStatsCallback::ConnectionStatsCallback(void* handle, mtprConnectionStatsCallback cb, void* userdata)
141 : AbstractCallback(handle, userdata), _callback(cb)
143 LOG_DEBUG(">>> callback[%p], handle[%p], user_data[%p] registered",
144 cb, handle, userdata);
147 bool ConnectionStatsCallback::invoke(VariantData data1, VariantData data2, VariantData data3)
149 auto fieldName = std::get<std::string>(data1);
150 auto val = std::get<const GValue*>(data2);
151 auto propList = std::get<std::map<std::string, mtprConnectionStatsProp>>(data3);
152 g_autofree gchar* addr = NULL;
154 if (propList.find(fieldName) == propList.end()) {
155 LOG_DEBUG("not supported [%s]", fieldName.c_str());
159 mtprConnectionStatsProp prop = propList.at(fieldName);
161 switch (G_VALUE_TYPE(val)) {
162 case G_TYPE_BOOLEAN: {
163 gboolean result = g_value_get_boolean(val);
164 LOG_DEBUG("field[%s] GType[%s] value[%u]",
165 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
167 mtprConnectionStatsPropInfo propInfo {
168 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_BOOL, .v_bool = static_cast<bool>(result)
171 return _callback(_handle, &propInfo, _userdata);
174 gint result = g_value_get_int(val);
175 LOG_DEBUG("field[%s] GType[%s] value[%d]",
176 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
178 mtprConnectionStatsPropInfo propInfo {
179 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_INT, .v_int = result
182 return _callback(_handle, &propInfo, _userdata);
185 guint result = g_value_get_uint(val);
186 LOG_DEBUG("field[%s] GType[%s] value[%u]",
187 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
189 mtprConnectionStatsPropInfo propInfo {
190 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_UINT, .v_uint = result
193 return _callback(_handle, &propInfo, _userdata);
196 gint64 result = g_value_get_int64(val);
197 LOG_DEBUG("field[%s] GType[%s] value[%" G_GINT64_FORMAT "]",
198 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
200 mtprConnectionStatsPropInfo propInfo {
201 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_INT64, .v_int64 = result
204 return _callback(_handle, &propInfo, _userdata);
206 case G_TYPE_UINT64: {
207 guint64 result = g_value_get_uint64(val);
208 LOG_DEBUG("field[%s] GType[%s] value[%" G_GUINT64_FORMAT "]",
209 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
211 mtprConnectionStatsPropInfo propInfo {
212 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_UINT64, .v_uint64 = result
215 return _callback(_handle, &propInfo, _userdata);
218 gfloat result = g_value_get_float(val);
219 LOG_DEBUG("field[%s] GType[%s] value[%f]",
220 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
222 mtprConnectionStatsPropInfo propInfo {
223 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_FLOAT, .v_float = result
226 return _callback(_handle, &propInfo, _userdata);
228 case G_TYPE_DOUBLE: {
229 gdouble result = g_value_get_double(val);
230 LOG_DEBUG("field[%s] GType[%s] value[%f]",
231 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
233 mtprConnectionStatsPropInfo propInfo {
234 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_DOUBLE, .v_double = result
237 return _callback(_handle, &propInfo, _userdata);
239 case G_TYPE_STRING: {
240 const gchar *result = g_value_get_string(val);
241 LOG_DEBUG("field[%s] GType[%s] value[%s]",
242 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), result);
244 mtprConnectionStatsPropInfo propInfo {
245 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_STRING, .v_string = result
248 return _callback(_handle, &propInfo, _userdata);
251 if (G_VALUE_TYPE(val) == G_TYPE_SOCKET_ADDRESS) { /* non-constexpr : g_socket_address_get_type() */
252 addr = g_inet_address_to_string
253 (g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(g_value_get_object(val))));
254 LOG_DEBUG("field[%s] GType[%s] value[%s]",
255 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)), addr);
257 mtprConnectionStatsPropInfo propInfo {
258 fieldName.c_str(), prop, MTPR_CONNECTION_STATS_PROP_TYPE_STRING, .v_string = addr
261 return _callback(_handle, &propInfo, _userdata);
264 LOG_ERROR("invalid type, field[%s] GType[%s]",
265 fieldName.c_str(), g_type_name(G_VALUE_TYPE(val)));