123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /*
- * Copyright (C) 2008-2012 The QXmpp developers
- *
- * Author:
- * Jeremy Lainé
- *
- * Source:
- * http://code.google.com/p/qxmpp
- *
- * This file is a part of QXmpp library.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- */
- #ifndef QXMPPRTPCHANNEL_H
- #define QXMPPRTPCHANNEL_H
- #include <QIODevice>
- #include <QSize>
- #include "QXmppJingleIq.h"
- #include "QXmppLogger.h"
- class QXmppCodec;
- class QXmppJinglePayloadType;
- class QXmppRtpAudioChannelPrivate;
- class QXmppRtpVideoChannelPrivate;
- /// \brief The QXmppRtpPacket class represents an RTP packet.
- ///
- class QXMPP_EXPORT QXmppRtpPacket
- {
- public:
- bool decode(const QByteArray &ba);
- QByteArray encode() const;
- QString toString() const;
- /// RTP version.
- quint8 version;
- /// Marker flag.
- bool marker;
- /// Payload type.
- quint8 type;
- /// Synchronization source.
- quint32 ssrc;
- /// Contributing sources.
- QList<quint32> csrc;
- /// Sequence number.
- quint16 sequence;
- /// Timestamp.
- quint32 stamp;
- /// Raw payload data.
- QByteArray payload;
- };
- class QXMPP_EXPORT QXmppRtpChannel
- {
- public:
- QXmppRtpChannel();
- /// Closes the RTP channel.
- virtual void close() = 0;
- /// Returns the mode in which the channel has been opened.
- virtual QIODevice::OpenMode openMode() const = 0;
- QList<QXmppJinglePayloadType> localPayloadTypes();
- void setRemotePayloadTypes(const QList<QXmppJinglePayloadType> &remotePayloadTypes);
- protected:
- /// \cond
- virtual void payloadTypesChanged() = 0;
- QList<QXmppJinglePayloadType> m_incomingPayloadTypes;
- QList<QXmppJinglePayloadType> m_outgoingPayloadTypes;
- bool m_outgoingPayloadNumbered;
- /// \endcond
- };
- /// \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 QXMPP_EXPORT QXmppRtpAudioChannel : public QIODevice, public QXmppRtpChannel
- {
- Q_OBJECT
- Q_ENUMS(Tone)
- public:
- /// This enum is used to describe a DTMF tone.
- enum Tone {
- Tone_0 = 0, ///< Tone for the 0 key.
- Tone_1, ///< Tone for the 1 key.
- Tone_2, ///< Tone for the 2 key.
- Tone_3, ///< Tone for the 3 key.
- Tone_4, ///< Tone for the 4 key.
- Tone_5, ///< Tone for the 5 key.
- Tone_6, ///< Tone for the 6 key.
- Tone_7, ///< Tone for the 7 key.
- Tone_8, ///< Tone for the 8 key.
- Tone_9, ///< Tone for the 9 key.
- Tone_Star, ///< Tone for the * key.
- Tone_Pound, ///< Tone for the # key.
- Tone_A, ///< Tone for the A key.
- Tone_B, ///< Tone for the B key.
- Tone_C, ///< Tone for the C key.
- Tone_D ///< Tone for the D key.
- };
- QXmppRtpAudioChannel(QObject *parent = 0);
- ~QXmppRtpAudioChannel();
- qint64 bytesAvailable() const;
- void close();
- bool isSequential() const;
- QIODevice::OpenMode openMode() const;
- QXmppJinglePayloadType payloadType() const;
- qint64 pos() const;
- bool seek(qint64 pos);
- signals:
- /// \brief This signal is emitted when a datagram needs to be sent.
- void sendDatagram(const QByteArray &ba);
- /// \brief This signal is emitted to send logging messages.
- void logMessage(QXmppLogger::MessageType type, const QString &msg);
- public slots:
- void datagramReceived(const QByteArray &ba);
- void startTone(QXmppRtpAudioChannel::Tone tone);
- void stopTone(QXmppRtpAudioChannel::Tone tone);
- protected:
- /// \cond
- void debug(const QString &message)
- {
- emit logMessage(QXmppLogger::DebugMessage, qxmpp_loggable_trace(message));
- }
- void warning(const QString &message)
- {
- emit logMessage(QXmppLogger::WarningMessage, qxmpp_loggable_trace(message));
- }
- void logReceived(const QString &message)
- {
- emit logMessage(QXmppLogger::ReceivedMessage, qxmpp_loggable_trace(message));
- }
- void logSent(const QString &message)
- {
- emit logMessage(QXmppLogger::SentMessage, qxmpp_loggable_trace(message));
- }
- void payloadTypesChanged();
- qint64 readData(char * data, qint64 maxSize);
- qint64 writeData(const char * data, qint64 maxSize);
- /// \endcond
- private slots:
- void emitSignals();
- void writeDatagram();
- private:
- friend class QXmppRtpAudioChannelPrivate;
- QXmppRtpAudioChannelPrivate * d;
- };
- /// \brief The QXmppVideoFrame class provides a representation of a frame of video data.
- ///
- /// \note THIS API IS NOT FINALIZED YET
- class QXMPP_EXPORT QXmppVideoFrame
- {
- public:
- /// This enum describes a pixel format.
- enum PixelFormat {
- Format_Invalid = 0, ///< The frame is invalid.
- Format_RGB32 = 3, ///< The frame stored using a 32-bit RGB format (0xffRRGGBB).
- Format_RGB24 = 4, ///< The frame is stored using a 24-bit RGB format (8-8-8).
- Format_YUV420P = 18, ///< The frame is stored using an 8-bit per component planar
- ///< YUV format with the U and V planes horizontally and
- ///< vertically sub-sampled, i.e. the height and width of the
- ///< U and V planes are half that of the Y plane.
- Format_UYVY = 20, ///< The frame is stored using an 8-bit per component packed
- ///< YUV format with the U and V planes horizontally
- ///< sub-sampled (U-Y-V-Y), i.e. two horizontally adjacent
- ///< pixels are stored as a 32-bit macropixel which has a Y
- ///< value for each pixel and common U and V values.
- Format_YUYV = 21, ///< The frame is stored using an 8-bit per component packed
- ///< YUV format with the U and V planes horizontally
- ///< sub-sampled (Y-U-Y-V), i.e. two horizontally adjacent
- ///< pixels are stored as a 32-bit macropixel which has a Y
- ///< value for each pixel and common U and V values.
- };
- QXmppVideoFrame();
- QXmppVideoFrame(int bytes, const QSize &size, int bytesPerLine, PixelFormat format);
- uchar *bits();
- const uchar *bits() const;
- int bytesPerLine() const;
- int height() const;
- bool isValid() const;
- int mappedBytes() const;
- PixelFormat pixelFormat() const;
- QSize size() const;
- int width() const;
- private:
- int m_bytesPerLine;
- QByteArray m_data;
- int m_height;
- int m_mappedBytes;
- PixelFormat m_pixelFormat;
- int m_width;
- };
- class QXMPP_EXPORT QXmppVideoFormat
- {
- public:
- int frameHeight() const {
- return m_frameSize.height();
- }
- int frameWidth() const {
- return m_frameSize.width();
- }
- qreal frameRate() const {
- return m_frameRate;
- }
- void setFrameRate(qreal frameRate) {
- m_frameRate = frameRate;
- }
- 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:
- qreal m_frameRate;
- 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 QXMPP_EXPORT QXmppRtpVideoChannel : public QXmppLoggable, public QXmppRtpChannel
- {
- Q_OBJECT
- public:
- QXmppRtpVideoChannel(QObject *parent = 0);
- ~QXmppRtpVideoChannel();
- void close();
- QIODevice::OpenMode openMode() const;
- // incoming stream
- QXmppVideoFormat decoderFormat() const;
- QList<QXmppVideoFrame> readFrames();
- // outgoing stream
- QXmppVideoFormat encoderFormat() const;
- void setEncoderFormat(const QXmppVideoFormat &format);
- void writeFrame(const QXmppVideoFrame &frame);
- 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:
- /// \cond
- void payloadTypesChanged();
- /// \endcond
- private:
- friend class QXmppRtpVideoChannelPrivate;
- QXmppRtpVideoChannelPrivate * d;
- };
- #endif
|