Diagnose delayed decoder completion with buffered audio

This commit is contained in:
evgeny committed 2026-10-20 23:46:59 +02:00
1 parent 5bc0c1ece4
commit 23c4e4efbc
2 files changed
+20 -4

No files matched your search

+15 -2
View File
@@ -793,8 +793,15 @@ private slots:
AVPacket* packet = av_packet_alloc(); QVERIFY(packet); QCOMPARE(avcodec_receive_packet(context, packet), 0);
QByteArray access(reinterpret_cast<const char*>(packet->data), packet->size);
av_packet_free(&packet); av_frame_free(&frame); avcodec_free_context(&context);
QVERIFY(SoundManager::instance()->init());
std::unique_ptr<opus_codec_encoder_t, decltype(&opus_codec_encoder_destroy)>
opus(opus_codec_encoder_create(48000, 2), opus_codec_encoder_destroy);
QVERIFY(opus);
int16_t pcm[1920] = {}; uint8_t encoded[1275];
int audioSize = opus_codec_encode(opus.get(), pcm, 960, encoded, sizeof(encoded)); QVERIFY(audioSize > 0);
struct Delay { Delay() { delayedDecoder = true; } ~Delay() { delayedDecoder = false; } } delay;
for (unsigned count : {3u, 8u}) {
for (bool audio : {false, true}) for (unsigned count : {3u, 8u}) {
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "fixture delayed decoder frames=%u audio=%d", count, audio);
QCOMPARE(stream_publish_finish(publisher), STREAM_OK); stream_close(publisher); publisher = nullptr;
QCOMPARE(stream_publish_open(inst, group, nullptr, &publisher), STREAM_OK);
stream_info info{}; QCOMPARE(stream_get_info(publisher, &info), STREAM_OK); epoch = info.descriptor.source_epoch;
@@ -802,9 +809,15 @@ private slots:
QSignalSpy shown(&window, &StreamPlayerWindow::framePresented);
for (unsigned i = 0; i < count; i++) {
QByteArray data = i ? access : QByteArray(4, '\0') + access;
stream_media_block media{}; media.format = {160, 90, 0, STREAM_MEDIA_H264, 0, 1}; media.video_count = 1;
stream_media_block media{};
media.format = {160, 90, 0, STREAM_MEDIA_H264, (uint8_t)(audio ? STREAM_MEDIA_OPUS_STEREO : 0), 1};
media.video_count = 1;
media.video[0] = {i + 1, i * 40000u, (uint32_t)data.size(), 0, (uint32_t)data.size(),
(uint8_t)(i ? 0 : STREAM_MEDIA_KEY), reinterpret_cast<const uint8_t*>(data.constData())};
if (audio) {
media.audio_count = 2;
for (unsigned j = 0; j < 2; j++) media.audio[j] = {i * 40000u + j * 20000u, (uint32_t)audioSize, 960, encoded};
}
uint8_t wire[7345]; size_t length = 0;
QCOMPARE(stream_media_encode(&media, wire, sizeof(wire), &length), STREAM_OK);
QCOMPARE(stream_publish_block(publisher, wire, length), STREAM_OK); QTest::qWait(i ? 1 : 30);