diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-04-15 18:08:40 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-04-15 18:08:40 +0000 |
| commit | 2ee8fd4c12b9da5418365c2716eb0e9423fd4e08 (patch) | |
| tree | ddb9882d71c08db2f737250edb1084fc00603f32 /src/plugins | |
| parent | b48e843ac11ed8ffbb5d8155ad91160b42841d93 (diff) | |
| download | qmmp-2ee8fd4c12b9da5418365c2716eb0e9423fd4e08.tar.gz qmmp-2ee8fd4c12b9da5418365c2716eb0e9423fd4e08.tar.bz2 qmmp-2ee8fd4c12b9da5418365c2716eb0e9423fd4e08.zip | |
added latest ffmpeg support, fixed bug with ape seeking, removed legacy
code
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2162 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/ffmpeg/CMakeLists.txt | 34 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 62 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.h | 29 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp | 50 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpeg.pro | 16 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp | 13 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h | 12 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/settingsdialog.cpp | 33 |
8 files changed, 83 insertions, 166 deletions
diff --git a/src/plugins/Input/ffmpeg/CMakeLists.txt b/src/plugins/Input/ffmpeg/CMakeLists.txt index 24991e45b..86a41c4a4 100644 --- a/src/plugins/Input/ffmpeg/CMakeLists.txt +++ b/src/plugins/Input/ffmpeg/CMakeLists.txt @@ -28,39 +28,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../) link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp) # libffmpeg -pkg_check_modules(FFMPEG libavcodec libavformat libavutil) - - -# old ffmpeg support - -IF(EXISTS /usr/include/ffmpeg/libavformat/avformat.h) - ADD_DEFINITIONS(-DHAVE_LIBAVFORMAT_AVFORMAT_H) - include_directories(/usr/include/ffmpeg) -ELSEIF(EXISTS /usr/include/ffmpeg/avformat.h) - ADD_DEFINITIONS(-DHAVE_FFMPEG_AVFORMAT_H) -ELSEIF(EXISTS /usr/include/libavformat/avformat.h) - ADD_DEFINITIONS(-DHAVE_LIBAVFORMAT_AVFORMAT_H) -ELSE(EXISTS /usr/include/ffmpeg/libavformat/avformat.h) - include_directories(/usr/local/include/ffmpeg - /usr/local/include/libavformat - /usr/local/include/libavutil -) -ENDIF(EXISTS /usr/include/ffmpeg/libavformat/avformat.h) - -IF(EXISTS /usr/include/ffmpeg/libavcodec/avcodec.h) - ADD_DEFINITIONS(-DHAVE_LIBAVCODEC_AVCODEC_H) - include_directories(/usr/include/ffmpeg) -ELSEIF(EXISTS /usr/include/ffmpeg/avcodec.h) - ADD_DEFINITIONS(-DHAVE_FFMPEG_AVCODEC_H) -ELSEIF(EXISTS /usr/include/libavcodec/avcodec.h) - ADD_DEFINITIONS(-DHAVE_LIBAVCODEC_AVCODEC_H) -ELSE(EXISTS /usr/include/ffmpeg/libavcodec/avcodec.h) - include_directories(/usr/local/include/ffmpeg - /usr/local/include/libavcodec - /usr/local/include/libavutil -) -ENDIF(EXISTS /usr/include/ffmpeg/libavcodec/avcodec.h) - +pkg_check_modules(FFMPEG libavcodec>=52.20.0 libavformat>=52.31.0 libavutil>=49.15.0) include_directories(${FFMPEG_INCLUDE_DIRS}) link_directories(${FFMPEG_LIBRARY_DIRS}) diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp index 0a2e734fa..a6c5b53f0 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,7 +23,6 @@ #include <qmmp/buffer.h> #include <qmmp/output.h> #include <qmmp/recycler.h> - #include "decoder_ffmpeg.h" // callbacks @@ -76,6 +75,7 @@ DecoderFFmpeg::DecoderFFmpeg(const QString &path, QIODevice *i) m_output_buf = 0; m_output_at = 0; m_skipBytes = 0; + m_stream = 0; av_init_packet(&m_pkt); av_init_packet(&m_temp_pkt); } @@ -91,6 +91,8 @@ DecoderFFmpeg::~DecoderFFmpeg() av_free_packet(&m_pkt); if(m_output_buf) av_free(m_output_buf); + if(m_stream) + av_free(m_stream); } bool DecoderFFmpeg::initialize() @@ -119,23 +121,29 @@ bool DecoderFFmpeg::initialize() } qDebug("DecoderFFmpeg: detected format: %s", fmt->long_name); - init_put_byte(&m_stream, m_input_buf, INPUT_BUFFER_SIZE, - 0, this, ffmpeg_read, NULL, ffmpeg_seek); - - m_stream.is_streamed = input()->isSequential(); - m_stream.max_packet_size = INPUT_BUFFER_SIZE; - +#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(105<<8)+0)) + m_stream = avio_alloc_context(m_input_buf, INPUT_BUFFER_SIZE, 0, this, ffmpeg_read, NULL, ffmpeg_seek); + if(!m_stream) + { + qWarning("DecoderFFmpeg: unable to initialize I/O callbacks"); + return false; + } + m_stream->seekable = !input()->isSequential(); +#else + m_stream = (ByteIOContext *)av_malloc(sizeof(ByteIOContext)); + init_put_byte(m_stream, m_input_buf, INPUT_BUFFER_SIZE, 0, this, ffmpeg_read, NULL, ffmpeg_seek); + m_stream->is_streamed = input()->isSequential(); +#endif + m_stream->max_packet_size = INPUT_BUFFER_SIZE; AVFormatParameters ap; memset(&ap, 0, sizeof(ap)); - if(av_open_input_stream(&ic, &m_stream, m_path.toLocal8Bit(), - fmt, &ap) != 0) + if(av_open_input_stream(&ic, m_stream, m_path.toLocal8Bit(), fmt, &ap) != 0) { qDebug("DecoderFFmpeg: av_open_input_stream() failed"); return false; } - AVCodec *codec; av_find_stream_info(ic); @@ -155,7 +163,11 @@ bool DecoderFFmpeg::initialize() else c->channels = 2; +#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(101<<8)+0)) + av_dump_format(ic,0,0,0); +#else dump_format(ic,0,0,0); +#endif codec = avcodec_find_decoder(c->codec_id); if (!codec) @@ -178,7 +190,17 @@ bool DecoderFFmpeg::initialize() m_totalTime = 0; #endif - configure(c->sample_rate, c->channels, Qmmp::PCM_S16LE); +#if (LIBAVUTIL_VERSION_INT >= ((50<<16)+(38<<8)+0)) + if(c->sample_fmt == AV_SAMPLE_FMT_S32) + configure(c->sample_rate, c->channels, Qmmp::PCM_S32LE); + else + configure(c->sample_rate, c->channels, Qmmp::PCM_S16LE); +#else + if(c->sample_fmt == SAMPLE_FMT_S32) + configure(c->sample_rate, c->channels, Qmmp::PCM_S32LE); + else + configure(c->sample_rate, c->channels, Qmmp::PCM_S16LE); +#endif m_bitrate = c->bit_rate; qDebug("DecoderFFmpeg: initialize succes"); return true; @@ -245,7 +267,6 @@ void DecoderFFmpeg::seek(qint64 pos) timestamp += ic->start_time; m_seekTime = timestamp; av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD); - avcodec_flush_buffers(c); if(m_pkt.size) m_skip = true; } @@ -271,7 +292,6 @@ void DecoderFFmpeg::fillBuffer() m_temp_pkt.size = 0; continue; } -#if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0)) if(m_seekTime && c->codec_id == CODEC_ID_APE) { int64_t rescaledPts = av_rescale(m_pkt.pts, @@ -282,11 +302,9 @@ void DecoderFFmpeg::fillBuffer() } else m_skipBytes = 0; - -#endif m_seekTime = 0; } -#if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0)) + if(m_skipBytes > 0 && c->codec_id == CODEC_ID_APE) { while (m_skipBytes > 0) @@ -308,14 +326,12 @@ void DecoderFFmpeg::fillBuffer() } else m_output_at = ffmpeg_decode(m_output_buf); -#else - m_output_at = ffmpeg_decode(m_output_buf); -#endif + if(m_output_at < 0) { m_output_at = 0; m_temp_pkt.size = 0; -#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) + if(c->codec_id == CODEC_ID_SHORTEN) { if(m_pkt.data) @@ -323,15 +339,13 @@ void DecoderFFmpeg::fillBuffer() m_pkt.data = 0; break; } -#endif continue; } else if(m_output_at == 0) { -#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) if(c->codec_id == CODEC_ID_SHORTEN) continue; -#endif + if(m_pkt.data) av_free_packet(&m_pkt); m_pkt.data = 0; diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h index 5dc3085b9..cd30dc4c1 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -22,23 +22,8 @@ #define __decoder_ffmeg_h extern "C"{ - -#if defined HAVE_FFMPEG_AVFORMAT_H -#include <ffmpeg/avformat.h> -#elif defined HAVE_LIBAVFORMAT_AVFORMAT_H #include <libavformat/avformat.h> -#else -#include <avformat.h> -#endif - - -#if defined HAVE_FFMPEG_AVCODEC_H -#include <ffmpeg/avcodec.h> -#elif defined HAVE_LIBAVCODEC_AVCODEC_H #include <libavcodec/avcodec.h> -#else -#include <avcodec.h> -#endif } #include <qmmp/decoder.h> @@ -57,7 +42,7 @@ public: qint64 read(char *audio, qint64 maxSize); void seek(qint64 time); -private: +private: //helper functions void fillBuffer(); qint64 ffmpeg_decode(uint8_t *audio); @@ -72,13 +57,19 @@ private: AVPacket m_pkt; AVPacket m_temp_pkt; - ByteIOContext m_stream; + +#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(102<<8)+0)) + AVIOContext *m_stream; +#else + ByteIOContext *m_stream; +#endif + uint8_t *m_output_buf; qint64 m_output_at; uchar m_input_buf[INPUT_BUFFER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; int64_t m_seekTime; - qint64 m_skipBytes; + qint64 m_skipBytes; }; diff --git a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp index 16a837fae..98cc0336c 100644 --- a/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp +++ b/src/plugins/Input/ffmpeg/decoderffmpegfactory.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2010 by Ilya Kotov * + * Copyright (C) 2008-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -21,24 +21,9 @@ #include <QtGui> #include <QSettings> -extern "C" -{ -#if defined HAVE_FFMPEG_AVFORMAT_H -#include <ffmpeg/avformat.h> -#elif defined HAVE_LIBAVFORMAT_AVFORMAT_H +extern "C"{ #include <libavformat/avformat.h> -#else -#include <avformat.h> -#endif - - -#if defined HAVE_FFMPEG_AVCODEC_H -#include <ffmpeg/avcodec.h> -#elif defined HAVE_LIBAVCODEC_AVCODEC_H #include <libavcodec/avcodec.h> -#else -#include <avcodec.h> -#endif } #include "ffmpegmetadatamodel.h" @@ -147,13 +132,30 @@ QList<FileInfo *> DecoderFFmpegFactory::createPlayList(const QString &fileName, if (useMetaData) { - info->setMetaData(Qmmp::ALBUM, QString::fromUtf8(in->album).trimmed()); - info->setMetaData(Qmmp::ARTIST, QString::fromUtf8(in->author).trimmed()); - info->setMetaData(Qmmp::COMMENT, QString::fromUtf8(in->comment).trimmed()); - info->setMetaData(Qmmp::GENRE, QString::fromUtf8(in->genre).trimmed()); - info->setMetaData(Qmmp::TITLE, QString::fromUtf8(in->title).trimmed()); - info->setMetaData(Qmmp::YEAR, in->year); - info->setMetaData(Qmmp::TRACK, in->track); + AVMetadataTag *album = av_metadata_get(in->metadata,"album",0,0); + AVMetadataTag *artist = av_metadata_get(in->metadata,"artist",0,0); + AVMetadataTag *comment = av_metadata_get(in->metadata,"comment",0,0); + AVMetadataTag *genre = av_metadata_get(in->metadata,"genre",0,0); + AVMetadataTag *title = av_metadata_get(in->metadata,"title",0,0); + AVMetadataTag *year = av_metadata_get(in->metadata,"WM/Year",0,0); + if(!year) + year = av_metadata_get(in->metadata,"year",0,0); + AVMetadataTag *track = av_metadata_get(in->metadata,"track",0,0); + + if(album) + info->setMetaData(Qmmp::ALBUM, QString::fromUtf8(album->value).trimmed()); + if(artist) + info->setMetaData(Qmmp::ARTIST, QString::fromUtf8(artist->value).trimmed()); + if(comment) + info->setMetaData(Qmmp::COMMENT, QString::fromUtf8(comment->value).trimmed()); + if(genre) + info->setMetaData(Qmmp::GENRE, QString::fromUtf8(genre->value).trimmed()); + if(title) + info->setMetaData(Qmmp::TITLE, QString::fromUtf8(title->value).trimmed()); + if(year) + info->setMetaData(Qmmp::YEAR, year->value); + if(track) + info->setMetaData(Qmmp::TRACK, track->value); } info->setLength(in->duration/AV_TIME_BASE); av_close_input_file(in); diff --git a/src/plugins/Input/ffmpeg/ffmpeg.pro b/src/plugins/Input/ffmpeg/ffmpeg.pro index 9d7851700..50b25f822 100644 --- a/src/plugins/Input/ffmpeg/ffmpeg.pro +++ b/src/plugins/Input/ffmpeg/ffmpeg.pro @@ -12,26 +12,14 @@ QMAKE_CLEAN = ../libffmpeg.so TARGET = $$PLUGINS_PREFIX/Input/ffmpeg QMAKE_CLEAN = $$PLUGINS_PREFIX/Input/libffmpeg.so INCLUDEPATH += ../../../ -INCLUDEPATH += /usr/include/libavformat -INCLUDEPATH += /usr/include/libavcodec -INCLUDEPATH += /usr/include/libavutil -INCLUDEPATH += /usr/include/ffmpeg/libavcodec -INCLUDEPATH += /usr/include/ffmpeg/libavformat -INCLUDEPATH += /usr/include/ffmpeg/libavutil -INCLUDEPATH += /usr/include/ffmpeg CONFIG += release \ warn_on \ plugin \ link_pkgconfig TEMPLATE = lib QMAKE_LIBDIR += ../../../../lib -LIBS += -lqmmp \ - -L/usr/lib \ - -I/usr/include \ - -I/usr/include/ffmpeg \ - -I/usr/include/libavcodec \ - -I/usr/include/libavformat \ - -I/usr/include/libavutil +LIBS += -lqmmp + DEFINES += __STDC_CONSTANT_MACROS PKGCONFIG += libavcodec libavformat libavutil TRANSLATIONS = translations/ffmpeg_plugin_ru.ts \ diff --git a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp index fd758661f..933c766b6 100644 --- a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp +++ b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009 by Ilya Kotov * + * Copyright (C) 2009-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -18,17 +18,6 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ - -extern "C" -{ -#if defined HAVE_FFMPEG_AVCODEC_H -#include <ffmpeg/avcodec.h> -#elif defined HAVE_LIBAVCODEC_AVCODEC_H -#include <libavcodec/avcodec.h> -#else -#include <avcodec.h> -#endif -} #include "ffmpegmetadatamodel.h" FFmpegMetaDataModel::FFmpegMetaDataModel(const QString &path, QObject *parent) : MetaDataModel(parent) diff --git a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h index 992d1aa32..e14f8b93c 100644 --- a/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h +++ b/src/plugins/Input/ffmpeg/ffmpegmetadatamodel.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009 by Ilya Kotov * + * Copyright (C) 2009-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -21,15 +21,9 @@ #ifndef FFMPEGMETADATAMODEL_H #define FFMPEGMETADATAMODEL_H -extern "C" -{ -#if defined HAVE_FFMPEG_AVFORMAT_H -#include <ffmpeg/avformat.h> -#elif defined HAVE_LIBAVFORMAT_AVFORMAT_H +extern "C"{ #include <libavformat/avformat.h> -#else -#include <avformat.h> -#endif +#include <libavcodec/avcodec.h> } #include <qmmp/metadatamodel.h> diff --git a/src/plugins/Input/ffmpeg/settingsdialog.cpp b/src/plugins/Input/ffmpeg/settingsdialog.cpp index 3691b6e21..be77ebc43 100644 --- a/src/plugins/Input/ffmpeg/settingsdialog.cpp +++ b/src/plugins/Input/ffmpeg/settingsdialog.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2010 by Ilya Kotov * + * Copyright (C) 2008-2011 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,25 +23,10 @@ #include <qmmp/qmmp.h> -extern "C" -{ -#if defined HAVE_FFMPEG_AVFORMAT_H -#include <ffmpeg/avformat.h> -#elif defined HAVE_LIBAVFORMAT_AVFORMAT_H +extern "C"{ #include <libavformat/avformat.h> -#else -#include <avformat.h> -#endif - -#if defined HAVE_FFMPEG_AVCODEC_H -#include <ffmpeg/avcodec.h> -#elif defined HAVE_LIBAVCODEC_AVCODEC_H #include <libavcodec/avcodec.h> -#else -#include <avcodec.h> -#endif } - #include "settingsdialog.h" SettingsDialog::SettingsDialog(QWidget *parent) @@ -52,25 +37,16 @@ SettingsDialog::SettingsDialog(QWidget *parent) QSettings settings(Qmmp::configFile(), QSettings::IniFormat); QStringList filters; filters << "*.wma"; -#if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0)) filters << "*.ape"; -#endif -#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) filters << "*.shn"; -#endif filters = settings.value("FFMPEG/filters", filters).toStringList(); avcodec_init(); avcodec_register_all(); av_register_all(); ui.wmaCheckBox->setEnabled(avcodec_find_decoder(CODEC_ID_WMAV1)); ui.wmaCheckBox->setChecked(filters.contains("*.wma") && avcodec_find_decoder(CODEC_ID_WMAV1)); -#if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(44<<8)+0)) ui.apeCheckBox->setEnabled(avcodec_find_decoder(CODEC_ID_APE)); ui.apeCheckBox->setChecked(filters.contains("*.ape") && avcodec_find_decoder(CODEC_ID_APE)); -#else - ui.apeCheckBox->setChecked(false); - ui.apeCheckBox->setEnabled(false); -#endif ui.ttaCheckBox->setEnabled(avcodec_find_decoder(CODEC_ID_TTA)); ui.ttaCheckBox->setChecked(filters.contains("*.tta") && avcodec_find_decoder(CODEC_ID_TTA)); ui.alacCheckBox->setEnabled(avcodec_find_decoder(CODEC_ID_ALAC)); @@ -83,12 +59,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) ui.mp4CheckBox->setChecked(filters.contains("*.m4a") && avcodec_find_decoder(CODEC_ID_AAC)); ui.raCheckBox->setEnabled(avcodec_find_decoder(CODEC_ID_RA_288)); ui.raCheckBox->setChecked(filters.contains("*.ra") && avcodec_find_decoder(CODEC_ID_RA_288)); -#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(20<<8)+0)) ui.shCheckBox->setChecked(filters.contains("*.shn") && avcodec_find_decoder(CODEC_ID_SHORTEN)); -#else - ui.shCheckBox->setChecked(false); - ui.shCheckBox->setEnabled(false); -#endif } SettingsDialog::~SettingsDialog() |
