[Libav-user] Fill AVFrame from a Cairo surface

Colossus colossus73 at gmail.com
Mon Aug 16 10:29:10 EEST 2021


Hi,

I have this piece of code:
static gboolean img_export_frame_to_avframe(img_window_struct *img,
cairo_surface_t *surface)
{
gint width, height, stride, row, col, offset;
uint8_t  *pix;

/* Image info and pixel data */
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 );

g_print("Stride: %d\n",stride);

/* Avlibrary stuff */
img->video_frame = av_frame_alloc();
av_frame_make_writable(img->video_frame);
img->video_frame->format = AV_PIX_FMT_RGBA;
img->video_frame->width  = width;
img->video_frame->height = height;
img->video_frame->linesize[0] = stride;

av_frame_get_buffer(img->video_frame, 1);
img->video_packet = av_packet_alloc();

for( row = 0; row < img->video_frame->height; row++ )
{
for( col = 0; col < img->video_frame->width; col++ )
{
offset = 3 * col + row * img->video_frame->linesize[0];
img->video_frame->data[0][offset + 0] = pix[0];
img->video_frame->data[0][offset + 1] = pix[1];
img->video_frame->data[0][offset + 2] = pix[2];
}
}
img_export_encode_av_frame(img->video_frame, img->video_format_context,
img->codec_context, img->video_packet);
return TRUE;
}

But avcodec_send_frame() called from img_export_encode_av_frame() always
return:

libx264 @ 0x5582519787c0] Input picture width (640) is greater than stride
(0)

The stride is 5120 not 0! Where am I wrong? Also I grepped with the
recursive option the whole ffmpeg4 source and I couldn't find the error
message above of course without the 640 and 0...

Thanks
Giutor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20210816/d646e74d/attachment.htm>


More information about the Libav-user mailing list