libyuv :: NV21ToI420弄乱了颜色

时间:2015-04-09 03:38:34

标签: yuv libyuv

我使用libyuv将NV21图像格式转换为I420:

void convert(uint8* input, int width, int height) {

  int size = width * height * 3/2;
  uint8* output = new uint8[size];

  uint8* src_y = input;
  int src_stride_y = width;
  uint8* src_vu = input + (width * height);
  int src_stride_vu = width / 2;
  uint8* dst_y = output;
  int dst_stride_y = width;
  uint8* dst_u = dst_y + (width * height);
  int dst_stride_u = width / 2;
  uint8* dst_v = dst_u + (width * height) / 4;
  int dst_stride_v = width / 2;

  libyuv::NV21ToI420(src_y, src_stride_y,
           src_vu, src_stride_vu,
           dst_y, dst_stride_y,
           dst_u, dst_stride_u,
           dst_v, dst_stride_v,
           width, height);

  dumpToFile(dst_y, size);
  ...
}

输入的大小为640x480。

我使用ImageMagick的显示器显示转储文件:

$ display -size 640x480 -depth 8 -sampling-factor 4:2:0 -colorspace srgb MyI420_1.yuv

然而,颜色在显示的图像中混乱。图像的其他方面看起来还不错。

我想知道我的代码是否犯了错误。也许我的步幅计算不正确。

请注意,如果我使用自定义功能重新排列V1U1V2U2 ...作为U1U2 ... V1V2 ...并转储输出,它显示正常。但是,我更喜欢使用libyuv,因为它对neon,SSE2等有一些优化。问候。

1 个答案:

答案 0 :(得分:0)

您的 src_stride_vu 需要与 width 相同,因为它的组合步幅为 UV 像素交错。