|
@@ -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()
|
|
|
{
|