78 lines
2.1 KiB
C++
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
|