#ifndef VideoPlayer1_H
#define VideoPlayer1_H

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

class VideoDecode;

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

    void setPlayVedio(const QString& fileName);     /* 设置播放视频 */
    bool play();                                    /* 播放视频 */
    void pause();                                   /* 暂停播放 */
    void stop();                                    /* 停止播放 */


    static void ListHWDecoder();                    /* 列出当前环境支持的硬件解码器 */

    // void setPlayCallBack(std::function<Play_CallBack> playCallBack,void* context);  /* 设置播放回调函数 */
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_refreshOneUI();                         /* 通过信号刷新第一张图片 */
    void do_playCompleted();                        /* 播放完成 */

private:
    QString m_fileName;
    QTimer m_timerRefreshUI;                        /* 定时器，用于刷新界面 */
    int m_srcWidth = 0;                             /* 视频原本大小 */
    int m_srcHeight = 0;
    int m_nowWidth = 0;                             /* 现在大小 */
    int m_nowHeight = 0;
    int m_frameCount = 0;                           /* 帧数 */
    int m_interval = 0;                             /* 间隔 */

    VideoDecode* m_decodeVedio = nullptr;
    QThread* m_threadDecode = nullptr;              /* 解码器所在的线程 */
    QImage* m_image = nullptr;                      /* 画面 */
    bool m_playStatus = false;                      /* 是否正在播放 */
    QSemaphore* m_semRefresh = nullptr;             /* 刷新信号量 */

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

    bool m_isPlay = false;
};



#endif /* VideoPlayer1_H */
