diff options
Diffstat (limited to 'src/plugins/multimedia/ffmpeg/qffmpeg.cpp')
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpeg.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpeg.cpp b/src/plugins/multimedia/ffmpeg/qffmpeg.cpp index 73c6c6788..f5b97566a 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeg.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpeg.cpp @@ -2,6 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qffmpeg_p.h" +#include "qaudioformat.h" +#include "qffmpegmediaformatinfo_p.h" #include <qdebug.h> #include <qloggingcategory.h> @@ -15,6 +17,7 @@ extern "C" { #include <libavutil/pixdesc.h> #include <libavutil/samplefmt.h> +#include <libavutil/opt.h> #ifdef Q_OS_DARWIN #include <libavutil/hwcontext_videotoolbox.h> @@ -427,6 +430,70 @@ const AVPacketSideData *streamSideData(const AVStream *stream, AVPacketSideDataT #endif } +ResampleAudioFormat::ResampleAudioFormat(const AVCodecParameters* codecPar) + : sampleFormat(AVSampleFormat(codecPar->format)), sampleRate(codecPar->sample_rate) +{ +#if QT_FFMPEG_OLD_CHANNEL_LAYOUT + if (codecPar->channel_layout) { + channelLayoutMask = codecPar->channel_layout; + } + else { + const auto channelConfig = + QAudioFormat::defaultChannelConfigForChannelCount(codecPar->channels); + channelLayoutMask = QFFmpegMediaFormatInfo::avChannelLayout(channelConfig); + } +#else + channelLayout = codecPar->ch_layout; +#endif +} + +ResampleAudioFormat::ResampleAudioFormat(const QAudioFormat& audioFormat) + : sampleFormat(QFFmpegMediaFormatInfo::avSampleFormat(audioFormat.sampleFormat())) + , sampleRate(audioFormat.sampleRate()) +{ + const auto channelConfig = audioFormat.channelConfig() == QAudioFormat::ChannelConfigUnknown ? + QAudioFormat::defaultChannelConfigForChannelCount(audioFormat.channelCount()) : + audioFormat.channelConfig(); + + const auto mask = QFFmpegMediaFormatInfo::avChannelLayout(channelConfig); + +#if QT_FFMPEG_OLD_CHANNEL_LAYOUT + channelLayoutMask = mask; +#else + av_channel_layout_from_mask(&channelLayout, mask); +#endif +} + +SwrContextUPtr createResampleContext(const ResampleAudioFormat& inputFormat, + const ResampleAudioFormat& outputFormat) +{ + SwrContext *resampler = nullptr; +#if QT_FFMPEG_OLD_CHANNEL_LAYOUT + resampler = swr_alloc_set_opts(nullptr, + outputFormat.channelLayoutMask, + outputFormat.sampleFormat, + outputFormat.sampleRate, + inputFormat.channelLayoutMask, + inputFormat.sampleFormat, + inputFormat.sampleRate, + 0, + nullptr); +#else + swr_alloc_set_opts2(&resampler, + &outputFormat.channelLayout, + outputFormat.sampleFormat, + outputFormat.sampleRate, + &inputFormat.channelLayout, + inputFormat.sampleFormat, + inputFormat.sampleRate, + 0, + nullptr); +#endif + + swr_init(resampler); + return SwrContextUPtr(resampler); +} + #ifdef Q_OS_DARWIN bool isCVFormatSupported(uint32_t cvFormat) { |