Commit 7146c0c0 authored by Laurent Aimar's avatar Laurent Aimar Committed by Jean-Baptiste Kempf

Fixed xcb yv12/i420 UV planes swapping.

(cherry picked from commit bc9751069ceb91c1b385677f04dd2726a40576f9)
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent fa3c90b6
...@@ -86,6 +86,7 @@ struct vout_display_sys_t ...@@ -86,6 +86,7 @@ struct vout_display_sys_t
uint16_t width; /* display width */ uint16_t width; /* display width */
uint16_t height; /* display height */ uint16_t height; /* display height */
uint32_t data_size; /* picture byte size (for non-SHM) */ uint32_t data_size; /* picture byte size (for non-SHM) */
bool swap_uv; /* U/V pointer must be swapped in a picture */
bool shm; /* whether to use MIT-SHM */ bool shm; /* whether to use MIT-SHM */
bool visible; /* whether it makes sense to draw at all */ bool visible; /* whether it makes sense to draw at all */
...@@ -319,6 +320,7 @@ static int Open (vlc_object_t *obj) ...@@ -319,6 +320,7 @@ static int Open (vlc_object_t *obj)
p_sys->conn = conn; p_sys->conn = conn;
p_sys->att = NULL; p_sys->att = NULL;
p_sys->pool = NULL; p_sys->pool = NULL;
p_sys->swap_uv = false;
if (!CheckXVideo (vd, conn)) if (!CheckXVideo (vd, conn))
{ {
...@@ -398,7 +400,10 @@ static int Open (vlc_object_t *obj) ...@@ -398,7 +400,10 @@ static int Open (vlc_object_t *obj)
if (xfmt != NULL) if (xfmt != NULL)
{ {
p_sys->id = xfmt->id; p_sys->id = xfmt->id;
fmt.i_chroma = chroma; p_sys->swap_uv = vlc_fourcc_AreUVPlanesSwapped (fmt.i_chroma,
chroma);
if (!p_sys->swap_uv)
fmt.i_chroma = chroma;
if (xfmt->type == XCB_XV_IMAGE_FORMAT_INFO_TYPE_RGB) if (xfmt->type == XCB_XV_IMAGE_FORMAT_INFO_TYPE_RGB)
{ {
fmt.i_rmask = xfmt->red_mask; fmt.i_rmask = xfmt->red_mask;
...@@ -611,7 +616,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count) ...@@ -611,7 +616,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
/* We assume that offsets[0] is zero */ /* We assume that offsets[0] is zero */
for (int i = 1; i < __MIN (p_sys->att->num_planes, PICTURE_PLANE_MAX); i++) 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]; res->p[i].p_pixels = res->p[0].p_pixels + offsets[i];
if (vd->fmt.i_chroma == VLC_CODEC_YV12) if (p_sys->swap_uv)
{ /* YVU: swap U and V planes */ { /* YVU: swap U and V planes */
uint8_t *buf = res->p[2].p_pixels; uint8_t *buf = res->p[2].p_pixels;
res->p[2].p_pixels = res->p[1].p_pixels; res->p[2].p_pixels = res->p[1].p_pixels;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment