Browse Source

Build shared live video library independently from stream publication

master
evgeny 4 days ago
parent
commit
43a90ff23b
  1. 11
      tools/chatgui/CMakeLists.txt
  2. 14
      tools/chatgui/tests/test_stream_publish.cpp

11
tools/chatgui/CMakeLists.txt

@ -139,12 +139,15 @@ if(PkgConfig_FOUND)
endif()
# Общий sender остаётся в libutun; Qt захватывает видео, FFmpeg/Opus работают в publisher workers.
add_library(chatgui_stream_publish STATIC src/stream_video_encoder.cpp src/stream_publish_engine.cpp src/stream_publish_window.cpp)
target_link_libraries(chatgui_stream_publish PUBLIC ${QT_LIBS} utun PRIVATE ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
target_include_directories(chatgui_stream_publish PRIVATE ${FFMPEG_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/../../lib/libopus/include)
add_library(chatgui_live_video STATIC src/live_video_encoder.cpp)
target_link_libraries(chatgui_live_video PUBLIC ${QT_LIBS} utun PRIVATE ${FFMPEG_TARGET} ${FFMPEG_LIBRARIES})
target_include_directories(chatgui_live_video PRIVATE ${FFMPEG_INCLUDE_DIRS})
if(FFMPEG_FOUND)
target_compile_definitions(chatgui_stream_publish PRIVATE HAVE_FFMPEG)
target_compile_definitions(chatgui_live_video PRIVATE HAVE_FFMPEG)
endif()
add_library(chatgui_stream_publish STATIC src/stream_publish_engine.cpp src/stream_publish_window.cpp)
target_link_libraries(chatgui_stream_publish PUBLIC chatgui_live_video)
target_include_directories(chatgui_stream_publish PRIVATE ${CMAKE_SOURCE_DIR}/../../lib/libopus/include)
set(GUI_CAPTURE_ENABLED 0)
if(QT_PACKAGE STREQUAL "Qt6" AND FFMPEG_FOUND)
set(GUI_BASE_QT6_FOUND ${Qt6_FOUND})

14
tools/chatgui/tests/test_stream_publish.cpp

@ -8,7 +8,7 @@
#include <atomic>
#include <thread>
#include <cmath>
#include "../src/stream_video_encoder.h"
#include "../src/live_video_encoder.h"
#include "../src/stream_publish_engine.h"
#include "../src/stream_publish_window.h"
#include "../src/sound_manager.h"
@ -77,10 +77,10 @@ class StreamPublishTest : public QObject {
Q_UNUSED(codec); Q_UNUSED(width); Q_UNUSED(height); Q_UNUSED(pts);
return QByteArray(4, '\0') + "opaque access unit";
#else
StreamVideoEncoder encoder; StreamVideoConfig config; config.width = width; config.height = height; config.codec = codec;
LiveVideoEncoder encoder; LiveVideoConfig config; config.width = width; config.height = height; config.codec = codec;
if (!encoder.open(config)) return {};
QImage image(width, height, QImage::Format_RGB32); image.fill(QColor(45, 130, 220));
QList<StreamEncodedFrame> output;
QList<LiveEncodedFrame> output;
if (!encoder.encode(image, pts, true, output) || output.isEmpty() || !output.front().key) return {};
return output.front().data;
#endif
@ -126,9 +126,9 @@ private slots:
}
void encoderRoundTrip_data() {
QTest::addColumn<int>("codec");
auto codecs = StreamVideoEncoder::available();
auto codecs = LiveVideoEncoder::available();
if (codecs.isEmpty()) QTest::newRow("unavailable") << 0;
for (int codec : codecs) QTest::newRow(qPrintable(StreamVideoEncoder::codecName(codec))) << codec;
for (int codec : codecs) QTest::newRow(qPrintable(LiveVideoEncoder::codecName(codec))) << codec;
}
void encoderRoundTrip() {
#ifdef HAVE_FFMPEG
@ -174,10 +174,10 @@ private slots:
}
void liveSoftwareBitrateKeepsDecoder() {
#ifdef HAVE_FFMPEG
StreamVideoEncoder encoder; StreamVideoConfig config; config.width = config.height = 16;
LiveVideoEncoder encoder; LiveVideoConfig config; config.width = config.height = 16;
QVERIFY(encoder.open(config));
if (encoder.name() != "libx264") QSKIP("The available hardware encoder uses video-only replacement for bitrate changes");
QImage image(16, 16, QImage::Format_RGB32); image.fill(Qt::red); QList<StreamEncodedFrame> output;
QImage image(16, 16, QImage::Format_RGB32); image.fill(Qt::red); QList<LiveEncodedFrame> output;
QVERIFY(encoder.encode(image, 100000, true, output)); QVERIFY(!output.isEmpty() && output.front().key);
const uint8_t *configuration, *frame; size_t configLength, frameLength;
auto first = output.front().data;

Loading…
Cancel
Save