Cover art handling: significantly reduce memory usage. fixes #93

This commit is contained in:
emeric
2020-10-12 13:30:34 +02:00
parent f6736bb919
commit e79dae48d1
21 changed files with 440 additions and 273 deletions
+6 -12
View File
@@ -45,7 +45,7 @@ static std::string averror_to_string(int error)
}
MediaFileException::MediaFileException(int avError)
: AvException("MediaFileException: " + averror_to_string(avError))
: AvException {"MediaFileException: " + averror_to_string(avError)}
{
}
@@ -181,8 +181,8 @@ MediaFile::hasAttachedPictures(void) const
return false;
}
std::vector<Picture>
MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const
void
MediaFile::visitAttachedPictures(std::function<void(const Picture&)> func) const
{
static const std::map<int, std::string> codecMimeMap =
{
@@ -194,8 +194,6 @@ MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const
{ AV_CODEC_ID_PPM, "image/x-portable-pixmap" },
};
std::vector<Picture> pictures;
for (std::size_t i = 0; i < _context->nb_streams; ++i)
{
AVStream *avstream = _context->streams[i];
@@ -225,15 +223,11 @@ MediaFile::getAttachedPictures(std::size_t nbMaxPictures) const
const AVPacket& pkt {avstream->attached_pic};
std::copy(pkt.data, pkt.data + pkt.size, std::back_inserter(picture.data));
picture.data = reinterpret_cast<const std::byte*>(pkt.data);
picture.dataSize = pkt.size;
pictures.push_back( picture );
if (pictures.size() >= nbMaxPictures)
break;
func(picture);
}
return pictures;
}
std::optional<MediaFileFormat>
+5 -3
View File
@@ -23,6 +23,7 @@
#include <chrono>
#include <filesystem>
#include <functional>
#include <map>
#include <optional>
#include <string>
@@ -40,7 +41,8 @@ void AvInit();
struct Picture
{
std::string mimeType;
std::vector<uint8_t> data;
const std::byte* data {};
std::size_t dataSize;
};
struct StreamInfo
@@ -76,11 +78,11 @@ class MediaFile
std::vector<StreamInfo> getStreamInfo() const;
std::optional<std::size_t> getBestStream() const; // none if failure/unknown
bool hasAttachedPictures(void) const;
std::vector<Picture> getAttachedPictures(std::size_t nbMaxPictures) const;
void visitAttachedPictures(std::function<void(const Picture&)> func) const;
private:
std::filesystem::path _p;
const std::filesystem::path _p;
AVFormatContext* _context {};
};