/* * Cantata * * Copyright (c) 2011-2012 Craig Drummond * * Large portions of this file, mainly the textual descriptions, etc, are taken from * Amarok - hence the (c) notice below... */ /**************************************************************************************** * Copyright (c) 2010 Téo Mrnjavac * * * * This program is free software; you can redistribute it and/or modify it under * * the terms of the GNU General Public License as published by the Free Software * * Foundation; either version 2 of the License, or (at your option) any later * * version. * * * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * * PARTICULAR PURPOSE. See the GNU General Public License for more Encoder. * * * * You should have received a copy of the GNU General Public License along with * * this program. If not, see . * ****************************************************************************************/ #include "encoders.h" #include "utils.h" #include "localize.h" #include #include namespace Encoders { static QList installedEncoders; static QString ffmpeg; static bool usingAvconv=false; static void init() { static bool initialised=false; if (!initialised) { initialised=true; ffmpeg=Utils::findExe("ffmpeg"); if (ffmpeg.isEmpty()) { ffmpeg=Utils::findExe("avconv"); usingAvconv=true; } if (ffmpeg.isEmpty()) { return; } QByteArray vbr = "~%1kb/s VBR"; QByteArray cbr = "%1kb/s CBR"; QByteArray quality = "%1 (~%2kb/s VBR)"; QList initial; initial.append( Encoder(i18n("AAC (Non-Free)"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "Advanced Audio " "Coding (AAC) is a patented lossy codec for digital audio.
AAC " "generally achieves better sound quality than MP3 at similar bit rates. " "It is a reasonable choice for the iPod and some other portable music " "players. Non-Free implementation."), i18n("The bitrate is a measure of the quantity of data used to represent a second " "of the audio track.
The AAC encoder used by Cantata supports a variable bitrate (VBR) setting, which means that the bitrate value " "fluctuates along the track based on the complexity of the audio content. " "More complex intervals of data are encoded with a higher bitrate than less " "complex ones; this approach yields overall better quality and a smaller file " "than having a constant bitrate throughout the track.
" "For this reason, the bitrate measure in this slider is just an estimate " "of the average bitrate of " "the encoded track.
" "150kb/s is a good choice for music listening on a portable player.
" "Anything below 120kb/s might be unsatisfactory for music and anything above " "200kb/s is probably overkill."), QLatin1String("m4a"), QLatin1String("libfaac"), QLatin1String("-aq"), i18n("Expected average bitrate for variable bitrate encoding"), QList() << Setting(i18n(vbr).arg(25), 30) << Setting(i18n(vbr).arg(50), 55) << Setting(i18n(vbr).arg(70), 80) << Setting(i18n(vbr).arg(90), 105) << Setting(i18n(vbr).arg(120), 125) << Setting(i18n(vbr).arg(150), 155) << Setting(i18n(vbr).arg(170), 180) << Setting(i18n(vbr).arg(180), 205) << Setting(i18n(vbr).arg(190), 230) << Setting(i18n(vbr).arg(200), 255) << Setting(i18n(vbr).arg(210), 280), i18n("Smaller file"), i18n("Better sound quality"), 5)); initial.append( Encoder(i18n("Apple Lossless"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "Apple Lossless " "(ALAC) is an audio codec for lossless compression of digital music.
" "Recommended only for Apple music players and players that do not support " "FLAC."), QString(), QLatin1String("m4a"), QLatin1String("alac"), QString(), QString(), QList(), QString(), QString(), 0)); initial.append( Encoder(i18n("FLAC"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "Free " "Lossless Audio Codec (FLAC) is an open and royalty-free codec for " "lossless compression of digital music.
If you wish to store your music " "without compromising on audio quality, FLAC is an excellent choice."), i18n("The " "compression level is an integer value between 0 and 8 that represents " "the tradeoff between file size and compression speed while encoding with FLAC.
" "Setting the compression level to 0 yields the shortest compression time but " "generates a comparably big file.
" "On the other hand, a compression level of 8 makes compression quite slow but " "produces the smallest file.
" "Note that since FLAC is by definition a lossless codec, the audio quality " "of the output is exactly the same regardless of the compression level.
" "Also, levels above 5 dramatically increase compression time but create an only " "slightly smaller file, and are not recommended."), QLatin1String("flac"), QLatin1String("flac"), QLatin1String("-compression_level"), i18n("Compression level"), QList() << Setting(QString::number(0), 0) << Setting(QString::number(1), 1) << Setting(QString::number(2), 2) << Setting(QString::number(3), 3) << Setting(QString::number(4), 4) << Setting(QString::number(5), 5) << Setting(QString::number(6), 6) << Setting(QString::number(7), 7) << Setting(QString::number(8), 8), i18n("Faster compression"), i18n("Smaller file"), 5)); initial.append( Encoder(i18n("MP3"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "MPEG Audio Layer 3 (MP3) is " "a patented digital audio codec using a form of lossy data compression." "
In spite of its shortcomings, it is a common format for consumer " "audio storage, and is widely supported on portable music players."), i18n("The bitrate is a measure of the quantity of data used to represent a " "second of the audio track.
The MP3 encoder used by Cantata supports " "a variable bitrate (VBR) " "setting, which means that the bitrate value fluctuates along the track " "based on the complexity of the audio content. More complex intervals of " "data are encoded with a higher bitrate than less complex ones; this " "approach yields overall better quality and a smaller file than having a " "constant bitrate throughout the track.
" "For this reason, the bitrate measure in this slider is just an estimate " "of the average bitrate of the encoded track.
" "160kb/s is a good choice for music listening on a portable player.
" "Anything below 120kb/s might be unsatisfactory for music and anything above " "205kb/s is probably overkill."), QLatin1String("mp3"), QLatin1String("libmp3lame"), QLatin1String("-aq"), i18n("Expected average bitrate for variable bitrate encoding"), QList() << Setting(i18n(vbr).arg(80), 9) << Setting(i18n(vbr).arg(100), 8) << Setting(i18n(vbr).arg(120), 7) << Setting(i18n(vbr).arg(140), 6) << Setting(i18n(vbr).arg(160), 5) << Setting(i18n(vbr).arg(175), 4) << Setting(i18n(vbr).arg(190), 3) << Setting(i18n(vbr).arg(205), 2) << Setting(i18n(vbr).arg(220), 1) << Setting(i18n(vbr).arg(240), 0), i18n("Smaller file"), i18n("Better sound quality"), 4)); initial.append( Encoder(i18n("Ogg Vorbis"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "Ogg Vorbis is an open " "and royalty-free audio codec for lossy audio compression.
It produces " "smaller files than MP3 at equivalent or higher quality. Ogg Vorbis is an " "all-around excellent choice, especially for portable music players that " "support it."), i18n("The bitrate is a measure of the quantity of data used to represent a " "second of the audio track.
The Vorbis encoder used by Cantata supports " "a variable bitrate " "(VBR) setting, which means that the bitrate value fluctuates along the track " "based on the complexity of the audio content. More complex intervals of " "data are encoded with a higher bitrate than less complex ones; this " "approach yields overall better quality and a smaller file than having a " "constant bitrate throughout the track.
" "The Vorbis encoder uses a quality rating between -1 and 10 to define " "a certain expected audio quality level. The bitrate measure in this slider is " "just a rough estimate (provided by Vorbis) of the average bitrate of the encoded " "track given a quality value. In fact, with newer and more efficient Vorbis versions the " "actual bitrate is even lower.
" "5 is a good choice for music listening on a portable player.
" "Anything below 3 might be unsatisfactory for music and anything above " "8 is probably overkill."), QLatin1String("ogg"), QLatin1String("libvorbis"), QLatin1String("-aq"), i18n("Quality rating"), QList() << Setting(i18n(quality).arg(-1).arg(45), -1) << Setting(i18n(quality).arg(0).arg(64), 0) << Setting(i18n(quality).arg(1).arg(80), 1) << Setting(i18n(quality).arg(2).arg(96), 2) << Setting(i18n(quality).arg(3).arg(112), 3) << Setting(i18n(quality).arg(4).arg(128), 4) << Setting(i18n(quality).arg(5).arg(160), 5) << Setting(i18n(quality).arg(6).arg(192), 6) << Setting(i18n(quality).arg(7).arg(224), 7) << Setting(i18n(quality).arg(8).arg(256), 8) << Setting(i18n(quality).arg(9).arg(320), 9) << Setting(i18n(quality).arg(10).arg(500), 10), i18n("Smaller file"), i18n("Better sound quality"), 6)); initial.append( Encoder(i18n("Windows Media Audio"), i18nc("Feel free to redirect the english Wikipedia link to a local version, if " "it exists.", "Windows Media " "Audio (WMA) is a proprietary codec developed by Microsoft for lossy " "audio compression.
Recommended only for portable music players that " "do not support Ogg Vorbis."), i18n("The bitrate is a measure of the quantity of data used to represent a " "second of the audio track.
Due to the limitations of the proprietary WMA " "format and the difficulty of reverse-engineering a proprietary encoder, the " "WMA encoder used by Cantata sets a constant bitrate (CBR) setting.
" "For this reason, the bitrate measure in this slider is a pretty accurate estimate " "of the bitrate of the encoded track.
" "136kb/s is a good choice for music listening on a portable player.
" "Anything below 112kb/s might be unsatisfactory for music and anything above " "182kb/s is probably overkill."), QLatin1String("wma"), QLatin1String("wmav2"), QLatin1String("-ab"), i18n("Bitrate"), QList() << Setting(i18n(cbr).arg(64), 65*1000) << Setting(i18n(cbr).arg(80), 75*1000) << Setting(i18n(cbr).arg(96), 88*1000) << Setting(i18n(cbr).arg(112), 106*1000) << Setting(i18n(cbr).arg(136), 133*1000) << Setting(i18n(cbr).arg(182), 180*1000) << Setting(i18n(cbr).arg(275), 271*1000) << Setting(i18n(cbr).arg(550), 545*1000), i18n("Smaller file"), i18n("Better sound quality"), 4)); QProcess proc; proc.start(ffmpeg, QStringList() << "-codecs"); if (proc.waitForStarted()) { proc.waitForFinished(); } if (0!=proc.exitCode()) { return; } QString output=proc.readAllStandardOutput(); if (output.simplified().isEmpty()) { return; } foreach (const Encoder &encoder, initial) { if (output.contains(QRegExp(QLatin1String(".EA... ")+encoder.codec))) { installedEncoders.append(encoder); } } } } QString Encoder::changeExtension(const QString &file) { return Utils::changeExtension(file, extension); } bool Encoder::isDifferent(const QString &file) { return file!=changeExtension(file); } QStringList Encoder::params(int value, const QString &in, const QString &out) { QStringList p; p << ffmpeg << QLatin1String("-i") << in << QLatin1String("-threads") << QLatin1String("0") << QLatin1String(usingAvconv ? "-c:a" : "-acodec") << codec; if (!ffmpegParam.isEmpty() && values.size()>1) { bool increase=values.at(0).valuevalue) || (!increase && s.value getAvailable() { init(); return installedEncoders; } Encoder getEncoder(const QString &codec) { init(); foreach (const Encoder &encoder, installedEncoders) { if (encoder.codec==codec) { return encoder; } } return Encoder(); } }