1

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... として再配置し、出力をダンプすると、正常に表示されることに注意してください。ただし、neon、SSE2などの最適化が行われているため、libyuvを使用することを好みます。よろしく。

4

1 に答える 1