aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp')
-rw-r--r--src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
index 2f630a35a..d751f5845 100644
--- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
+++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
@@ -227,13 +227,16 @@ bool DecoderFFmpeg::initialize()
switch(c->sample_fmt)
{
case AV_SAMPLE_FMT_U8:
+ case AV_SAMPLE_FMT_U8P:
format = Qmmp::PCM_S8;
break;
case AV_SAMPLE_FMT_S16:
+ case AV_SAMPLE_FMT_S16P:
format = Qmmp::PCM_S16LE;
break;
case AV_SAMPLE_FMT_S32:
case AV_SAMPLE_FMT_FLT:
+ case AV_SAMPLE_FMT_FLTP:
format = Qmmp::PCM_S32LE;
break;
default:
@@ -278,12 +281,29 @@ qint64 DecoderFFmpeg::read(char *audio, qint64 maxSize)
return 0;
qint64 len = qMin(m_output_at, maxSize);
- memcpy(audio, m_decoded_frame->extended_data[0], len);
+ if(av_sample_fmt_is_planar(c->sample_fmt))
+ {
+ int bps = av_get_bytes_per_sample(c->sample_fmt);
- m_output_at -= len;
- memmove(m_decoded_frame->extended_data[0], m_decoded_frame->extended_data[0] + len, m_output_at);
+ for(int i = 0; i < len >> 1; i+=bps)
+ {
+ 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);
+ }
+ 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);
+ }
+ else
+ {
+ memcpy(audio, m_decoded_frame->extended_data[0], len);
+ m_output_at -= len;
+ memmove(m_decoded_frame->extended_data[0], m_decoded_frame->extended_data[0] + len, m_output_at);
+ }
- if(c->sample_fmt == AV_SAMPLE_FMT_FLT)
+ 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++)