Using the relevant GIOChannel function to read video frames

This commit is contained in:
Pierre Pronchery 2013-06-29 18:03:07 -04:00
parent cf2f777f0b
commit edad8ade60

View File

@ -597,22 +597,27 @@ static gboolean _camera_on_can_read(GIOChannel * channel,
GIOCondition condition, gpointer data) GIOCondition condition, gpointer data)
{ {
Camera * camera = data; Camera * camera = data;
ssize_t s; GIOStatus status;
gsize size;
GError * error = NULL;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
if(channel != camera->channel || condition != G_IO_IN) if(channel != camera->channel || condition != G_IO_IN)
return FALSE; return FALSE;
if((s = read(camera->fd, camera->raw_buffer, camera->raw_buffer_cnt)) status = g_io_channel_read_chars(channel, camera->raw_buffer,
<= 0) camera->raw_buffer_cnt, &size, &error);
/* this status can be ignored */
if(status == G_IO_STATUS_AGAIN)
return TRUE;
if(status == G_IO_STATUS_ERROR)
{ {
/* this error can be ignored */ /* FIXME use g_io_channel_shutdown() instead */
if(errno == EAGAIN)
return TRUE;
close(camera->fd); close(camera->fd);
camera->fd = -1; camera->fd = -1;
_camera_error(camera, strerror(errno), 1); _camera_error(camera, error->message, 1);
g_error_free(error);
gtk_widget_set_sensitive(GTK_WIDGET(_camera_toolbar[0].widget), gtk_widget_set_sensitive(GTK_WIDGET(_camera_toolbar[0].widget),
FALSE); FALSE);
#ifdef EMBEDDED #ifdef EMBEDDED
@ -623,8 +628,8 @@ static gboolean _camera_on_can_read(GIOChannel * channel,
return FALSE; return FALSE;
} }
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() %lu %ld\n", __func__, fprintf(stderr, "DEBUG: %s() %lu %lu\n", __func__,
camera->raw_buffer_cnt, s); camera->raw_buffer_cnt, size);
#endif #endif
camera->source = g_idle_add(_camera_on_refresh, camera); camera->source = g_idle_add(_camera_on_refresh, camera);
return FALSE; return FALSE;