download: support YUY2 surface to raw data
authorWind Yuan <feng.yuan@intel.com>
Wed, 24 Apr 2013 02:39:03 +0000 (10:39 +0800)
committerWind Yuan <feng.yuan@intel.com>
Wed, 24 Apr 2013 05:39:57 +0000 (13:39 +0800)
 Add new format GST_VAAPI_IMAGE_YUY2 to gst_vaapi_image.
 Add copy_image_YUY2 for direct retangle data copy.
 GstVaapiDisplay should append YUY2 format if hardware supports.

gst-libs/gst/vaapi/gstvaapiimage.c
gst-libs/gst/vaapi/gstvaapiimageformat.c
gst-libs/gst/vaapi/gstvaapiimageformat.h

index 143ef8d..9f2b94c 100644 (file)
@@ -133,6 +133,9 @@ vaapi_image_is_linear(const VAImage *va_image)
     case VA_FOURCC('I','4','2','0'):
         data_size = width * height + 2 * width2 * height2;
         break;
+    case VA_FOURCC('Y','U','Y','2'):
+        data_size = width * height * 2;
+        break;
     case VA_FOURCC('A','Y','U','V'):
     case VA_FOURCC('A','R','G','B'):
     case VA_FOURCC('R','G','B','A'):
@@ -946,6 +949,12 @@ init_image_from_buffer(GstVaapiImageRaw *raw_image, GstBuffer *buffer)
     height2 = (height + 1) / 2;
     size2   = 0;
     switch (format) {
+    case GST_VAAPI_IMAGE_YUY2:
+        raw_image->num_planes = 1;
+        raw_image->pixels[0] = data;
+        raw_image->stride[0] = GST_ROUND_UP_4(width)*2;
+        size2 += height * raw_image->stride[0];
+        break;
     case GST_VAAPI_IMAGE_NV12:
         raw_image->num_planes = 2;
         raw_image->pixels[0]  = data;
@@ -1070,6 +1079,26 @@ copy_image_YV12(
     }
 }
 
+/* Copy YUY2 images */
+static void
+copy_image_YUY2(
+    GstVaapiImageRaw        *dst_image,
+    GstVaapiImageRaw        *src_image,
+    const GstVaapiRectangle *rect
+)
+{
+    guchar *dst, *src;
+    guint dst_stride, src_stride;
+    guint i, x, y, w, h;
+
+    /* YUYV interlace plane */
+    dst_stride = dst_image->stride[0];
+    dst = dst_image->pixels[0] + rect->y * dst_stride + rect->x * 2;
+    src_stride = src_image->stride[0];
+    src = src_image->pixels[0] + rect->y * src_stride + rect->x * 2;
+    memcpy_pic(dst, dst_stride, src, src_stride, rect->width * 2, rect->height);
+}
+
 /* Copy RGBA images */
 static void
 copy_image_RGBA(
@@ -1125,6 +1154,9 @@ copy_image(
     case GST_VAAPI_IMAGE_I420:
         copy_image_YV12(dst_image, src_image, rect);
         break;
+    case GST_VAAPI_IMAGE_YUY2:
+        copy_image_YUY2(dst_image, src_image, rect);
+        break;
     case GST_VAAPI_IMAGE_ARGB:
     case GST_VAAPI_IMAGE_RGBA:
     case GST_VAAPI_IMAGE_ABGR:
index d29ef6c..94c3f77 100644 (file)
@@ -61,6 +61,7 @@ static const GstVaapiImageFormatMap gst_vaapi_image_formats[] = {
     DEF_YUV(NV12, ('N','V','1','2'), LSB, 12),
     DEF_YUV(YV12, ('Y','V','1','2'), LSB, 12),
     DEF_YUV(I420, ('I','4','2','0'), LSB, 12),
+    DEF_YUV(YUY2, ('Y','U','Y','2'), LSB, 16),
     DEF_YUV(AYUV, ('A','Y','U','V'), LSB, 32),
 #if G_BYTE_ORDER == G_BIG_ENDIAN
     DEF_RGB(ARGB, ('A','R','G','B'), MSB, 32,
@@ -252,6 +253,7 @@ gst_vaapi_image_format_from_video(GstVideoFormat format)
     case GST_VIDEO_FORMAT_NV12: va_format = GST_VAAPI_IMAGE_NV12;   break;
     case GST_VIDEO_FORMAT_YV12: va_format = GST_VAAPI_IMAGE_YV12;   break;
     case GST_VIDEO_FORMAT_I420: va_format = GST_VAAPI_IMAGE_I420;   break;
+    case GST_VIDEO_FORMAT_YUY2: va_format = GST_VAAPI_IMAGE_YUY2;   break;
     case GST_VIDEO_FORMAT_AYUV: va_format = GST_VAAPI_IMAGE_AYUV;   break;
     case GST_VIDEO_FORMAT_ARGB: va_format = GST_VAAPI_IMAGE_ARGB;   break;
     case GST_VIDEO_FORMAT_RGBA: va_format = GST_VAAPI_IMAGE_RGBA;   break;
index 9e1e662..9768754 100644 (file)
@@ -53,6 +53,7 @@ typedef enum {
     GST_VAAPI_IMAGE_NV12 = GST_MAKE_FOURCC('N','V','1','2'),
     GST_VAAPI_IMAGE_YV12 = GST_MAKE_FOURCC('Y','V','1','2'),
     GST_VAAPI_IMAGE_I420 = GST_MAKE_FOURCC('I','4','2','0'),
+    GST_VAAPI_IMAGE_YUY2 = GST_MAKE_FOURCC('Y','U','Y','2'),
     GST_VAAPI_IMAGE_AYUV = GST_MAKE_FOURCC('A','Y','U','V'),
     GST_VAAPI_IMAGE_ARGB = GST_MAKE_FOURCC('A','R','G','B'),
     GST_VAAPI_IMAGE_RGBA = GST_MAKE_FOURCC('R','G','B','A'),