From 0a423e1de01db995dbe7ea6b4b5887d25f5793cf Mon Sep 17 00:00:00 2001 From: Carl-Anton Ingmarsson Date: Tue, 23 Jun 2009 17:16:25 +0200 Subject: [PATCH] vdpau: add support for UYVY --- sys/vdpau/gstvdpvideoyuv.c | 36 +++++++++++++++++++++++++++++++++++- sys/vdpau/gstvdpyuvvideo.c | 26 +++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/sys/vdpau/gstvdpvideoyuv.c b/sys/vdpau/gstvdpvideoyuv.c index 1810f9e06d..a17eba7008 100644 --- a/sys/vdpau/gstvdpvideoyuv.c +++ b/sys/vdpau/gstvdpvideoyuv.c @@ -55,7 +55,8 @@ static GstStaticPadTemplate src_template = GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ";" - GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("NV12"))); + GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("NV12") ";" + GST_VIDEO_CAPS_YUV ("UYVY"))); #define DEBUG_INIT(bla) \ GST_DEBUG_CATEGORY_INIT (gst_vdp_video_yuv_debug, "vdpauvideoyuv", 0, "VDPAU VdpSurface to YUV"); @@ -178,6 +179,32 @@ gst_vdp_video_yuv_transform (GstBaseTransform * trans, GstBuffer * inbuf, } break; } + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + { + VdpStatus status; + guint8 *data[1]; + guint32 stride[1]; + + data[0] = GST_BUFFER_DATA (outbuf); + + stride[0] = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_UYVY, + 0, video_yuv->width); + + GST_LOG_OBJECT (video_yuv, "Entering vdp_video_surface_get_bits_ycbcr"); + status = + device->vdp_video_surface_get_bits_ycbcr (surface, + VDP_YCBCR_FORMAT_UYVY, (void *) data, stride); + GST_LOG_OBJECT (video_yuv, + "Got status %d from vdp_video_surface_get_bits_ycbcr", status); + if (G_UNLIKELY (status != VDP_STATUS_OK)) { + GST_ELEMENT_ERROR (video_yuv, RESOURCE, READ, + ("Couldn't get data from vdpau"), + ("Error returned from vdpau was: %s", + device->vdp_get_error_string (status))); + return GST_FLOW_ERROR; + } + break; + } default: break; } @@ -219,6 +246,13 @@ gst_vdp_video_transform_size (GstBaseTransform * trans, video_yuv->width * video_yuv->height / 2; break; } + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + { + *othersize = + gst_video_format_get_size (GST_VIDEO_FORMAT_UYVY, video_yuv->width, + video_yuv->height); + break; + } default: return FALSE; } diff --git a/sys/vdpau/gstvdpyuvvideo.c b/sys/vdpau/gstvdpyuvvideo.c index 04c5fe5a0f..db67646161 100644 --- a/sys/vdpau/gstvdpyuvvideo.c +++ b/sys/vdpau/gstvdpyuvvideo.c @@ -50,7 +50,8 @@ static GstStaticPadTemplate sink_template = GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420") ";" - GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("NV12"))); + GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("NV12") ";" + GST_VIDEO_CAPS_YUV ("UYVY"))); static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE (GST_BASE_TRANSFORM_SRC_NAME, @@ -197,6 +198,29 @@ gst_vdp_yuv_video_transform (GstBaseTransform * trans, GstBuffer * inbuf, } break; } + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + { + VdpStatus status; + guint8 *data[1]; + guint32 stride[1]; + + data[0] = GST_BUFFER_DATA (inbuf); + + stride[0] = gst_video_format_get_row_stride (GST_VIDEO_FORMAT_UYVY, + 0, yuv_video->width); + + status = + device->vdp_video_surface_put_bits_ycbcr (surface, + VDP_YCBCR_FORMAT_UYVY, (void *) data, stride); + if (G_UNLIKELY (status != VDP_STATUS_OK)) { + GST_ELEMENT_ERROR (yuv_video, RESOURCE, READ, + ("Couldn't get data from vdpau"), + ("Error returned from vdpau was: %s", + device->vdp_get_error_string (status))); + return GST_FLOW_ERROR; + } + break; + } default: break; }