Fixed bitrate detection for av parser

This commit is contained in:
emeric
2023-11-12 14:46:44 +01:00
parent 07949de20f
commit 53943c4118
4 changed files with 51 additions and 51 deletions
+6 -4
View File
@@ -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
+1 -1
View File
@@ -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<StreamInfo> getStreamInfo() const override;
std::optional<StreamInfo> getBestStreamInfo() const override;
+13 -6
View File
@@ -17,7 +17,7 @@
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/
/* 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
@@ -37,14 +37,21 @@ namespace Av
struct Picture
{
std::string mimeType;
const std::byte* data {};
std::size_t dataSize {};
const std::byte* data{};
std::size_t dataSize{};
};
struct ContainerInfo
{
std::size_t bitrate{};
std::string name{};
std::chrono::milliseconds duration{};
};
struct StreamInfo
{
size_t index {};
std::size_t bitrate {};
size_t index{};
std::size_t bitrate{};
std::string codec;
};
@@ -56,7 +63,7 @@ namespace Av
using MetadataMap = std::unordered_map<std::string, std::string>;
virtual const std::filesystem::path& getPath() const = 0;
virtual std::chrono::milliseconds getDuration() const = 0;
virtual ContainerInfo getContainerInfo() const = 0;
virtual MetadataMap getMetaData() const = 0;
virtual std::vector<StreamInfo> getStreamInfo() const = 0;
virtual std::optional<StreamInfo> getBestStreamInfo() const = 0; // none if failure/unknown
+3 -12
View File
@@ -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;