aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-01-15 09:17:31 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-01-15 09:17:31 +0000
commit66af5b7d63098ce9cdaebfa43773315a2e39818c (patch)
tree1586b9de8fa2e4435941e1cd10f1ed0f94fa4a31 /src/plugins
parent775e5eaed1b3cce61ecbf5d9d6d0f1d416c121bf (diff)
downloadqmmp-66af5b7d63098ce9cdaebfa43773315a2e39818c.tar.gz
qmmp-66af5b7d63098ce9cdaebfa43773315a2e39818c.tar.bz2
qmmp-66af5b7d63098ce9cdaebfa43773315a2e39818c.zip
ffmpeg: added float output
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6031 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
-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;
}