Qt6 API Reference

Qt6 bindings for MediaX video streaming with GUI integration.

Overview

MediaX Qt6 provides QWidget-based video display and streaming integration:

  • QtRtpReceiver - Video player widget
  • QtRtpTransmitter - Video transmit from Qt
  • QtSapListener - SAP discovery with Qt signals
  • QtSapAnnouncer - SAP announcement

Installation

Qt6 bindings require:

  • Qt6 Widgets, Multimedia
  • MediaX core library
# Install dependencies
sudo apt install qt6-base-dev qt6-multimedia-dev

# Build with Qt6 support
cmake -DBUILD_QT6=ON ..

QtRtpReceiver

Video player widget for RTP streams.

#include "qt6/qt_rtp_receiver.h"

Class Definition

class mediax::qt6::QtRtpReceiver : public QWidget {
    Q_OBJECT

public:
    explicit QtRtpReceiver(QWidget* parent = nullptr);

    void SetStreamInfo(const rtp::StreamInformation& info);
    bool Start();
    void Stop();
    bool IsRunning() const;

signals:
    void frameReceived();
    void connectionLost();
    void errorOccurred(const QString& message);
};

Usage

#include <QApplication>
#include <QMainWindow>
#include "qt6/qt_rtp_receiver.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QMainWindow window;

    mediax::qt6::QtRtpReceiver* receiver = new mediax::qt6::QtRtpReceiver(&window);
    window.setCentralWidget(receiver);

    mediax::rtp::StreamInformation stream_info;
    stream_info.hostname = "239.192.1.1";
    stream_info.port = 5004;
    stream_info.width = 1920;
    stream_info.height = 1080;
    stream_info.encoding = mediax::rtp::ColourspaceType::kColourspaceRgb24;

    receiver->SetStreamInfo(stream_info);
    receiver->Start();

    window.resize(1280, 720);
    window.show();

    return app.exec();
}

QtRtpTransmitter

Transmit video from Qt applications.

Header

#include "qt6/qt_rtp_transmitter.h"

Class Definition

class mediax::qt6::QtRtpTransmitter : public QObject {
    Q_OBJECT

public:
    explicit QtRtpTransmitter(QObject* parent = nullptr);

    void SetStreamInfo(const rtp::StreamInformation& info);
    bool Open();
    void Close();
    bool Transmit(const QImage& image);
    bool Transmit(const uint8_t* data, size_t size);

signals:
    void frameSent();
    void errorOccurred(const QString& message);
};

Usage

#include "qt6/qt_rtp_transmitter.h"
#include <QImage>

mediax::qt6::QtRtpTransmitter transmitter;

mediax::rtp::StreamInformation stream_info;
stream_info.session_name = "qt-stream";
stream_info.hostname = "239.192.1.1";
stream_info.port = 5004;
stream_info.width = 1920;
stream_info.height = 1080;
stream_info.framerate = 30;
stream_info.encoding = mediax::rtp::ColourspaceType::kColourspaceRgb24;

transmitter.SetStreamInfo(stream_info);
transmitter.Open();

// Transmit QImage
QImage image(1920, 1080, QImage::Format_RGB888);
image.fill(Qt::red);
transmitter.Transmit(image);

transmitter.Close();

QtSapListener

SAP discovery with Qt signal/slot integration.

Header

#include "qt6/qt_sap_listener.h"

Class Definition

class mediax::qt6::QtSapListener : public QObject {
    Q_OBJECT

public:
    explicit QtSapListener(QObject* parent = nullptr);

    void Start();
    void Stop();
    QList<rtp::StreamInformation> GetStreams() const;

signals:
    void streamDiscovered(const mediax::rtp::StreamInformation& stream);
    void streamRemoved(const QString& sessionName);
};

Usage

#include "qt6/qt_sap_listener.h"
#include <QDebug>

mediax::qt6::QtSapListener listener;

QObject::connect(&listener, &mediax::qt6::QtSapListener::streamDiscovered,
    [](const mediax::rtp::StreamInformation& stream) {
        qDebug() << "Discovered:" << QString::fromStdString(stream.session_name);
        qDebug() << "  Address:" << QString::fromStdString(stream.hostname)
                 << ":" << stream.port;
    });

listener.Start();

QtSapAnnouncer

SAP announcement for Qt applications.

Header

#include "qt6/qt_sap_announcer.h"

Class Definition

class mediax::qt6::QtSapAnnouncer : public QObject {
    Q_OBJECT

public:
    explicit QtSapAnnouncer(QObject* parent = nullptr);

    void AddStream(const rtp::StreamInformation& info);
    void RemoveStream(const QString& sessionName);
    void RemoveAllStreams();
    void Start();
    void Stop();
};

Usage

#include "qt6/qt_sap_announcer.h"

mediax::qt6::QtSapAnnouncer announcer;

mediax::rtp::StreamInformation stream_info;
stream_info.session_name = "qt-announced";
stream_info.hostname = "239.192.1.1";
stream_info.port = 5004;
stream_info.width = 1920;
stream_info.height = 1080;
stream_info.framerate = 30;
stream_info.encoding = mediax::rtp::ColourspaceType::kColourspaceRgb24;

announcer.AddStream(stream_info);
announcer.Start();

// ... run application ...

announcer.Stop();
announcer.RemoveAllStreams();

Complete Application Example

#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QComboBox>
#include <QPushButton>
#include "qt6/qt_rtp_receiver.h"
#include "qt6/qt_sap_listener.h"

class StreamViewer : public QMainWindow {
    Q_OBJECT

public:
    StreamViewer() {
        QWidget* central = new QWidget(this);
        QVBoxLayout* layout = new QVBoxLayout(central);

        // Stream selector
        streamCombo = new QComboBox(this);
        layout->addWidget(streamCombo);

        // Connect button
        QPushButton* connectBtn = new QPushButton("Connect", this);
        layout->addWidget(connectBtn);
        connect(connectBtn, &QPushButton::clicked, this, &StreamViewer::connectStream);

        // Video display
        receiver = new mediax::qt6::QtRtpReceiver(this);
        layout->addWidget(receiver);

        setCentralWidget(central);

        // SAP listener
        connect(&sapListener, &mediax::qt6::QtSapListener::streamDiscovered,
                this, &StreamViewer::onStreamDiscovered);
        sapListener.Start();
    }

private slots:
    void onStreamDiscovered(const mediax::rtp::StreamInformation& stream) {
        QString name = QString::fromStdString(stream.session_name);
        streamCombo->addItem(name);
        streams[name] = stream;
    }

    void connectStream() {
        QString selected = streamCombo->currentText();
        if (streams.contains(selected)) {
            receiver->Stop();
            receiver->SetStreamInfo(streams[selected]);
            receiver->Start();
        }
    }

private:
    QComboBox* streamCombo;
    mediax::qt6::QtRtpReceiver* receiver;
    mediax::qt6::QtSapListener sapListener;
    QMap<QString, mediax::rtp::StreamInformation> streams;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    StreamViewer viewer;
    viewer.resize(1280, 720);
    viewer.show();

    return app.exec();
}

CMake Integration

find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia)
find_package(mediax REQUIRED)

target_link_libraries(your_app PRIVATE
    Qt6::Widgets
    Qt6::Multimedia
    mediax::mediaxqt
)

Thread Safety

  • All Qt6 classes are designed for use from the main thread
  • Video frames are processed in background threads
  • Signal/slot connections handle cross-thread communication
  • Use Qt::QueuedConnection for thread-safe slot invocation

Support