Разопаковане на един BYTE* от YUV в 3 BYTE* указателя за всяка равнина

Не съм запознат с YUV и как се пакетират данните. Като се има предвид, че имам следния код...

int width = 1920;
int height = 1080;
BYTE* yuvData = GetFrame();

...как да разопаковам yuvData в метод, който има следния подпис...

Display(BYTE* pYplane, BYTE* pVplane, BYTE* pUplane)

Буферът YUV е в планарен формат.


person Paul Knopf    schedule 19.10.2015    source източник


Отговори (1)


Зависи от типа формат YUV, който не сте посочили във въпроса. Следните връзки съдържат добро обяснение и илюстрации относно различните видове YUV:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750%28v=vs.85%29.aspx

http://www.fourcc.org/yuv.php

Например, един често използван тип YUV е планарен YUV420. В този формат компонентите на цветността се дискретизират 2:1 хоризонтално и 2:1 вертикално. Това означава, че за всеки 4 стойности на лума (Y) имате един компонент на наситеност (1U + 1V) (вижте илюстрацията във връзките за визуализация). Planar ви казва, че първо имате всички компоненти на осветеност, последвани от всички U компоненти, последвани от всички V компоненти. Следователно

int iSizeY = width * height;
int iSizeUV = (width * height)/4;
BYTE* pY = yuvData;
BYTE* pU = yuvData + iSizeY // there are width * height Y components
BYTE* pV = pU + iSizeUV;    // skip the U components
person Ralf    schedule 19.10.2015
comment
Това търсех! Сега виждам, че потокът от байтове е на парчета от 2y 1u 1v. - person Paul Knopf; 19.10.2015