From 3c611da315f3755f4675fe4e874389e033f44d08 Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Fri, 17 Nov 2017 17:49:16 +0900 Subject: [PATCH] msdkenc: Fix handling of YUY2, UYVY, BGRA surfaces https://bugzilla.gnome.org/show_bug.cgi?id=789847 --- sys/msdk/gstmsdkenc.c | 13 +++++++++++++ sys/msdk/msdk.c | 12 +++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/sys/msdk/gstmsdkenc.c b/sys/msdk/gstmsdkenc.c index d3eeedff6e..b0eb85e88a 100644 --- a/sys/msdk/gstmsdkenc.c +++ b/sys/msdk/gstmsdkenc.c @@ -196,6 +196,19 @@ gst_msdkenc_alloc_surfaces (GstMsdkEnc * thiz, GstVideoFormat format, } else if (Y_size) { surface->Data.UV = data + Y_size; } + + if (format == GST_VIDEO_FORMAT_YUY2) { + surface->Data.U = data + 1; + surface->Data.V = data + 3; + } else if (format == GST_VIDEO_FORMAT_UYVY) { + surface->Data.U = data + 1; + surface->Data.Y = data + 2; + surface->Data.V = data + 3; + } else if (format == GST_VIDEO_FORMAT_BGRA) { + surface->Data.R = data; + surface->Data.G = data + 1; + surface->Data.B = data + 2; + } } } diff --git a/sys/msdk/msdk.c b/sys/msdk/msdk.c index 77f966c3eb..19ce04c617 100644 --- a/sys/msdk/msdk.c +++ b/sys/msdk/msdk.c @@ -96,13 +96,23 @@ msdk_frame_to_surface (GstVideoFrame * frame, mfxFrameSurface1 * surface) break; case GST_VIDEO_FORMAT_YUY2: + surface->Data.Y = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); + surface->Data.Pitch = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + surface->Data.U = surface->Data.Y + 1; + surface->Data.V = surface->Data.Y + 3; + break; case GST_VIDEO_FORMAT_UYVY: surface->Data.Y = GST_VIDEO_FRAME_PLANE_DATA (frame, 0); surface->Data.Pitch = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); + surface->Data.U = surface->Data.Y; + surface->Data.Y = surface->Data.U + 1; + surface->Data.V = surface->Data.U + 2; break; case GST_VIDEO_FORMAT_BGRA: surface->Data.R = GST_VIDEO_FRAME_COMP_DATA (frame, 0); + surface->Data.G = surface->Data.R - 1; + surface->Data.B = surface->Data.R - 2; surface->Data.Pitch = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); break; @@ -190,7 +200,7 @@ msdk_frame_to_surface (GstVideoFrame * frame, mfxFrameSurface1 * surface) height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 0); src = GST_VIDEO_FRAME_COMP_DATA (frame, 0); sstride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0); - dst = surface->Data.R; + dst = surface->Data.B; dstride = surface->Data.Pitch; width *= 4;