Эх сурвалжийг харах

V0.3.8
1、修改了RingQueue,可以使用有参构造和无参构造

Apple 5 сар өмнө
parent
commit
77114310ca

+ 53 - 2
demo/VideoPlayer/VideoPlayer/DecodeVedio.cpp

@@ -2,7 +2,8 @@
 #include "spdlog/spdlog.h"
 #include "FmtLog/fmtlog.h"
 
-#include <QImage>
+
+
 #include <QThread>
 
 extern "C"
@@ -425,7 +426,7 @@ void DecodeVedio::initFFmpeg(const QString& fileName)
     }
     SPDLOG_TRACE("打开编码器成功!");
 
-    /******** 读取数据(解码数据) ********/
+    /******** 创建数据包(解码数据) ********/
     m_packet = av_packet_alloc();
     // av_init_packet(m_packet);
     av_new_packet(m_packet, m_pCodecCtx->width * m_pCodecCtx->height);
@@ -660,6 +661,56 @@ void DecodeVedio::decodeVedio()
     m_threadStopped = true;
 }
 
+/**
+ * @brief 软解码线程,使用CPU解码,使用环境队列存储解码的数据
+ * 
+ */
+void DecodeVedio::decodeUsingCPU()
+{
+    /******** 初始化局部变量 ********/
+    int ret = 0;
+    int retFrame = 0;
+    int retPacket = 0;
+    m_pauseDecode = false;
+    m_decodeStatus = true;
+    /* 创建数据包 */
+    AVPacket* packet = av_packet_alloc();
+    // av_init_packet(m_packet);
+    ret = av_new_packet(m_packet, m_pCodecCtx->width * m_pCodecCtx->height);
+    if(ret < 0)
+    {
+        SPDLOG_ERROR("创建数据包packet错误");
+        return;
+    }
+
+    /* 创建两个pFrame,一个存放原始数据,一个存放转换后的RGB数据 */
+    AVFrame* pFrameSRC = av_frame_alloc();
+    if(pFrameSRC == nullptr)
+    {
+        SPDLOG_ERROR("创建pFrameSRC错误");
+        return;
+    }
+    AVFrame* pFrameRGB = av_frame_alloc();
+    if(pFrameRGB == nullptr)
+    {
+        SPDLOG_ERROR("创建pFrameRGB错误");
+        return;
+    }
+    /* 创建环形队列 */
+    m_ringQueue.setQueueSize(30);
+
+    /******** 读取数据包 av_read_frame ********/
+    while(m_isRunning)
+    {
+
+        /* 发送给解码器 avcodec_send_packet */
+
+        /* 读取出解码器返回的帧 avcodec_receive_frame */
+
+        /* 转换解码后的帧格式,转换成RGBA格式,Qt可以识别 */
+    }
+}
+
 /* 退出线程,将所有可能暂停线程运行的条件全部唤醒 */
 void DecodeVedio::exitThread()
 {

+ 6 - 0
demo/VideoPlayer/VideoPlayer/DecodeVedio.h

@@ -6,6 +6,9 @@
 #include <QTimer>
 #include <QMutex>
 #include <QWaitCondition>
+#include <QImage>
+
+#include "RingQueue/RingQueue.hpp"
 
 // #include "threadcontroller.h"
 
@@ -79,6 +82,7 @@ signals:
 private:
     void freeFFmpeg();                              /* 取消ffmpeg初始化函数 */
     void decodeVedio();                             /* 解码视频的工作函数,这个就是新线程 */
+    void decodeUsingCPU();                          /* 软解码线程 */
     void exitThread();                              /* 退出线程 */
     void pauseDecode();                             /* 暂停解码 */
 
@@ -124,6 +128,8 @@ private:
 
     QList<int> m_listHWDeviceType;                  /* 保存当前环境支持的硬件解码器 */
     AVBufferRef* m_hw_device_ctx = nullptr;         /* 对数据缓冲区的引用 */
+
+    RingQueue<QImage*> m_ringQueue;                 /* 环形队列,存储生成的图像 */
 };
 
 

+ 1 - 1
demo/VideoPlayer/widget.cpp

@@ -19,7 +19,7 @@ Widget::Widget(QWidget *parent)
     m_videoPlayer->setPlayWidget(ui->widget_display);
     SPDLOG_INFO("***** Qt Library *****");
     
-    // VideoPlayer::ListHWDecoder();
+    VideoPlayer::ListHWDecoder();
 }
 
 Widget::~Widget()