Minor cleanup on audio codecs

This commit is contained in:
emeric
2025-12-07 22:40:45 +01:00
parent 66e4f9ef92
commit 6d27f18f19
38 changed files with 521 additions and 553 deletions
+34 -34
View File
@@ -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;
+4 -4
View File
@@ -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;
+9 -9
View File
@@ -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() } };
}
}
+34 -34
View File
@@ -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