guint8 *src,
guint32 width,
guint32 height,
- GstVaapiImageFormat src_format,
+ guint32 src_format,
guint8 *dest,
VAImage *va_image)
{
g_assert(va_image->num_planes == 2);
/* copy Y first */
- for (row = 0; row < height; row++) {
- memcpy(y_dest, y_src, width);
- y_src += ystride;
- y_dest += va_image->pitches[0];
+ if (GST_VAAPI_IMAGE_NV12 == src_format
+ || GST_VAAPI_IMAGE_I420 == src_format
+ || GST_VAAPI_IMAGE_YV12 == src_format)
+ {
+ for (row = 0; row < height; row++) {
+ memcpy(y_dest, y_src, width);
+ y_src += ystride;
+ y_dest += va_image->pitches[0];
+ }
}
switch (src_format) {
}
break;
+ case GST_MAKE_FOURCC('Y', 'U', 'Y', '2'): {
+ const guint8 *y_next_src;
+ guint8 *y_next_dest;
+ ystride = GST_ROUND_UP_2(width)*2;
+ for (row = 0; row < height/2; row++) {
+ y_next_src = y_src + ystride;
+ y_next_dest = y_dest + va_image->pitches[0];
+ for (column = 0; column < width/2; column++) {
+ y_dest[column*2] = y_src[column*4];
+ y_dest[column*2+1] = y_src[column*4+2];
+ y_next_dest[column*2] = y_next_src[column*4];
+ y_next_dest[column*2+1] = y_next_src[column*4+2];
+ uv_dest[column*2] = (y_src[column*4+1] + y_next_src[column*4+1])>>1;
+ uv_dest[column*2+1] = (y_src[column*4+3] + y_next_src[column*4+3])>>1;
+ }
+ y_src = y_next_src + ystride;
+ y_dest = y_next_dest + va_image->pitches[0];
+ uv_dest += va_image->pitches[1];
+ }
+ /* odd line */
+ if (height%2) {
+ y_next_dest = y_dest + va_image->pitches[0];
+ for (column = 0; column < width/2; column++) {
+ y_dest[column*2] = y_src[column*4];
+ y_dest[column*2+1] = y_src[column*4+2];
+ y_next_dest[column*2] = y_src[column*4];
+ y_next_dest[column*2+1] = y_src[column*4+2];
+ uv_dest[column*2] = y_src[column*4+1];
+ uv_dest[column*2+1] = y_src[column*4+3];
+ }
+ }
+ }
+ break;
+
default:
return FALSE;
}
gst_vaapi_convert_buffer_to_image(
GstVaapiImage *image,
GstBuffer *inbuf, // inbuf : I420
- GstVaapiImageFormat in_format)
+ guint32 in_format)
{
GstVaapiImagePrivate *priv;
guint width, height;
/* currently only support YUV convert */
if ( (in_format != GST_VAAPI_IMAGE_NV12
&& in_format != GST_VAAPI_IMAGE_YV12
- && in_format != GST_VAAPI_IMAGE_I420)
+ && in_format != GST_VAAPI_IMAGE_I420
+ && in_format != GST_MAKE_FOURCC('Y', 'U', 'Y', '2'))
|| (image_format != GST_VAAPI_IMAGE_NV12
&& image_format != GST_VAAPI_IMAGE_YV12
&& image_format != GST_VAAPI_IMAGE_I420)
* SECTION:gstvaapiupload
* @short_description: A video to VA flow filter
*
- * vaapiupload converts from raw YUV pixels to VA surfaces suitable
+ * vaapiupload uploads from raw YUV pixels to VA surfaces suitable
* for the vaapisink element, for example.
*/
/* ElementFactory information */
static const GstElementDetails gst_vaapiupload_details =
GST_ELEMENT_DETAILS(
- "VA-API colorspace converter",
+ "VA-API colorspace uploader",
"Filter/Converter/Video",
GST_PLUGIN_DESC,
"Gwenole Beauchesne <gwenole.beauchesne@intel.com>");
}
static GstCaps *
+gst_vaapi_get_other_support_caps(GstVaapiConvert *upload)
+{
+ GstCaps *caps;
+ caps = gst_caps_from_string(GST_VIDEO_CAPS_YUV("YUY2"));
+ return caps;
+}
+
+static GstCaps *
gst_vaapiupload_transform_caps(
GstBaseTransform *trans,
GstPadDirection direction,
return NULL;
out_caps = gst_caps_from_string(gst_vaapiupload_yuv_caps_str);
if (upload->display) {
- GstCaps *allowed_caps, *inter_caps;
+ GstCaps *allowed_caps, *inter_caps, *other_caps;
allowed_caps = gst_vaapi_display_get_image_caps(upload->display);
if (!allowed_caps)
return NULL;
+ /* can direct copy other YUV to va surface */
+ other_caps = gst_vaapi_get_other_support_caps(upload);
+ gst_caps_merge(allowed_caps, other_caps);
+
inter_caps = gst_caps_intersect(out_caps, allowed_caps);
gst_caps_unref(allowed_caps);
gst_caps_unref(out_caps);
if (!gst_vaapiupload_ensure_surface_pool(upload, outcaps))
return FALSE;
- if (convert->direct_rendering)
+ if (upload->direct_rendering)
gst_vaapiupload_ensure_direct_rendering_caps(upload, incaps);
dr = MIN(upload->direct_rendering, upload->direct_rendering_caps);
if (upload->direct_rendering != dr) {
if (!gst_vaapiupload_negotiate_buffers(upload, incaps, outcaps))
return FALSE;
+ GST_INFO("set caps\nIN caps:\n%" GST_PTR_FORMAT "\nOUT caps:\n%" GST_PTR_FORMAT,
+ incaps, outcaps);
return TRUE;
}