summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2022-08-25 14:08:15 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-09-01 17:59:01 +0000
commit1e4efd5d139c2c8ef2f02bd438936820f2359707 (patch)
tree1f1fa9d928f1f6cb74291bab282da41d26853ace
parentb66ef371b0883ffc0d02adcf4259cd742a9466bf (diff)
downloadqtmultimedia-1e4efd5d139c2c8ef2f02bd438936820f2359707.tar.gz
Fix audio and video synchronization with ffmpeg backend
Set a correct output playback rate to the audio resampler. The functionality will be tested after implementation mocks of audio output. Task-number: QTBUG-105617 Change-Id: Iaed95ac12e5e75b55b2c09245aad45c32a885fdf Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit 5393dae58ed62ec765abfb846dcd33a7b2aaaac6) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp17
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h1
2 files changed, 15 insertions, 3 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
index 66e2c28c3..f37a10174 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
@@ -775,24 +775,35 @@ void AudioRenderer::updateOutput(const Codec *codec)
format = QFFmpegMediaFormatInfo::audioFormatFromCodecParameters(audioStream->codecpar);
format.setChannelConfig(dev.channelConfiguration());
+ initResempler(codec);
+
audioSink = new QAudioSink(dev, format);
audioSink->setVolume(output->volume());
audioSink->setBufferSize(format.bytesForDuration(100000));
audioDevice = audioSink->start();
+
latencyUSecs = format.durationForBytes(audioSink->bufferSize()); // ### ideally get full latency
qCDebug(qLcAudioRenderer) << " -> have an audio sink" << audioDevice;
+}
+void AudioRenderer::initResempler(const Codec *codec)
+{
// init resampler. It's ok to always do this, as the resampler will be a no-op if
// formats agree.
AVSampleFormat requiredFormat = QFFmpegMediaFormatInfo::avSampleFormat(format.sampleFormat());
#if QT_FFMPEG_OLD_CHANNEL_LAYOUT
- qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat << audioStream->codecpar->channels;
+ qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat
+ << codec->stream()->codecpar->channels;
#else
- qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat << audioStream->codecpar->ch_layout.nb_channels;
+ qCDebug(qLcAudioRenderer) << "init resampler" << requiredFormat
+ << codec->stream()->codecpar->ch_layout.nb_channels;
#endif
- resampler.reset(new Resampler(codec, format));
+
+ auto resamplerFormat = format;
+ resamplerFormat.setSampleRate(qRound(format.sampleRate() / playbackRate()));
+ resampler.reset(new Resampler(codec, resamplerFormat));
}
void AudioRenderer::freeOutput()
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
index 0ca069105..01763911d 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
+++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder_p.h
@@ -474,6 +474,7 @@ private slots:
private:
void updateOutput(const Codec *codec);
+ void initResempler(const Codec *codec);
void freeOutput();
void init() override;