Разбор YV12
Есть кто сталкивался с форматом YV12?
В общем, надо считать изображения любого формата с цветовым пространством YV12 и записать в новый файл. Понял, что структура YV12 строен так: Сначала n*m картинка яркости, потом n/2 * m/2 картинка U, потом n/2 * m/2 картинка V.
Но как реализовать в виде кода?
Спасибо, с уважением sqwerty.
Вопрос по прежнему в силе... есть кто занимался по формату YV12?
#define clip(z) ((z < 0) ? 0 : ((z > 255) ? 255 : z))
#define YUV_B(Y, U) (clip((1164*(Y - 16) + 2018*(U - 128))/1000))
#define YUV_G(Y, U, V) (clip((1164*(Y - 16) - 813*(V - 128) - 391*(U - 128))/1000))
#define YUV_R(Y, V) (clip((1164*(Y - 16) + 1596*(V - 128))/1000))
#define SAVEBYTE(buf, offset, szbuf, value) {if(offset<szbuf){buf[offset]=value;}}
long YV12_to_RGB(BYTE *bufIn, DWORD dwszIn, WORD width, WORD height, BYTE *bufOut, DWORD dwszOut)
{
if (dwszIn && bufIn) {
DWORD k, pz, i = width*height/4;
BYTE *Y0, *Y1, *Y2, *Y3, *U, *V;
BYTE kx, ky;
if(!bufOut || !dwszOut) return 0;
for (ky=0; ky<4; ky+=2){
for (kx=0; kx<4; kx+=2){
Y0 = bufIn + ((ky)*width +kx);
Y1 = bufIn + ((ky)*width +kx+1);
Y2 = bufIn + ((ky+1)*width +kx);
Y3 = bufIn + ((ky+1)*width +kx+1);
k = (((ky)&-2)*width)/4 + ((kx)&-2)/2;
U = bufIn + (5*i +k);
V = bufIn + (4*i +k);
pz = 3*(4*ky+kx);
SAVEBYTE(bufOut, pz, dwszOut, YUV_B(*Y0, *U));
SAVEBYTE(bufOut, pz+1, dwszOut, YUV_G(*Y0, *U, *V));
SAVEBYTE(bufOut, pz+2, dwszOut, YUV_R(*Y0, *V));
pz = 3*(4*ky+kx+1);
SAVEBYTE(bufOut, pz, dwszOut, YUV_B(*Y1, *U));
SAVEBYTE(bufOut, pz+1, dwszOut, YUV_G(*Y1, *U, *V));
SAVEBYTE(bufOut, pz+2, dwszOut, YUV_R(*Y1, *V));
pz = 3*(4*(ky+1)+kx);
SAVEBYTE(bufOut, pz, dwszOut, YUV_B(*Y2, *U));
SAVEBYTE(bufOut, pz+1, dwszOut, YUV_G(*Y2, *U, *V));
SAVEBYTE(bufOut, pz+2, dwszOut, YUV_R(*Y2, *V));
pz = 3*(4*(ky+1)+kx+1);
SAVEBYTE(bufOut, pz, dwszOut, YUV_B(*Y3, *U));
SAVEBYTE(bufOut, pz+1, dwszOut, YUV_G(*Y3, *U, *V));
SAVEBYTE(bufOut, pz+2, dwszOut, YUV_R(*Y3, *V));
}
}
return min(1.5*width*height, dwszOut);
} else return (1.5*width*height);
}
ну мне бы для начало только считать формат YV12, а потом уже преобразовать, изменять размеры и т.п.