context: add support for non-YUV 4:2:0 formats.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 25 Apr 2014 11:45:31 +0000 (13:45 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Fri, 25 Apr 2014 17:24:07 +0000 (19:24 +0200)
Don't force allocation of VA surfaces in YUV 4:2:0 format. Rather, allow
for the upper layer to specify the desired chroma type. If the chroma
type field is not set (or yields zero), then YUV 4:2:0 format is used
by default.

gst-libs/gst/vaapi/gstvaapicontext.c
gst-libs/gst/vaapi/gstvaapicontext.h

index b306a6f..45ecf9c 100644 (file)
@@ -44,6 +44,9 @@
 #define DEBUG 1
 #include "gstvaapidebug.h"
 
+/* Define default VA surface chroma format to YUV 4:2:0 */
+#define DEFAULT_CHROMA_TYPE (GST_VAAPI_CHROMA_TYPE_YUV420)
+
 static void
 unref_surface_cb (GstVaapiSurface * surface)
 {
@@ -136,7 +139,7 @@ context_create_surfaces (GstVaapiContext * context)
 
   for (i = context->surfaces->len; i < num_surfaces; i++) {
     surface = gst_vaapi_surface_new (GST_VAAPI_OBJECT_DISPLAY (context),
-        GST_VAAPI_CHROMA_TYPE_YUV420, cip->width, cip->height);
+        cip->chroma_type, cip->width, cip->height);
     if (!surface)
       return FALSE;
     gst_vaapi_surface_set_parent_context (surface, context);
@@ -158,7 +161,7 @@ context_create (GstVaapiContext * context)
   VAStatus status;
   GArray *surfaces = NULL;
   gboolean success = FALSE;
-  guint i, value;
+  guint i, value, va_chroma_format;
 
   if (!context->surfaces && !context_create_surfaces (context))
     goto cleanup;
@@ -186,12 +189,15 @@ context_create (GstVaapiContext * context)
       gst_vaapi_entrypoint_get_va_entrypoint (cip->entrypoint);
 
   /* Validate VA surface format */
+  va_chroma_format = from_GstVaapiChromaType (cip->chroma_type);
+  if (!va_chroma_format)
+    goto cleanup;
   attrib->type = VAConfigAttribRTFormat;
   if (!context_get_attribute (context, attrib->type, &value))
     goto cleanup;
-  if (!(value & VA_RT_FORMAT_YUV420))
+  if (!(value & va_chroma_format))
     goto cleanup;
-  attrib->value = VA_RT_FORMAT_YUV420;
+  attrib->value = va_chroma_format;
   attrib++;
 
   switch (cip->usage) {
@@ -286,9 +292,14 @@ context_update_config_encoder (GstVaapiContext * context,
 
 static inline void
 gst_vaapi_context_init (GstVaapiContext * context,
-    const GstVaapiContextInfo * cip)
+    const GstVaapiContextInfo * new_cip)
 {
-  context->info = *cip;
+  GstVaapiContextInfo *const cip = &context->info;
+
+  *cip = *new_cip;
+  if (!cip->chroma_type)
+    cip->chroma_type = DEFAULT_CHROMA_TYPE;
+
   context->va_config = VA_INVALID_ID;
   gst_vaapi_context_overlay_init (context);
 }
@@ -355,38 +366,46 @@ gst_vaapi_context_reset (GstVaapiContext * context,
     const GstVaapiContextInfo * new_cip)
 {
   GstVaapiContextInfo *const cip = &context->info;
-  gboolean size_changed, config_changed;
+  gboolean reset_surfaces = FALSE, reset_config = FALSE;
+  GstVaapiChromaType chroma_type;
+
+  chroma_type = new_cip->chroma_type ? new_cip->chroma_type :
+      DEFAULT_CHROMA_TYPE;
+  if (cip->chroma_type != chroma_type) {
+    cip->chroma_type = chroma_type;
+    reset_surfaces = TRUE;
+  }
 
-  size_changed = cip->width != new_cip->width || cip->height != new_cip->height;
-  if (size_changed) {
+  if (cip->width != new_cip->width || cip->height != new_cip->height) {
     cip->width = new_cip->width;
     cip->height = new_cip->height;
+    reset_surfaces = TRUE;
   }
 
-  config_changed = cip->profile != new_cip->profile ||
-      cip->entrypoint != new_cip->entrypoint;
-  if (config_changed) {
+  if (cip->profile != new_cip->profile ||
+      cip->entrypoint != new_cip->entrypoint) {
     cip->profile = new_cip->profile;
     cip->entrypoint = new_cip->entrypoint;
+    reset_config = TRUE;
   }
 
   if (cip->usage != new_cip->usage) {
     cip->usage = new_cip->usage;
-    config_changed = TRUE;
+    reset_config = TRUE;
     memcpy (&cip->config, &new_cip->config, sizeof (cip->config));
   } else if (new_cip->usage == GST_VAAPI_CONTEXT_USAGE_ENCODE) {
     if (context_update_config_encoder (context, &new_cip->config.encoder))
-      config_changed = TRUE;
+      reset_config = TRUE;
   }
 
-  if (size_changed)
+  if (reset_surfaces)
     context_destroy_surfaces (context);
-  if (config_changed)
+  if (reset_config)
     context_destroy (context);
 
-  if (size_changed && !context_create_surfaces (context))
+  if (reset_surfaces && !context_create_surfaces (context))
     return FALSE;
-  if (config_changed && !context_create (context))
+  if (reset_config && !context_create (context))
     return FALSE;
   return TRUE;
 }
index 64e758f..d3010c1 100644 (file)
@@ -81,6 +81,7 @@ struct _GstVaapiContextInfo
   GstVaapiContextUsage usage;
   GstVaapiProfile profile;
   GstVaapiEntrypoint entrypoint;
+  GstVaapiChromaType chroma_type;
   guint width;
   guint height;
   guint ref_frames;