9#include <libavutil/opt.h>
20 : m_outputFormat(outputFormat)
22 qCDebug(qLcResampler) <<
"createResampler";
23 const AVStream *audioStream =
codec->stream();
24 const auto *codecpar = audioStream->codecpar;
26 if (!m_outputFormat.isValid())
35 qCDebug(qLcResampler) <<
"init resampler" << m_outputFormat.sampleRate() <<
config << codecpar->sample_rate;
36#if QT_FFMPEG_OLD_CHANNEL_LAYOUT
37 auto inConfig = codecpar->channel_layout;
40 resampler = swr_alloc_set_opts(
nullptr,
43 m_outputFormat.sampleRate(),
45 AVSampleFormat(codecpar->format),
46 codecpar->sample_rate,
50 AVChannelLayout in_ch_layout = codecpar->ch_layout;
51 AVChannelLayout out_ch_layout = {};
53 swr_alloc_set_opts2(&resampler,
56 m_outputFormat.sampleRate(),
58 AVSampleFormat(codecpar->format),
59 codecpar->sample_rate,
66Resampler::~Resampler()
73 const int maxOutSamples = adjustMaxOutSamples(
frame);
76 auto **
in =
const_cast<const uint8_t **
>(
frame->extended_data);
77 auto *
out =
reinterpret_cast<uint8_t *
>(
samples.data());
78 const int outSamples = swr_convert(resampler, &
out, maxOutSamples,
in,
frame->nb_samples);
80 samples.resize(m_outputFormat.bytesForFrames(outSamples));
82 qint64 startTime = m_outputFormat.durationForFrames(m_samplesProcessed);
83 m_samplesProcessed += outSamples;
86 << outSamples << maxOutSamples;
90int Resampler::adjustMaxOutSamples(
const AVFrame *
frame)
92 int maxOutSamples = swr_get_out_samples(resampler,
frame->nb_samples);
94 const auto remainingCompensationDistance = m_endCompensationSample - m_samplesProcessed;
96 if (remainingCompensationDistance > 0 && maxOutSamples > remainingCompensationDistance) {
103 setSampleCompensation(0, 0);
104 maxOutSamples = swr_get_out_samples(resampler,
frame->nb_samples);
107 return maxOutSamples;
112 const int res = swr_set_compensation(resampler, delta,
static_cast<int>(
distance));
114 qCWarning(qLcResampler) <<
"swr_set_compensation fail:" <<
res;
116 m_sampleCompensationDelta = delta;
117 m_endCompensationSample = m_samplesProcessed +
distance;
121qint32 Resampler::activeSampleCompensationDelta()
const
123 return m_samplesProcessed < m_endCompensationSample ? m_sampleCompensationDelta : 0;
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
GLsizei GLsizei GLfloat distance
QTextStream out(stdout)
[7]