diff options
author | Gilbok Lee <gilbok.lee@samsung.com> | 2022-09-02 16:11:07 +0900 |
---|---|---|
committer | Gilbok Lee <gilbok.lee@samsung.com> | 2022-09-05 11:49:00 +0900 |
commit | eda4d46bc88e6f3ceebac51f74849705d853d105 (patch) | |
tree | 0c1f4ea5c66e4cb55a4c7d341bd169238efc4b1e | |
parent | 0f6716eae43ad6f4c14e94b93687d72bfb994441 (diff) | |
download | mediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.tar.gz mediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.tar.bz2 mediatransporter-eda4d46bc88e6f3ceebac51f74849705d853d105.zip |
[0.0.7] Remove the redundant code
- fix wrong log message
Change-Id: I8f898fa04fb3cbdec6a08f6bfd3b6c171b4096f7
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); |