aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppRtpChannel.h
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-04-15 15:40:09 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-04-15 15:40:09 +0000
commite1c4a3b40604db10037b59b482ff219609354165 (patch)
treef71d640613754cbbd5a87484ab49e416c0e861a0 /src/QXmppRtpChannel.h
parent807a04ef3b864ac8f0e0f170176db7dd629f742a (diff)
downloadqxmpp-e1c4a3b40604db10037b59b482ff219609354165.tar.gz
overhaul RTP / jingle stack to allow video support
Diffstat (limited to 'src/QXmppRtpChannel.h')
-rw-r--r--src/QXmppRtpChannel.h126
1 files changed, 115 insertions, 11 deletions
diff --git a/src/QXmppRtpChannel.h b/src/QXmppRtpChannel.h
index 881b31df..9b02aa2a 100644
--- a/src/QXmppRtpChannel.h
+++ b/src/QXmppRtpChannel.h
@@ -25,21 +25,42 @@
#define QXMPPRTPCHANNEL_H
#include <QIODevice>
+#include <QSize>
+#include "QXmppJingleIq.h"
#include "QXmppLogger.h"
class QXmppCodec;
class QXmppJinglePayloadType;
-class QXmppRtpChannelPrivate;
+class QXmppRtpAudioChannelPrivate;
+class QXmppRtpVideoChannelPrivate;
-/// \brief The QXmppRtpChannel class represents an RTP channel to a remote party.
+class QXmppRtpChannel
+{
+public:
+ QXmppRtpChannel();
+
+ virtual void close() = 0;
+ virtual QIODevice::OpenMode openMode() const = 0;
+ QList<QXmppJinglePayloadType> localPayloadTypes();
+ void setRemotePayloadTypes(const QList<QXmppJinglePayloadType> &remotePayloadTypes);
+
+protected:
+ virtual void payloadTypesChanged();
+
+ QList<QXmppJinglePayloadType> m_incomingPayloadTypes;
+ QList<QXmppJinglePayloadType> m_outgoingPayloadTypes;
+ bool m_outgoingPayloadNumbered;
+};
+
+/// \brief The QXmppRtpAudioChannel class represents an RTP audio channel to a remote party.
///
/// It acts as a QIODevice so that you can read / write audio samples, for
/// instance using a QAudioOutput and a QAudioInput.
///
/// \note THIS API IS NOT FINALIZED YET
-class QXmppRtpChannel : public QIODevice
+class QXmppRtpAudioChannel : public QIODevice, public QXmppRtpChannel
{
Q_OBJECT
@@ -64,18 +85,16 @@ public:
Tone_D ///< Tone for the D key.
};
- QXmppRtpChannel(QObject *parent = 0);
- ~QXmppRtpChannel();
+ QXmppRtpAudioChannel(QObject *parent = 0);
+ ~QXmppRtpAudioChannel();
QXmppJinglePayloadType payloadType() const;
- QList<QXmppJinglePayloadType> localPayloadTypes() const;
- void setRemotePayloadTypes(const QList<QXmppJinglePayloadType> &remotePayloadTypes);
-
/// \cond
qint64 bytesAvailable() const;
void close();
bool isSequential() const;
+ QIODevice::OpenMode openMode() const;
qint64 pos() const;
bool seek(qint64 pos);
/// \endcond
@@ -89,8 +108,8 @@ signals:
public slots:
void datagramReceived(const QByteArray &ba);
- void startTone(QXmppRtpChannel::Tone tone);
- void stopTone(QXmppRtpChannel::Tone tone);
+ void startTone(QXmppRtpAudioChannel::Tone tone);
+ void stopTone(QXmppRtpAudioChannel::Tone tone);
protected:
/// \cond
@@ -114,6 +133,7 @@ protected:
emit logMessage(QXmppLogger::SentMessage, qxmpp_loggable_trace(message));
}
+ void payloadTypesChanged();
qint64 readData(char * data, qint64 maxSize);
qint64 writeData(const char * data, qint64 maxSize);
/// \endcond
@@ -123,7 +143,91 @@ private slots:
void writeDatagram();
private:
- QXmppRtpChannelPrivate * const d;
+ friend class QXmppRtpAudioChannelPrivate;
+ QXmppRtpAudioChannelPrivate * d;
+};
+
+class QXmppVideoPlane
+{
+public:
+ QByteArray data;
+ int width;
+ int height;
+ int stride;
+};
+
+class QXmppVideoFrame
+{
+public:
+ enum PixelFormat {
+ Format_YUV420P = 18,
+ };
+
+ QXmppVideoPlane planes[3];
+};
+
+class QXmppVideoFormat
+{
+public:
+ QSize frameSize() const {
+ return m_frameSize;
+ }
+
+ void setFrameSize(const QSize &frameSize) {
+ m_frameSize = frameSize;
+ }
+
+ QXmppVideoFrame::PixelFormat pixelFormat() const {
+ return m_pixelFormat;
+ }
+
+ void setPixelFormat(QXmppVideoFrame::PixelFormat pixelFormat) {
+ m_pixelFormat = pixelFormat;
+ }
+
+private:
+ QSize m_frameSize;
+ QXmppVideoFrame::PixelFormat m_pixelFormat;
+};
+
+
+/// \brief The QXmppRtpVideoChannel class represents an RTP video channel to a remote party.
+///
+/// \note THIS API IS NOT FINALIZED YET
+
+class QXmppRtpVideoChannel : public QXmppLoggable, public QXmppRtpChannel
+{
+ Q_OBJECT
+
+public:
+ QXmppRtpVideoChannel(QObject *parent = 0);
+ ~QXmppRtpVideoChannel();
+
+ // incoming stream
+ QXmppVideoFormat decoderFormat() const;
+ QList<QXmppVideoFrame> readFrames();
+
+ // outgoing stream
+ QXmppVideoFormat encoderFormat() const;
+ void setEncoderFormat(const QXmppVideoFormat &format);
+ void writeFrame(const QXmppVideoFrame &frame);
+
+ QIODevice::OpenMode openMode() const;
+ void close();
+
+signals:
+ /// \brief This signal is emitted when a datagram needs to be sent.
+ void sendDatagram(const QByteArray &ba);
+
+public slots:
+ void datagramReceived(const QByteArray &ba);
+
+protected:
+ void payloadTypesChanged();
+
+private:
+ friend class QXmppRtpVideoChannelPrivate;
+ QXmppRtpVideoChannelPrivate * d;
};
#endif