C, Каир: рендеринг потока изображений RGB - PullRequest
1 голос
/ 18 января 2012

Я хотел бы отобразить поток необработанных изображений RGB (фиксированный размер, без альфа-канала, <60fps) в окне GTK. Мне <a href="https://stackoverflow.com/questions/8849105/c-gtk-display-stream-of-rgb-images-at-60-fps"> сказали использовать здесь Каир.

Мой код отлично работает с одиночными изображениями и все еще для потока изображений со скоростью около 1 FPS. Выше 2 FPS мое приложение вылетает с ошибками Xorg, поэтому я считаю, что мой механик cairo неверен.

Это выглядит примерно так:

unsigned char    *image_data;
cairo_surface_t  *image;
GtkWidget        *main_window;

void init_window()
{
    // (...) all the GTK initialization stuff

    image_data = malloc(IMAGE_BYTES);
    image = cairo_image_surface_create_for_data(image_data,
                CAIRO_FORMAT_RGB24,
                IMAGE_W, IMAGE_H,
                cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, IMAGE_W));
}

void update_image()
{
    cairo_t *cr;

    cr = gdk_cairo_create(main_window->window);
    cairo_set_source_surface(cr, image, 10, 10);
    cairo_paint(cr);

    cairo_destroy(cr);
}

int main()
{
    // (...)
    init_window();

    while ((image_data = receive_image()) != NULL)
        update_image();
}

Как правильно отображать серии изображений в Каире? Какие структуры должны быть повторно использованы, какие должны быть воссозданы?

1 Ответ

1 голос
/ 19 января 2012

Это может быть не связано, но способ обновления изображения в основном неверен.Где твой звонок на gtk_main?Более того, и в ответ на новое изображение, доступное с камеры, сгенерируйте событие expose для обновления вашего окна.

Кстати, похоже, вы рисуете прямо в главном окне, которое не ИМХОлучшее, что нужно сделать.Добавьте в основное окно GtkDrawingArea и нарисуйте его в ответ на сигнал expose-event (если вы используете GTK2) или сигнал draw (если вы используете GTK3).

также обрабатывайте ваши входящие изображения как источник событий, используя GSource .

...