lumina/src/cpp/framedecoder.h
Chris Cochrun 014a38a4f9 the addition of a thumbnailer that works for videos
the previewSlideDelegate now uses the thumbnails instead
2023-02-08 14:16:26 -06:00

78 lines
2.1 KiB
C++

/*
SPDX-FileCopyrightText: 2010 Dirk Vanden Boer <dirk.vdb@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef MOVIEDECODER_H
#define MOVIEDECODER_H
#include <QString>
class QImage;
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavformat/avformat.h>
}
class FrameDecoder
{
public:
explicit FrameDecoder(const QString &filename, AVFormatContext *pavContext = nullptr);
~FrameDecoder();
QString getCodec();
void seek(int timeInSeconds);
bool decodeVideoFrame();
void getScaledVideoFrame(int scaledSize, bool maintainAspectRatio, QImage &videoFrame);
int getWidth();
int getHeight();
int getDuration();
void initialize(const QString &filename);
void destroy();
bool getInitialized();
private:
bool initializeVideo();
bool decodeVideoPacket();
bool getVideoPacket();
void convertAndScaleFrame(AVPixelFormat format, int scaledSize, bool maintainAspectRatio, int &scaledWidth, int &scaledHeight);
void createAVFrame(AVFrame **avFrame, quint8 **frameBuffer, int width, int height, AVPixelFormat format);
void calculateDimensions(int squareSize, bool maintainAspectRatio, int &destWidth, int &destHeight);
void deleteFilterGraph();
bool initFilterGraph(enum AVPixelFormat pixfmt, int width, int height);
bool processFilterGraph(AVFrame *dst, const AVFrame *src, enum AVPixelFormat pixfmt, int width, int height);
private:
int m_VideoStream;
AVFormatContext *m_pFormatContext;
AVCodecContext *m_pVideoCodecContext;
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(59, 0, 100)
AVCodec *m_pVideoCodec;
#else
const AVCodec *m_pVideoCodec;
#endif
AVFrame *m_pFrame;
quint8 *m_pFrameBuffer;
AVPacket *m_pPacket;
bool m_FormatContextWasGiven;
bool m_AllowSeek;
bool m_initialized;
AVFilterContext *m_bufferSinkContext;
AVFilterContext *m_bufferSourceContext;
AVFilterGraph *m_filterGraph;
AVFrame *m_filterFrame;
int m_lastWidth;
int m_lastHeight;
enum AVPixelFormat m_lastPixfmt;
};
#endif