diff --git a/tools/chatgui/tests/test_call_video_gpu.cpp b/tools/chatgui/tests/test_call_video_gpu.cpp index db077b0b..3eb8d714 100644 --- a/tools/chatgui/tests/test_call_video_gpu.cpp +++ b/tools/chatgui/tests/test_call_video_gpu.cpp @@ -122,6 +122,33 @@ private slots: QVERIFY2(encoder.error().contains("call bitstream contract"), qPrintable(encoder.error())); QCOMPARE(software, 0u); } + void drainsWithoutNewCapture() { + selected = "h264_nvenc"; + CallVideoEncoder encoder; call_video_format format{1, 640, 360, 30, 0, 1, 31, 4000000, 2}; + QVERIFY2(encoder.open(format, 1000000), qPrintable(encoder.error())); + QImage image(640, 360, QImage::Format_RGB32); image.fill(Qt::blue); + QList output; CallVideoRateCompletion completion; + QVERIFY(encoder.encode(image, 1000000, true, output, completion)); + QVERIFY(encoder.encode(image, 1033333, false, output, completion)); + QCOMPARE(output.size(), 1); QCOMPARE(output.front().pts, uint64_t(1000000)); + CallVideoDecoder decoder; unsigned decodedCount = 0; + auto decode = [&](const LiveEncodedFrame& f) { + call_video_frame wire{}; wire.call_id = 1; wire.frame_id = ++decodedCount; wire.pts_us = f.pts; wire.format = format; + wire.data = reinterpret_cast(f.data.constData()); wire.size = wire.length = f.data.size(); + wire.flags = f.key ? CALL_VIDEO_KEY : 0; QImage decoded; return decoder.decode(wire, decoded); + }; + QVERIFY(decode(output.front())); depth = 8; // GPU временно перестал выдавать output. + for (unsigned i = 2; i < 9; ++i) { + QVERIFY(encoder.encode(image, 1000000 + i * 33333ull, false, output, completion)); QVERIFY(output.isEmpty()); + } + QCOMPARE(encoder.pendingFrames(), 8u); + depth = 0; // Завершение аппаратной работы без следующего кадра камеры. + QVERIFY(encoder.encode({}, 0, false, output, completion)); QCOMPARE(output.size(), 8); + for (unsigned i = 0; i < 8; ++i) { + QCOMPARE(output[i].pts, 1000000 + (i + 1) * 33333ull); QVERIFY(decode(output[i])); + } + QCOMPARE(encoder.pendingFrames(), 0u); QCOMPARE(decodedCount, 9u); + } void pipeline_data() { QTest::addColumn("backend"); QTest::addColumn("batch"); QTest::addColumn("reject"); for (auto name : {"h264_nvenc", "hevc_nvenc", "h264_amf", "hevc_amf", "h264_qsv", "hevc_qsv"})