From 12407a13a0900bf0689bb380cc40b820a9fd5317 Mon Sep 17 00:00:00 2001 From: Carsten Kroll Date: Mon, 22 Aug 2011 14:13:30 +0200 Subject: [PATCH] d3dvideosink: added NV12 + enabled RGB support --- sys/d3dvideosink/d3dvideosink.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index ed4d249b6e..15d6f4b3d2 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -89,12 +89,11 @@ struct _IPCData GST_DEBUG_CATEGORY (d3dvideosink_debug); #define GST_CAT_DEFAULT d3dvideosink_debug -/* TODO: Support RGB! */ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ YUY2, UYVY, YV12, I420 }")) - //";" GST_VIDEO_CAPS_RGBx) + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ YUY2, UYVY, YV12, I420, NV12 }") + ";" GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_BGRA) ); static void gst_d3dvideosink_init_interfaces (GType type); @@ -1678,6 +1677,30 @@ gst_d3dvideosink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) } break; } + case GST_MAKE_FOURCC ('N', 'V', '1', '2'): + { + guint8 *dst = dest; + int component; + dststride = lr.Pitch; + for (component = 0; component < 2; component++) { + const int compHeight = + gst_video_format_get_component_height (sink->format, + component, sink->height); + guint8 *src = + source + + gst_video_format_get_component_offset (sink->format, + component, sink->width, sink->height); + srcstride = + gst_video_format_get_row_stride (sink->format, component, + sink->width); + for (i = 0; i < compHeight; i++) { + memcpy (dst + dststride * i, src + srcstride * i, + srcstride); + } + dst += dststride * compHeight; + } + break; + } default: g_assert_not_reached (); } @@ -2124,6 +2147,10 @@ gst_d3dvideosink_initialize_swap_chain (GstD3DVideoSink * sink) d3dformat = D3DFMT_X8R8G8B8; d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2'); break; + case GST_MAKE_FOURCC ('N', 'V', '1', '2'): + d3dformat = D3DFMT_X8R8G8B8; + d3dfourcc = (D3DFORMAT) MAKEFOURCC ('N', 'V', '1', '2'); + break; default: g_assert_not_reached (); goto error;