From 66af5b7d63098ce9cdaebfa43773315a2e39818c Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Fri, 15 Jan 2016 09:17:31 +0000 Subject: ffmpeg: added float output git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6031 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 31 +++++++++++------------------ 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'src') 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; } -- cgit v1.2.3-13-gbd6f