From 53943c41189e8f9708065f300789b17f21ff4b79 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 12 Nov 2023 14:46:44 +0100 Subject: [PATCH] Fixed bitrate detection for av parser --- src/libs/av/impl/AudioFile.cpp | 10 +-- src/libs/av/impl/AudioFile.hpp | 2 +- src/libs/av/include/av/IAudioFile.hpp | 75 +++++++++++++---------- src/libs/metadata/impl/AvFormatParser.cpp | 15 +---- 4 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/libs/av/impl/AudioFile.cpp b/src/libs/av/impl/AudioFile.cpp index e6172a98..fd29b3f0 100644 --- a/src/libs/av/impl/AudioFile.cpp +++ b/src/libs/av/impl/AudioFile.cpp @@ -101,12 +101,14 @@ namespace Av return _p; } - std::chrono::milliseconds AudioFile::getDuration() const + ContainerInfo AudioFile::getContainerInfo() const { - if (_context->duration == AV_NOPTS_VALUE) - return std::chrono::milliseconds{ 0 }; // TODO estimate + ContainerInfo info; + info.bitrate = _context->bit_rate; + info.duration = std::chrono::milliseconds{ _context->duration == AV_NOPTS_VALUE ? 0 : _context->duration / AV_TIME_BASE * 1000 }; + info.name = _context->iformat->name; - return std::chrono::milliseconds{ _context->duration / AV_TIME_BASE * 1000 }; + return info; } AudioFile::MetadataMap AudioFile::getMetaData() const diff --git a/src/libs/av/impl/AudioFile.hpp b/src/libs/av/impl/AudioFile.hpp index bd3224dd..46e8f830 100644 --- a/src/libs/av/impl/AudioFile.hpp +++ b/src/libs/av/impl/AudioFile.hpp @@ -35,7 +35,7 @@ namespace Av ~AudioFile(); const std::filesystem::path& getPath() const override; - std::chrono::milliseconds getDuration() const override; + ContainerInfo getContainerInfo() const override; MetadataMap getMetaData() const override; std::vector getStreamInfo() const override; std::optional getBestStreamInfo() const override; diff --git a/src/libs/av/include/av/IAudioFile.hpp b/src/libs/av/include/av/IAudioFile.hpp index 0c788c66..b7f92a7b 100644 --- a/src/libs/av/include/av/IAudioFile.hpp +++ b/src/libs/av/include/av/IAudioFile.hpp @@ -17,7 +17,7 @@ * along with LMS. If not, see . */ -/* This file contains some classes in order to get info from file using the libavconv */ + /* This file contains some classes in order to get info from file using the libavconv */ #pragma once @@ -34,46 +34,53 @@ namespace Av { - struct Picture - { - std::string mimeType; - const std::byte* data {}; - std::size_t dataSize {}; - }; + struct Picture + { + std::string mimeType; + const std::byte* data{}; + std::size_t dataSize{}; + }; - struct StreamInfo - { - size_t index {}; - std::size_t bitrate {}; - std::string codec; - }; + struct ContainerInfo + { + std::size_t bitrate{}; + std::string name{}; + std::chrono::milliseconds duration{}; + }; - class IAudioFile - { - public: - virtual ~IAudioFile() = default; + struct StreamInfo + { + size_t index{}; + std::size_t bitrate{}; + std::string codec; + }; - using MetadataMap = std::unordered_map; + class IAudioFile + { + public: + virtual ~IAudioFile() = default; - virtual const std::filesystem::path& getPath() const = 0; - virtual std::chrono::milliseconds getDuration() const = 0; - virtual MetadataMap getMetaData() const = 0; - virtual std::vector getStreamInfo() const = 0; - virtual std::optional getBestStreamInfo() const = 0; // none if failure/unknown - virtual std::optional getBestStreamIndex() const = 0; // none if failure/unknown - virtual bool hasAttachedPictures() const = 0; - virtual void visitAttachedPictures(std::function func) const = 0; - }; + using MetadataMap = std::unordered_map; - std::unique_ptr parseAudioFile(const std::filesystem::path& p); + virtual const std::filesystem::path& getPath() const = 0; + virtual ContainerInfo getContainerInfo() const = 0; + virtual MetadataMap getMetaData() const = 0; + virtual std::vector getStreamInfo() const = 0; + virtual std::optional getBestStreamInfo() const = 0; // none if failure/unknown + virtual std::optional getBestStreamIndex() const = 0; // none if failure/unknown + virtual bool hasAttachedPictures() const = 0; + virtual void visitAttachedPictures(std::function func) const = 0; + }; - struct AudioFileFormat - { - std::string mimeType; - std::string format; - }; + std::unique_ptr parseAudioFile(const std::filesystem::path& p); - std::string_view getMimeType(const std::filesystem::path& fileExtension); + struct AudioFileFormat + { + std::string mimeType; + std::string format; + }; + + std::string_view getMimeType(const std::filesystem::path& fileExtension); } // namespace Av diff --git a/src/libs/metadata/impl/AvFormatParser.cpp b/src/libs/metadata/impl/AvFormatParser.cpp index 6c8c6296..63347cc5 100644 --- a/src/libs/metadata/impl/AvFormatParser.cpp +++ b/src/libs/metadata/impl/AvFormatParser.cpp @@ -186,18 +186,9 @@ AvFormatParser::parse(const std::filesystem::path& p, bool debug) { const auto mediaFile {Av::parseAudioFile(p)}; - // Stream info - if (const auto stream{ mediaFile->getBestStreamInfo() }) - { - track.bitrate = stream->bitrate; - } - else - { - LMS_LOG(METADATA, INFO) << "File '" << p.string() << "': cannot get best audio stream"; - return std::nullopt; - } - - track.duration = mediaFile->getDuration(); + Av::ContainerInfo info{ mediaFile->getContainerInfo() }; + track.duration = info.duration; + track.bitrate = info.bitrate; track.hasCover = mediaFile->hasAttachedPictures(); MetaData::Tags tags;