Created
May 30, 2014 17:35
-
-
Save ndufresne/37133b0ebc64cfd7e272 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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