#ifndef VideoPlayer_H
#define VideoPlayer_H

#include <QWidget>
#include <QThread>
#include <QTimer>
#include <QSemaphore>

class DecodeVedio;

class VideoPlayer : public QWidget
{
    Q_OBJECT
public:
    explicit VideoPlayer(QWidget *parent = nullptr);
    ~VideoPlayer();

    void openPlayVedio(const QString& fileName);    /* 打开播放视频 */
    bool play();                                    /* 播放视频 */
    void pause();                                   /* 暂停播放 */
    void stop();                                    /* 停止播放 */
    
    void backward(qint64 ms);                       /* 后退，单位ms */
    void forward(qint64 ms);                        /* 前进，单位ms */
    bool getPlayStatus() { return m_playStatus; }   /* 获取播放状态 */
    qint64 getDuration();                           /* 获取视频时长 */
    qint64 getCurrentPos();                         /* 获取当前播放位置 */
    void setCurrentPos(qint64 pos);                 /* 设置当前播放位置 */

    void setPlayWidgetSize(int width,int height);   /* 设置播放视频窗口的大小 */
    void setPlayWidget(QWidget* widget, bool flag = false); /* 设置播放窗口 */
    void setPreviewImage(int num = 2);              /* 设置预览图片数目，在暂停时跳转，可能会有花屏或者黑帧，可以设置跳转图片个数跳过黑帧 */
    void setFPS(int fps);                            /* 设置帧率 */

    // void setPlayCallBack(std::function<Play_CallBack> playCallBack,void* context);  /* 设置播放回调函数 */
signals:
    void signal_playCompleted();                    /* 播放完成信号 */
    void signal_refreshImage();                     /* 刷新图片信号 */

protected:
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void refreshOneUIUntilHave();                   /* 刷新一张图片，直到有图片为止 */
    /* 双击事件函数 */
    void mouseDoubleClickEvent(QMouseEvent *event) override;

private slots:
    void do_refreshUI();                            /* 取出画面，刷新UI */
    void do_refreshSamImage();                      /* 通过信号刷新图片 */
    void do_playCompleted();                        /* 播放完成 */

private:
    bool isLocalFile(const QString& fileName);      /* 判断是否是本地文件 */

private:
    bool m_isLocalFile = false;                     /* 是否是本地文件 */
    QString m_fileName;
    QTimer m_timerRefreshUI;                        /* 定时器，用于刷新界面 */
    int m_srcWidth = 0;                             /* 视频原本大小 */
    int m_srcHeight = 0;
    int m_nowWidth = 0;                             /* 现在大小 */
    int m_nowHeight = 0;
    int m_fps = 0;                                  /* 帧数 */
    int m_interval = 0;                             /* 定时器定时间隔，帧率的倒数，单位ms */
    qint64 m_duration = 0;                          /* 时长，单位ms */

    DecodeVedio* m_decodeVedio = nullptr;
    QThread* m_threadDecode = nullptr;              /* 解码器所在的线程 */
    QImage* m_image = nullptr;                      /* 画面 */
    bool m_playStatus = false;                      /* 是否正在播放 */
    bool m_isOpenFile = false;                      /* 是否打开了视频文件，未打开视频文件也就是未初始化解码线程 */
    QSemaphore* m_semRefresh = nullptr;             /* 刷新信号量 */

    int m_previewImage = 0;                         /* 预览图片数目 */

    // std::function<Play_CallBack> m_funcPlayCB = nullptr;  /* 播放回调函数 */
    // void* m_context = nullptr;                      /* 上下文 */
};



#endif /* VideoPlayer_H */
