Minor cleanup on audio codecs
This commit is contained in:
@@ -70,83 +70,83 @@ namespace lms::audio::ffmpeg
|
||||
res[core::stringUtils::stringToUpper(tag->key)] = tag->value;
|
||||
}
|
||||
|
||||
std::optional<core::media::ContainerType> avdemuxerToContainerType(std::string_view name)
|
||||
std::optional<core::media::Container> avdemuxerToContainerType(std::string_view name)
|
||||
{
|
||||
if (name == "aiff")
|
||||
return core::media::ContainerType::AIFF;
|
||||
return core::media::Container::AIFF;
|
||||
if (name == "ape")
|
||||
return core::media::ContainerType::APE;
|
||||
return core::media::Container::APE;
|
||||
if (name.starts_with("asf"))
|
||||
return core::media::ContainerType::ASF;
|
||||
return core::media::Container::ASF;
|
||||
if (name == "dsf")
|
||||
return core::media::ContainerType::DSF;
|
||||
return core::media::Container::DSF;
|
||||
if (name == "flac")
|
||||
return core::media::ContainerType::FLAC;
|
||||
return core::media::Container::FLAC;
|
||||
if (name.find("mp4") != std::string_view::npos)
|
||||
return core::media::ContainerType::MP4;
|
||||
return core::media::Container::MP4;
|
||||
if (name.starts_with("mpc"))
|
||||
return core::media::ContainerType::MPC;
|
||||
return core::media::Container::MPC;
|
||||
if (name == "mp3")
|
||||
return core::media::ContainerType::MPEG;
|
||||
return core::media::Container::MPEG;
|
||||
if (name == "ogg")
|
||||
return core::media::ContainerType::Ogg;
|
||||
return core::media::Container::Ogg;
|
||||
if (name == "shn")
|
||||
return core::media::ContainerType::Shorten;
|
||||
return core::media::Container::Shorten;
|
||||
if (name == "tta")
|
||||
return core::media::ContainerType::TrueAudio;
|
||||
return core::media::Container::TrueAudio;
|
||||
if (name == "wav")
|
||||
return core::media::ContainerType::WAV;
|
||||
return core::media::Container::WAV;
|
||||
if (name == "wv")
|
||||
return core::media::ContainerType::WavPack;
|
||||
return core::media::Container::WavPack;
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<core::media::CodecType> avcodecToCodecType(AVCodecID codec)
|
||||
std::optional<core::media::Codec> avcodecToCodecType(AVCodecID codec)
|
||||
{
|
||||
switch (codec)
|
||||
{
|
||||
case AV_CODEC_ID_AAC:
|
||||
return core::media::CodecType::AAC;
|
||||
return core::media::Codec::AAC;
|
||||
case AV_CODEC_ID_AC3:
|
||||
return core::media::CodecType::AC3;
|
||||
return core::media::Codec::AC3;
|
||||
case AV_CODEC_ID_ALAC:
|
||||
return core::media::CodecType::ALAC;
|
||||
return core::media::Codec::ALAC;
|
||||
case AV_CODEC_ID_APE:
|
||||
return core::media::CodecType::APE;
|
||||
return core::media::Codec::APE;
|
||||
case AV_CODEC_ID_DSD_LSBF:
|
||||
case AV_CODEC_ID_DSD_LSBF_PLANAR:
|
||||
case AV_CODEC_ID_DSD_MSBF:
|
||||
case AV_CODEC_ID_DSD_MSBF_PLANAR:
|
||||
return core::media::CodecType::DSD;
|
||||
return core::media::Codec::DSD;
|
||||
case AV_CODEC_ID_EAC3:
|
||||
return core::media::CodecType::EAC3;
|
||||
return core::media::Codec::EAC3;
|
||||
case AV_CODEC_ID_FLAC:
|
||||
return core::media::CodecType::FLAC;
|
||||
return core::media::Codec::FLAC;
|
||||
case AV_CODEC_ID_MP3:
|
||||
return core::media::CodecType::MP3;
|
||||
return core::media::Codec::MP3;
|
||||
case AV_CODEC_ID_MP4ALS:
|
||||
return core::media::CodecType::MP4ALS;
|
||||
return core::media::Codec::MP4ALS;
|
||||
case AV_CODEC_ID_MUSEPACK7:
|
||||
return core::media::CodecType::MPC7;
|
||||
return core::media::Codec::MPC7;
|
||||
case AV_CODEC_ID_MUSEPACK8:
|
||||
return core::media::CodecType::MPC8;
|
||||
return core::media::Codec::MPC8;
|
||||
case AV_CODEC_ID_OPUS:
|
||||
return core::media::CodecType::Opus;
|
||||
return core::media::Codec::Opus;
|
||||
case AV_CODEC_ID_SHORTEN:
|
||||
return core::media::CodecType::Shorten;
|
||||
return core::media::Codec::Shorten;
|
||||
case AV_CODEC_ID_VORBIS:
|
||||
return core::media::CodecType::Vorbis;
|
||||
return core::media::Codec::Vorbis;
|
||||
case AV_CODEC_ID_WAVPACK:
|
||||
return core::media::CodecType::WavPack;
|
||||
return core::media::Codec::WavPack;
|
||||
case AV_CODEC_ID_WMALOSSLESS:
|
||||
return core::media::CodecType::WMA9Lossless;
|
||||
return core::media::Codec::WMA9Lossless;
|
||||
case AV_CODEC_ID_WMAPRO:
|
||||
return core::media::CodecType::WMA9Pro;
|
||||
return core::media::Codec::WMA9Pro;
|
||||
case AV_CODEC_ID_WMAV1:
|
||||
return core::media::CodecType::WMA1;
|
||||
return core::media::Codec::WMA1;
|
||||
case AV_CODEC_ID_WMAV2:
|
||||
return core::media::CodecType::WMA2;
|
||||
return core::media::Codec::WMA2;
|
||||
|
||||
default:
|
||||
return std::nullopt;
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "core/media/CodecType.hpp"
|
||||
#include "core/media/ContainerType.hpp"
|
||||
#include "core/media/Codec.hpp"
|
||||
#include "core/media/Container.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
@@ -45,7 +45,7 @@ namespace lms::audio::ffmpeg
|
||||
|
||||
struct ContainerInfo
|
||||
{
|
||||
std::optional<core::media::ContainerType> container;
|
||||
std::optional<core::media::Container> container;
|
||||
std::string containerName;
|
||||
|
||||
std::optional<std::size_t> bitrate;
|
||||
@@ -55,7 +55,7 @@ namespace lms::audio::ffmpeg
|
||||
struct StreamInfo
|
||||
{
|
||||
size_t index{};
|
||||
std::optional<core::media::CodecType> codec;
|
||||
std::optional<core::media::Codec> codec;
|
||||
std::string codecName;
|
||||
|
||||
std::optional<size_t> bitrate;
|
||||
|
||||
@@ -161,42 +161,42 @@ namespace lms::audio::ffmpeg
|
||||
|
||||
switch (_outputParams.format->container)
|
||||
{
|
||||
case core::media::ContainerType::FLAC:
|
||||
case core::media::Container::FLAC:
|
||||
args.emplace_back("flac");
|
||||
break;
|
||||
case core::media::ContainerType::Ogg:
|
||||
case core::media::Container::Ogg:
|
||||
args.emplace_back("ogg");
|
||||
break;
|
||||
case core::media::ContainerType::MPEG:
|
||||
case core::media::Container::MPEG:
|
||||
args.emplace_back("mp3");
|
||||
break;
|
||||
|
||||
default:
|
||||
throw Exception{ "Unsupported container type " + std::string{ core::media::containerTypeToString(_outputParams.format->container).str() } };
|
||||
throw Exception{ "Unsupported container type " + std::string{ core::media::containerToString(_outputParams.format->container).str() } };
|
||||
}
|
||||
|
||||
args.emplace_back("-acodec");
|
||||
|
||||
switch (_outputParams.format->codec)
|
||||
{
|
||||
case core::media::CodecType::MP3:
|
||||
case core::media::Codec::MP3:
|
||||
args.emplace_back("libmp3lame");
|
||||
break;
|
||||
|
||||
case core::media::CodecType::Opus:
|
||||
case core::media::Codec::Opus:
|
||||
args.emplace_back("libopus");
|
||||
break;
|
||||
|
||||
case core::media::CodecType::Vorbis:
|
||||
case core::media::Codec::Vorbis:
|
||||
args.emplace_back("libvorbis");
|
||||
break;
|
||||
|
||||
case core::media::CodecType::FLAC:
|
||||
case core::media::Codec::FLAC:
|
||||
args.emplace_back("flac");
|
||||
break;
|
||||
|
||||
default:
|
||||
throw Exception{ "Unhandled codec type " + std::string{ codecTypeToString(_outputParams.format->codec).str() } };
|
||||
throw Exception{ "Unhandled codec type " + std::string{ core::media::getCodecDesc(_outputParams.format->codec).name.str() } };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -104,27 +104,27 @@ namespace lms::audio::taglib
|
||||
// Guess container from the file type
|
||||
if (const auto* apeFile{ dynamic_cast<const ::TagLib::APE::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::APE;
|
||||
audioProperties.codec = core::media::CodecType::APE; // TODO version?
|
||||
audioProperties.container = core::media::Container::APE;
|
||||
audioProperties.codec = core::media::Codec::APE; // TODO version?
|
||||
audioProperties.bitsPerSample = apeFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
else if (const auto* asfFile{ dynamic_cast<const ::TagLib::ASF::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::ASF;
|
||||
audioProperties.container = core::media::Container::ASF;
|
||||
|
||||
switch (asfFile->audioProperties()->codec())
|
||||
{
|
||||
case ::TagLib::ASF::Properties::Codec::WMA1:
|
||||
audioProperties.codec = core::media::CodecType::WMA1;
|
||||
audioProperties.codec = core::media::Codec::WMA1;
|
||||
break;
|
||||
case ::TagLib::ASF::Properties::Codec::WMA2:
|
||||
audioProperties.codec = core::media::CodecType::WMA2;
|
||||
audioProperties.codec = core::media::Codec::WMA2;
|
||||
break;
|
||||
case ::TagLib::ASF::Properties::Codec::WMA9Lossless:
|
||||
audioProperties.codec = core::media::CodecType::WMA9Lossless;
|
||||
audioProperties.codec = core::media::Codec::WMA9Lossless;
|
||||
break;
|
||||
case ::TagLib::ASF::Properties::Codec::WMA9Pro:
|
||||
audioProperties.codec = core::media::CodecType::WMA9Pro;
|
||||
audioProperties.codec = core::media::Codec::WMA9Pro;
|
||||
break;
|
||||
case ::TagLib::ASF::Properties::Codec::Unknown:
|
||||
LMS_LOG(AUDIO, DEBUG, "Unhandled ASF codec in " << filePath);
|
||||
@@ -136,27 +136,27 @@ namespace lms::audio::taglib
|
||||
#if LMS_TAGLIB_HAS_DSF
|
||||
else if (const auto* dsfFile{ dynamic_cast<const ::TagLib::DSF::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::DSF;
|
||||
audioProperties.codec = core::media::CodecType::DSD;
|
||||
audioProperties.container = core::media::Container::DSF;
|
||||
audioProperties.codec = core::media::Codec::DSD;
|
||||
audioProperties.bitsPerSample = dsfFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
#endif // LMS_TAGLIB_HAS_DSF
|
||||
else if (const auto* flacFile{ dynamic_cast<const ::TagLib::FLAC::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::FLAC;
|
||||
audioProperties.codec = core::media::CodecType::FLAC;
|
||||
audioProperties.container = core::media::Container::FLAC;
|
||||
audioProperties.codec = core::media::Codec::FLAC;
|
||||
audioProperties.bitsPerSample = flacFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
else if (const auto* mp4File{ dynamic_cast<const ::TagLib::MP4::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::MP4;
|
||||
audioProperties.container = core::media::Container::MP4;
|
||||
switch (mp4File->audioProperties()->codec())
|
||||
{
|
||||
case ::TagLib::MP4::Properties::Codec::AAC:
|
||||
audioProperties.codec = core::media::CodecType::AAC;
|
||||
audioProperties.codec = core::media::Codec::AAC;
|
||||
break;
|
||||
case ::TagLib::MP4::Properties::Codec::ALAC:
|
||||
audioProperties.codec = core::media::CodecType::ALAC;
|
||||
audioProperties.codec = core::media::Codec::ALAC;
|
||||
break;
|
||||
case ::TagLib::MP4::Properties::Codec::Unknown:
|
||||
LMS_LOG(AUDIO, DEBUG, "Unhandled MP4 codec in " << filePath);
|
||||
@@ -167,15 +167,15 @@ namespace lms::audio::taglib
|
||||
}
|
||||
else if (const auto* mpcFile{ dynamic_cast<const ::TagLib::MPC::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::MPC;
|
||||
audioProperties.container = core::media::Container::MPC;
|
||||
|
||||
switch (mpcFile->audioProperties()->mpcVersion())
|
||||
{
|
||||
case 7:
|
||||
audioProperties.codec = core::media::CodecType::MPC7;
|
||||
audioProperties.codec = core::media::Codec::MPC7;
|
||||
break;
|
||||
case 8:
|
||||
audioProperties.codec = core::media::CodecType::MPC8;
|
||||
audioProperties.codec = core::media::Codec::MPC8;
|
||||
break;
|
||||
default:
|
||||
LMS_LOG(AUDIO, DEBUG, "Unhandled MPC codec version " << mpcFile->audioProperties()->mpcVersion() << " in " << filePath);
|
||||
@@ -186,13 +186,13 @@ namespace lms::audio::taglib
|
||||
{
|
||||
const auto& properties{ *mpegFile->audioProperties() };
|
||||
|
||||
audioProperties.container = core::media::ContainerType::MPEG;
|
||||
audioProperties.container = core::media::Container::MPEG;
|
||||
if ((properties.version() == TagLib::MPEG::Header::Version::Version1 || properties.version() == TagLib::MPEG::Header::Version::Version2 || properties.version() == TagLib::MPEG::Header::Version::Version2_5)
|
||||
&& mpegFile->audioProperties()->layer() == 3)
|
||||
audioProperties.codec = core::media::CodecType::MP3; // could be MPEG-1 layer 3 or MPEG-2(.5) layer 3
|
||||
audioProperties.codec = core::media::Codec::MP3; // could be MPEG-1 layer 3 or MPEG-2(.5) layer 3
|
||||
#if LMS_TAGLIB_HAS_ADTS
|
||||
else if (mpegFile->audioProperties()->isADTS()) // likely AAC
|
||||
audioProperties.codec = core::media::CodecType::AAC;
|
||||
audioProperties.codec = core::media::Codec::AAC;
|
||||
#endif
|
||||
else
|
||||
{
|
||||
@@ -202,44 +202,44 @@ namespace lms::audio::taglib
|
||||
}
|
||||
else if (dynamic_cast<const ::TagLib::Ogg::Opus::File*>(&file))
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::Ogg;
|
||||
audioProperties.codec = core::media::CodecType::Opus;
|
||||
audioProperties.container = core::media::Container::Ogg;
|
||||
audioProperties.codec = core::media::Codec::Opus;
|
||||
}
|
||||
else if (dynamic_cast<const ::TagLib::Ogg::Vorbis::File*>(&file))
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::Ogg;
|
||||
audioProperties.codec = core::media::CodecType::Vorbis;
|
||||
audioProperties.container = core::media::Container::Ogg;
|
||||
audioProperties.codec = core::media::Codec::Vorbis;
|
||||
}
|
||||
else if (const auto* aiffFile{ dynamic_cast<const ::TagLib::RIFF::AIFF::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::AIFF;
|
||||
audioProperties.codec = core::media::CodecType::PCM;
|
||||
audioProperties.container = core::media::Container::AIFF;
|
||||
audioProperties.codec = core::media::Codec::PCM;
|
||||
audioProperties.bitsPerSample = aiffFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
else if (const auto* wavFile{ dynamic_cast<const ::TagLib::RIFF::WAV::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::WAV;
|
||||
audioProperties.codec = core::media::CodecType::PCM;
|
||||
audioProperties.container = core::media::Container::WAV;
|
||||
audioProperties.codec = core::media::Codec::PCM;
|
||||
audioProperties.bitsPerSample = wavFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
#if LMS_TAGLIB_HAS_SHORTEN
|
||||
else if (const auto* shortenFile{ dynamic_cast<const ::TagLib::Shorten::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::Shorten;
|
||||
audioProperties.codec = core::media::CodecType::Shorten;
|
||||
audioProperties.container = core::media::Container::Shorten;
|
||||
audioProperties.codec = core::media::Codec::Shorten;
|
||||
audioProperties.bitsPerSample = shortenFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
#endif // LMS_TAGLIB_HAS_SHORTEN
|
||||
else if (const auto* trueAudioFile{ dynamic_cast<const ::TagLib::TrueAudio::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::TrueAudio;
|
||||
audioProperties.codec = core::media::CodecType::TrueAudio;
|
||||
audioProperties.container = core::media::Container::TrueAudio;
|
||||
audioProperties.codec = core::media::Codec::TrueAudio;
|
||||
audioProperties.bitsPerSample = trueAudioFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
else if (const auto* wavPackFile{ dynamic_cast<const ::TagLib::WavPack::File*>(&file) })
|
||||
{
|
||||
audioProperties.container = core::media::ContainerType::WavPack;
|
||||
audioProperties.codec = core::media::CodecType::WavPack;
|
||||
audioProperties.container = core::media::Container::WavPack;
|
||||
audioProperties.codec = core::media::Codec::WavPack;
|
||||
audioProperties.bitsPerSample = wavPackFile->audioProperties()->bitsPerSample();
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user