X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fvideodefinition.cpp;h=360817f99963db0b7033d672b930afab3a8bbf0c;hb=434d88418722fd7717038e44bd74271ca1d92771;hp=c2180e2d24b39f2cfc2136b30c3dea95541a054f;hpb=efec77e73c8eafb7ba1f0b7817567272f02262e5;p=minitube diff --git a/src/videodefinition.cpp b/src/videodefinition.cpp index c2180e2..360817f 100644 --- a/src/videodefinition.cpp +++ b/src/videodefinition.cpp @@ -1,25 +1,76 @@ +/* $BEGIN_LICENSE + +This file is part of Minitube. +Copyright 2009, Flavio Tordini + +Minitube 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 3 of the License, or +(at your option) any later version. + +Minitube 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 details. + +You should have received a copy of the GNU General Public License +along with Minitube. If not, see . + +$END_LICENSE */ + #include "videodefinition.h" -QStringList VideoDefinition::getDefinitionNames() { - static QStringList definitionNames = QStringList() << "360p" << "720p" << "1080p"; - return definitionNames; -} +namespace { +const int kEmptyDefinitionCode = -1; -QList VideoDefinition::getDefinitionCodes() { - static QList definitionCodes = QList() << 18 << 22 << 37; - return definitionCodes; -} +template +const VideoDefinition &getDefinitionForImpl(T matchValue) { + const auto &defs = VideoDefinition::getDefinitions(); -QHash VideoDefinition::getDefinitions() { - static QHash definitions; - if (definitions.isEmpty()) { - definitions.insert("360p", 18); - definitions.insert("720p", 22); - definitions.insert("1080p", 37); + for (auto i = defs.rbegin(); i != defs.rend(); ++i) { + if ((*i.*Getter)() == matchValue) return *i; + } + /* + for (const VideoDefinition &def : defs) { + if ((def.*Getter)() == matchValue) return def; } + */ + static const VideoDefinition kEmptyDefinition(QString(), kEmptyDefinitionCode); + return kEmptyDefinition; +} +} // namespace + +const QVector &VideoDefinition::getDefinitions() { + // List preferred equivalent format last: + // algo selects the last format with same name first + static const QVector definitions = { + VideoDefinition("240p", 242), VideoDefinition("240p", 133), + VideoDefinition("360p", 243), VideoDefinition("360p", 396), + VideoDefinition("360p", 18, true), VideoDefinition("480p", 244), + VideoDefinition("480p", 135), VideoDefinition("720p", 247), + VideoDefinition("720p", 136), VideoDefinition("720p", 22, true), + VideoDefinition("1080p", 248), VideoDefinition("1080p", 137), + VideoDefinition("1440p", 271), VideoDefinition("2160p", 313), + }; return definitions; } -int VideoDefinition::getDefinitionCode(QString name) { - return VideoDefinition::getDefinitions().value(name); +const QVector &VideoDefinition::getDefinitionNames() { + static const QVector names = {"480p", "720p", "1080p", "1440p", "2160p"}; + return names; +} + +const VideoDefinition &VideoDefinition::forName(const QString &name) { + return getDefinitionForImpl(name); +} + +const VideoDefinition &VideoDefinition::forCode(int code) { + return getDefinitionForImpl(code); +} + +VideoDefinition::VideoDefinition(const QString &name, int code, bool hasAudioStream) + : name(name), code(code), hasAudioStream(hasAudioStream) {} + +bool VideoDefinition::isEmpty() const { + return code == kEmptyDefinitionCode && name.isEmpty(); }