aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppRtcpPacket.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-26 09:58:26 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-26 09:58:26 +0200
commit2ab9a9b06f8e6e93c953a8be52e24969c599cd6c (patch)
treeba5486dbd138ffdc2035731794410ea1d71d1827 /src/base/QXmppRtcpPacket.cpp
parent3fa128ca62939dff7e161cc2ead6ade90f3c3578 (diff)
downloadqxmpp-2ab9a9b06f8e6e93c953a8be52e24969c599cd6c.tar.gz
RTCP: start decode sender reports
Diffstat (limited to 'src/base/QXmppRtcpPacket.cpp')
-rw-r--r--src/base/QXmppRtcpPacket.cpp336
1 files changed, 259 insertions, 77 deletions
diff --git a/src/base/QXmppRtcpPacket.cpp b/src/base/QXmppRtcpPacket.cpp
index f8bb56ed..7394fa97 100644
--- a/src/base/QXmppRtcpPacket.cpp
+++ b/src/base/QXmppRtcpPacket.cpp
@@ -43,12 +43,40 @@ public:
/// Raw payload data.
QByteArray payload;
+ QXmppRtcpSenderReport senderReport;
+ QList<QXmppRtcpReceiverReport> receiverReports;
QList<QXmppRtcpSourceDescription> sourceDescriptions;
};
+class QXmppRtcpReceiverReportPrivate : public QSharedData
+{
+public:
+ QXmppRtcpReceiverReportPrivate();
+ bool read(QDataStream &stream);
+ void write(QDataStream &stream) const;
+
+ quint32 ssrc;
+ QByteArray blob;
+};
+
+class QXmppRtcpSenderReportPrivate : public QSharedData
+{
+public:
+ QXmppRtcpSenderReportPrivate();
+ bool read(QDataStream &stream);
+ void write(QDataStream &stream) const;
+
+ quint32 ssrc;
+ quint64 ntpStamp;
+ quint32 rtpStamp;
+ quint32 packetCount;
+ quint32 octetCount;
+};
+
class QXmppRtcpSourceDescriptionPrivate : public QSharedData
{
public:
+ QXmppRtcpSourceDescriptionPrivate();
bool read(QDataStream &stream);
void write(QDataStream &stream) const;
@@ -67,7 +95,7 @@ QXmppRtcpPacket::QXmppRtcpPacket()
/// Constructs a copy of other.
///
/// \param other
-///
+
QXmppRtcpPacket::QXmppRtcpPacket(const QXmppRtcpPacket &other)
: d(other.d)
{
@@ -77,16 +105,6 @@ QXmppRtcpPacket::~QXmppRtcpPacket()
{
}
-/// Assigns the other packet to this one.
-///
-/// \param other
-///
-QXmppRtcpPacket& QXmppRtcpPacket::operator=(const QXmppRtcpPacket& other)
-{
- d = other.d;
- return *this;
-}
-
/// Parses an RTCP packet.
///
/// \param ba
@@ -131,8 +149,20 @@ bool QXmppRtcpPacket::read(QDataStream &stream)
if (stream.readRawData(d->payload.data(), payloadLength) != payloadLength)
return false;
- if (d->type == SourceDescription) {
- QDataStream s(d->payload);
+ QDataStream s(d->payload);
+ d->receiverReports.clear();
+ d->senderReport = QXmppRtcpSenderReport();
+ d->sourceDescriptions.clear();
+ if (d->type == SenderReport) {
+ if (!d->senderReport.d->read(s))
+ return false;
+ for (int j = 0; j < d->count; ++j) {
+ QXmppRtcpReceiverReport receiverReport;
+ if (!receiverReport.d->read(s))
+ return false;
+ d->receiverReports << receiverReport;
+ }
+ } else if (d->type == SourceDescription) {
for (int j = 0; j < d->count; ++j) {
QXmppRtcpSourceDescription desc;
if (!desc.d->read(s))
@@ -148,9 +178,12 @@ void QXmppRtcpPacket::write(QDataStream &stream) const
QByteArray payload;
quint8 count;
- if (d->type == SourceDescription) {
+ QDataStream s(&payload, QIODevice::WriteOnly);
+ if (d->type == SenderReport) {
+ count = 0;
+ d->senderReport.d->write(s);
+ } else if (d->type == SourceDescription) {
count = d->sourceDescriptions.size();
- QDataStream s(&payload, QIODevice::WriteOnly);
foreach (const QXmppRtcpSourceDescription &desc, d->sourceDescriptions)
desc.d->write(s);
} else {
@@ -164,25 +197,24 @@ void QXmppRtcpPacket::write(QDataStream &stream) const
stream.writeRawData(payload.constData(), payload.size());
}
-/// Returns the number of report blocks.
-
-quint8 QXmppRtcpPacket::count() const
+QList<QXmppRtcpReceiverReport> QXmppRtcpPacket::receiverReports() const
{
- return d->count;
+ return d->receiverReports;
}
-/// Sets the number of report blocks.
-///
-/// \param count
+void QXmppRtcpPacket::setReceiverReports(const QList<QXmppRtcpReceiverReport> &reports)
+{
+ d->receiverReports = reports;
+}
-void QXmppRtcpPacket::setCount(quint8 count)
+QXmppRtcpSenderReport QXmppRtcpPacket::senderReport() const
{
- d->count = count;
+ return d->senderReport;
}
-QByteArray QXmppRtcpPacket::payload() const
+void QXmppRtcpPacket::setSenderReport(const QXmppRtcpSenderReport &report)
{
- return d->payload;
+ d->senderReport = report;
}
QList<QXmppRtcpSourceDescription> QXmppRtcpPacket::sourceDescriptions() const
@@ -211,6 +243,207 @@ void QXmppRtcpPacket::setType(quint8 type)
d->type = type;
}
+/// Constructs an empty receiver report.
+
+QXmppRtcpReceiverReport::QXmppRtcpReceiverReport()
+ : d(new QXmppRtcpReceiverReportPrivate())
+{
+}
+
+/// Constructs a copy of other.
+///
+/// \param other
+
+QXmppRtcpReceiverReport::QXmppRtcpReceiverReport(const QXmppRtcpReceiverReport &other)
+ : d(other.d)
+{
+}
+
+QXmppRtcpReceiverReport::~QXmppRtcpReceiverReport()
+{
+}
+
+quint32 QXmppRtcpReceiverReport::ssrc() const
+{
+ return d->ssrc;
+}
+
+void QXmppRtcpReceiverReport::setSsrc(quint32 ssrc)
+{
+ d->ssrc = ssrc;
+}
+
+QXmppRtcpReceiverReportPrivate::QXmppRtcpReceiverReportPrivate()
+ : ssrc(0)
+{
+ blob.resize(20);
+}
+
+bool QXmppRtcpReceiverReportPrivate::read(QDataStream &stream)
+{
+ stream >> ssrc;
+ return stream.readRawData(blob.data(), blob.size()) == blob.size();
+}
+
+void QXmppRtcpReceiverReportPrivate::write(QDataStream &stream) const
+{
+ stream << ssrc;
+ stream.writeRawData(blob.constData(), blob.size());
+}
+
+/// Constructs an empty sender report.
+
+QXmppRtcpSenderReport::QXmppRtcpSenderReport()
+ : d(new QXmppRtcpSenderReportPrivate())
+{
+}
+
+/// Constructs a copy of other.
+///
+/// \param other
+
+QXmppRtcpSenderReport::QXmppRtcpSenderReport(const QXmppRtcpSenderReport &other)
+ : d(other.d)
+{
+}
+
+QXmppRtcpSenderReport::~QXmppRtcpSenderReport()
+{
+}
+
+quint64 QXmppRtcpSenderReport::ntpStamp() const
+{
+ return d->ntpStamp;
+}
+
+void QXmppRtcpSenderReport::setNtpStamp(quint64 ntpStamp)
+{
+ d->ntpStamp = ntpStamp;
+}
+
+quint32 QXmppRtcpSenderReport::rtpStamp() const
+{
+ return d->rtpStamp;
+}
+
+void QXmppRtcpSenderReport::setRtpStamp(quint32 rtpStamp)
+{
+ d->rtpStamp = rtpStamp;
+}
+
+quint32 QXmppRtcpSenderReport::ssrc() const
+{
+ return d->ssrc;
+}
+
+void QXmppRtcpSenderReport::setSsrc(quint32 ssrc)
+{
+ d->ssrc = ssrc;
+}
+
+quint32 QXmppRtcpSenderReport::octetCount() const
+{
+ return d->octetCount;
+}
+
+void QXmppRtcpSenderReport::setOctetCount(quint32 count)
+{
+ d->octetCount = count;
+}
+
+quint32 QXmppRtcpSenderReport::packetCount() const
+{
+ return d->packetCount;
+}
+
+void QXmppRtcpSenderReport::setPacketCount(quint32 count)
+{
+ d->packetCount = count;
+}
+
+QXmppRtcpSenderReportPrivate::QXmppRtcpSenderReportPrivate()
+ : ssrc(0)
+ , ntpStamp(0)
+ , rtpStamp(0)
+ , packetCount(0)
+ , octetCount(0)
+{
+}
+
+bool QXmppRtcpSenderReportPrivate::read(QDataStream &stream)
+{
+ stream >> ssrc;
+ stream >> ntpStamp;
+ stream >> rtpStamp;
+ stream >> packetCount;
+ stream >> octetCount;
+ return stream.status() == QDataStream::Ok;
+}
+
+void QXmppRtcpSenderReportPrivate::write(QDataStream &stream) const
+{
+ stream << ssrc;
+ stream << ntpStamp;
+ stream << rtpStamp;
+ stream << packetCount;
+ stream << octetCount;
+}
+
+/// Constructs an empty source description
+
+QXmppRtcpSourceDescription::QXmppRtcpSourceDescription()
+ : d(new QXmppRtcpSourceDescriptionPrivate())
+{
+}
+
+/// Constructs a copy of other.
+///
+/// \param other
+
+QXmppRtcpSourceDescription::QXmppRtcpSourceDescription(const QXmppRtcpSourceDescription &other)
+ : d(other.d)
+{
+}
+
+QXmppRtcpSourceDescription::~QXmppRtcpSourceDescription()
+{
+}
+
+QString QXmppRtcpSourceDescription::cname() const
+{
+ return d->cname;
+}
+
+void QXmppRtcpSourceDescription::setCname(const QString &cname)
+{
+ d->cname = cname;
+}
+
+QString QXmppRtcpSourceDescription::name() const
+{
+ return d->name;
+}
+
+void QXmppRtcpSourceDescription::setName(const QString &name)
+{
+ d->name = name;
+}
+
+quint32 QXmppRtcpSourceDescription::ssrc() const
+{
+ return d->ssrc;
+}
+
+void QXmppRtcpSourceDescription::setSsrc(quint32 ssrc)
+{
+ d->ssrc = ssrc;
+}
+
+QXmppRtcpSourceDescriptionPrivate::QXmppRtcpSourceDescriptionPrivate()
+ : ssrc(0)
+{
+}
+
bool QXmppRtcpSourceDescriptionPrivate::read(QDataStream &stream)
{
QByteArray buffer;
@@ -280,54 +513,3 @@ void QXmppRtcpSourceDescriptionPrivate::write(QDataStream &stream) const
stream.writeRawData(buffer.constData(), buffer.size());
}
}
-
-/// Constructs an empty source description
-
-QXmppRtcpSourceDescription::QXmppRtcpSourceDescription()
- : d(new QXmppRtcpSourceDescriptionPrivate())
-{
- d->ssrc = 0;
-}
-
-/// Constructs a copy of other.
-///
-/// \param other
-///
-QXmppRtcpSourceDescription::QXmppRtcpSourceDescription(const QXmppRtcpSourceDescription &other)
- : d(other.d)
-{
-}
-
-QXmppRtcpSourceDescription::~QXmppRtcpSourceDescription()
-{
-}
-
-QString QXmppRtcpSourceDescription::cname() const
-{
- return d->cname;
-}
-
-void QXmppRtcpSourceDescription::setCname(const QString &cname)
-{
- d->cname = cname;
-}
-
-QString QXmppRtcpSourceDescription::name() const
-{
- return d->name;
-}
-
-void QXmppRtcpSourceDescription::setName(const QString &name)
-{
- d->name = name;
-}
-
-quint32 QXmppRtcpSourceDescription::ssrc() const
-{
- return d->ssrc;
-}
-
-void QXmppRtcpSourceDescription::setSsrc(quint32 ssrc)
-{
- d->ssrc = ssrc;
-}