libyuv
Bitmap(RGB)→VP8の変換にYUVを経由しなければいけないようで、まずはYUVへの変換をテスト。
libyuv/libyuv - Git at Google
各種RGB系、YUV系画像の相互変換、回転等が可能らしい。
とりあえずライブラリをビルドして、4x4のBitmapを変換してみる。
libyuv:
make -f linux.mk CC=gcc CXX=g++
#include <stdio.h> #include <stdlib.h> void bgr2yuv(){ // 青 緑 // 白 赤 の4x4 bitmap RGB24(BGRの順) unsigned char rgb[] = { 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00}; int width = 4, height = 4; unsigned char *yuv; yuv = (char*)malloc(width*height+width*height/4*2); int uOffset = width*height, vOffset = width*height + (width*height)/4; FILE *yuvFile; RGB24ToI420( rgb, width*3, yuv, width, yuv+uOffset, width/2, yuv+vOffset, width/2, width, height); for (int j=0;j<height;j++) { for (int i=0; i<width;++i) { printf("%3d %3d(%d) %3d(%d)| ", yuv[j*width+i], yuv[uOffset+width/2*(int)(j/2)+(int)(i/2)],width/2*(int)(j/2)+(int)(i/2), yuv[vOffset+width/2*(int)(j/2)+(int)(i/2)],width/2*(int)(j/2)+(int)(i/2)); } printf("\n"); } if ((yuvFile = fopen("test.yuv", "wb")) == NULL) printf("Error opening test.yuv\n"); if (fwrite(yuv, width*height+width*height/4*2, 1, yuvFile) < 1) printf("Error writing test.yuv"); fclose(yuvFile); //result /* 41 240(0) 110(0)| 41 240(0) 110(0)| 144 54(1) 34(1)| 144 54(1) 34(1)| 41 240(0) 110(0)| 41 240(0) 110(0)| 144 54(1) 34(1)| 144 54(1) 34(1)| 235 128(2) 128(2)| 235 128(2) 128(2)| 82 100(3) 212(3)| 82 100(3) 212(3)| 235 128(2) 128(2)| 235 128(2) 128(2)| 82 100(3) 212(3)| 16 100(3) 212(3)| 青=(41 240 110)、緑=(144 54 34)、白=(235 128 128)、赤=(82 100 212) */ } int main() { bgr2yuv(); return 0; }
gcc libyuvtest.c libyuv.a a.exe 41 240(0) 110(0)| 41 240(0) 110(0)| 144 54(1) 34(1)| 144 54(1) 34(1)| 41 240(0) 110(0)| 41 240(0) 110(0)| 144 54(1) 34(1)| 144 54(1) 34(1)| 235 128(2) 128(2)| 235 128(2) 128(2)| 82 100(3) 212(3)| 82 100(3) 212(3)| 235 128(2) 128(2)| 235 128(2) 128(2)| 82 100(3) 212(3)| 16 100(3) 212(3)|