libav: Заполнение AVFrame образцами данных RGB24?
Я пытаюсь заполнить образец данных для AVFrame, инициализированного в формате RGB24. Я использую следующий фрагмент кода для заполнения данных RGB. Но в кодированном видео я вижу только полосу серого, покрывающую только 1/3 видеокадра. Этот фрагмент кода предполагается заполнить только красным цветом. Любые советы, что я делаю не так здесь?
AVFrame *targetFrame=.....
int height=imageHeight();
int width=imageWidth();
for(y=0;y<encoder.getVideoParams().height ;y++){
for(x=0;x< encoder.getVideoParams().width;x++){
targetFrame->data[0][(y* width)+x]=(x%255); //R
targetFrame->data[0][(y* width)+x+1]=0; //G
targetFrame->data[0][(y* width)+x+2]=0; //B
}
}
1 ответ
Решение
Если вы используете RGB24, вам нужно масштабировать координаты перед индексированием в буфер данных. Вот версия вашего внутреннего цикла, которая будет делать это правильно:
int offset = 3 * (x + y * width);
targetFrame->data[0][offset + 0] = x % 255; // R
targetFrame->data[0][offset + 1] = 0; // G
targetFrame->data[0][offset + 2] = 0; // B
И вот более простой подход:
uint8_t *p = targetFrame->data[0];
for(y = 0; y < encoder.getVideoParams().height; y++) {
for(x = 0; x < encoder.getVideoParams().width; x++) {
*p++ = x % 255; // R
*p++ = 0; // G
*p++ = 0; // B
}
}