[1.0.29] Don't push the mediapacket to appsrc, if the pipeline is not ready 09/308409/1
authorGilbok Lee <gilbok.lee@samsung.com>
Thu, 14 Mar 2024 03:56:49 +0000 (12:56 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 25 Mar 2024 06:26:56 +0000 (15:26 +0900)
Change-Id: Ica750400b494d06a3e74fdca4f388b7bc563e81e

include/MediaTransporterSender.h
include/MediaTransporterSenderRtsp.h
packaging/capi-media-transporter.spec
src/MediaTransporter.cpp
src/MediaTransporterSenderRist.cpp
src/MediaTransporterSenderRtsp.cpp
src/MediaTransporterSenderSrt.cpp
src/MediaTransporterSenderToServerRtsp.cpp

index 9952858..dee2de7 100644 (file)
@@ -38,11 +38,13 @@ public:
        void removeMediaSource(int id);
 
        IMediaSourceBin* getMediaSource(unsigned int id);
+       bool getCanSendPacket() { return _canSendPacket; }
 
 protected:
        void linkMediaSourceToMuxer(GstElement* mux);
        std::map<unsigned int, std::unique_ptr<IMediaSourceBin>> _mediaSources;
        bool _asyncStart = false;
+       bool _canSendPacket = true;
 };
 
 } // namespace
index 1d44071..7a6493a 100644 (file)
@@ -48,7 +48,7 @@ private:
        void startRtspServer();
        void stopRtspServer();
 
-       static void _clientConnectedCb(GstRTSPServer* server, GstRTSPClient* client);
+       static void _clientConnectedCb(GstRTSPServer* server, GstRTSPClient* client, gpointer userData);
        static void _mediaConstructedCb(GstRTSPMediaFactory* factory, GstRTSPMedia* media, gpointer userData);
        static void _mediaConfigureCb(GstRTSPMediaFactory* factory, GstRTSPMedia* media, gpointer data);
        static void _mediaPreparedCb(GstRTSPMedia* media, gpointer data);
index d3a0adf..787ffeb 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-transporter
 Summary:    A Media Transporter library in Tizen Native API
-Version:    1.0.28
+Version:    1.0.29
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index cd1d86b..b9f8071 100644 (file)
@@ -611,6 +611,9 @@ int mtpr_media_packet_source_push_packet(mtpr_h mtpr, unsigned int source_id, me
                MediaTransporterSender* sender = dynamic_cast<MediaTransporterSender*>(handle->base.get());
                RET_VAL_IF(!sender, MTPR_ERROR_INVALID_OPERATION, "only sender support this api!!!");
 
+               if (!sender->getCanSendPacket())
+                       return MTPR_ERROR_NONE;
+
                MediaSourceBinMediaPacket* mediaPacketSourceBIn = dynamic_cast<MediaSourceBinMediaPacket*>(sender->getMediaSource(source_id));
                RET_VAL_IF(!mediaPacketSourceBIn, MTPR_ERROR_INVALID_PARAMETER, "Invalid source id");
 
index 3e12ceb..4811007 100644 (file)
@@ -120,11 +120,13 @@ void MediaTransporterSenderRist::startPipeline()
 {
        gst::_setPipelineState(_gst.pipeline, GST_STATE_PLAYING,
                                                MediaTransporterIni::get().general().timeout, _asyncStart);
+       _canSendPacket = true;
 }
 
 void MediaTransporterSenderRist::stopPipeline()
 {
        _ristSink = NULL;
+       _canSendPacket = false;
        gst::_setPipelineState(_gst.pipeline, GST_STATE_NULL,
                                                        MediaTransporterIni::get().general().timeout);
 }
index 5d7dff8..0d9a432 100644 (file)
@@ -36,6 +36,7 @@ __clientFilter(GstRTSPServer* server, GstRTSPClient* client, gpointer userData)
 
 MediaTransporterSenderRtsp::MediaTransporterSenderRtsp()
 {
+       _canSendPacket = false;
        LOG_DEBUG("ctor: %p", this);
 }
 
@@ -92,6 +93,7 @@ void MediaTransporterSenderRtsp::startPipeline()
 
 void MediaTransporterSenderRtsp::stopPipeline()
 {
+       _canSendPacket = false;
        if (_rtspPipeline) {
                GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(_rtspPipeline));
                gst_bus_set_sync_handler(bus, NULL, NULL, NULL);
@@ -100,7 +102,6 @@ void MediaTransporterSenderRtsp::stopPipeline()
                gst_object_unref(_rtspPipeline);
                _rtspPipeline = NULL;
        }
-
        stopRtspServer();
        removeIdleEventSource();
 }
@@ -147,7 +148,7 @@ void MediaTransporterSenderRtsp::startRtspServer()
 
                gst_rtsp_server_set_address(GST_RTSP_SERVER(server), ipAddr.c_str());
                gst_rtsp_server_set_service(GST_RTSP_SERVER(server), portNum.c_str());
-               g_signal_connect(server, "client-connected", G_CALLBACK(_clientConnectedCb), NULL);
+               g_signal_connect(server, "client-connected", G_CALLBACK(_clientConnectedCb), this);
 
                GstRTSPMountPoints* mounts = gst_rtsp_server_get_mount_points(server);
 
@@ -204,9 +205,12 @@ void MediaTransporterSenderRtsp::stopRtspServer()
        _rtspMountPoint.clear();
 }
 
-void MediaTransporterSenderRtsp::_clientConnectedCb(GstRTSPServer* server, GstRTSPClient* client)
+void MediaTransporterSenderRtsp::_clientConnectedCb(GstRTSPServer* server, GstRTSPClient* client, gpointer userData)
 {
+       auto mtprSenderRtsp = static_cast<MediaTransporterSenderRtsp*>(userData);
        LOG_DEBUG("client connected %p", client);
+
+       mtprSenderRtsp->_canSendPacket = true;
 }
 
 void MediaTransporterSenderRtsp::_mediaConstructedCb(GstRTSPMediaFactory* factory, GstRTSPMedia* media, gpointer userData)
index d51c4ea..3cc1c7d 100644 (file)
@@ -204,6 +204,7 @@ void MediaTransporterSenderSrt::startPipeline()
 {
        gst::_setPipelineState(_gst.pipeline, GST_STATE_PLAYING,
                                                MediaTransporterIni::get().general().timeout, _asyncStart);
+       _canSendPacket = true;
        startStatsMonitoring();
 }
 
@@ -212,6 +213,7 @@ void MediaTransporterSenderSrt::stopPipeline()
        stopStatsMonitoring();
 
        _srtSink = NULL;
+       _canSendPacket = false;
        gst::_setPipelineState(_gst.pipeline, GST_STATE_NULL,
                                                                MediaTransporterIni::get().general().timeout);
 }
index 4746a90..ebfaad9 100644 (file)
@@ -103,11 +103,13 @@ void MediaTransporterSenderToServerRtsp::startPipeline()
 {
        gst::_setPipelineState(_gst.pipeline, GST_STATE_PLAYING,
                                                        MediaTransporterIni::get().general().timeout, _asyncStart);
+       _canSendPacket = true;
 }
 
 void MediaTransporterSenderToServerRtsp::stopPipeline()
 {
        _rtspSink = NULL;
+       _canSendPacket = false;
        gst::_setPipelineState(_gst.pipeline, GST_STATE_NULL,
                                                        MediaTransporterIni::get().general().timeout);
 }