QXmpp Version: 1.12.0
Loading...
Searching...
No Matches
QXmppCall_p.h
1// SPDX-FileCopyrightText: 2019 Jeremy Lainé <jeremy.laine@m4x.org>
2// SPDX-FileCopyrightText: 2019 Niels Ole Salscheider <ole@salscheider.org>
3// SPDX-FileCopyrightText: 2025 Linus Jahn <lnj@kaidan.im>
4//
5// SPDX-License-Identifier: LGPL-2.1-or-later
6
7#ifndef QXMPPCALL_P_H
8#define QXMPPCALL_P_H
9
10#include "QXmppCall.h"
11#include "QXmppJingleIq.h"
12
13#include "GstWrapper.h"
14
15#include <gst/gst.h>
16
17#include <QList>
18
19//
20// W A R N I N G
21// -------------
22//
23// This file is not part of the QXmpp API.
24// This header file may change from version to version without notice,
25// or even be removed.
26//
27// We mean it.
28//
29
30class QXmppCallStream;
31
32class QXmppCallPrivate : public QObject
33{
34 Q_OBJECT
35public:
36 using GstElementPtr = QXmpp::Private::GstElementPtr;
37
38 struct GstCodec {
39 int pt;
40 QString name;
41 int channels;
42 uint clockrate;
43 QString gstPay;
44 QString gstDepay;
45 QString gstEnc;
46 QString gstDec;
47 struct Property {
48 QString name;
49 int value;
50 };
51 // Use e.g. gst-inspect-1.0 x264enc to find good encoder settings for live streaming
52 QList<Property> encProps;
53 };
54
55 explicit QXmppCallPrivate(QXmppCall *qq);
56 ~QXmppCallPrivate();
57
58 void ssrcActive(uint sessionId, uint ssrc);
59 void padAdded(GstPad *pad);
60 GstCaps *ptMap(uint sessionId, uint pt);
61 static bool isFormatSupported(const QString &codecName);
62 static bool isCodecSupported(const GstCodec &codec);
63 static void filterGStreamerFormats(QList<GstCodec> &formats);
64
65 QXmppCallStream *createStream(const QString &media, const QString &creator, const QString &name);
66 QXmppCallStream *findStreamByMedia(QStringView media);
67 QXmppCallStream *findStreamByName(QStringView name);
68 QXmppCallStream *findStreamById(int id);
69 QXmppJingleIq::Content localContent(QXmppCallStream *stream) const;
70
71 bool handleDescription(QXmppCallStream *stream, const QXmppJingleIq::Content &content);
72 void handleRequest(const QXmppJingleIq &iq);
73 bool handleTransport(QXmppCallStream *stream, const QXmppJingleIq::Content &content);
74 void setState(QXmppCall::State state);
75 bool sendAck(const QXmppJingleIq &iq);
76 void sendInvite();
77 void terminate(QXmppJingleReason reason);
78
79 QXmppCall::Direction direction;
80 QString jid;
81 QString ownJid;
82 bool useDtls = false;
83 QXmppCallManager *manager;
84 QString sid;
85 QXmppCall::State state;
86
87 GstElementPtr pipeline;
88 GstElement *rtpBin;
89
90 // Media streams
91 QList<QXmppCallStream *> streams;
92 int nextId;
93
94 // Supported codecs
95 QList<GstCodec> videoCodecs = {
96 { .pt = 100, .name = QStringLiteral("H264"), .channels = 1, .clockrate = 90000, .gstPay = QStringLiteral("rtph264pay"), .gstDepay = QStringLiteral("rtph264depay"), .gstEnc = QStringLiteral("x264enc"), .gstDec = QStringLiteral("avdec_h264"), .encProps = { { QStringLiteral("tune"), 4 }, { QStringLiteral("speed-preset"), 3 }, { QStringLiteral("byte-stream"), true }, { QStringLiteral("bitrate"), 512 } } },
97 { .pt = 99, .name = QStringLiteral("VP8"), .channels = 1, .clockrate = 90000, .gstPay = QStringLiteral("rtpvp8pay"), .gstDepay = QStringLiteral("rtpvp8depay"), .gstEnc = QStringLiteral("vp8enc"), .gstDec = QStringLiteral("vp8dec"), .encProps = { { QStringLiteral("deadline"), 20000 }, { QStringLiteral("target-bitrate"), 512000 } } },
98 // vp9enc and x265enc seem to be very slow. Give them a lower priority for now.
99 { .pt = 102, .name = QStringLiteral("H265"), .channels = 1, .clockrate = 90000, .gstPay = QStringLiteral("rtph265pay"), .gstDepay = QStringLiteral("rtph265depay"), .gstEnc = QStringLiteral("x265enc"), .gstDec = QStringLiteral("avdec_h265"), .encProps = { { QStringLiteral("tune"), 4 }, { QStringLiteral("speed-preset"), 3 }, { QStringLiteral("bitrate"), 512 } } },
100 { .pt = 101, .name = QStringLiteral("VP9"), .channels = 1, .clockrate = 90000, .gstPay = QStringLiteral("rtpvp9pay"), .gstDepay = QStringLiteral("rtpvp9depay"), .gstEnc = QStringLiteral("vp9enc"), .gstDec = QStringLiteral("vp9dec"), .encProps = { { QStringLiteral("deadline"), 20000 }, { QStringLiteral("target-bitrate"), 512000 } } }
101 };
102
103 QList<GstCodec> audioCodecs = {
104 { .pt = 98, .name = QStringLiteral("OPUS"), .channels = 2, .clockrate = 48000, .gstPay = QStringLiteral("rtpopuspay"), .gstDepay = QStringLiteral("rtpopusdepay"), .gstEnc = QStringLiteral("opusenc"), .gstDec = QStringLiteral("opusdec") },
105 { .pt = 98, .name = QStringLiteral("OPUS"), .channels = 1, .clockrate = 48000, .gstPay = QStringLiteral("rtpopuspay"), .gstDepay = QStringLiteral("rtpopusdepay"), .gstEnc = QStringLiteral("opusenc"), .gstDec = QStringLiteral("opusdec") },
106 { .pt = 97, .name = QStringLiteral("SPEEX"), .channels = 1, .clockrate = 48000, .gstPay = QStringLiteral("rtpspeexpay"), .gstDepay = QStringLiteral("rtpspeexdepay"), .gstEnc = QStringLiteral("speexenc"), .gstDec = QStringLiteral("speexdec") },
107 { .pt = 97, .name = QStringLiteral("SPEEX"), .channels = 1, .clockrate = 44100, .gstPay = QStringLiteral("rtpspeexpay"), .gstDepay = QStringLiteral("rtpspeexdepay"), .gstEnc = QStringLiteral("speexenc"), .gstDec = QStringLiteral("speexdec") },
108 { .pt = 96, .name = QStringLiteral("AAC"), .channels = 2, .clockrate = 48000, .gstPay = QStringLiteral("rtpmp4apay"), .gstDepay = QStringLiteral("rtpmp4adepay"), .gstEnc = QStringLiteral("avenc_aac"), .gstDec = QStringLiteral("avdec_aac") },
109 { .pt = 96, .name = QStringLiteral("AAC"), .channels = 2, .clockrate = 44100, .gstPay = QStringLiteral("rtpmp4apay"), .gstDepay = QStringLiteral("rtpmp4adepay"), .gstEnc = QStringLiteral("avenc_aac"), .gstDec = QStringLiteral("avdec_aac") },
110 { .pt = 96, .name = QStringLiteral("AAC"), .channels = 1, .clockrate = 48000, .gstPay = QStringLiteral("rtpmp4apay"), .gstDepay = QStringLiteral("rtpmp4adepay"), .gstEnc = QStringLiteral("avenc_aac"), .gstDec = QStringLiteral("avdec_aac") },
111 { .pt = 96, .name = QStringLiteral("AAC"), .channels = 1, .clockrate = 44100, .gstPay = QStringLiteral("rtpmp4apay"), .gstDepay = QStringLiteral("rtpmp4adepay"), .gstEnc = QStringLiteral("avenc_aac"), .gstDec = QStringLiteral("avdec_aac") },
112 { .pt = 8, .name = QStringLiteral("PCMA"), .channels = 1, .clockrate = 8000, .gstPay = QStringLiteral("rtppcmapay"), .gstDepay = QStringLiteral("rtppcmadepay"), .gstEnc = QStringLiteral("alawenc"), .gstDec = QStringLiteral("alawdec") },
113 { .pt = 0, .name = QStringLiteral("PCMU"), .channels = 1, .clockrate = 8000, .gstPay = QStringLiteral("rtppcmupay"), .gstDepay = QStringLiteral("rtppcmudepay"), .gstEnc = QStringLiteral("mulawenc"), .gstDec = QStringLiteral("mulawdec") }
114 };
115
116private:
117 QXmppCall *q;
118};
119
120#endif
The QXmppCallManager class provides support for making and receiving voice calls.
Definition QXmppCallManager.h:27
Definition QXmppCallStream.h:22
Definition QXmppCall.h:23
Direction
This enum is used to describe the direction of a call.
Definition QXmppCall.h:34
State
This enum is used to describe the state of a call.
Definition QXmppCall.h:41
The QXmppJingleIq class represents an IQ used for initiating media sessions as specified by XEP-0166:...
Definition QXmppJingleData.h:415
Definition QXmppJingleData.h:350