Loading...
Searching...
No Matches
Thumbnailer.hpp
1#pragma once
2
3#include <Media/Libav.hpp>
4#if SCORE_HAS_LIBAV
5#include <Video/VideoInterface.hpp>
6
7#include <score_plugin_media_export.h>
8
9extern "C" {
10#include <libavformat/avformat.h>
11#include <libswscale/swscale.h>
12}
13
14#include <QImage>
15#include <QObject>
16
17#include <cinttypes>
18#include <verdigris>
19
20namespace Video
21{
22class SCORE_PLUGIN_MEDIA_EXPORT VideoThumbnailer
23 : public QObject
24 , public VideoMetadata
25{
26 W_OBJECT(VideoThumbnailer)
27public:
28 explicit VideoThumbnailer(QString filePath);
30
31 void requestThumbnails(int64_t req, QVector<int64_t> flicks)
32 E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, requestThumbnails, req, flicks)
33
34
35 void requestHeight(int height)
36 E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, requestHeight, height)
37
38 void thumbnailReady(int64_t req, int64_t flicks, QImage thumb)
39 E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, thumbnailReady, req, flicks, thumb)
40
41 QImage process(int64_t flicks);
42
43 double aspectRatio() const noexcept { return m_aspect; }
44
47 QSize thumbnailSize() const noexcept { return {smallWidth, smallHeight}; }
48
49 static constexpr int defaultThumbnailHeight = 55;
50
51private:
52 void onRequest(int64_t req, QVector<int64_t> flicks);
53 void onHeightRequest(int height);
54 void setupRescale(int height);
55 void processNext();
56
57 int smallWidth{};
58 int smallHeight{};
59
60 QVector<int64_t> m_requests;
61 int64_t m_requestIndex{};
62 int m_currentIndex{};
63
64 AVFormatContext* m_formatContext{};
65 AVCodecContext* m_codecContext{};
66 SwsContext* m_rescale{};
67 const AVCodec* m_codec{};
68 AVFrame* m_rgb{};
69 int64_t m_last_dts = 0;
70
71 int m_stream{-1};
72 double m_aspect{1.};
73};
74}
75
76W_REGISTER_ARGTYPE(QVector<int64_t>)
77#endif
Definition Thumbnailer.hpp:25
QSize thumbnailSize() const noexcept
Definition Thumbnailer.hpp:47
Definition VideoInterface.hpp:73