continue;
/* VLC pads scanline to 16 pixels internally */
- unsigned width = (fmt->i_width + 15) & ~15;
- unsigned height = (fmt->i_height + 15) & ~15;
+ unsigned width = fmt->i_width;
+ unsigned height = fmt->i_height;
xcb_xv_query_image_attributes_reply_t *i;
i = xcb_xv_query_image_attributes_reply (conn,
xcb_xv_query_image_attributes (conn, port, f->id,
/* */
video_format_t fmt = vd->fmt;
- bool found_adaptor = false;
+ p_sys->port = 0;
xcb_xv_adaptor_info_iterator_t it;
for (it = xcb_xv_query_adaptors_info_iterator (adaptors);
- it.rem > 0 && !found_adaptor;
+ it.rem > 0;
xcb_xv_adaptor_info_next (&it))
{
const xcb_xv_adaptor_info_t *a = it.data;
p_sys->port = port;
goto grabbed_port;
}
- msg_Dbg (vd, "cannot grab port %"PRIu32, port);
+ msg_Dbg (vd, "cannot grab port %"PRIu32": Xv error %"PRIu8, port,
+ result);
}
continue; /* No usable port */
}
}
xcb_xv_ungrab_port (conn, p_sys->port, XCB_CURRENT_TIME);
+ p_sys->port = 0;
msg_Dbg (vd, "no usable X11 visual");
continue; /* No workable XVideo format (visual/depth) */
created_window:
- found_adaptor = true;
break;
}
free (adaptors);
- if (!found_adaptor)
+ if (!p_sys->port)
{
msg_Err (vd, "no available XVideo adaptor");
goto error;
free (p_sys);
}
-/**
- * Return a direct buffer
- */
-static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
+static void PoolAlloc (vout_display_t *vd, unsigned requested_count)
{
vout_display_sys_t *p_sys = vd->sys;
- if (!p_sys->pool)
- {
- memset (p_sys->resource, 0, sizeof(p_sys->resource));
+ memset (p_sys->resource, 0, sizeof(p_sys->resource));
- const uint32_t *pitches =
- xcb_xv_query_image_attributes_pitches (p_sys->att);
- const uint32_t *offsets =
- xcb_xv_query_image_attributes_offsets (p_sys->att);
- p_sys->data_size = p_sys->att->data_size;
+ const uint32_t *pitches= xcb_xv_query_image_attributes_pitches (p_sys->att);
+ const uint32_t *offsets= xcb_xv_query_image_attributes_offsets (p_sys->att);
+ const unsigned num_planes= __MIN(p_sys->att->num_planes, PICTURE_PLANE_MAX);
+ p_sys->data_size = p_sys->att->data_size;
- unsigned count;
- picture_t *pic_array[MAX_PICTURES];
- for (count = 0; count < requested_count; count++)
- {
- if (count >= MAX_PICTURES)
- break;
- picture_resource_t *res = &p_sys->resource[count];
+ picture_t *pic_array[MAX_PICTURES];
+ requested_count = __MIN(requested_count, MAX_PICTURES);
- for (int i = 0; i < __MIN (p_sys->att->num_planes, PICTURE_PLANE_MAX); i++)
- {
- res->p[i].i_lines =
- ((i + 1 < p_sys->att->num_planes ? offsets[i+1] :
- p_sys->data_size) - offsets[i]) / pitches[i];
- res->p[i].i_pitch = pitches[i];
- }
- if (PictureResourceAlloc (vd, res, p_sys->att->data_size,
- p_sys->conn, p_sys->shm))
- break;
+ unsigned count;
+ for (count = 0; count < requested_count; count++)
+ {
+ picture_resource_t *res = &p_sys->resource[count];
- /* Allocate further planes as specified by XVideo */
- /* We assume that offsets[0] is zero */
- for (int i = 1; i < __MIN (p_sys->att->num_planes, PICTURE_PLANE_MAX); i++)
- res->p[i].p_pixels = res->p[0].p_pixels + offsets[i];
- if (p_sys->swap_uv)
- { /* YVU: swap U and V planes */
- uint8_t *buf = res->p[2].p_pixels;
- res->p[2].p_pixels = res->p[1].p_pixels;
- res->p[1].p_pixels = buf;
- }
+ for (unsigned i = 0; i < num_planes; i++)
+ {
+ uint32_t data_size;
+ data_size = (i < num_planes - 1) ? offsets[i+1] : p_sys->data_size;
- pic_array[count] = picture_NewFromResource (&vd->fmt, res);
- if (!pic_array[count])
- {
- PictureResourceFree (res, p_sys->conn);
- memset (res, 0, sizeof(*res));
- break;
- }
+ res->p[i].i_lines = (data_size - offsets[i]) / pitches[i];
+ res->p[i].i_pitch = pitches[i];
}
- if (count == 0)
- return NULL;
+ if (PictureResourceAlloc (vd, res, p_sys->att->data_size,
+ p_sys->conn, p_sys->shm))
+ break;
- p_sys->pool = picture_pool_New (count, pic_array);
- /* TODO release picture resources if NULL */
- xcb_flush (p_sys->conn);
+ /* Allocate further planes as specified by XVideo */
+ /* We assume that offsets[0] is zero */
+ for (unsigned i = 1; i < num_planes; i++)
+ res->p[i].p_pixels = res->p[0].p_pixels + offsets[i];
+
+ if (p_sys->swap_uv)
+ { /* YVU: swap U and V planes */
+ uint8_t *buf = res->p[2].p_pixels;
+ res->p[2].p_pixels = res->p[1].p_pixels;
+ res->p[1].p_pixels = buf;
+ }
+
+ pic_array[count] = picture_NewFromResource (&vd->fmt, res);
+ if (!pic_array[count])
+ {
+ PictureResourceFree (res, p_sys->conn);
+ memset (res, 0, sizeof(*res));
+ break;
+ }
}
+ if (count == 0)
+ return;
+
+ p_sys->pool = picture_pool_New (count, pic_array);
+ /* TODO release picture resources if NULL */
+ xcb_flush (p_sys->conn);
+}
+
+/**
+ * Return a direct buffer
+ */
+static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
+{
+ vout_display_sys_t *p_sys = vd->sys;
+
+ if (!p_sys->pool)
+ PoolAlloc (vd, requested_count);
+
return p_sys->pool;
}
if (!p_sys->visible)
goto out;
+ xcb_force_screen_saver (p_sys->conn, XCB_SCREEN_SAVER_RESET);
+
if (segment)
ck = xcb_xv_shm_put_image_checked (p_sys->conn, p_sys->port,
p_sys->window, p_sys->gc, segment, p_sys->id, 0,