[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: playground/network/kcall
From: George Kiagiadakis <gkiagiad () csd ! uoc ! gr>
Date: 2009-07-19 12:56:47
Message-ID: 1248008207.725125.23584.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 999216 by gkiagia:
Monitor for pad removals from the FsConference and correctly emit and
handle the {audio,video}SrcPadRemoved() signals from QTfChannel.
M +6 -2 kcall_handler/farsight/farsightmediahandler.cpp
M +2 -1 libqtgstreamer/qgstbus.cpp
M +38 -0 libqtgstreamer/qgstelement.cpp
M +8 -0 libqtgstreamer/qgstelement.h
M +5 -0 libqtgstreamer/qgstpad.cpp
M +3 -0 libqtgstreamer/qgstpad.h
M +47 -1 libqtpfarsight/qtfchannel.cpp
M +3 -0 libqtpfarsight/qtfchannel.h
--- trunk/playground/network/kcall/kcall_handler/farsight/farsightmediahandler.cpp #999215:999216
@@ -41,6 +41,8 @@
AudioBinPtr audioInputBin;
AudioBinPtr audioOutputBin;
QGstElementPtr audioAdder;
+
+ QHash<QByteArray, QGstPadPtr> audioAdderPadsMap;
};
FarsightMediaHandler::FarsightMediaHandler(const Tp::StreamedMediaChannelPtr & channel,
@@ -225,12 +227,14 @@
Q_ASSERT(!d->audioAdder.isNull() && !d->audioOutputBin.isNull());
QGstPadPtr sinkPad = d->audioAdder->getRequestPad("sink%d");
srcPad->link(sinkPad);
+ d->audioAdderPadsMap.insert(srcPad->property<QByteArray>("name"), sinkPad);
}
void FarsightMediaHandler::audioSrcPadRemoved(QGstPadPtr srcPad)
{
- //TODO implement me
- Q_UNUSED(srcPad);
+ QGstPadPtr sinkPad = d->audioAdderPadsMap.take(srcPad->property<QByteArray>("name"));
+ srcPad->unlink(sinkPad);
+ d->audioAdder->releaseRequestPad(sinkPad);
}
void FarsightMediaHandler::openVideoOutputDevice(bool *success)
--- trunk/playground/network/kcall/libqtgstreamer/qgstbus.cpp #999215:999216
@@ -35,7 +35,7 @@
QGstBus::QGstBus(GstBus *gstBus)
: QGstObject(GST_OBJECT(gstBus))
{
- g_signal_connect(gstBus, "message", G_CALLBACK(&QGstBusPrivate::bus_message), this);
+ g_signal_connect(m_object, "message", G_CALLBACK(&QGstBusPrivate::bus_message), this);
}
//static
@@ -46,6 +46,7 @@
QGstBus::~QGstBus()
{
+ g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstBusPrivate::bus_message, this);
}
void QGstBus::addSignalWatch()
--- trunk/playground/network/kcall/libqtgstreamer/qgstelement.cpp #999215:999216
@@ -24,9 +24,39 @@
namespace QtGstreamer {
+class QGstElementPrivate
+{
+public:
+ static void no_more_pads(GstElement *element, QGstElement *self);
+ static void pad_added(GstElement *element, GstPad *pad, QGstElement *self);
+ static void pad_removed(GstElement *element, GstPad *pad, QGstElement *self);
+};
+
+//static
+void QGstElementPrivate::no_more_pads(GstElement *element, QGstElement *self)
+{
+ emit self->noMorePads();
+}
+
+//static
+void QGstElementPrivate::pad_added(GstElement *element, GstPad *pad, QGstElement *self)
+{
+ emit self->padAdded(QGstPad::fromGstPad(pad));
+}
+
+//static
+void QGstElementPrivate::pad_removed(GstElement *element, GstPad *pad, QGstElement *self)
+{
+ emit self->padRemoved(QGstPad::fromGstPad(pad));
+}
+
+
QGstElement::QGstElement(GstElement *gstElement)
: QGstObject(GST_OBJECT(gstElement))
{
+ g_signal_connect(m_object, "no-more-pads", G_CALLBACK(&QGstElementPrivate::no_more_pads), this);
+ g_signal_connect(m_object, "pad-added", G_CALLBACK(&QGstElementPrivate::pad_added), this);
+ g_signal_connect(m_object, "pad-removed", G_CALLBACK(&QGstElementPrivate::pad_removed), this);
}
//static
@@ -37,6 +67,9 @@
QGstElement::~QGstElement()
{
+ g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::no_more_pads, this);
+ g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::pad_added, this);
+ g_signal_handlers_disconnect_by_func(m_object, (void*) &QGstElementPrivate::pad_removed, this);
}
QGstElement::State QGstElement::currentState() const
@@ -75,6 +108,11 @@
return QGstPad::fromGstPad(pad);
}
+void QGstElement::releaseRequestPad(const QGstPadPtr & pad)
+{
+ gst_element_release_request_pad(GST_ELEMENT(m_object), GST_PAD(pad->m_object));
+}
+
QGstBusPtr QGstElement::getBus()
{
return QGstBus::fromGstBus(gst_element_get_bus(GST_ELEMENT(m_object)));
--- trunk/playground/network/kcall/libqtgstreamer/qgstelement.h #999215:999216
@@ -29,12 +29,14 @@
typedef QSharedPointer<QGstBus> QGstBusPtr;
class QGstElement;
typedef QSharedPointer<QGstElement> QGstElementPtr;
+class QGstElementPrivate;
class QGstElement : public QGstObject
{
Q_OBJECT
Q_DISABLE_COPY(QGstElement)
friend class QGstBin;
+ friend class QGstElementPrivate;
public:
enum State { VoidPending, Null, Ready, Paused, Playing };
enum StateChangeReturn { StateChangeFailure, StateChangeSuccess,
@@ -49,6 +51,7 @@
bool addPad(const QGstPadPtr & pad);
QGstPadPtr getStaticPad(const char *name);
QGstPadPtr getRequestPad(const char *name);
+ void releaseRequestPad(const QGstPadPtr & pad);
QGstBusPtr getBus();
@@ -72,6 +75,11 @@
const QGstElementPtr & element9 = QGstElementPtr(),
const QGstElementPtr & element10 = QGstElementPtr());
+Q_SIGNALS:
+ void noMorePads();
+ void padAdded(QtGstreamer::QGstPadPtr pad);
+ void padRemoved(QtGstreamer::QGstPadPtr pad);
+
protected:
QGstElement(GstElement *gstElement);
};
--- trunk/playground/network/kcall/libqtgstreamer/qgstpad.cpp #999215:999216
@@ -34,6 +34,11 @@
{
}
+QGstPad::Direction QGstPad::direction() const
+{
+ return static_cast<Direction>(gst_pad_get_direction(GST_PAD(m_object)));
+}
+
bool QGstPad::isLinked() const
{
return gst_pad_is_linked(GST_PAD(m_object));
--- trunk/playground/network/kcall/libqtgstreamer/qgstpad.h #999215:999216
@@ -36,10 +36,13 @@
public:
enum LinkReturn { Ok = 0, WrongHierarchy = -1, WasLinked = -2, WrongDirection = -3,
NoFormat = -4, NoSched = -5, Refused = -6 };
+ enum Direction { Unknown, Src, Sink };
static QGstPadPtr fromGstPad(GstPad *gstPad);
virtual ~QGstPad();
+ Direction direction() const;
+
bool isLinked() const;
LinkReturn link(const QGstPadPtr &other);
bool unlink(const QGstPadPtr & other);
--- trunk/playground/network/kcall/libqtpfarsight/qtfchannel.cpp #999215:999216
@@ -30,7 +30,12 @@
~Private();
void init(Tp::StreamedMediaChannelPtr channel, QGstBusPtr bus);
+
+ //slots
void onBusMessage(GstMessage *message);
+ void onAudioSrcPadAdded(QtGstreamer::QGstPadPtr pad);
+ void onVideoSrcPadAdded(QtGstreamer::QGstPadPtr pad);
+ void onConferencePadRemoved(QtGstreamer::QGstPadPtr pad);
static gboolean busWatch(GstBus *bus, GstMessage *message, QTfChannel::Private *self);
static void onTfChannelClosed(TfChannel *tfChannel, QTfChannel::Private *self);
@@ -50,6 +55,10 @@
QTfChannel *const q;
QGstBusPtr m_bus;
+ QList<QByteArray> m_audioSrcPads;
+ QList<QByteArray> m_videoSrcPads;
+ QGstElementPtr m_conference;
+
QMutex m_srcPadAddedMutex;
bool m_audioOutputDeviceIsOpen;
bool m_videoOutputDeviceIsOpen;
@@ -83,6 +92,11 @@
m_bus = bus;
connect(bus.data(), SIGNAL(message(GstMessage*)), q, SLOT(onBusMessage(GstMessage*)));
+ connect(q, SIGNAL(audioSrcPadAdded(QtGstreamer::QGstPadPtr)),
+ q, SLOT(onAudioSrcPadAdded(QtGstreamer::QGstPadPtr)));
+ connect(q, SIGNAL(videoSrcPadAdded(QtGstreamer::QGstPadPtr)),
+ q, SLOT(onVideoSrcPadAdded(QtGstreamer::QGstPadPtr)));
+
qRegisterMetaType<QGstPadPtr>();
}
@@ -91,6 +105,35 @@
tf_channel_bus_message(m_tfChannel, message);
}
+void QTfChannel::Private::onAudioSrcPadAdded(QGstPadPtr pad)
+{
+ m_audioSrcPads.append(pad->property<QByteArray>("name"));
+}
+
+void QTfChannel::Private::onVideoSrcPadAdded(QGstPadPtr pad)
+{
+ m_videoSrcPads.append(pad->property<QByteArray>("name"));
+}
+
+void QTfChannel::Private::onConferencePadRemoved(QGstPadPtr pad)
+{
+ if ( pad->direction() != QGstPad::Src ) {
+ return;
+ }
+
+ QByteArray name = pad->property<QByteArray>("name");
+ int index = -1;
+ if ( (index = m_audioSrcPads.indexOf(name)) != -1 ) {
+ m_audioSrcPads.removeAt(index);
+ emit q->audioSrcPadRemoved(pad);
+ } else if ( (index = m_videoSrcPads.indexOf(name)) != -1 ) {
+ m_videoSrcPads.removeAt(index);
+ emit q->videoSrcPadRemoved(pad);
+ } else {
+ Q_ASSERT(false);
+ }
+}
+
void QTfChannel::Private::onTfChannelClosed(TfChannel *tfChannel, QTfChannel::Private *self)
{
Q_UNUSED(tfChannel);
@@ -104,7 +147,10 @@
Q_UNUSED(tfChannel);
Q_UNUSED(participant);
self->m_bus->addSignalWatch();
- emit self->q->sessionCreated(QGstElement::fromGstElement(GST_ELEMENT(conference)));
+ self->m_conference = QGstElement::fromGstElement(GST_ELEMENT(conference));
+ connect(self->m_conference.data(), SIGNAL(padRemoved(QtGstreamer::QGstPadPtr)),
+ self->q, SLOT(onConferencePadRemoved(QtGstreamer::QGstPadPtr)));
+ emit self->q->sessionCreated(self->m_conference);
}
--- trunk/playground/network/kcall/libqtpfarsight/qtfchannel.h #999215:999216
@@ -57,6 +57,9 @@
friend class Private;
Private *const d;
Q_PRIVATE_SLOT(d, void onBusMessage(GstMessage *message));
+ Q_PRIVATE_SLOT(d, void onAudioSrcPadAdded(QtGstreamer::QGstPadPtr pad));
+ Q_PRIVATE_SLOT(d, void onVideoSrcPadAdded(QtGstreamer::QGstPadPtr pad));
+ Q_PRIVATE_SLOT(d, void onConferencePadRemoved(QtGstreamer::QGstPadPtr pad));
};
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic