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を使用することを好みます。よろしく。