Toybrick

标题: RV1126 RGB转换之后的数据怎么快速共享给应用 [打印本页]

作者: jpegflyer    时间: 2022-12-7 11:24
标题: RV1126 RGB转换之后的数据怎么快速共享给应用
    我在使用RV1126的rga做YUV420P和RGB32格式转换, 2560*1440的图像,转换过程7ms,速度比ffmpeg的 sws_scale 提升了5~6倍,但转换完的数据buffer给Qt使用, Qt 的QImage速度会变慢5~6倍。代码如下:
  1. int ret = 0;
  2.     int srcWidth,srcHeight,srcFormat;
  3.     int dstWidth,dstHeight,dstFormat;
  4.     int m_iWidth, m_iHeight;

  5.     /********** SrcInfo set **********/
  6.     srcWidth = 2560;
  7.     srcHeight = 1440;
  8.     srcFormat = RK_FORMAT_YCrCb_420_P;

  9.     /********** DstInfo set **********/
  10.     dstWidth = 2560;
  11.     dstHeight = 1440;
  12.     dstFormat = RK_FORMAT_RGBA_8888;//RK_FORMAT_BGRA_8888;//RK_FORMAT_RGBA_8888; //RK_FORMAT_BGRA_8888 //RK_FORMAT_BGRX_8888

  13.     static rga_info_t src;
  14.     static rga_info_t dst;

  15.     if(m_bInitCapFinish==false)
  16.     {
  17.         m_bInitCapFinish = true;

  18.         m_iWidth = srcWidth;
  19.         m_iHeight = srcHeight;
  20.         ret = m_pRGA->RkRgaInit();
  21.         ret = m_pRGA->RkRgaGetAllocBuffer(&m_fBoSrc, m_iWidth, m_iHeight, 32);
  22.         ret = m_pRGA->RkRgaGetAllocBuffer(&m_fBoDst, m_iWidth, m_iHeight, 32);
  23.         m_pRGA->RkRgaGetMmap(&m_fBoSrc);
  24.         m_pRGA->RkRgaGetMmap(&m_fBoDst);

  25.         memset(&src, 0, sizeof(rga_info_t));
  26.         src.fd = -1;
  27.         src.mmuFlag = 1;

  28.         memset(&dst, 0, sizeof(rga_info_t));
  29.         dst.fd = -1;
  30.         dst.mmuFlag = 1;

  31.         ret = m_pRGA->RkRgaGetBufferFd(&m_fBoSrc, &src.fd);
  32.         qDebug() << "src.fd = "<<src.fd;

  33.         if (ret) {
  34.             qDebug() <<"rgaGetsrcFd fail :" <<strerror(errno);
  35.         }

  36.         ret = m_pRGA->RkRgaGetBufferFd(&m_fBoDst, &dst.fd);
  37.         qDebug() << "src.fd = "<<dst.fd;
  38.         if (ret) {
  39.             qDebug()<<"rgaGetdstFd error :" << strerror(errno);
  40.         }
  41.         rga_set_rect(&src.rect, 0,0,m_iWidth,m_iHeight,m_iWidth/*stride*/,m_iHeight,srcFormat);
  42.         rga_set_rect(&dst.rect, 0,0,m_iWidth,m_iHeight,m_iWidth/*stride*/,m_iHeight,dstFormat);
  43.     }

  44.     QTime timert;
  45.     timert.start();
  46.     av_image_copy_to_buffer((uint8_t*)m_fBoSrc.ptr, m_fBoSrc.size, m_pFrame->data, m_pFrame->linesize,
  47.                             AV_PIX_FMT_YUV420P, 2560, 1440, 1);

  48.     ret = m_pRGA->RkRgaBlit(&src, &dst, NULL);
  49.     int32_t time2 = timert.elapsed();
  50.     qDebug() <<"rga sw" <<__LINE__ <<"time" <<time2<<" ms" << "ret" << ret <<m_fBoDst.size;

  51.     //把这个RGB数据 用QImage加载
  52.     QImage tmpImgt((uint8_t*)m_fBoDst.ptr, 2560, 1440, QImage::Format_RGB32); //Format_RGBA8888

  53.     static uint32_t cntt = 0;
  54.     if (cntt++ >= 2)
  55.     {
  56.         timert.start();
  57.         QImage imaget = tmpImgt.copy();
  58.         int32_t time2 = timert.elapsed();
  59.         qDebug() <<"rga copy" <<__LINE__ <<"time" <<time2<<" ms";

  60.         emit sig_GetOneFrame(imaget);  //发送信号
  61.         cntt = 0;
  62.     }
复制代码


作者: 我是流氓我怕谁    时间: 2023-2-16 11:08
这个要确认下,qt是否能吃物理地址或者buffer handle,如果不能的话,只能虚拟地址,这个应该大家都一样把。




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3