summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilbok Lee <gilbok.lee@samsung.com>2022-09-02 16:11:07 +0900
committerGilbok Lee <gilbok.lee@samsung.com>2022-09-05 11:49:00 +0900
commiteda4d46bc88e6f3ceebac51f74849705d853d105 (patch)
tree0c1f4ea5c66e4cb55a4c7d341bd169238efc4b1e
parent0f6716eae43ad6f4c14e94b93687d72bfb994441 (diff)
downloadmediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.tar.gz
mediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.tar.bz2
mediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.zip
[0.0.7] Remove the redundant code
- fix wrong log message Change-Id: I8f898fa04fb3cbdec6a08f6bfd3b6c171b4096f7
-rw-r--r--include/MediaSourceBinAudioTest.h4
-rw-r--r--include/MediaSourceBinBase.h3
-rw-r--r--include/MediaSourceBinCamera.h4
-rw-r--r--include/MediaSourceBinMic.h4
-rw-r--r--include/MediaSourceBinVideoTest.h4
-rw-r--r--include/MediaTransporterBase.h4
-rw-r--r--include/MediaTransporterGst.h10
-rw-r--r--include/MediaTransporterReceiver.h9
-rw-r--r--include/MediaTransporterReceiverRist.h2
-rw-r--r--include/MediaTransporterReceiverSrt.h2
-rw-r--r--include/MediaTransporterSender.h1
-rw-r--r--include/MediaTransporterSenderRist.h2
-rw-r--r--include/MediaTransporterSenderRtsp.h2
-rw-r--r--include/MediaTransporterSenderSrt.h2
-rw-r--r--include/MediaTransporterSenderToServerRtsp.h2
-rw-r--r--packaging/capi-media-transporter.spec2
-rw-r--r--src/MediaSourceBinAudioTest.cpp84
-rw-r--r--src/MediaSourceBinBase.cpp36
-rw-r--r--src/MediaSourceBinCamera.cpp97
-rw-r--r--src/MediaSourceBinMic.cpp84
-rw-r--r--src/MediaSourceBinVideoTest.cpp97
-rw-r--r--src/MediaTransporter.cpp47
-rw-r--r--src/MediaTransporterBase.cpp4
-rw-r--r--src/MediaTransporterGst.cpp139
-rw-r--r--src/MediaTransporterParam.cpp10
-rw-r--r--src/MediaTransporterReceiver.cpp78
-rw-r--r--src/MediaTransporterReceiverRist.cpp40
-rw-r--r--src/MediaTransporterReceiverSrt.cpp42
-rw-r--r--src/MediaTransporterSender.cpp47
-rw-r--r--src/MediaTransporterSenderRist.cpp60
-rw-r--r--src/MediaTransporterSenderRtsp.cpp57
-rw-r--r--src/MediaTransporterSenderSrt.cpp59
-rw-r--r--src/MediaTransporterSenderToServerRtsp.cpp57
33 files changed, 344 insertions, 751 deletions
diff --git a/include/MediaSourceBinAudioTest.h b/include/MediaSourceBinAudioTest.h
index e28c87c..2e137e9 100644
--- a/include/MediaSourceBinAudioTest.h
+++ b/include/MediaSourceBinAudioTest.h
@@ -40,10 +40,6 @@ public:
private:
GstElement* createMicSource();
- void setEncoderParam(gst::GstElements& elements);
- void setSourceParam(gst::GstElements& elements);
- void replaceCapsWithAudioInfo(GstElement* element);
- void replaceEncCapsWithAudioInfo(GstElement* element);
param::audioInfo _audioInfo;
param::encodingInfo _encInfo;
diff --git a/include/MediaSourceBinBase.h b/include/MediaSourceBinBase.h
index 1fcafb1..132420e 100644
--- a/include/MediaSourceBinBase.h
+++ b/include/MediaSourceBinBase.h
@@ -51,6 +51,9 @@ public:
protected:
gst::GstElements createVideoRestOfElements(const MtprMediaSourceIni& ini);
gst::GstElements createAudioRestOfElements(const MtprMediaSourceIni& ini);
+ void setSourceParam(gst::GstElements& elements, const param::audioInfo& aInfo);
+ void setSourceParam(gst::GstElements& elements, const param::videoInfo& vInfo);
+ void setEncoderParam(gst::GstElements& elements, const param::encodingInfo& encInfo);
};
} // namespace
diff --git a/include/MediaSourceBinCamera.h b/include/MediaSourceBinCamera.h
index 3256ad5..d706a97 100644
--- a/include/MediaSourceBinCamera.h
+++ b/include/MediaSourceBinCamera.h
@@ -40,10 +40,6 @@ public:
private:
GstElement* createCameraSource();
- void setEncoderParam(gst::GstElements& elements);
- void setSourceParam(gst::GstElements& elements);
- void replaceCapsWithVideoInfo(GstElement* element);
- void replaceEncCapsWithVideoInfo(GstElement* element);
param::videoInfo _videoInfo;
param::encodingInfo _encInfo;
diff --git a/include/MediaSourceBinMic.h b/include/MediaSourceBinMic.h
index b5b3b44..9ef101c 100644
--- a/include/MediaSourceBinMic.h
+++ b/include/MediaSourceBinMic.h
@@ -44,10 +44,6 @@ public:
private:
GstElement* createMicSource();
- void setEncoderParam(gst::GstElements& elements);
- void setSourceParam(gst::GstElements& elements);
- void replaceCapsWithAudioInfo(GstElement* element);
- void replaceEncCapsWithAudioInfo(GstElement* element);
param::audioInfo _audioInfo;
param::encodingInfo _encInfo;
diff --git a/include/MediaSourceBinVideoTest.h b/include/MediaSourceBinVideoTest.h
index eb6b31f..01cac96 100644
--- a/include/MediaSourceBinVideoTest.h
+++ b/include/MediaSourceBinVideoTest.h
@@ -40,10 +40,6 @@ public:
private:
GstElement* createVideoTestSource();
- void setEncoderParam(gst::GstElements& elements);
- void setSourceParam(gst::GstElements& elements);
- void replaceCapsWithVideoInfo(GstElement* element);
- void replaceEncCapsWithVideoInfo(GstElement* element);
param::videoInfo _videoInfo;
param::encodingInfo _encInfo;
diff --git a/include/MediaTransporterBase.h b/include/MediaTransporterBase.h
index e5bf3bb..2b9906a 100644
--- a/include/MediaTransporterBase.h
+++ b/include/MediaTransporterBase.h
@@ -48,7 +48,7 @@ public:
virtual ~MediaTransporterBase() = default;
void create();
- ResourceSet build();
+ void build();
void destroy();
void start();
@@ -83,7 +83,7 @@ private:
void makePipeline();
void stopInternal();
- virtual ResourceSet buildPipeline() = 0;
+ virtual void buildPipeline() = 0;
virtual void startPipeline() = 0;
virtual void stopPipeline() = 0;
diff --git a/include/MediaTransporterGst.h b/include/MediaTransporterGst.h
index 72901b4..b001fc4 100644
--- a/include/MediaTransporterGst.h
+++ b/include/MediaTransporterGst.h
@@ -24,6 +24,8 @@
#include <gst/audio/audio.h>
#include <vector>
+#include "MediaTransporterParam.h"
+
namespace tizen_media_transporter {
namespace gst {
@@ -122,6 +124,14 @@ void _destroyElementFromParent(GstElement* element);
void _printCaps(GstCaps* caps, std::string prefix);
+GstPad* _getGhostPadFromBin(GstBin* bin);
+
+void _updateCaps(GstElement* element, const param::videoInfo& vInfo);
+void _updateEncCaps(GstElement* element, const param::videoInfo& vInfo);
+
+void _updateCaps(GstElement* element, const param::audioInfo& aInfo);
+void _updateEncCaps(GstElement* element, const param::audioInfo& aInfo);
+
}; // gst
} // tizen_media_transporter
diff --git a/include/MediaTransporterReceiver.h b/include/MediaTransporterReceiver.h
index 4aba2ec..d74e7970 100644
--- a/include/MediaTransporterReceiver.h
+++ b/include/MediaTransporterReceiver.h
@@ -60,16 +60,16 @@ public:
protected:
int _buildForwardingElements(GstElement* demux, GstPad* pad, GCallback callback);
- void _buildForwardingSink(gst::GstElements& elements, GstPad* pad, GCallback callback);
-
- int _buildAudioRenderingElements(GstElement* demux, GstPad* pad);
- int _buildVideoRenderingElements(GstElement* demux, GstPad* pad);
+ int _buildRenderingElements(GstElement* demux, GstPad* pad, bool isAudio);
static void _streamAddedCallback(GstPad* pad, gpointer data);
static void _noMoreStreamCallback(gpointer data);
static void _encodedAudioStreamCallback(GstElement* object, GstBuffer* buffer, GstPad* pad, gpointer data);
static void _encodedVideoStreamCallback(GstElement* object, GstBuffer* buffer, GstPad* pad, gpointer data);
+ static bool _isSupportedMediaType(std::string mediaType);
+ static bool _isAudioMediaType(std::string mediaType);
+
std::unique_ptr<IInvokable> _trackAddedCallback;
std::unique_ptr<IInvokable> _noMoreTrackCallback;
@@ -86,6 +86,7 @@ protected:
private:
static media_packet_h _makeMediaPacket(GstBuffer* buffer, GstPad* pad, media_format_h* format);
+ void _buildForwardingSink(gst::GstElements& elements, GstPad* pad, GCallback callback);
void _buildAudioRenderingSink(gst::GstElements& elements);
void _buildVideoRenderingSink(gst::GstElements& elements);
};
diff --git a/include/MediaTransporterReceiverRist.h b/include/MediaTransporterReceiverRist.h
index 0435b27..c706e67 100644
--- a/include/MediaTransporterReceiverRist.h
+++ b/include/MediaTransporterReceiverRist.h
@@ -34,7 +34,7 @@ public:
MediaTransporterReceiverRist() = default;
~MediaTransporterReceiverRist() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/include/MediaTransporterReceiverSrt.h b/include/MediaTransporterReceiverSrt.h
index 94ae6e5..fee3326 100644
--- a/include/MediaTransporterReceiverSrt.h
+++ b/include/MediaTransporterReceiverSrt.h
@@ -34,7 +34,7 @@ public:
MediaTransporterReceiverSrt() = default;
~MediaTransporterReceiverSrt() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/include/MediaTransporterSender.h b/include/MediaTransporterSender.h
index 67a42ae..32bf2c4 100644
--- a/include/MediaTransporterSender.h
+++ b/include/MediaTransporterSender.h
@@ -40,6 +40,7 @@ public:
IMediaSourceBin* getMediaSource(int id);
protected:
+ void linkMediaSourceToMuxer(GstElement* mux);
std::map<int, std::unique_ptr<IMediaSourceBin>> _mediaSources;
};
diff --git a/include/MediaTransporterSenderRist.h b/include/MediaTransporterSenderRist.h
index 884de60..d91773c 100644
--- a/include/MediaTransporterSenderRist.h
+++ b/include/MediaTransporterSenderRist.h
@@ -34,7 +34,7 @@ public:
MediaTransporterSenderRist() = default;
~MediaTransporterSenderRist() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/include/MediaTransporterSenderRtsp.h b/include/MediaTransporterSenderRtsp.h
index 1818a39..3c6504d 100644
--- a/include/MediaTransporterSenderRtsp.h
+++ b/include/MediaTransporterSenderRtsp.h
@@ -32,7 +32,7 @@ public:
MediaTransporterSenderRtsp() = default;
~MediaTransporterSenderRtsp() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/include/MediaTransporterSenderSrt.h b/include/MediaTransporterSenderSrt.h
index 4b5b155..eec4b55 100644
--- a/include/MediaTransporterSenderSrt.h
+++ b/include/MediaTransporterSenderSrt.h
@@ -33,7 +33,7 @@ public:
MediaTransporterSenderSrt() = default;
~MediaTransporterSenderSrt() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/include/MediaTransporterSenderToServerRtsp.h b/include/MediaTransporterSenderToServerRtsp.h
index 63ee26f..e042a91 100644
--- a/include/MediaTransporterSenderToServerRtsp.h
+++ b/include/MediaTransporterSenderToServerRtsp.h
@@ -33,7 +33,7 @@ public:
MediaTransporterSenderToServerRtsp() = default;
~MediaTransporterSenderToServerRtsp() = default;
- ResourceSet buildPipeline() override;
+ void buildPipeline() override;
void startPipeline() override;
void stopPipeline() override;
diff --git a/packaging/capi-media-transporter.spec b/packaging/capi-media-transporter.spec
index b77dfe5..47c3c90 100644
--- a/packaging/capi-media-transporter.spec
+++ b/packaging/capi-media-transporter.spec
@@ -1,6 +1,6 @@
Name: capi-media-transporter
Summary: A Media Transporter library in Tizen Native API
-Version: 0.0.6
+Version: 0.0.7
Release: 0
Group: Multimedia/API
License: Apache-2.0
diff --git a/src/MediaSourceBinAudioTest.cpp b/src/MediaSourceBinAudioTest.cpp
index 27a49c2..f01afda 100644
--- a/src/MediaSourceBinAudioTest.cpp
+++ b/src/MediaSourceBinAudioTest.cpp
@@ -19,6 +19,7 @@
#include "MediaTransporterException.h"
#include "MediaTransporterParseIni.h"
#include "MediaTransporterParam.h"
+#include "MediaTransporterGst.h"
#include <algorithm>
@@ -45,85 +46,6 @@ GstElement* MediaSourceBinAudioTest::createMicSource()
return audioSrc;
}
-void MediaSourceBinAudioTest::setEncoderParam(gst::GstElements& elements)
-{
- GstElement* encoder = gst::_findEncoderElement(elements);
- if (!encoder)
- return;
-
- if (_encInfo.bitrate) {
- if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(encoder)), "bitrate"))
- g_object_set(G_OBJECT(encoder), "bitrate", _encInfo.bitrate * 1000, NULL);
- else
- LOG_WARNING("%s element doesn't contain bitrate property", GST_ELEMENT_NAME(encoder));
- }
-}
-
-void MediaSourceBinAudioTest::replaceCapsWithAudioInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- auto& ini = MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_AUDIOTEST));
- GstAudioFormat format;
- if (!_audioInfo.format.empty())
- format = gst::_getAudioFormatFromString(_audioInfo.format);
- else
- format = gst::_getAudioFormatFromString(ini.audioRawFormat);
-
- RET_IF(format == GST_AUDIO_FORMAT_UNKNOWN, "not supported raw format");
-
- GstAudioInfo info;
- int rate = _audioInfo.rate != -1 ? _audioInfo.rate : ini.audioSamplerate;
- int channel = _audioInfo.channel != -1 ? _audioInfo.channel : ini.audioChannels;
- gst_audio_info_set_format(&info, format, rate, channel, NULL);
- GstCaps* newCaps = gst_audio_info_to_caps(&info);
-
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- if (!gst_caps_is_equal(oldCaps, newCaps))
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinAudioTest::replaceEncCapsWithAudioInfo(GstElement* element)
-{
- GstCaps* oldCaps;
-
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_audioInfo.channel != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _audioInfo.channel);
- gst_caps_set_value(newCaps, "channels", &value);
- }
-
- if (_audioInfo.rate != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _audioInfo.rate);
- gst_caps_set_value(newCaps, "rate", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps))
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinAudioTest::setSourceParam(gst::GstElements& elements)
-{
- GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
- if (srcCapsfilter)
- replaceCapsWithAudioInfo(srcCapsfilter);
-
- GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
- if (encCapsfilter)
- replaceEncCapsWithAudioInfo(encCapsfilter);
-}
-
MediaSourceBinInfo MediaSourceBinAudioTest::generate()
{
gst::GstElements elements;
@@ -135,8 +57,8 @@ MediaSourceBinInfo MediaSourceBinAudioTest::generate()
auto created = createAudioRestOfElements(MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_AUDIOTEST)));
std::copy(created.begin(), created.end(), std::back_inserter(elements));
- setSourceParam(elements);
- setEncoderParam(elements);
+ setSourceParam(elements, _audioInfo);
+ setEncoderParam(elements, _encInfo);
} catch (const MediaTransporterException& e) {
gst::_clearElements(elements);
throw;
diff --git a/src/MediaSourceBinBase.cpp b/src/MediaSourceBinBase.cpp
index bdba563..d7fbf44 100644
--- a/src/MediaSourceBinBase.cpp
+++ b/src/MediaSourceBinBase.cpp
@@ -198,3 +198,39 @@ gst::GstElements MediaSourceBinBase::createAudioRestOfElements(const MtprMediaSo
return elements;
}
+
+void MediaSourceBinBase::setEncoderParam(gst::GstElements& elements, const param::encodingInfo& encInfo)
+{
+ GstElement* encoder = gst::_findEncoderElement(elements);
+ if (!encoder)
+ return;
+
+ if (encInfo.bitrate) {
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(encoder)), "bitrate"))
+ g_object_set(G_OBJECT(encoder), "bitrate", encInfo.bitrate * 1000, NULL);
+ else
+ LOG_WARNING("%s element doesn't contain bitrate property", GST_ELEMENT_NAME(encoder));
+ }
+}
+
+void MediaSourceBinBase::setSourceParam(gst::GstElements& elements, const param::audioInfo& aInfo)
+{
+ GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
+ if (srcCapsfilter)
+ gst::_updateCaps(srcCapsfilter, aInfo);
+
+ GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
+ if (encCapsfilter)
+ gst::_updateEncCaps(srcCapsfilter, aInfo);
+}
+
+void MediaSourceBinBase::setSourceParam(gst::GstElements& elements, const param::videoInfo& vInfo)
+{
+ GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
+ if (srcCapsfilter)
+ gst::_updateCaps(srcCapsfilter, vInfo);
+
+ GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
+ if (encCapsfilter)
+ gst::_updateEncCaps(srcCapsfilter, vInfo);
+}
diff --git a/src/MediaSourceBinCamera.cpp b/src/MediaSourceBinCamera.cpp
index b45f448..7618bcc 100644
--- a/src/MediaSourceBinCamera.cpp
+++ b/src/MediaSourceBinCamera.cpp
@@ -20,6 +20,7 @@
#include "MediaTransporterParseIni.h"
#include "MediaTransporterUtil.h"
#include "MediaTransporterParam.h"
+#include "MediaTransporterGst.h"
#include <algorithm>
@@ -51,98 +52,6 @@ GstElement* MediaSourceBinCamera::createCameraSource()
return camerasrc;
}
-void MediaSourceBinCamera::setEncoderParam(gst::GstElements& elements)
-{
- GstElement* encoder = gst::_findEncoderElement(elements);
- if (!encoder)
- return;
-
- if (_encInfo.bitrate) {
- if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(encoder)), "bitrate"))
- g_object_set(G_OBJECT(encoder), "bitrate", _encInfo.bitrate * 1000, NULL);
- else
- LOG_WARNING("%s element doesn't contain bitrate property", GST_ELEMENT_NAME(encoder));
- }
-}
-
-void MediaSourceBinCamera::replaceCapsWithVideoInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_videoInfo.width != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.width);
- gst_caps_set_value(newCaps, "width", &value);
- }
-
- if (_videoInfo.height != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.height);
- gst_caps_set_value(newCaps, "height", &value);
- }
-
- if (_videoInfo.frameRate != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, GST_TYPE_FRACTION);
- gst_value_set_fraction(&value, _videoInfo.frameRate, 1);
- gst_caps_set_value(newCaps, "framerate", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps)) {
- gst::_printCaps(newCaps, "newCaps");
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
- }
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinCamera::replaceEncCapsWithVideoInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_videoInfo.width != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.width);
- gst_caps_set_value(newCaps, "width", &value);
- }
-
- if (_videoInfo.height != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.height);
- gst_caps_set_value(newCaps, "height", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps)) {
- gst::_printCaps(newCaps, "Change newCaps");
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
- }
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinCamera::setSourceParam(gst::GstElements& elements)
-{
- GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
- if (srcCapsfilter)
- replaceCapsWithVideoInfo(srcCapsfilter);
-
- GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
- if (encCapsfilter)
- replaceEncCapsWithVideoInfo(encCapsfilter);
-}
-
MediaSourceBinInfo MediaSourceBinCamera::generate()
{
gst::GstElements elements;
@@ -153,8 +62,8 @@ MediaSourceBinInfo MediaSourceBinCamera::generate()
auto created = createVideoRestOfElements(MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_CAMERA)));
std::copy(created.begin(), created.end(), std::back_inserter(elements));
- setSourceParam(elements);
- setEncoderParam(elements);
+ setSourceParam(elements, _videoInfo);
+ setEncoderParam(elements, _encInfo);
} catch (const MediaTransporterException& e) {
gst::_clearElements(elements);
throw;
diff --git a/src/MediaSourceBinMic.cpp b/src/MediaSourceBinMic.cpp
index cd53891..15d2e10 100644
--- a/src/MediaSourceBinMic.cpp
+++ b/src/MediaSourceBinMic.cpp
@@ -20,6 +20,7 @@
#include "MediaTransporterParseIni.h"
#include "MediaTransporterUtil.h"
#include "MediaTransporterParam.h"
+#include "MediaTransporterGst.h"
#include <sound_manager_internal.h>
#include <pulse/proplist.h>
@@ -52,85 +53,6 @@ GstElement* MediaSourceBinMic::createMicSource()
return audioSrc;
}
-void MediaSourceBinMic::setEncoderParam(gst::GstElements& elements)
-{
- GstElement* encoder = gst::_findEncoderElement(elements);
- if (!encoder)
- return;
-
- if (_encInfo.bitrate) {
- if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(encoder)), "bitrate"))
- g_object_set(G_OBJECT(encoder), "bitrate", _encInfo.bitrate * 1000, NULL);
- else
- LOG_WARNING("%s element doesn't contain bitrate property", GST_ELEMENT_NAME(encoder));
- }
-}
-
-void MediaSourceBinMic::replaceCapsWithAudioInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- auto& ini = MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_MIC));
- GstAudioFormat format;
- if (!_audioInfo.format.empty())
- format = gst::_getAudioFormatFromString(_audioInfo.format);
- else
- format = gst::_getAudioFormatFromString(ini.audioRawFormat);
-
- RET_IF(format == GST_AUDIO_FORMAT_UNKNOWN, "not supported raw format");
-
- GstAudioInfo info;
- int rate = _audioInfo.rate != -1 ? _audioInfo.rate : ini.audioSamplerate;
- int channel = _audioInfo.channel != -1 ? _audioInfo.channel : ini.audioChannels;
- gst_audio_info_set_format(&info, format, rate, channel, NULL);
- GstCaps* newCaps = gst_audio_info_to_caps(&info);
-
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- if (!gst_caps_is_equal(oldCaps, newCaps))
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinMic::replaceEncCapsWithAudioInfo(GstElement* element)
-{
- GstCaps* oldCaps;
-
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_audioInfo.channel != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _audioInfo.channel);
- gst_caps_set_value(newCaps, "channels", &value);
- }
-
- if (_audioInfo.rate != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _audioInfo.rate);
- gst_caps_set_value(newCaps, "rate", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps))
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinMic::setSourceParam(gst::GstElements& elements)
-{
- GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
- if (srcCapsfilter)
- replaceCapsWithAudioInfo(srcCapsfilter);
-
- GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
- if (encCapsfilter)
- replaceEncCapsWithAudioInfo(encCapsfilter);
-}
-
MediaSourceBinInfo MediaSourceBinMic::generate()
{
gst::GstElements elements;
@@ -144,8 +66,8 @@ MediaSourceBinInfo MediaSourceBinMic::generate()
auto created = createAudioRestOfElements(MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_MIC)));
std::copy(created.begin(), created.end(), std::back_inserter(elements));
- setSourceParam(elements);
- setEncoderParam(elements);
+ setSourceParam(elements, _audioInfo);
+ setEncoderParam(elements, _encInfo);
} catch (const MediaTransporterException& e) {
gst::_clearElements(elements);
throw;
diff --git a/src/MediaSourceBinVideoTest.cpp b/src/MediaSourceBinVideoTest.cpp
index 74b0228..d26d2ab 100644
--- a/src/MediaSourceBinVideoTest.cpp
+++ b/src/MediaSourceBinVideoTest.cpp
@@ -19,6 +19,7 @@
#include "MediaTransporterException.h"
#include "MediaTransporterParseIni.h"
#include "MediaTransporterParam.h"
+#include "MediaTransporterGst.h"
#include <algorithm>
@@ -45,98 +46,6 @@ GstElement* MediaSourceBinVideoTest::createVideoTestSource()
return videotestsrc;
}
-void MediaSourceBinVideoTest::setEncoderParam(gst::GstElements& elements)
-{
- GstElement* encoder = gst::_findEncoderElement(elements);
- if (!encoder)
- return;
-
- if (_encInfo.bitrate) {
- if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(encoder)), "bitrate"))
- g_object_set(G_OBJECT(encoder), "bitrate", _encInfo.bitrate * 1000, NULL);
- else
- LOG_WARNING("%s element doesn't contain bitrate property", GST_ELEMENT_NAME(encoder));
- }
-}
-
-void MediaSourceBinVideoTest::replaceCapsWithVideoInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_videoInfo.width != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.width);
- gst_caps_set_value(newCaps, "width", &value);
- }
-
- if (_videoInfo.height != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.height);
- gst_caps_set_value(newCaps, "height", &value);
- }
-
- if (_videoInfo.frameRate != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, GST_TYPE_FRACTION);
- gst_value_set_fraction(&value, _videoInfo.frameRate, 1);
- gst_caps_set_value(newCaps, "framerate", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps)) {
- gst::_printCaps(newCaps, "Change newCaps");
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
- }
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinVideoTest::replaceEncCapsWithVideoInfo(GstElement* element)
-{
- GstCaps* oldCaps;
- g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
- RET_IF(!oldCaps, "capsfilter has no caps");
-
- GstCaps* newCaps = gst_caps_copy(oldCaps);
-
- if (_videoInfo.width != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.width);
- gst_caps_set_value(newCaps, "width", &value);
- }
-
- if (_videoInfo.height != -1) {
- GValue value = G_VALUE_INIT;
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, _videoInfo.height);
- gst_caps_set_value(newCaps, "height", &value);
- }
-
- if (!gst_caps_is_equal(oldCaps, newCaps)) {
- gst::_printCaps(newCaps, "Change newCaps");
- g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
- }
-
- gst_caps_unref(newCaps);
-}
-
-void MediaSourceBinVideoTest::setSourceParam(gst::GstElements& elements)
-{
- GstElement* srcCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_SRC_CAPSFILTER);
- if (srcCapsfilter)
- replaceCapsWithVideoInfo(srcCapsfilter);
-
- GstElement* encCapsfilter = gst::_findElementByName(elements, ELEMENT_NAME_ENCODE_CAPSFILTER);
- if (encCapsfilter)
- replaceEncCapsWithVideoInfo(encCapsfilter);
-}
-
MediaSourceBinInfo MediaSourceBinVideoTest::generate()
{
gst::GstElements elements;
@@ -147,8 +56,8 @@ MediaSourceBinInfo MediaSourceBinVideoTest::generate()
auto created = createVideoRestOfElements(MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_VIDEOTEST))); // FIXME
std::copy(created.begin(), created.end(), std::back_inserter(elements));
- setSourceParam(elements);
- setEncoderParam(elements);
+ setSourceParam(elements, _videoInfo);
+ setEncoderParam(elements, _encInfo);
} catch (const MediaTransporterException& e) {
gst::_clearElements(elements);
throw;
diff --git a/src/MediaTransporter.cpp b/src/MediaTransporter.cpp
index 87a007a..dfd5224 100644
--- a/src/MediaTransporter.cpp
+++ b/src/MediaTransporter.cpp
@@ -74,8 +74,7 @@ int mtpr_start(mtpr_h mtpr)
assert(handle->resourceManager);
try {
- ResourceSet rs = handle->base->build();
- handle->resourceManager->acquire(rs);
+ handle->base->build();
handle->base->start();
} catch (const MediaTransporterException& e) {
LOG_ERROR("Failed to start!!! : %s", e.what());
@@ -111,7 +110,7 @@ int mtpr_get_state(mtpr_h mtpr, mtpr_state_e *state)
assert(handle->base);
*state = handle->base->state();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to stop!!! : %s", e.what());
+ LOG_ERROR("Failed to get state!!! : %s", e.what());
return e.error();
}
@@ -127,7 +126,7 @@ int mtpr_get_connection_type(mtpr_h mtpr, mtpr_connection_type_e *type)
assert(handle->base);
*type = handle->base->type();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to create!!! : %s", e.what());
+ LOG_ERROR("Failed to get connection type!!! : %s", e.what());
return e.error();
}
@@ -165,7 +164,7 @@ int mtpr_get_sender_address(mtpr_h mtpr, char **address)
}
*address = strdup(senderAddress.c_str());
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to set sender address!!! : %s", e.what());
+ LOG_ERROR("Failed to get sender address!!! : %s", e.what());
return e.error();
}
@@ -181,7 +180,7 @@ int mtpr_set_receiver_address(mtpr_h mtpr, const char *address)
assert(handle->base);
handle->base->setReceiverAddress(address);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to set sender address!!! : %s", e.what());
+ LOG_ERROR("Failed to set receiver address!!! : %s", e.what());
return e.error();
}
@@ -203,7 +202,7 @@ int mtpr_get_receiver_address(mtpr_h mtpr, char **address)
}
*address = strdup(receiverAddress.c_str());
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to set sender address!!! : %s", e.what());
+ LOG_ERROR("Failed to get receiver address!!! : %s", e.what());
return e.error();
}
@@ -319,7 +318,7 @@ int mtpr_mic_source_set_sound_stream_info(mtpr_h mtpr, unsigned int source_id, s
micSourceBin->setSoundStreamInfo(stream_info);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to mic set sound stream info!!! : %s", e.what());
+ LOG_ERROR("Failed to set mic sound stream info!!! : %s", e.what());
return e.error();
}
@@ -335,7 +334,7 @@ int mtpr_set_error_cb(mtpr_h mtpr, mtpr_error_cb callback, void *user_data)
assert(handle->base);
handle->base->setErrorCallback(mtpr, callback, user_data);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setErrorCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to set error callback!!! : %s", e.what());
return e.error();
}
@@ -351,7 +350,7 @@ int mtpr_unset_error_cb(mtpr_h mtpr)
assert(handle->base);
handle->base->unsetErrorCallback();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to unsetErrorCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to unset error callback!!! : %s", e.what());
return e.error();
}
@@ -371,7 +370,7 @@ int mtpr_set_track_added_cb(mtpr_h mtpr, mtpr_track_added_cb callback, void* use
try {
receiver->setTrackAddedCallback(mtpr, callback, user_data);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setNoMoreTrackCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to set track added callback!!! : %s", e.what());
return e.error();
}
@@ -391,7 +390,7 @@ int mtpr_unset_track_added_cb(mtpr_h mtpr)
try {
receiver->unsetTrackAddedCallback();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to unsetNoMoreTrackCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to unset track added callback!!! : %s", e.what());
return e.error();
}
@@ -411,7 +410,7 @@ int mtpr_set_no_more_track_cb(mtpr_h mtpr, mtpr_no_more_track_cb callback, void*
try {
receiver->setNoMoreTrackCallback(mtpr, callback, user_data);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setNoMoreTrackCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to set no more track callback!!! : %s", e.what());
return e.error();
}
@@ -431,7 +430,7 @@ int mtpr_unset_no_more_track_cb(mtpr_h mtpr)
try {
receiver->unsetNoMoreTrackCallback();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to unsetNoMoreTrackCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to unset no more track callback!!! : %s", e.what());
return e.error();
}
@@ -451,7 +450,7 @@ int mtpr_set_audio_packet_cb(mtpr_h mtpr, mtpr_encoded_frame_cb callback, void*
try {
receiver->setAudioPacketCallback(mtpr, callback, user_data);//__internal_audio_packet_cb, static_cast<void*>(handle));
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setAudioPacketCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to set audio packet callback!!! : %s", e.what());
return e.error();
}
@@ -471,7 +470,7 @@ int mtpr_unset_audio_packet_cb(mtpr_h mtpr)
try {
receiver->unsetAudioPacketCallback();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to unsetAudioPacketCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to unset audio packet callback!!! : %s", e.what());
return e.error();
}
@@ -491,7 +490,7 @@ int mtpr_set_video_packet_cb(mtpr_h mtpr, mtpr_encoded_frame_cb callback, void*
try {
receiver->setVideoPacketCallback(mtpr, callback, user_data);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setVideoPacketCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to set video packet callback!!! : %s", e.what());
return e.error();
}
@@ -511,7 +510,7 @@ int mtpr_unset_video_packet_cb(mtpr_h mtpr)
try {
receiver->unsetVideoPacketCallback();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to unsetVideoPacketCallback!!! : %s", e.what());
+ LOG_ERROR("Failed to unset video packet callback!!! : %s", e.what());
return e.error();
}
@@ -532,7 +531,7 @@ int mtpr_set_display(mtpr_h mtpr, mtpr_display_type_e type, mtpr_display_h displ
handle->display = std::make_shared<MediaTransporterDisplay>(type, display);
receiver->setDisplay(handle->display);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to mtpr_set_display!!! : %s", e.what());
+ LOG_ERROR("Failed to set display!!! : %s", e.what());
return e.error();
}
@@ -549,7 +548,7 @@ int mtpr_set_display_mode(mtpr_h mtpr, mtpr_display_mode_e mode)
try {
handle->display->setMode(mode);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to set modeq!!! : %s", e.what());
+ LOG_ERROR("Failed to set display mode!!! : %s", e.what());
return e.error();
}
@@ -566,7 +565,7 @@ int mtpr_get_display_mode(mtpr_h mtpr, mtpr_display_mode_e *mode)
try {
*mode = handle->display->getMode();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to get Mode!!! : %s", e.what());
+ LOG_ERROR("Failed to get display mode!!! : %s", e.what());
return e.error();
}
@@ -583,7 +582,7 @@ int mtpr_set_display_visible(mtpr_h mtpr, bool visible)
try {
handle->display->setVisible(visible);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to set visible!!! : %s", e.what());
+ LOG_ERROR("Failed to set display visible!!! : %s", e.what());
return e.error();
}
@@ -600,7 +599,7 @@ int mtpr_get_display_visible(mtpr_h mtpr, bool *visible)
try {
*visible = handle->display->getVisible();
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to get visible!!! : %s", e.what());
+ LOG_ERROR("Failed to get display visible!!! : %s", e.what());
return e.error();
}
@@ -620,7 +619,7 @@ int mtpr_set_sound_stream_info(mtpr_h mtpr, sound_stream_info_h stream_info)
try {
receiver->setSoundStreamInfo(stream_info);
} catch (const MediaTransporterException& e) {
- LOG_ERROR("Failed to setSoundStreamInfo!!! : %s", e.what());
+ LOG_ERROR("Failed to set sound stream info!!! : %s", e.what());
return e.error();
}
diff --git a/src/MediaTransporterBase.cpp b/src/MediaTransporterBase.cpp
index 681a805..0bd10f3 100644
--- a/src/MediaTransporterBase.cpp
+++ b/src/MediaTransporterBase.cpp
@@ -107,14 +107,14 @@ void MediaTransporterBase::create()
_state = MTPR_STATE_IDLE;
}
-ResourceSet MediaTransporterBase::build()
+void MediaTransporterBase::build()
{
std::lock_guard<std::mutex> mutex(_mutex);
if (_state != MTPR_STATE_IDLE)
throw MediaTransporterException(MTPR_ERROR_INVALID_STATE, "state must be IDLE");
- return buildPipeline();
+ buildPipeline();
}
void MediaTransporterBase::start()
diff --git a/src/MediaTransporterGst.cpp b/src/MediaTransporterGst.cpp
index 5929c7a..f6d5fc9 100644
--- a/src/MediaTransporterGst.cpp
+++ b/src/MediaTransporterGst.cpp
@@ -741,3 +741,142 @@ void gst::_printCaps(GstCaps* caps, std::string prefix)
std::string caps_str = gst_caps_to_string(caps);
LOG_DEBUG("%s caps[%s]", prefix.c_str(), caps_str.c_str());
}
+
+GstPad* gst::_getGhostPadFromBin(GstBin* bin)
+{
+ GstElement* queue = gst_bin_get_by_name(bin, "srcQueue");
+ if (!queue)
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to get srcQueue");
+
+ GstPad* srcPad = nullptr;
+
+ if (!gst::_addNoTargetGhostpad(bin, &srcPad, true))
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _addNoTargetGhostpad");
+
+ if (!gst::_setGhostpadTarget(srcPad, queue, true))
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _setGhostpadTarget");
+
+ return srcPad;
+}
+
+
+void gst::_updateCaps(GstElement* element, const param::videoInfo& vInfo)
+{
+ GstCaps* oldCaps;
+ g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
+ RET_IF(!oldCaps, "capsfilter has no caps");
+
+ GstCaps* newCaps = gst_caps_copy(oldCaps);
+
+ if (vInfo.width != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, vInfo.width);
+ gst_caps_set_value(newCaps, "width", &value);
+ }
+
+ if (vInfo.height != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, vInfo.height);
+ gst_caps_set_value(newCaps, "height", &value);
+ }
+
+ if (vInfo.frameRate != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, GST_TYPE_FRACTION);
+ gst_value_set_fraction(&value, vInfo.frameRate, 1);
+ gst_caps_set_value(newCaps, "framerate", &value);
+ }
+
+ if (!gst_caps_is_equal(oldCaps, newCaps)) {
+ gst::_printCaps(newCaps, "newCaps");
+ g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
+ }
+
+ gst_caps_unref(newCaps);
+}
+
+void gst::_updateEncCaps(GstElement* element, const param::videoInfo& vInfo)
+{
+ GstCaps* oldCaps;
+ g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
+ RET_IF(!oldCaps, "capsfilter has no caps");
+
+ GstCaps* newCaps = gst_caps_copy(oldCaps);
+
+ if (vInfo.width != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, vInfo.width);
+ gst_caps_set_value(newCaps, "width", &value);
+ }
+
+ if (vInfo.height != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, vInfo.height);
+ gst_caps_set_value(newCaps, "height", &value);
+ }
+
+ if (!gst_caps_is_equal(oldCaps, newCaps)) {
+ gst::_printCaps(newCaps, "Change newCaps");
+ g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
+ }
+
+ gst_caps_unref(newCaps);
+}
+
+void gst::_updateCaps(GstElement* element, const param::audioInfo& aInfo)
+{
+ GstCaps* oldCaps;
+ auto& ini = MediaTransporterIni::get().mediaSource(static_cast<int>(MTPR_SOURCE_TYPE_MIC));
+ GstAudioFormat format;
+ if (!aInfo.format.empty())
+ format = gst::_getAudioFormatFromString(aInfo.format);
+ else
+ format = gst::_getAudioFormatFromString(ini.audioRawFormat);
+
+ RET_IF(format == GST_AUDIO_FORMAT_UNKNOWN, "not supported raw format");
+
+ GstAudioInfo info;
+ int rate = aInfo.rate != -1 ? aInfo.rate : ini.audioSamplerate;
+ int channel = aInfo.channel != -1 ? aInfo.channel : ini.audioChannels;
+ gst_audio_info_set_format(&info, format, rate, channel, NULL);
+ GstCaps* newCaps = gst_audio_info_to_caps(&info);
+
+ g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
+ if (!gst_caps_is_equal(oldCaps, newCaps))
+ g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
+
+ gst_caps_unref(newCaps);
+}
+
+void gst::_updateEncCaps(GstElement* element, const param::audioInfo& aInfo)
+{
+ GstCaps* oldCaps;
+
+ g_object_get(G_OBJECT(element), "caps", &oldCaps, NULL);
+ RET_IF(!oldCaps, "capsfilter has no caps");
+
+ GstCaps* newCaps = gst_caps_copy(oldCaps);
+
+ if (aInfo.channel != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, aInfo.channel);
+ gst_caps_set_value(newCaps, "channels", &value);
+ }
+
+ if (aInfo.rate != -1) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, G_TYPE_INT);
+ g_value_set_int(&value, aInfo.rate);
+ gst_caps_set_value(newCaps, "rate", &value);
+ }
+
+ if (!gst_caps_is_equal(oldCaps, newCaps))
+ g_object_set(G_OBJECT(element), "caps", newCaps, NULL);
+
+ gst_caps_unref(newCaps);
+} \ No newline at end of file
diff --git a/src/MediaTransporterParam.cpp b/src/MediaTransporterParam.cpp
index b29ae5a..2d06476 100644
--- a/src/MediaTransporterParam.cpp
+++ b/src/MediaTransporterParam.cpp
@@ -29,7 +29,10 @@ void param::parseSourceParam(bundle* params, param::videoInfo* vInfo, param::enc
int written_count = 0;
char* string_val = NULL;
- RET_IF(!params, "input param is NULL");
+ if (!params) {
+ LOG_INFO("input param is NULL");
+ return;
+ }
if (bundle_get_str(params, MTPR_SOURCE_PARAM_VIDEO_WIDTH, &string_val) != BUNDLE_ERROR_KEY_NOT_AVAILABLE) {
vInfo->width = static_cast<int>(strtoul(string_val, NULL, 10));
@@ -64,7 +67,10 @@ void param::parseSourceParam(bundle* params, param::audioInfo* aInfo, param::enc
int written_count = 0;
char* string_val = NULL;
- RET_IF(!params, "input param is NULL");
+ if (!params) {
+ LOG_INFO("input param is NULL");
+ return;
+ }
/* Will be move to mic/audiotest bin */
if (bundle_get_str(params, MTPR_SOURCE_PARAM_AUDIO_CHANNEL, &string_val) != BUNDLE_ERROR_KEY_NOT_AVAILABLE) {
diff --git a/src/MediaTransporterReceiver.cpp b/src/MediaTransporterReceiver.cpp
index e24f6e8..48ef6ab 100644
--- a/src/MediaTransporterReceiver.cpp
+++ b/src/MediaTransporterReceiver.cpp
@@ -473,57 +473,7 @@ void MediaTransporterReceiver::_buildVideoRenderingSink(gst::GstElements& elemen
}
}
-int MediaTransporterReceiver::_buildAudioRenderingElements(GstElement* demux, GstPad* pad)
-{
- gst::GstElements elements;
-
- RET_VAL_IF(!demux, MTPR_ERROR_INVALID_PARAMETER, "demux element is NULL");
- RET_VAL_IF(!pad, MTPR_ERROR_INVALID_PARAMETER, "pad is NULL");
-
- GstElement* queue = gst::_createElement(gst::DEFAULT_ELEMENT_QUEUE);
- /* FIXME: need to check queue size */
- g_object_set(G_OBJECT(queue),
- "max-size-buffers", DEFAULT_QUEUE_MAX_SIZE_BUFFERS,
- "max-size-bytes", DEFAULT_QUEUE_MAX_SIZE_BYTES,
- "max-size-time", DEFAULT_QUEUE_MAX_SIZE_TIME,
- NULL);
- elements.push_back(queue);
-
- GstElement* parser = gst::_createElementFromRegistry("Parser", gst_pad_get_current_caps(pad), NULL,
- MediaTransporterIni::get().general().gstExcludedElements);
- GstPad* srcPad;
- if (parser) {
- srcPad = gst_element_get_static_pad(parser, "src");
- elements.push_back(parser);
- } else {
- srcPad = gst_element_get_static_pad(queue, "src");
- }
-
- GstCaps* caps = gst_pad_has_current_caps(srcPad) ? gst_pad_get_current_caps(srcPad)
- : gst_pad_query_caps(srcPad, NULL);
- GstElement* decoder = gst::_createElementFromRegistry("Codec/Decoder/Audio", caps, NULL,
- MediaTransporterIni::get().general().gstExcludedElements);
- elements.push_back(decoder);
- g_object_unref(srcPad);
-
- _buildAudioRenderingSink(elements);
-
- gst::_addElementsToBin(GST_BIN(_gst.pipeline), elements);
-
- if (!gst_element_link_pads(GST_ELEMENT(demux),
- GST_PAD_NAME(pad),
- GST_ELEMENT(queue),
- "sink")) {
- LOG_ERROR("failed to link demuxer and queue");
- }
-
- gst::_linkElements(elements);
- gst::_syncElementsStateWithParent(elements);
-
- return MTPR_ERROR_NONE;
-}
-
-int MediaTransporterReceiver::_buildVideoRenderingElements(GstElement* demux, GstPad* pad)
+int MediaTransporterReceiver::_buildRenderingElements(GstElement* demux, GstPad* pad, bool isAudio)
{
gst::GstElements elements;
@@ -555,12 +505,16 @@ int MediaTransporterReceiver::_buildVideoRenderingElements(GstElement* demux, Gs
GstCaps* caps = gst_pad_has_current_caps(srcPad) ? gst_pad_get_current_caps(srcPad)
: gst_pad_query_caps(srcPad, NULL);
- GstElement* decoder = gst::_createElementFromRegistry("Codec/Decoder/Video", caps, NULL,
- MediaTransporterIni::get().general().gstExcludedElements);
+ GstElement* decoder = gst::_createElementFromRegistry(
+ isAudio ? "Codec/Decoder/Audio" : "Codec/Decoder/Video", caps, NULL,
+ MediaTransporterIni::get().general().gstExcludedElements);
elements.push_back(decoder);
g_object_unref(srcPad);
- _buildVideoRenderingSink(elements);
+ if (isAudio)
+ _buildAudioRenderingSink(elements);
+ else
+ _buildVideoRenderingSink(elements);
gst::_addElementsToBin(GST_BIN(_gst.pipeline), elements);
@@ -616,3 +570,19 @@ void MediaTransporterReceiver::setSoundStreamInfo(sound_stream_info_h streamInfo
_streamInfo = stringStream.str();
}
+
+bool MediaTransporterReceiver::_isSupportedMediaType(std::string mediaType)
+{
+ if ((mediaType.find("audio") == std::string::npos) &&
+ (mediaType.find("video") == std::string::npos)) {
+ LOG_ERROR("not supported media type [%s]", mediaType.c_str());
+ return false;
+ }
+
+ return true;
+}
+
+bool MediaTransporterReceiver::_isAudioMediaType(std::string mediaType)
+{
+ return mediaType.find("audio") != std::string::npos;
+} \ No newline at end of file
diff --git a/src/MediaTransporterReceiverRist.cpp b/src/MediaTransporterReceiverRist.cpp
index ee93a54..7df1dd2 100644
--- a/src/MediaTransporterReceiverRist.cpp
+++ b/src/MediaTransporterReceiverRist.cpp
@@ -24,22 +24,6 @@
using namespace tizen_media_transporter;
-static bool _isSupportedMediaType(std::string mediaType)
-{
- if ((mediaType.find("audio") == std::string::npos) &&
- (mediaType.find("video") == std::string::npos)) {
- LOG_ERROR("not supported media type [%s]", mediaType.c_str());
- return false;
- }
-
- return true;
-}
-
-static bool _isAudioMediaType(std::string mediaType)
-{
- return mediaType.find("audio") != std::string::npos;
-}
-
void MediaTransporterReceiverRist::_demuxNoMorePadsCallback(GstElement *demux, gpointer userData)
{
MediaTransporterReceiverRist* rist = static_cast<MediaTransporterReceiverRist*>(userData);
@@ -63,30 +47,25 @@ void MediaTransporterReceiverRist::_demuxPadAddedCallback(GstElement *demux, Gst
auto rist = static_cast<MediaTransporterReceiverRist*>(userData);
assert(rist);
- if (_isAudioMediaType(mediaType)) {
- if (rist->_audioCallback._callback)
- rist->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedAudioStreamCallback));
- else
- rist->_buildAudioRenderingElements(demux, new_pad);
- } else {
- if (rist->_videoCallback._callback)
- rist->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedVideoStreamCallback));
- else
- rist->_buildVideoRenderingElements(demux, new_pad);
- }
+
+ bool isAudio = _isAudioMediaType(mediaType);
+ if (rist->_audioCallback._callback && isAudio)
+ rist->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedAudioStreamCallback));
+ else if (rist->_videoCallback._callback && !isAudio)
+ rist->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedVideoStreamCallback));
+ else
+ rist->_buildRenderingElements(demux, new_pad, isAudio);
_streamAddedCallback(new_pad, userData);
}
-ResourceSet MediaTransporterReceiverRist::buildPipeline()
+void MediaTransporterReceiverRist::buildPipeline()
{
GstElement* src = NULL;
GstElement* rtpmp2tdepay = NULL;
GstElement* queue = NULL;
GstElement* tsdemux = NULL;
- ResourceSet allResourceRequired;
-
MTPR_FENTER();
/* create mux to sink */
@@ -114,7 +93,6 @@ ResourceSet MediaTransporterReceiverRist::buildPipeline()
gst::_connectAndAppendSignal(&_gst.signals, G_OBJECT(tsdemux), "no-more-pads", G_CALLBACK(_demuxNoMorePadsCallback), this);
LOG_INFO("linked mux and sink");
- return allResourceRequired;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
diff --git a/src/MediaTransporterReceiverSrt.cpp b/src/MediaTransporterReceiverSrt.cpp
index 502f794..fb8cea8 100644
--- a/src/MediaTransporterReceiverSrt.cpp
+++ b/src/MediaTransporterReceiverSrt.cpp
@@ -24,22 +24,6 @@
using namespace tizen_media_transporter;
-static bool _isSupportedMediaType(std::string mediaType)
-{
- if ((mediaType.find("audio") == std::string::npos) &&
- (mediaType.find("video") == std::string::npos)) {
- LOG_ERROR("not supported media type [%s]", mediaType.c_str());
- return false;
- }
-
- return true;
-}
-
-static bool _isAudioMediaType(std::string mediaType)
-{
- return mediaType.find("audio") != std::string::npos;
-}
-
void MediaTransporterReceiverSrt::_demuxNoMorePadsCallback(GstElement *demux, gpointer userData)
{
MediaTransporterReceiverSrt* srt = static_cast<MediaTransporterReceiverSrt*>(userData);
@@ -63,29 +47,24 @@ void MediaTransporterReceiverSrt::_demuxPadAddedCallback(GstElement *demux, GstP
auto srt = static_cast<MediaTransporterReceiverSrt*>(userData);
assert(srt);
- if (_isAudioMediaType(mediaType)) {
- if (srt->_audioCallback._callback)
- srt->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedAudioStreamCallback));
- else
- srt->_buildAudioRenderingElements(demux, new_pad);
- } else {
- if (srt->_videoCallback._callback)
- srt->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedVideoStreamCallback));
- else
- srt->_buildVideoRenderingElements(demux, new_pad);
- }
+
+ bool isAudio = _isAudioMediaType(mediaType);
+ if (srt->_audioCallback._callback && isAudio)
+ srt->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedAudioStreamCallback));
+ else if (srt->_videoCallback._callback && !isAudio)
+ srt->_buildForwardingElements(demux, new_pad, G_CALLBACK(_encodedVideoStreamCallback));
+ else
+ srt->_buildRenderingElements(demux, new_pad, isAudio);
_streamAddedCallback(new_pad, userData);
}
-ResourceSet MediaTransporterReceiverSrt::buildPipeline()
+void MediaTransporterReceiverSrt::buildPipeline()
{
GstElement* src = NULL;
GstElement* queue = NULL;
GstElement* tsdemux = NULL;
- ResourceSet allResourceRequired;
-
MTPR_FENTER();
/* create mux to sink */
@@ -110,9 +89,6 @@ ResourceSet MediaTransporterReceiverSrt::buildPipeline()
gst::_connectAndAppendSignal(&_gst.signals, G_OBJECT(tsdemux), "no-more-pads", G_CALLBACK(_demuxNoMorePadsCallback), this);
LOG_INFO("linked mux and sink");
- return allResourceRequired;
-
- // return MTPR_ERROR_NONE;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
diff --git a/src/MediaTransporterSender.cpp b/src/MediaTransporterSender.cpp
index ff79058..0eda02a 100644
--- a/src/MediaTransporterSender.cpp
+++ b/src/MediaTransporterSender.cpp
@@ -51,4 +51,49 @@ IMediaSourceBin* MediaTransporterSender::getMediaSource(int id)
} catch (...) {
throw MediaTransporterException(MTPR_ERROR_INVALID_PARAMETER, "invalid id to get Source");
}
-} \ No newline at end of file
+}
+
+void MediaTransporterSender::linkMediaSourceToMuxer(GstElement* mux)
+{
+
+ GstPad* sinkPad = NULL;
+ try {
+ /* link each element */
+ for (auto& [id, mediaSource] : _mediaSources) {
+ auto[ type, bin, resourceRequired ] = mediaSource->generate();
+
+ LOG_INFO("mediaSource(type:%d, bin:%p, resourceRequired:%zu) generated",
+ static_cast<int>(type), bin, resourceRequired.size());
+
+ _resourceManager->acquire(resourceRequired);
+
+ gst_bin_add(GST_BIN(_gst.pipeline), GST_ELEMENT(bin));
+
+ GstPad* srcPad = gst::_getGhostPadFromBin(bin);
+ if (gst_pad_is_linked(srcPad)) {
+ LOG_ERROR("pad %s:%s is already linked", GST_DEBUG_PAD_NAME(srcPad));
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "already linked");
+ }
+
+ sinkPad = gst_element_request_pad_simple(mux, "sink_%d");
+ if (!sinkPad)
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
+
+ GstPadLinkReturn res = gst_pad_link(srcPad, sinkPad);
+ if (GST_PAD_LINK_FAILED(res)) {
+ LOG_ERROR("failed to link pads, [%s:%s] - [%s:%s]",
+ GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
+
+ throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to link pads");
+ }
+ LOG_INFO("pad is linked %s:%s - %s:%s", GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
+ }
+ } catch (const MediaTransporterException& e) {
+ LOG_ERROR("%s", e.what());
+ if (sinkPad) {
+ gst_element_release_request_pad(mux, sinkPad);
+ g_object_unref(sinkPad);
+ }
+ throw;
+ }
+}
diff --git a/src/MediaTransporterSenderRist.cpp b/src/MediaTransporterSenderRist.cpp
index 5e524a2..403bcf4 100644
--- a/src/MediaTransporterSenderRist.cpp
+++ b/src/MediaTransporterSenderRist.cpp
@@ -29,31 +29,11 @@
using namespace tizen_media_transporter;
-static GstPad* _getGhostPadFromBin(GstBin* bin)
-{
- GstElement* queue = gst_bin_get_by_name(bin, "srcQueue");
- if (!queue)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to get srcQueue");
-
- GstPad* srcPad = nullptr;
-
- if (!gst::_addNoTargetGhostpad(bin, &srcPad, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _addNoTargetGhostpad");
-
- if (!gst::_setGhostpadTarget(srcPad, queue, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _setGhostpadTarget");
-
- return srcPad;
-}
-
-ResourceSet MediaTransporterSenderRist::buildPipeline()
+void MediaTransporterSenderRist::buildPipeline()
{
GstElement* mux = NULL;
GstElement* sink = NULL;
GstElement* pay = NULL;
- GstPad* sinkPad = NULL;
-
- ResourceSet allResourceRequired;
/* create mux to sink */
try {
@@ -87,49 +67,13 @@ ResourceSet MediaTransporterSenderRist::buildPipeline()
LOG_ERROR("pp %s, ref %d",
GST_ELEMENT_NAME(_gst.pipeline), GST_OBJECT_REFCOUNT_VALUE(_gst.pipeline));
- /* link each element */
- for (auto& [id, mediaSource] : _mediaSources) {
- auto[ type, bin, resourceRequired ] = mediaSource->generate();
-
- LOG_INFO("mediaSource(type:%d, bin:%p, resourceRequired:%zu) generated",
- static_cast<int>(type), bin, resourceRequired.size());
-
- allResourceRequired.insert(resourceRequired.begin(), resourceRequired.end());
-
- gst_bin_add(GST_BIN(_gst.pipeline), GST_ELEMENT(bin));
-
- GstPad* srcPad = _getGhostPadFromBin(bin);
- if (gst_pad_is_linked(srcPad)) {
- LOG_ERROR("pad %s:%s is already linked", GST_DEBUG_PAD_NAME(srcPad));
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "already linked");
- }
-
- sinkPad = gst_element_request_pad_simple(mux, "sink_%d");
- if (!sinkPad)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
-
- GstPadLinkReturn res = gst_pad_link(srcPad, sinkPad);
- if (GST_PAD_LINK_FAILED(res)) {
- LOG_ERROR("failed to link pads, [%s:%s] - [%s:%s]",
- GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
-
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to link pads");
- }
- LOG_INFO("pad is linked %s:%s - %s:%s", GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
- }
+ linkMediaSourceToMuxer(mux);
_ristSink = sink;
LOG_INFO("linked mux and sink");
-
- return allResourceRequired;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
- if (sinkPad) {
- gst_element_release_request_pad(mux, sinkPad);
- g_object_unref(sinkPad);
- }
-
gst::_destroyElementFromParent(mux);
gst::_destroyElementFromParent(pay);
gst::_destroyElementFromParent(sink);
diff --git a/src/MediaTransporterSenderRtsp.cpp b/src/MediaTransporterSenderRtsp.cpp
index 3678f5f..5e0c4ec 100644
--- a/src/MediaTransporterSenderRtsp.cpp
+++ b/src/MediaTransporterSenderRtsp.cpp
@@ -30,22 +30,7 @@ using namespace tizen_media_transporter;
#define ADDR_PATH_DELIM "/"
#define ADDR_RTSP_PREFIX "rtsp://"
-static GstPad* _getGhostPadFromBin(GstBin* bin)
-{
- GstElement* queue = gst_bin_get_by_name(bin, "srcQueue");
- if (!queue)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to get srcQueue");
-
- GstPad* srcPad = nullptr;
-
- if (!gst::_addNoTargetGhostpad(bin, &srcPad, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _addNoTargetGhostpad");
-
- if (!gst::_setGhostpadTarget(srcPad, queue, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _setGhostpadTarget");
- return srcPad;
-}
static GstRTSPFilterResult
__clientFilter(GstRTSPServer *server, GstRTSPClient *client, gpointer userData)
@@ -54,13 +39,10 @@ __clientFilter(GstRTSPServer *server, GstRTSPClient *client, gpointer userData)
return GST_RTSP_FILTER_REMOVE;
}
-ResourceSet MediaTransporterSenderRtsp::buildPipeline()
+void MediaTransporterSenderRtsp::buildPipeline()
{
GstElement* mux = NULL;
GstElement* pay = NULL;
- GstPad* sinkPad = NULL;
-
- ResourceSet allResourceRequired;
try {
if (_senderAddress.empty())
@@ -81,48 +63,13 @@ ResourceSet MediaTransporterSenderRtsp::buildPipeline()
LOG_ERROR("pp %s, ref %d",
GST_ELEMENT_NAME(_gst.pipeline), GST_OBJECT_REFCOUNT_VALUE(_gst.pipeline));
- /* create sources and link elements */
- for (auto& [id, mediaSource] : _mediaSources) {
- auto[ type, bin, resourceRequired ] = mediaSource->generate();
-
- LOG_INFO("mediaSource(type:%d, bin:%p, resourceRequired:%zu) generated",
- static_cast<int>(type), bin, resourceRequired.size());
-
- allResourceRequired.insert(resourceRequired.begin(), resourceRequired.end());
-
- gst_bin_add(GST_BIN(_gst.pipeline), GST_ELEMENT(bin));
-
- GstPad* srcPad = _getGhostPadFromBin(bin);
- if (gst_pad_is_linked(srcPad)) {
- LOG_ERROR("pad %s:%s is already linked", GST_DEBUG_PAD_NAME(srcPad));
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "already linked");
- }
-
- sinkPad = gst_element_request_pad_simple(mux, "sink_%d");
- if (!sinkPad)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
-
- GstPadLinkReturn res = gst_pad_link(srcPad, sinkPad);
- if (GST_PAD_LINK_FAILED(res)) {
- LOG_ERROR("failed to link pads, [%s:%s] - [%s:%s]",
- GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
-
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
- }
- LOG_INFO("pad is linked %s:%s - %s:%s", GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
- }
+ linkMediaSourceToMuxer(mux);
LOG_INFO("linked mux and pay");
- return allResourceRequired;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
- if (sinkPad) {
- gst_element_release_request_pad(mux, sinkPad);
- g_object_unref(sinkPad);
- }
-
gst::_destroyElementFromParent(mux);
gst::_destroyElementFromParent(pay);
diff --git a/src/MediaTransporterSenderSrt.cpp b/src/MediaTransporterSenderSrt.cpp
index 5de67bb..065b579 100644
--- a/src/MediaTransporterSenderSrt.cpp
+++ b/src/MediaTransporterSenderSrt.cpp
@@ -25,23 +25,6 @@
using namespace tizen_media_transporter;
-static GstPad* _getGhostPadFromBin(GstBin* bin)
-{
- GstElement* queue = gst_bin_get_by_name(bin, "srcQueue");
- if (!queue)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to get srcQueue");
-
- GstPad* srcPad = nullptr;
-
- if (!gst::_addNoTargetGhostpad(bin, &srcPad, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _addNoTargetGhostpad");
-
- if (!gst::_setGhostpadTarget(srcPad, queue, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _setGhostpadTarget");
-
- return srcPad;
-}
-
static void __callerAddedCb(GstElement* element, gint socket, GSocketAddress* address, gpointer userData)
{
LOG_INFO("socket %d, address %s", socket,
@@ -66,13 +49,10 @@ static void __callerConnectingCb(GstElement* element, GSocketAddress* peerAddres
g_inet_address_to_string(g_inet_socket_address_get_address((GInetSocketAddress*)peerAddress)));
}
-ResourceSet MediaTransporterSenderSrt::buildPipeline()
+void MediaTransporterSenderSrt::buildPipeline()
{
GstElement* mux = NULL;
GstElement* sink = NULL;
- GstPad* sinkPad = NULL;
-
- ResourceSet allResourceRequired;
/* create mux to sink */
try {
@@ -114,49 +94,14 @@ ResourceSet MediaTransporterSenderSrt::buildPipeline()
LOG_ERROR("pp %s, ref %d",
GST_ELEMENT_NAME(_gst.pipeline), GST_OBJECT_REFCOUNT_VALUE(_gst.pipeline));
- /* link each element */
- for (auto& [id, mediaSource] : _mediaSources) {
- auto[ type, bin, resourceRequired ] = mediaSource->generate();
-
- LOG_INFO("mediaSource(type:%d, bin:%p, resourceRequired:%zu) generated",
- static_cast<int>(type), bin, resourceRequired.size());
-
- allResourceRequired.insert(resourceRequired.begin(), resourceRequired.end());
-
- gst_bin_add(GST_BIN(_gst.pipeline), GST_ELEMENT(bin));
-
- GstPad* srcPad = _getGhostPadFromBin(bin);
- if (gst_pad_is_linked(srcPad)) {
- LOG_ERROR("pad %s:%s is already linked", GST_DEBUG_PAD_NAME(srcPad));
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "already linked");
- }
-
- sinkPad = gst_element_request_pad_simple(mux, "sink_%d");
- if (!sinkPad)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
-
- GstPadLinkReturn res = gst_pad_link(srcPad, sinkPad);
- if (GST_PAD_LINK_FAILED(res)) {
- LOG_ERROR("failed to link pads, [%s:%s] - [%s:%s]",
- GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
-
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
- }
- LOG_INFO("pad is linked %s:%s - %s:%s", GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
- }
+ linkMediaSourceToMuxer(mux);
_srtSink = sink;
LOG_INFO("linked mux and sink");
- return allResourceRequired;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
- if (sinkPad) {
- gst_element_release_request_pad(mux, sinkPad);
- g_object_unref(sinkPad);
- }
-
gst::_destroyElementFromParent(mux);
gst::_destroyElementFromParent(sink);
diff --git a/src/MediaTransporterSenderToServerRtsp.cpp b/src/MediaTransporterSenderToServerRtsp.cpp
index a65dda0..ff6b1da 100644
--- a/src/MediaTransporterSenderToServerRtsp.cpp
+++ b/src/MediaTransporterSenderToServerRtsp.cpp
@@ -24,30 +24,10 @@
using namespace tizen_media_transporter;
-static GstPad* _getGhostPadFromBin(GstBin* bin)
-{
- GstElement* queue = gst_bin_get_by_name(bin, "srcQueue");
- if (!queue)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to get srcQueue");
-
- GstPad* srcPad = nullptr;
-
- if (!gst::_addNoTargetGhostpad(bin, &srcPad, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _addNoTargetGhostpad");
-
- if (!gst::_setGhostpadTarget(srcPad, queue, true))
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "Failed to _setGhostpadTarget");
-
- return srcPad;
-}
-
-ResourceSet MediaTransporterSenderToServerRtsp::buildPipeline()
+void MediaTransporterSenderToServerRtsp::buildPipeline()
{
GstElement *mux = NULL;
GstElement *sink = NULL;
- GstPad* sinkPad = NULL;
-
- ResourceSet allResourceRequired;
/* create mux to sink */
try {
@@ -69,47 +49,14 @@ ResourceSet MediaTransporterSenderToServerRtsp::buildPipeline()
LOG_ERROR("pp %s, ref %d",
GST_ELEMENT_NAME(_gst.pipeline), GST_OBJECT_REFCOUNT_VALUE(_gst.pipeline));
- /* link each element */
- for (auto& [id, mediaSource] : _mediaSources) {
- auto[ type, bin, resourceRequired ] = mediaSource->generate();
-
- LOG_INFO("mediaSource(type:%d, bin:%p, resourceRequired:%zu) generated",
- static_cast<int>(type), bin, resourceRequired.size());
-
- gst_bin_add(GST_BIN(_gst.pipeline), GST_ELEMENT(bin));
-
- GstPad* srcPad = _getGhostPadFromBin(bin);
- if (gst_pad_is_linked(srcPad)) {
- LOG_ERROR("pad %s:%s is already linked", GST_DEBUG_PAD_NAME(srcPad));
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "already linked");
- }
-
- sinkPad = gst_element_request_pad_simple(mux, "sink_%d");
- if (!sinkPad)
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
-
- GstPadLinkReturn res = gst_pad_link(srcPad, sinkPad);
- if (GST_PAD_LINK_FAILED(res)) {
- LOG_ERROR("failed to link pads, [%s:%s] - [%s:%s]",
- GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
-
- throw MediaTransporterException(MTPR_ERROR_INVALID_OPERATION, "failed to get request pad");
- }
- LOG_INFO("pad is linked %s:%s - %s:%s", GST_DEBUG_PAD_NAME(srcPad), GST_DEBUG_PAD_NAME(sinkPad));
- }
+ linkMediaSourceToMuxer(mux);
_rtspSink = sink;
LOG_INFO("linked mux and sink");
- return allResourceRequired;
} catch (const MediaTransporterException& e) {
LOG_ERROR("%s", e.what());
- if (sinkPad) {
- gst_element_release_request_pad(mux, sinkPad);
- g_object_unref(sinkPad);
- }
-
gst::_destroyElementFromParent(mux);
gst::_destroyElementFromParent(sink);