Я пытаюсь преобразовать вектор данных изображения RGB (полученный из изображения .png) в формат YUV420p, используя libav.
В примере кода libav для создания фиктивного образа используется следующее:
/* prepare a dummy image */
static void fill_yuv_image(AVFrame *pict, int frame_index, int width, int height)
{
int x, y, i;
i = frame_index;
/* Y */
for(y=0;y<height;y++) {
for(x=0;x<width;x++) {
pict->data[0][y * pict->linesize[0] + x] = x + y + i * 3;
}
}
/* Cb and Cr */
for(y=0;y<height/2;y++) {
for(x=0;x<width/2;x++) {
pict->data[1][y * pict->linesize[1] + x] = 128 + y + i * 2;
pict->data[2][y * pict->linesize[2] + x] = 64 + x + i * 5;
}
}
}
Мне не ясно несколько вещей здесь:
Во-первых, нужно ли переупорядочивать данные RGB во входном векторе, чтобы они подходили для кодирования как YUV420p?
Во-вторых, я понимаю, что для каждого пикселя есть значение Y и что значения Cb и Cr используются для четырех (2x2) пикселей. Чего я не понимаю, так это того, как данные RGB «сокращаются» до значений Cb и Cr — есть ли где-нибудь пример того, как это сделать?