繁体   English   中英

原始 yuv420p 数据上的 sws_scale

[英]sws_scale on raw yuv420p data

我正在从我的树莓派获取 yuv420p 格式的相机数据。 我正在尝试使用sws_scale将它们转换为 RGBA 格式。 所以这就是我初始化上下文的方式:

_sws_context = sws_getContext(CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_YUV420P,
                                      CAMERA_WIDTH, CAMERA_HEIGHT, AV_PIX_FMT_RGBA, 0, nullptr, nullptr, nullptr);

我现在对如何设置sws_scale的数据和行大小有点困惑。 从相机我只是得到一个没有进一步结构的普通字节数组。 我想我必须以某种方式将其细分为平面。 我的第一种方法是根本不将它分开,基本上有这样的东西(基于以下事实:

const uint8_t *src_data[] = {data.data()};
const int src_strides[] = {(int) std::ceil((CAMERA_WIDTH * 6) / 8)};

这是基于:

2x2 像素网格有 12 位

所以我假设一条线会使用其中的一半。 但这会导致分段错误。 所以我想我必须以某种方式将src_datasrc_strides拆分到各自的 YUV 平面中,但我不确定如何做到这一点,特别是因为 YUV420 数据的一个像素每个平面使用的字节少于一个字节......

事实证明它比我想象的要简单:飞机一个接一个,这也使步伐非常明显:

        const auto y = data.data();
        const auto u = y + CAMERA_WIDTH * CAMERA_HEIGHT;
        const auto v = u + (CAMERA_WIDTH * CAMERA_HEIGHT) / 4;

        const auto stride_y = CAMERA_WIDTH;
        const auto stride_u = CAMERA_WIDTH / 2;
        const auto stride_v = CAMERA_WIDTH / 2;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM