基于海思平台与QT框架的高效视频显示

本文介绍了一种在QT框架下,不使用OpenGl的高效视频展示方法。通过海思芯片的VGS进行YUV格式视频的缩放,IVE模块实现YUV转BGR,最后TDE将BGR转为RGB,全程采用硬件加速提升效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    首先,不涉及视频解码,仅涉及解码之后的视频缩放、颜色空间转换(如YUV转RGB)、贴图。本文主要说明的是在QT框架没有使用OpenGl的情况下,如何让解码后的视频更高效的展示出来。

    海思底层解码出来的视频都是YUV格式的,而QT的贴图格式是RGB,并且QT的视频展示框的宽高往往和解码出来的YUV不一样。所以要把解码出来的视频展示出来需要对源YUV做缩放、然后转RGB,QT的QImage类自带缩放功能,但是使用软缩放效率太低,相关的YUV转RGB的代码做转换也是一样效率很低,特别对于一些CPU能力比较低的芯片视频完全没法看。本文中的方案主要通过以下流程来实现:

                                           

                                                                  图 1.视频播放流程 

    从解码器拿出来YUV图片,使用VGS缩放到与展示框大小差不多(由于对齐的原因一般不会完全相同),缩放之后的YUV经过IVE模块转成BGR,最后用TDE将BGR转成RGB。整个流程都使用硬件模块实现,大大提高效率。

一. 缩放

    利用VGS做YUV的缩放,代码片段如下:

#include <hi_comm_vgs.h>
#include <mpi_vgs.h>

// src: 源图像
// dst:目标图像
// 将src指向的源图像缩放到由dst指向的宽高的大小,并且图像输入到dst对应的内存中
// note: 都需要开辟好空间
int ImgScale(VIDEO_FRAME_INFO_S *src,VIDEO_FRAME_INFO_S *dst) {
  HI_S32 ret;
  VGS_HANDLE vgs_handle;
  ret = HI_MPI_VGS_BeginJob(&vgs_handle);
  if (ret != HI_SUCCESS) {
    printf("HI_MPI_VGS_BeginJob failed:%#x\n", ret);
    return ret;
  }
  VGS_TASK_ATTR_S vgs_task;
  memset(&vgs_task, 0, sizeof(vgs_task));
  memcpy(&vgs_task.stImageIn,src,sizeof(vgs_task.stImageIn));
  memcpy(&vgs_task.stImgOut,dst,sizeof(vgs_task.stImgOut));
  ret 
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值