diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-01-06 21:38:47 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-01-06 21:38:47 +0000 |
| commit | d489c39c0ec9b4973599053892c964f89520714c (patch) | |
| tree | 33aee0a4c1a9bfbba32c0cb3305b209796123913 | |
| parent | 85577827106626d3f13e6b19606ea660f9e99662 (diff) | |
| download | qmmp-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
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 9 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp | 28 |
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; |
