Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разбор YV12

57K
13 февраля 2011 года
sqwerty
34 / / 04.01.2011
Добрый день!
Есть кто сталкивался с форматом YV12?
В общем, надо считать изображения любого формата с цветовым пространством YV12 и записать в новый файл. Понял, что структура YV12 строен так: Сначала n*m картинка яркости, потом n/2 * m/2 картинка U, потом n/2 * m/2 картинка V.
Но как реализовать в виде кода?

Спасибо, с уважением sqwerty.
57K
23 марта 2011 года
sqwerty
34 / / 04.01.2011
Вопрос по прежнему в силе... есть кто занимался по формату YV12?
9.0K
23 марта 2011 года
grag63
71 / / 23.01.2006
Уважаемый sqwerty, не знаю что вы подразумевали под выражением "изображения любого формата", но FOURCC YV12 в RGB можно преобразовать сл. образом:

#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);
}
57K
24 марта 2011 года
sqwerty
34 / / 04.01.2011
ну мне бы для начало только считать формат YV12, а потом уже преобразовать, изменять размеры и т.п.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог