aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-01-08 13:28:09 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-01-08 13:28:09 +0000
commit6f516c6976f17c9070724e7aa4d10f0d38270c43 (patch)
treeed5bf5843f00d229f63d4cbe94234bcfdd70b4ca /src/plugins/Input
parentb88699da21e85c3848774d6fb5c70dc13bc9cac1 (diff)
downloadqmmp-6f516c6976f17c9070724e7aa4d10f0d38270c43.tar.gz
qmmp-6f516c6976f17c9070724e7aa4d10f0d38270c43.tar.bz2
qmmp-6f516c6976f17c9070724e7aa4d10f0d38270c43.zip
added ffmpeg 1.1 support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3131 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
-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++)