首页 > 解决方案 > SSE2 将压缩 RGB 转换为 RGBA 像素(每 3 个字节后添加第 4 个 0xFF 字节)

问题描述

我的应用程序正在处理计算量很大的近实时工作负载,我需要尽可能加快速度。该软件是用 C++ 编写的,仅针对 Linux。

我的程序从专业的天文相机上抓取了一个 6.4 兆像素的 RAW 数据缓冲区,该相机能够以 3096 像素 x 2080 像素的分辨率提供 25 fps。然后,通过使用高质量的线性插值去拜耳算法,对该流进行实时去拜耳。我知道 HQ 线性插值去拜耳算法的计算量总是很大,但我的程序还有其他领域我想加快速度。

一旦流被 debayered,我需要将 RGB 缓冲区(从 debayering 创建)转换为 RGBA 缓冲区,因为我的理解(通过分析证明)GPU 在 RGBA 像素缓冲区上运行效率更高。但是,我很高兴能纠正这一点。


最初,我编写了一个非常简单的 for 循环(如下),当然,它产生了可怕的结果。

// both buffers have uint8_t elements
for(int n = 0, m = 0; n < m_Width * m_Height * 4; n+=4, m+=3)
{
     m_display_buffer[n] = in_buffer[m];
     m_display_buffer[n+1] = in_buffer[m+1];
     m_display_buffer[n+2] = in_buffer[m+2];
     m_display_buffer[n+3] = 255;
}

上面的代码给了我 13 fps 的帧速率。我的下一个实验是使用等于 255 的所有元素初始化缓冲区,然后使用以下代码:

uint8_t *dsp = m_display_buffer;
uint8_t *in_8 = (uint8_t*) in_buffer;

for (int n = 0; n < m_Width * m_Height; n++)
{
    *dsp++ = *in_8++;
    *dsp++ = *in_8++;
    *dsp++ = *in_8++;
    *dsp++;
}

上面的代码显着加快了循环;现在在 i7-7700 笔记本电脑上运行达到 23.9 fps。但是,在旧机器上运行此代码仍然会产生非常令人失望的帧速率。我知道旧机器在 debayering 方面遇到了困难,但分析清楚地表明转换为 RGBA 缓冲区会导致严重问题。


我已经读过可能使用 SSE 内在函数来更有效地做到这一点,但是,我对 SSE 内在函数的经验为零。

我已经尝试了许多在网上找到的 SSE 示例,但无法使其正常工作。因此,如果有 SSE 经验的人能够帮助我解决这个问题,我将不胜感激。

我不能以高于 2 或可能 3 的 SSE 为目标,因为我的软件可能在更旧的硬件上运行。

如果有人能指出我正确的方向,我将不胜感激。

标签: c++optimizationvideo-streamingssedemosaicing

解决方案


推荐阅读