4#include <libavformat/avformat.h>
5#include <libavcodec/avcodec.h>
77 std::chrono::milliseconds length = 0ms;
78 bool compilation =
false;
80 AVFormatContext* p_context =
nullptr;
81 AVInputFormat* p_inputformat =
nullptr;
83 QByteArray local8bit =
filename.toLocal8Bit();
84 if ((avformat_open_input(&p_context, local8bit.constData(),
85 p_inputformat,
nullptr) < 0))
90 if (avformat_find_stream_info(p_context,
nullptr) < 0)
96 AVDictionaryEntry *tag = av_dict_get(p_context->metadata,
"\0",
nullptr,
97 AV_METADATA_IGNORE_SUFFIX);
98 while (tag !=
nullptr)
100 LOG(VB_GENERAL, LOG_DEBUG, QString(
"Tag: %1 Value: %2")
101 .arg(tag->key) .arg(QString::fromUtf8(tag->value)));
102 tag = av_dict_get(p_context->metadata,
"\0", tag,
103 AV_METADATA_IGNORE_SUFFIX);
119 if (artist.isEmpty())
126 length = duration_cast<std::chrono::milliseconds>(av_duration(p_context->duration));
132 compilation ? artist :
"",
133 album, title, genre, year,
136 retdata->setCompilation(compilation);
138 avformat_close_input(&p_context);
152 AVDictionaryEntry *tag = av_dict_get(context->metadata, tagname,
nullptr, 0);
157 value = QString::fromUtf8(tag->value);
170 AVFormatContext* p_context =
nullptr;
171 AVInputFormat* p_inputformat =
nullptr;
174 QByteArray local8bit =
filename.toLocal8Bit();
175 if ((avformat_open_input(&p_context, local8bit.constData(),
176 p_inputformat,
nullptr) < 0))
181 if (avformat_find_stream_info(p_context,
nullptr) < 0)
184 std::chrono::milliseconds rv =
185 duration_cast<std::chrono::milliseconds>(av_duration(p_context->duration));
187 avformat_close_input(&p_context);
201 QString *title, QString *genre)
203 if (artist->isEmpty())
204 artist->append(
"Unknown Artist");
206 if (album->isEmpty())
207 album->append(
"Unknown Album");
209 if (title->isEmpty())
210 title->append(
"Unknown Title");
212 if (genre->isEmpty())
213 genre->append(
"Unknown Genre");
#define LOG(_MASK_, _LEVEL_, _QSTRING_)