#ifndef ENCODER_HPP
#define ENCODER_HPP

#include <QImage>
#include <QSize>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}

struct OutputStream {
    AVStream *st = NULL;
    AVCodecContext *enc = NULL;

    int64_t nextPts = 0;

    AVFrame *frame = NULL;

    SwsContext *sws = NULL;
};

struct CodecSettings {
    int bitrate;
    int gopSize;
    int bFrames;
    int mbDecisions;
    QString h264Profile;
    int h264Crf;
    bool vp9Lossless;
};

class Encoder {
public:
    Encoder(QString &targetFile, QSize res, CodecSettings *settings = NULL);
    ~Encoder();
    bool addFrame(QImage frm);
    bool isRunning();
    bool end();

private:
    AVCodec *codec = NULL;

    OutputStream *out = new OutputStream;
    AVFormatContext *fc = NULL;

    bool success = false;
    bool ended = false;

    QSize size;

    void setFrameRGB(QImage img);
};

#endif // ENCODER_HPP