MediaSourceBinInfo generate() override;
void setMediaFormat(media_format_h format);
void pushMediaPacket(media_packet_h packet);
- void setBufferStateChangedCallback(void* handle, mtprPacketSourceBufferStateCallback callback, void* userData);
+ void setBufferStateChangedCallback(InvokablePtr callback);
void unsetBufferStateChangedCallback();
protected:
static void _needDataCallback(GstElement* object, guint size, gpointer data);
static void _enoughDataCallback(GstElement* object, gpointer data);
- std::unique_ptr<IInvokable> _bufferStateCallback;
+ InvokablePtr _bufferStateCallback;
private:
void _createMediaPacketSource();
mtprState state();
- void setErrorCallback(void* handle, mtprErrorCallback callback, void* userData);
+ void setErrorCallback(InvokablePtr callback);
void unsetErrorCallback();
virtual void setSenderAddress(std::string address);
virtual void setConnection(std::string name, std::string value);
virtual std::string getConnection(std::string name);
- virtual void foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData);
+ virtual void foreachConnectionStats(InvokablePtr callback);
void setResourceManager(std::shared_ptr<MediaTransporterResource> resourceManager);
void changed() override; // resource interrupted
protected:
mtprGstreamer _gst {};
- std::unique_ptr<IInvokable> _errorCallback;
- std::unique_ptr<IInvokable> _connectionStatsCallback;
+ InvokablePtr _errorCallback;
std::shared_ptr<MediaTransporterResource> _resourceManager;
private:
void* _userdata;
};
+using InvokablePtr = std::unique_ptr<IInvokable>;
+
+struct CallbackFactory
+{
+ static InvokablePtr createTrackAddedCallback(void* handle, mtprTrackAddedCallback cb, void* userdata);
+ static InvokablePtr createNoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback cb, void* userdata);
+ static InvokablePtr createPacketCallback(void* handle, mtprMediaType type, mtprPacketCallback cb, void* userdata);
+ static InvokablePtr createErrorCallback(void* handle, mtprErrorCallback cb, void* userdata);
+ static InvokablePtr createPacketSourceBufferStateCallback(void* handle, mtprPacketSourceBufferStateCallback cb, void* userdata);
+ static InvokablePtr createConnectionStatsCallback(void* handle, mtprConnectionStatsCallback cb, void* userdata);
+};
+
class TrackAddedCallback : public AbstractCallback
{
public:
MediaTransporterReceiver() = default;
virtual ~MediaTransporterReceiver() = default;
- void setTrackAddedCallback(void* handle, mtprTrackAddedCallback callback, void* userData);
+ void setTrackAddedCallback(InvokablePtr callback);
void unsetTrackAddedCallback();
- void setNoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback callback, void* userData);
+ void setNoMoreTrackCallback(InvokablePtr callback);
void unsetNoMoreTrackCallback();
- void setVideoPacketCallback(void* handle, mtprPacketCallback callback, void* userData);
+ void setVideoPacketCallback(InvokablePtr callback);
void unsetVideoPacketCallback();
- void setAudioPacketCallback(void* handle, mtprPacketCallback callback, void* userData);
+ void setAudioPacketCallback(InvokablePtr callback);
void unsetAudioPacketCallback();
void setDisplay(std::shared_ptr<MediaTransporterDisplay> display);
static bool _isSupportedMediaType(std::string mediaType);
static bool _isAudioMediaType(std::string mediaType);
- std::unique_ptr<IInvokable> _trackAddedCallback;
- std::unique_ptr<IInvokable> _noMoreTrackCallback;
+ InvokablePtr _trackAddedCallback;
+ InvokablePtr _noMoreTrackCallback;
struct mtprCallback {
- std::unique_ptr<IInvokable> _callback;
+ InvokablePtr _callback;
media_format_h mediaFormat { nullptr }; // FIXME : this should be A/V separated!!!
};
mtprCallback _videoCallback {};
std::string getSenderAddress() override { return _senderAddress; }
mtprConnectionType type() override { return MTPR_CONNECTION_TYPE_SRT_RECEIVER; }
- void foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData) override;
+ void foreachConnectionStats(InvokablePtr callback) override;
private:
static void _demuxPadAddedCallback(GstElement* demux, GstPad* new_pad, gpointer userData);
mtprConnectionType type() override { return MTPR_CONNECTION_TYPE_SRT_SENDER; }
- void foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData) override;
+ void foreachConnectionStats(InvokablePtr callback) override;
private:
void startStatsMonitoring();
Name: capi-media-transporter
Summary: A Media Transporter library in Tizen Native API
-Version: 1.0.22
+Version: 1.0.23
Release: 0
Group: Multimedia/API
License: Apache-2.0
}
-void MediaSourceBinMediaPacket::setBufferStateChangedCallback(void* handle, mtprPacketSourceBufferStateCallback callback, void* userData)
+void MediaSourceBinMediaPacket::setBufferStateChangedCallback(InvokablePtr callback)
{
- _bufferStateCallback = std::unique_ptr<IInvokable>(new PacketSourceBufferStateCallback(handle, callback, userData));
+ _bufferStateCallback = std::move(callback);
}
void MediaSourceBinMediaPacket::unsetBufferStateChangedCallback()
MediaSourceBinMediaPacket* mediaPacketSourceBIn = dynamic_cast<MediaSourceBinMediaPacket*>(sender->getMediaSource(source_id));
RET_VAL_IF(!mediaPacketSourceBIn, MTPR_ERROR_INVALID_PARAMETER, "Invalid source id");
- mediaPacketSourceBIn->setBufferStateChangedCallback(mtpr, callback, user_data);
+ mediaPacketSourceBIn->setBufferStateChangedCallback(CallbackFactory::createPacketSourceBufferStateCallback(handle, callback, user_data));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set media packet source state changed callback!!! : %s", e.what());
auto handle = static_cast<media_transporter_s*>(mtpr);
assert(handle->base);
- handle->base->setErrorCallback(mtpr, callback, user_data);
+ handle->base->setErrorCallback(CallbackFactory::createErrorCallback(mtpr, callback, user_data));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set error callback!!! : %s", e.what());
return e.error();
RET_VAL_IF(!receiver, MTPR_ERROR_INVALID_OPERATION, "only receiver support this api!!!");
try {
- receiver->setTrackAddedCallback(mtpr, callback, user_data);
+ receiver->setTrackAddedCallback(CallbackFactory::createTrackAddedCallback(mtpr, callback, user_data));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set track added callback!!! : %s", e.what());
return e.error();
RET_VAL_IF(!receiver, MTPR_ERROR_INVALID_OPERATION, "only receiver support this api!!!");
try {
- receiver->setNoMoreTrackCallback(mtpr, callback, user_data);
+ receiver->setNoMoreTrackCallback(CallbackFactory::createNoMoreTrackCallback(mtpr, callback, user_data));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set no more track callback!!! : %s", e.what());
return e.error();
RET_VAL_IF(!receiver, MTPR_ERROR_INVALID_OPERATION, "only receiver support this api!!!");
try {
- receiver->setAudioPacketCallback(mtpr, callback, user_data);//__internal_audio_packet_cb, static_cast<void*>(handle));
+ receiver->setAudioPacketCallback(CallbackFactory::createPacketCallback(mtpr, MTPR_MEDIA_TYPE_AUDIO, callback, user_data));//__internal_audio_packet_cb, static_cast<void*>(handle));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set audio packet callback!!! : %s", e.what());
return e.error();
RET_VAL_IF(!receiver, MTPR_ERROR_INVALID_OPERATION, "only receiver support this api!!!");
try {
- receiver->setVideoPacketCallback(mtpr, callback, user_data);
+ receiver->setVideoPacketCallback(CallbackFactory::createPacketCallback(mtpr, MTPR_MEDIA_TYPE_VIDEO, callback, user_data));
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to set video packet callback!!! : %s", e.what());
return e.error();
if (handle->base->state() == MTPR_STATE_IDLE)
throw MediaTransporterException(MTPR_ERROR_INVALID_STATE, "state must not be IDLE");
- handle->base->foreachConnectionStats(mtpr, callback, user_data);
+ handle->base->foreachConnectionStats(CallbackFactory::createConnectionStatsCallback(handle, callback, user_data));
+
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to foreach connection statistics!!! : %s", e.what());
return e.error();
}
return MTPR_ERROR_NONE;
-}
\ No newline at end of file
+}
throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "not supported");
}
-void MediaTransporterBase::setErrorCallback(void* handle, mtprErrorCallback callback, void* userData)
+void MediaTransporterBase::setErrorCallback(InvokablePtr callback)
{
- _errorCallback = std::unique_ptr<IInvokable>(new ErrorCallback(handle, callback, userData));
+ _errorCallback = std::move(callback);
}
void MediaTransporterBase::unsetErrorCallback()
_errorCallback = nullptr;
}
-void MediaTransporterBase::foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData)
+void MediaTransporterBase::foreachConnectionStats(InvokablePtr callback)
{
throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "not supported");
}
using namespace tizen_media_transporter;
+InvokablePtr CallbackFactory::createTrackAddedCallback(void* handle, mtprTrackAddedCallback cb, void* userdata)
+{
+ return InvokablePtr(new TrackAddedCallback(handle, cb, userdata));
+}
+
+InvokablePtr CallbackFactory::createNoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback cb, void* userdata)
+{
+ return InvokablePtr(new NoMoreTrackCallback(handle, cb, userdata));
+}
+
+InvokablePtr CallbackFactory::createPacketCallback(void* handle, mtprMediaType type, mtprPacketCallback cb, void* userdata)
+{
+ return InvokablePtr(new PacketCallback(handle, type, cb, userdata));
+}
+
+InvokablePtr CallbackFactory::createErrorCallback(void* handle, mtprErrorCallback cb, void* userdata)
+{
+ return InvokablePtr(new ErrorCallback(handle, cb, userdata));
+}
+
+InvokablePtr CallbackFactory::createPacketSourceBufferStateCallback(void* handle, mtprPacketSourceBufferStateCallback cb, void* userdata)
+{
+ return InvokablePtr(new PacketSourceBufferStateCallback(handle, cb, userdata));
+}
+
+InvokablePtr CallbackFactory::createConnectionStatsCallback(void* handle, mtprConnectionStatsCallback cb, void* userdata)
+{
+ return InvokablePtr(new ConnectionStatsCallback(handle, cb, userdata));
+}
+
TrackAddedCallback::TrackAddedCallback(void* handle, mtprTrackAddedCallback cb, void* userdata)
: AbstractCallback(handle, userdata), _callback(cb)
{
using namespace tizen_media_transporter;
-void MediaTransporterReceiver::setTrackAddedCallback(void* handle, mtprTrackAddedCallback callback, void* userData)
+void MediaTransporterReceiver::setTrackAddedCallback(InvokablePtr callback)
{
- _trackAddedCallback = std::unique_ptr<IInvokable>(new TrackAddedCallback(handle, callback, userData));
+ _trackAddedCallback = std::move(callback);
}
void MediaTransporterReceiver::unsetTrackAddedCallback()
_trackAddedCallback = nullptr;
}
-void MediaTransporterReceiver::setNoMoreTrackCallback(void* handle, mtprNoMoreTrackCallback callback, void* userData)
+void MediaTransporterReceiver::setNoMoreTrackCallback(InvokablePtr callback)
{
- _noMoreTrackCallback = std::unique_ptr<IInvokable>(new NoMoreTrackCallback(handle, callback, userData));
+ _noMoreTrackCallback = std::move(callback);
}
void MediaTransporterReceiver::unsetNoMoreTrackCallback()
_noMoreTrackCallback = nullptr;
}
-void MediaTransporterReceiver::setVideoPacketCallback(void* handle, mtprPacketCallback callback, void* userData)
+void MediaTransporterReceiver::setVideoPacketCallback(InvokablePtr callback)
{
- _videoCallback._callback = std::unique_ptr<IInvokable>(new PacketCallback(handle, MTPR_MEDIA_TYPE_VIDEO, callback, userData));
+ _videoCallback._callback = std::move(callback);
}
-void MediaTransporterReceiver::setAudioPacketCallback(void* handle, mtprPacketCallback callback, void* userData)
+void MediaTransporterReceiver::setAudioPacketCallback(InvokablePtr callback)
{
- _audioCallback._callback = std::unique_ptr<IInvokable>(new PacketCallback(handle, MTPR_MEDIA_TYPE_AUDIO, callback, userData));
+ _audioCallback._callback = std::move(callback);
}
void MediaTransporterReceiver::unsetVideoPacketCallback()
gboolean MediaTransporterReceiverSrt::_statsForeachCb(GQuark fieldId, const GValue* val, gpointer userData)
{
- MediaTransporterReceiverSrt* srt = static_cast<MediaTransporterReceiverSrt*>(userData);
+ auto callback = static_cast<IInvokable*>(userData);
std::string fieldName = g_quark_to_string(fieldId);
- if (!srt->_connectionStatsCallback ||
- !srt->_connectionStatsCallback->invoke(fieldName, val, __receiverProp)) {
+ if (!callback ||
+ !callback->invoke(fieldName, val, __receiverProp)) {
LOG_WARNING("stop calling stats callback");
return FALSE;
}
return TRUE;
}
-void MediaTransporterReceiverSrt::foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData)
+void MediaTransporterReceiverSrt::foreachConnectionStats(InvokablePtr callback)
{
- GstStructure* structure = NULL;
-
- _connectionStatsCallback = std::unique_ptr<IInvokable>(new ConnectionStatsCallback(handle, callback, userData));
+ GstStructure* structure = nullptr;
g_object_get(_srtSrc, "stats", &structure, NULL);
SECURE_LOG_DEBUG("RECEIVER >>> stats : %s", str);
g_free(str);
- gst_structure_foreach(structure, _statsForeachCb, (gpointer)this);
-
- _connectionStatsCallback = nullptr;
+ gst_structure_foreach(structure, _statsForeachCb, callback.get());
}
\ No newline at end of file
gboolean MediaTransporterSenderSrt::_statsForeachCb(GQuark fieldId, const GValue* val, gpointer userData)
{
- MediaTransporterSenderSrt* srt = static_cast<MediaTransporterSenderSrt*>(userData);
+ auto callback = static_cast<IInvokable*>(userData);
std::string fieldName = g_quark_to_string(fieldId);
- if (!srt->_connectionStatsCallback ||
- !srt->_connectionStatsCallback->invoke(fieldName, val, __senderProp)) {
+ if (!callback ||
+ !callback->invoke(fieldName, val, __senderProp)) {
LOG_WARNING("stop calling stats callback");
- srt->_connectionStatsCallback = NULL;
return FALSE;
}
return TRUE;
}
-void MediaTransporterSenderSrt::foreachConnectionStats(void* handle, mtprConnectionStatsCallback callback, void* userData)
+void MediaTransporterSenderSrt::foreachConnectionStats(InvokablePtr callback)
{
const GstStructure* structure = NULL;
- _connectionStatsCallback = std::unique_ptr<IInvokable>(new ConnectionStatsCallback(handle, callback, userData));
-
g_object_get(_srtSink, "stats", &structure, NULL);
gchar* str = gst_structure_to_string(structure);
SECURE_LOG_DEBUG("SENDER >>> stats : %s", str);
g_free(str);
+ gboolean ret = FALSE;
+
if (gst_structure_has_field(structure, "callers")) {
GValueArray* callers = (GValueArray *)g_value_get_boxed(gst_structure_get_value(structure, "callers"));
const GstStructure* callerStats = (GstStructure *)g_value_get_boxed(&callers->values[i]);
LOG_DEBUG("SENDER >>> caller idx : %d", i);
- gst_structure_foreach(callerStats, _statsForeachCb, (gpointer)this);
+ ret = gst_structure_foreach(callerStats, _statsForeachCb, callback.get());
+ if (!ret)
+ break;
}
}
- if (_connectionStatsCallback && gst_structure_has_field(structure, "bytes-sent-total"))
- _connectionStatsCallback->invoke("bytes-sent-total",
+ if (ret && gst_structure_has_field(structure, "bytes-sent-total"))
+ callback->invoke("bytes-sent-total",
gst_structure_get_value(structure, "bytes-sent-total"), __senderProp);
- _connectionStatsCallback = nullptr;
}