CAIRO_FORMAT_ARGB32 から AV_PIX_FMT_YUV420P までの一連のフレームを sws_scale でエンコードする必要があります。ffmpeg docs から、ソース形式に相当する AV が AV_PIX_FMT_ARGB であることを知ったので、ここに私のコードを示します。
// Set up conversion context
img->sws_ctx = sws_getCachedContext(
img->sws_ctx,
img->video_size[0],
img->video_size[1],
AV_PIX_FMT_ARGB,
img->video_size[0],
img->video_size[1],
AV_PIX_FMT_YUV420P,
SWS_BILINEAR,
NULL,
NULL,
NULL);
width = cairo_image_surface_get_width( surface );
height = cairo_image_surface_get_height( surface );
stride = cairo_image_surface_get_stride( surface );
pix = cairo_image_surface_get_data( surface );
const int in_linesize[1] = { stride };
sws_scale( img->sws_ctx, (const uint8_t * const *) &pix, in_linesize, 0,
img->video_size[1], img->video_frame->data, img->video_frame->linesize);
img->video_frame->pts++;
悲しいことに、ビデオは再生されず、VLC はこれらの役に立たないメッセージをたくさん表示します。
[h264 @ 0x7f6ce0cbc1c0] mmco: unref short failure
[h264 @ 0x7f6ce0c39a80] co located POCs unavailable
[h264 @ 0x7f6ce0c82800] co located POCs unavailable
[h264 @ 0x7f6ce0c9f400] mmco: unref short failure
エンコードプロセスは問題なく実行されます。const int in_linesize[1] = { 3 * width }; も試しました。どこが間違っていますか?