Распаковка одного 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) (см. иллюстрацию в ссылках для визуализации). Планар говорит вам, что сначала у вас есть все компоненты яркости, за которыми следуют все компоненты 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