aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-01-06 21:38:47 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-01-06 21:38:47 +0000
commitd489c39c0ec9b4973599053892c964f89520714c (patch)
tree33aee0a4c1a9bfbba32c0cb3305b209796123913 /src/plugins/Input
parent85577827106626d3f13e6b19606ea660f9e99662 (diff)
downloadqmmp-d489c39c0ec9b4973599053892c964f89520714c.tar.gz
qmmp-d489c39c0ec9b4973599053892c964f89520714c.tar.bz2
qmmp-d489c39c0ec9b4973599053892c964f89520714c.zip
ffmpeg plugin: added shoutcast support (Closes issue 162)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1485 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
-rw-r--r--src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp9
-rw-r--r--src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp28
2 files changed, 31 insertions, 6 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
index 174f8f693..4ec673839 100644
--- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
+++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp
@@ -104,11 +104,11 @@ bool DecoderFFmpeg::initialize()
av_register_all();
AVProbeData pd;
- uint8_t buf[2048 + AVPROBE_PADDING_SIZE];
+ uint8_t buf[8192 + AVPROBE_PADDING_SIZE];
pd.filename = m_path.toLocal8Bit().constData();
- pd.buf_size = input()->peek((char*)buf, sizeof(buf));
+ pd.buf_size = input()->peek((char*)buf, sizeof(buf) - AVPROBE_PADDING_SIZE);
pd.buf = buf;
- if(pd.buf_size < 2048)
+ if(pd.buf_size < 8192)
return FALSE;
AVInputFormat *fmt = av_probe_input_format(&pd, 1);
if(!fmt)
@@ -168,7 +168,7 @@ bool DecoderFFmpeg::initialize()
qWarning("DecoderFFmpeg: error while opening codec for output stream");
return FALSE;
}
- m_totalTime = ic->duration * 1000 / AV_TIME_BASE;
+ m_totalTime = input()->isSequential() ? 0 : ic->duration * 1000 / AV_TIME_BASE;
m_output_buf = new uint8_t[AVCODEC_MAX_AUDIO_FRAME_SIZE*sizeof(int16_t) + Qmmp::globalBufferSize()];
configure(c->sample_rate, c->channels, 16);
m_bitrate = c->bit_rate;
@@ -189,7 +189,6 @@ int DecoderFFmpeg::bitrate()
qint64 DecoderFFmpeg::read(char *audio, qint64 maxSize)
{
-
m_skipBytes = 0;
if (m_skip)
{
diff --git a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
index 50373deb7..edf830893 100644
--- a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
+++ b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp
@@ -64,8 +64,33 @@ bool DecoderFFmpegFactory::supports(const QString &source) const
return FALSE;
}
-bool DecoderFFmpegFactory::canDecode(QIODevice *) const
+bool DecoderFFmpegFactory::canDecode(QIODevice *i) const
{
+ av_register_all();
+ QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
+ QStringList filters;
+#if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0))
+ filters << "*.wma" << "*.ape";
+#else
+ filters << "*.wma";
+#endif
+ filters = settings.value("FFMPEG/filters", filters).toStringList();
+
+ AVProbeData pd;
+ uint8_t buf[8192 + AVPROBE_PADDING_SIZE];
+ pd.filename = 0;
+ pd.buf_size = i->peek((char*)buf, sizeof(buf) - AVPROBE_PADDING_SIZE);
+ pd.buf = buf;
+ if(pd.buf_size < 8192)
+ return FALSE;
+ AVInputFormat *fmt = av_probe_input_format(&pd, 1);
+ if(!fmt)
+ {
+ qWarning("DecoderFFmpegFactory: usupported format");
+ return FALSE;
+ }
+ if(filters.contains("*.mp3") && !memcmp(fmt->name, "mp3", 3))
+ return TRUE;
return FALSE;
}
@@ -87,6 +112,7 @@ const DecoderProperties DecoderFFmpegFactory::properties() const
properties.contentType += "audio/x-ms-wma";
if(filters.contains("*.mp3"))
properties.contentType += " audio/mpeg";
+ properties.contentType = properties.contentType.trimmed();
properties.shortName = "ffmpeg";
properties.hasAbout = TRUE;
properties.hasSettings = TRUE;