mchakri Ответов: 1

Как преобразовать RGB в NV12


Ниже приведен код для преобразования NV12 в RGB.
То, что я хочу, - это преобразование из RGB в NV12.

пустота CFramePump::NV12ToRGB( байт* рвых, байт* пин,ширина беззнаковый тип int без знака int Высота)
{


HRESULT hr = S_OK;
DWORD dexOut = 0;

unsigned int PX,PY;

int y[4];
int u;
инт в;


инт rbg_off;

инт y_off = 0;
int v_off=Высота*Ширина;
беззнаковый инт РГБ;
rbg_off = 0;
int ppy =0;
int ppx =0;
инт от;

для (PY=0;Py<Height;PY+=2)
{

для (PX=0;px< Width;PX+=2)
{

// получение значений YUV
y_off =Py * Width+PX;

y[0] = pIn[y_off];
y[1] = pIn[y_off+1];
y[2] = pIn[y_off+Width];
y[3] = pIn[y_off+Width+1];


u = pIn-код[v_off++];

v = pIn-код[v_off++];

выкл = (PY * Width*3)+(PX*3);

rgb = yuv2rgb(y[0], u, v);
pOut[off] = (rgb & 0x000000ff);
pOut[off+1] = (rgb & 0x0000ff00) >> 8;
pOut[off+2] = (rgb & 0x00ff0000) > & gt; 16;


rgb = yuv2rgb( y[1], u, v);
pOut[off+3] = (rgb & 0x000000ff);
pOut[off+4] = (rgb & 0x0000ff00) >> 8;
pOut[off+5] = (rgb & 0x00ff0000) > & gt; 16;

выкл.+=(ширина*3);

rgb = yuv2rgb( y[2], u, v);
pOut[off] = (rgb & 0x000000ff);
pOut[off+1] = (rgb & 0x0000ff00) >> 8;
pOut[off+2] = (rgb & 0x00ff0000) > & gt; 16;

rgb = yuv2rgb( y[3], u, v);
pOut[off+3] = (rgb & 0x000000ff);
pOut[off+4] = (rgb & 0x0000ff00) >> 8;
pOut[off+5] = (rgb & 0x00ff0000) > & gt; 16;


}

}

}

беззнаковый инт yuv2rgb( инт г, пр инт ,инт КБ )
{
инт Эй, ЭПБ ЭПР;
int Eg, Eb, Er;
беззнаковый результат инт ;

Ey = (Y-16);
Epb = (Cb-128);
ЭПР = (Cr-128);

Eg = (298*Ey-100*Epb-208*Epr) / 256;
Eb = (298*Ey + 516*Epb) / 256;
Er = (298*Ey + 408*Epr) / 256;

если(например, > 255)
Eg = 255;
если(например, < 0)
Eg = 0;

если(Eb > 255)
Eb = 255;
если (Eb < 0)
Eb = 0;

если (Er > 255)
Er = 255;
если (Er < 0)
Er = 0;

результат = (Eb < & lt; 16) | (Eg < & lt; 8) / Er;

возвращаемый результат;
}

Что я уже пробовал:

Преобразование из NV12 в RGB.
Мне нужна процедура преобразования RGB в NV12.