aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/ffmpeg
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/ffmpeg')
-rw-r--r--src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp31
1 files changed, 12 insertions, 19 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
index 278c31883..dac4526e8 100644
--- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
+++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
@@ -265,9 +265,11 @@ bool DecoderFFmpeg::initialize()
break;
case AV_SAMPLE_FMT_S32:
case AV_SAMPLE_FMT_S32P:
+ format = Qmmp::PCM_S32LE;
+ break;
case AV_SAMPLE_FMT_FLT:
case AV_SAMPLE_FMT_FLTP:
- format = Qmmp::PCM_S32LE;
+ format = Qmmp::PCM_FLOAT;
break;
default:
qWarning("DecoderFFmpeg: unsupported audio format");
@@ -314,16 +316,18 @@ qint64 DecoderFFmpeg::read(unsigned char *audio, qint64 maxSize)
if(av_sample_fmt_is_planar(c->sample_fmt) && m_channels > 1)
{
int bps = av_get_bytes_per_sample(c->sample_fmt);
- for(int i = 0; i < (len >> 1); i+=bps)
+
+ for(int i = 0; i < len / bps; i++)
{
- memcpy(audio + 2*i, m_decoded_frame->extended_data[0] + i, bps);
- memcpy(audio + 2*i + bps, m_decoded_frame->extended_data[1] + i, bps);
+ memcpy(audio + i * bps, m_decoded_frame->extended_data[i % m_channels] + i / m_channels * bps, bps);
}
+
m_output_at -= len;
- memmove(m_decoded_frame->extended_data[0],
- m_decoded_frame->extended_data[0] + len/2, m_output_at/2);
- memmove(m_decoded_frame->extended_data[1],
- m_decoded_frame->extended_data[1] + len/2, m_output_at/2);
+ for(int i = 0; i < m_channels; i++)
+ {
+ memmove(m_decoded_frame->extended_data[i],
+ m_decoded_frame->extended_data[i] + len/m_channels, m_output_at/m_channels);
+ }
}
else
{
@@ -332,17 +336,6 @@ qint64 DecoderFFmpeg::read(unsigned char *audio, qint64 maxSize)
memmove(m_decoded_frame->extended_data[0], m_decoded_frame->extended_data[0] + len, m_output_at);
}
- if(c->sample_fmt == AV_SAMPLE_FMT_FLTP || c->sample_fmt == AV_SAMPLE_FMT_FLT)
- {
- //convert float to signed 32 bit LE
- for(int i = 0; i < (len >> 2); i++)
- {
- int32_t *out = (int32_t *)audio;
- float *in = (float *) audio;
- out[i] = qBound(-1.0f, in[i], +1.0f) * (double) 0x7fffffff;
- }
- }
-
return len;
}