|
@@ -962,35 +962,40 @@ label_ThreadDecodeExit:
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* 对生成的图像进行格式转换,并添加到环形队列中 */
|
|
|
+/**
|
|
|
+ * @brief 对生成的图像进行格式转换,并添加到环形队列中
|
|
|
+ * 1、YUVJ420P格式是全色YUV格式,范围是[0-255],而YUV420P格式是限色YUV格式,范围是[16-235]。
|
|
|
+ * 2、判断视频格式,如果是RGB类型的转换成RGBA格式,如果是yuv类型的,转换成YUVJ420P格式
|
|
|
+ * @param pFrame
|
|
|
+ */
|
|
|
void DecodeVedio::convertImageFormatAndPushToQueue(AVFrame* pFrame)
|
|
|
{
|
|
|
/* 判断视频帧格式 */
|
|
|
- if(pFrame->format == AV_PIX_FMT_YUV420P)
|
|
|
+ if((pFrame->format == AV_PIX_FMT_YUV420P) || (pFrame->format == AV_PIX_FMT_YUVJ420P))
|
|
|
{
|
|
|
- m_frameFormat = EFrameFormat::Frame_YUV420P;
|
|
|
/* 是yuv420p格式, */
|
|
|
Frame_YUV420P* frame = new Frame_YUV420P();
|
|
|
- convertYUV420PToImage(pFrame, frame->frameData);
|
|
|
+ convertToYUV420P(pFrame, frame->frameData);
|
|
|
m_queueFrame.push(frame);
|
|
|
- } else
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 判断视频格式,如果是RGB类型的转换成RGBA格式,如果是yuv类型的,转换成YUVJ420P格式 */
|
|
|
+ /* 不是420p,转换成RGBA格式 */
|
|
|
+ Frame_RGBA8888* frame = new Frame_RGBA8888();
|
|
|
+ convertToRGBA(pFrame, frame->frameData);
|
|
|
+ if(frame->frameData == nullptr)
|
|
|
{
|
|
|
- /* 不是420p,转换成RGBA格式 */
|
|
|
- m_frameFormat = EFrameFormat::Frame_RGBA8888;
|
|
|
- convertToRGBA(pFrame);
|
|
|
- if(m_buffer != nullptr)
|
|
|
- {
|
|
|
- Frame_RGBA8888* frame = new Frame_RGBA8888();
|
|
|
- /* 将数据拷贝到QImage中 */
|
|
|
- frame->frameData = new QImage(m_buffer, m_srcSize.width(), m_srcSize.height(), QImage::Format_RGBA8888);
|
|
|
- /* 如果队列满,线程会阻塞在这里 */
|
|
|
- m_queueFrame.push(frame);
|
|
|
- }
|
|
|
+ SPDLOG_ERROR("转换成RGBA格式失败,可能是解码器不支持该格式: {}", av_get_pix_fmt_name((AVPixelFormat)pFrame->format));
|
|
|
+ delete frame; /* 释放空间 */
|
|
|
+ return;
|
|
|
}
|
|
|
+ /* 如果队列满,线程会阻塞在这里 */
|
|
|
+ m_queueFrame.push(frame);
|
|
|
}
|
|
|
|
|
|
/* 将yuv420p的uint8_t数组缓存转换成Image_YUV420P结构体 */
|
|
|
-void DecodeVedio::convertYUV420PToImage(AVFrame* pFrame, Image_YUV420P* image)
|
|
|
+void DecodeVedio::convertToYUV420P(AVFrame* pFrame, Image_YUV420P* image)
|
|
|
{
|
|
|
if(pFrame == nullptr || image == nullptr)
|
|
|
{
|
|
@@ -1010,7 +1015,7 @@ void DecodeVedio::convertYUV420PToImage(AVFrame* pFrame, Image_YUV420P* image)
|
|
|
}
|
|
|
|
|
|
/* 转换成RGBA格式 */
|
|
|
-void DecodeVedio::convertToRGBA(AVFrame* pFrame)
|
|
|
+void DecodeVedio::convertToRGBA(AVFrame* pFrame, QImage* image)
|
|
|
{
|
|
|
/* 转换解码后的帧格式,转换成RGBA格式,Qt可以识别 */
|
|
|
if(m_sws_ctx == nullptr)
|
|
@@ -1047,6 +1052,12 @@ void DecodeVedio::convertToRGBA(AVFrame* pFrame)
|
|
|
pFrame->height, /* 处理的行数(通常为图像高度) */
|
|
|
&m_buffer, /* 目标图像数据指针数组(packed格式只用[0]) */
|
|
|
lines); /* 目标图像每行字节数数组 */
|
|
|
+ if(m_buffer != nullptr)
|
|
|
+ {
|
|
|
+ /* 将数据拷贝到QImage中 */
|
|
|
+ *image = QImage(m_buffer, m_srcSize.width(), m_srcSize.height(), QImage::Format_RGBA8888);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/* 暂停解码,会阻塞到线程暂停为止 */
|