Skip to content

Instantly share code, notes, and snippets.

@ndufresne
Created May 30, 2014 17:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ndufresne/37133b0ebc64cfd7e272 to your computer and use it in GitHub Desktop.
Save ndufresne/37133b0ebc64cfd7e272 to your computer and use it in GitHub Desktop.
From 3b854c4560e0a2527e60c33ea7f8b81b65d14c34 Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Date: Fri, 30 May 2014 13:34:30 -0400
Subject: [PATCH] d3d: Use GstVideoInfo API to extrapolate strides and offsets
UNTESTED
This attempt to address stride issues with I420/YV12, which for undocumented
reasons have wery weird extrapolation code, where V plane seems swapped with
U plane. I simply avoid that code by using GstVideoInfo API.
https://bugzilla.gnome.org/show_bug.cgi?id=712809
---
sys/d3dvideosink/d3dhelpers.c | 67 ++++++++-----------------------------------
1 file changed, 12 insertions(+), 55 deletions(-)
diff --git a/sys/d3dvideosink/d3dhelpers.c b/sys/d3dvideosink/d3dhelpers.c
index c7ffc8c..b7999c4 100644
--- a/sys/d3dvideosink/d3dhelpers.c
+++ b/sys/d3dvideosink/d3dhelpers.c
@@ -572,6 +572,9 @@ gst_d3dsurface_buffer_pool_alloc_buffer (GstBufferPool * bpool,
D3DLOCKED_RECT lr;
HRESULT hr;
gsize size = 0;
+ gint padded_width;
+ GstVideoInfo sinfo = pool->info;
+ GstVideoAlignement valign = { 0 };
*buffer = NULL;
if (!pool->add_metavideo) {
@@ -597,67 +600,21 @@ gst_d3dsurface_buffer_pool_alloc_buffer (GstBufferPool * bpool,
goto fallback;
}
- switch (GST_VIDEO_INFO_FORMAT (&pool->info)) {
- case GST_VIDEO_FORMAT_BGR:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- size = lr.Pitch * GST_VIDEO_INFO_HEIGHT (&pool->info) * 3;
- break;
- case GST_VIDEO_FORMAT_BGRx:
- case GST_VIDEO_FORMAT_RGBx:
- case GST_VIDEO_FORMAT_BGRA:
- case GST_VIDEO_FORMAT_RGBA:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- size = lr.Pitch * GST_VIDEO_INFO_HEIGHT (&pool->info) * 4;
- break;
- case GST_VIDEO_FORMAT_RGB16:
- case GST_VIDEO_FORMAT_RGB15:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- size = lr.Pitch * GST_VIDEO_INFO_HEIGHT (&pool->info) * 2;
- break;
- case GST_VIDEO_FORMAT_YUY2:
- case GST_VIDEO_FORMAT_UYVY:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- size = lr.Pitch * GST_VIDEO_INFO_HEIGHT (&pool->info) * 2;
- break;
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- offset[2] =
- offset[0] + stride[0] * GST_VIDEO_INFO_COMP_HEIGHT (&pool->info, 0);
- stride[2] = lr.Pitch / 2;
- offset[1] =
- offset[2] + stride[2] * GST_VIDEO_INFO_COMP_HEIGHT (&pool->info, 2);
- stride[1] = lr.Pitch / 2;
- size =
- offset[1] + stride[1] * GST_VIDEO_INFO_COMP_HEIGHT (&pool->info, 1);
- break;
- case GST_VIDEO_FORMAT_NV12:
- offset[0] = 0;
- stride[0] = lr.Pitch;
- offset[1] =
- offset[0] + stride[0] * GST_VIDEO_INFO_COMP_HEIGHT (&pool->info, 0);
- stride[1] = lr.Pitch;
- size =
- offset[1] + stride[1] * GST_VIDEO_INFO_COMP_HEIGHT (&pool->info, 1);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
+ /* Update offset and stride */
+ padded_width = lr.Pitch / GST_VIDEO_INFO_COMP_PSTRIDE (&pool->info);
+ g_assert (added_width >= GST_VIDEO_INFO_WIDTH (&pool->info));
+ align.padding_right = padded_width - GST_VIDEO_INFO_WIDTH (&pool->info);
+ gst_video_info_align (&sinfo, &align);
+ g_assert (lr.Pitch == GST_VIDEO_INFO_COMP_STRIDE (&sinfo, 0));
IDirect3DSurface9_UnlockRect (surface);
*buffer = gst_buffer_new ();
gst_buffer_add_video_meta_full (*buffer, GST_VIDEO_FRAME_FLAG_NONE,
- GST_VIDEO_INFO_FORMAT (&pool->info), GST_VIDEO_INFO_WIDTH (&pool->info),
- GST_VIDEO_INFO_HEIGHT (&pool->info),
- GST_VIDEO_INFO_N_PLANES (&pool->info), offset, stride);
+ GST_VIDEO_INFO_FORMAT (&sinfo), GST_VIDEO_INFO_WIDTH (&sinfo),
+ GST_VIDEO_INFO_HEIGHT (&sinfo), GST_VIDEO_INFO_N_PLANES (&sinfo),
+ sinfo->offset, sinfo->stride);
mem = g_slice_new0 (GstD3DSurfaceMemory);
gst_memory_init (GST_MEMORY_CAST (mem), 0, pool->allocator, NULL, size, 0, 0,
--
1.9.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment