C++ 原始yuv420p数据上的sws_标度

C++ 原始yuv420p数据上的sws_标度,c++,image,colors,yuv,C++,Image,Colors,Yuv,我正在从我的raspberry pi获取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, nullp

我正在从我的raspberry pi获取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\u scale
的数据和行大小有点困惑。从相机上我只得到一个简单的字节数组,没有进一步的结构。我想我必须以某种方式将其细分为平面。我的第一个方法是根本不分离它,基本上有这样的东西(基于以下事实:

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

2x2像素网格有12位


所以我假设一行会使用其中的一半。但这会导致分割错误。所以我认为我必须以某种方式将
src_数据
src_跨步
分割到相应的YUV平面中,但我不确定如何做到这一点,特别是因为YUV420数据的一个像素每个平面使用不到一个字节…

结果更简单比我想象的还要多!飞机一架接一架,这也让步伐变得非常明显:

const auto y=data.data();
const auto u=y+摄像头宽度*摄像头高度;
const auto v=u+(摄像头宽度*摄像头高度)/4;
const auto step_y=摄像机宽度;
常量自动步幅=摄像机宽度/2;
const auto stride_v=摄像机宽度/2;