vaapiencode: DMABuf only if PRIME is available

Add DMABuf capsfeature in encoders' allowed sinkcaps only if PRIME
memory type is available in the VA surface attributes of codec
context.
This commit is contained in:
Víctor Manuel Jáquez Leal 2020-01-15 23:04:08 +01:00
parent c864e20d2c
commit 1db3ce56a0
5 changed files with 37 additions and 13 deletions

View file

@ -1533,6 +1533,7 @@ merge_profile_surface_attributes (GstVaapiEncoder * encoder,
attribs->min_height = MIN (attribs->min_height, attr.min_height); attribs->min_height = MIN (attribs->min_height, attr.min_height);
attribs->max_width = MAX (attribs->max_width, attr.max_width); attribs->max_width = MAX (attribs->max_width, attr.max_width);
attribs->max_height = MAX (attribs->max_height, attr.max_height); attribs->max_height = MAX (attribs->max_height, attr.max_height);
attribs->mem_types &= attr.mem_types;
return TRUE; return TRUE;
} }
@ -1553,10 +1554,10 @@ merge_profile_surface_attributes (GstVaapiEncoder * encoder,
GArray * GArray *
gst_vaapi_encoder_get_surface_attributes (GstVaapiEncoder * encoder, gst_vaapi_encoder_get_surface_attributes (GstVaapiEncoder * encoder,
GArray * profiles, gint * min_width, gint * min_height, GArray * profiles, gint * min_width, gint * min_height,
gint * max_width, gint * max_height) gint * max_width, gint * max_height, guint * mem_types)
{ {
GstVaapiConfigSurfaceAttributes attribs = { GstVaapiConfigSurfaceAttributes attribs = {
G_MAXINT, G_MAXINT, 1, 1, 0, NULL G_MAXINT, G_MAXINT, 1, 1, G_MAXUINT, NULL
}; };
GstVaapiProfile profile; GstVaapiProfile profile;
guint i; guint i;
@ -1586,6 +1587,8 @@ gst_vaapi_encoder_get_surface_attributes (GstVaapiEncoder * encoder,
*max_width = attribs.max_width; *max_width = attribs.max_width;
if (max_height) if (max_height)
*max_height = attribs.max_height; *max_height = attribs.max_height;
if (mem_types)
*mem_types = attribs.mem_types;
return attribs.formats; return attribs.formats;
} }

View file

@ -183,7 +183,7 @@ gst_vaapi_encoder_flush (GstVaapiEncoder * encoder);
GArray * GArray *
gst_vaapi_encoder_get_surface_attributes (GstVaapiEncoder * encoder, gst_vaapi_encoder_get_surface_attributes (GstVaapiEncoder * encoder,
GArray * profiles, gint * min_width, gint * min_height, GArray * profiles, gint * min_width, gint * min_height,
gint * max_width, gint * max_height); gint * max_width, gint * max_height, guint * mem_types);
GstVaapiProfile GstVaapiProfile
gst_vaapi_encoder_get_profile (GstVaapiEncoder * encoder); gst_vaapi_encoder_get_profile (GstVaapiEncoder * encoder);

View file

@ -117,3 +117,19 @@ gst_vaapi_profile_caps_append_decoder (GstVaapiDisplay * display,
return append_caps_with_context_info (display, &cip, structure); return append_caps_with_context_info (display, &cip, structure);
} }
/**
* gst_vaapi_mem_type_supports:
* @va_mem_types: memory types from VA surface attributes
* @mem_type: the #GstVaapiBufferMemoryType to test
*
* Test if @va_mem_types handles @mem_type
*
* Returns: %TRUE if @mem_type is supported in @va_mem_types;
* otherwise %FALSE
**/
gboolean
gst_vaapi_mem_type_supports (guint va_mem_types, guint mem_type)
{
return ((va_mem_types & from_GstVaapiBufferMemoryType (mem_type)) != 0);
}

View file

@ -33,6 +33,9 @@ gboolean
gst_vaapi_profile_caps_append_decoder (GstVaapiDisplay * display, gst_vaapi_profile_caps_append_decoder (GstVaapiDisplay * display,
GstVaapiProfile profile, GstStructure * structure); GstVaapiProfile profile, GstStructure * structure);
gboolean
gst_vaapi_mem_type_supports (guint va_mem_types, guint mem_type);
G_END_DECLS G_END_DECLS
#endif /* GST_VAAPI_PROFILE_CAPS_H */ #endif /* GST_VAAPI_PROFILE_CAPS_H */

View file

@ -366,6 +366,7 @@ ensure_allowed_sinkpad_caps (GstVaapiEncode * encode)
guint i, size; guint i, size;
GstStructure *structure; GstStructure *structure;
gint min_width, min_height, max_width, max_height; gint min_width, min_height, max_width, max_height;
guint mem_types;
if (encode->allowed_sinkpad_caps) if (encode->allowed_sinkpad_caps)
return TRUE; return TRUE;
@ -380,7 +381,7 @@ ensure_allowed_sinkpad_caps (GstVaapiEncode * encode)
/* Then get all supported formats, all these formats should be recognized /* Then get all supported formats, all these formats should be recognized
in video-format map. */ in video-format map. */
formats = gst_vaapi_encoder_get_surface_attributes (encode->encoder, profiles, formats = gst_vaapi_encoder_get_surface_attributes (encode->encoder, profiles,
&min_width, &min_height, &max_width, &max_height); &min_width, &min_height, &max_width, &max_height, &mem_types);
if (!formats) if (!formats)
goto failed_get_attributes; goto failed_get_attributes;
@ -398,19 +399,20 @@ ensure_allowed_sinkpad_caps (GstVaapiEncode * encode)
max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, NULL); max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, NULL);
} }
out_caps = gst_caps_copy (raw_caps);
va_caps = gst_caps_copy (raw_caps); va_caps = gst_caps_copy (raw_caps);
gst_caps_set_features_simple (va_caps, gst_caps_set_features_simple (va_caps,
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE)); gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE));
gst_caps_append (out_caps, va_caps);
if (gst_vaapi_mem_type_supports (mem_types,
GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF)) {
dma_caps = gst_caps_copy (raw_caps); dma_caps = gst_caps_copy (raw_caps);
gst_caps_set_features_simple (dma_caps, gst_caps_set_features_simple (dma_caps,
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_DMABUF)); gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_DMABUF));
/* collect all caps together. */
out_caps = raw_caps;
raw_caps = NULL;
gst_caps_append (out_caps, va_caps);
gst_caps_append (out_caps, dma_caps); gst_caps_append (out_caps, dma_caps);
}
gst_caps_replace (&encode->allowed_sinkpad_caps, out_caps); gst_caps_replace (&encode->allowed_sinkpad_caps, out_caps);
GST_INFO_OBJECT (encode, "Allowed sink caps %" GST_PTR_FORMAT, GST_INFO_OBJECT (encode, "Allowed sink caps %" GST_PTR_FORMAT,