mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-31 05:09:41 +00:00
libs: context: query surface format before context to create surface.
Before using context to create surface, the supported surface format should be checked first. https://bugzilla.gnome.org/show_bug.cgi?id=797222
This commit is contained in:
parent
bcd63f8021
commit
82872f4234
3 changed files with 55 additions and 2 deletions
|
@ -133,9 +133,13 @@ context_ensure_surfaces (GstVaapiContext * context)
|
||||||
GstVaapiSurface *surface;
|
GstVaapiSurface *surface;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
|
if (!ensure_formats (context))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
for (i = context->surfaces->len; i < num_surfaces; i++) {
|
for (i = context->surfaces->len; i < num_surfaces; i++) {
|
||||||
surface = gst_vaapi_surface_new (GST_VAAPI_OBJECT_DISPLAY (context),
|
surface =
|
||||||
cip->chroma_type, cip->width, cip->height);
|
gst_vaapi_surface_new_from_formats (GST_VAAPI_OBJECT_DISPLAY (context),
|
||||||
|
cip->chroma_type, cip->width, cip->height, context->formats);
|
||||||
if (!surface)
|
if (!surface)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
gst_vaapi_surface_set_parent_context (surface, context);
|
gst_vaapi_surface_set_parent_context (surface, context);
|
||||||
|
|
|
@ -316,6 +316,51 @@ error_unsupported_format:
|
||||||
#define gst_vaapi_surface_finalize gst_vaapi_surface_destroy
|
#define gst_vaapi_surface_finalize gst_vaapi_surface_destroy
|
||||||
GST_VAAPI_OBJECT_DEFINE_CLASS (GstVaapiSurface, gst_vaapi_surface);
|
GST_VAAPI_OBJECT_DEFINE_CLASS (GstVaapiSurface, gst_vaapi_surface);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_new_from_formats:
|
||||||
|
* @display: a #GstVaapiDisplay
|
||||||
|
* @chroma_type: the surface chroma format
|
||||||
|
* @width: the requested surface width
|
||||||
|
* @height: the requested surface height
|
||||||
|
* @formats: the limited format list
|
||||||
|
*
|
||||||
|
* Creates a new #GstVaapiSurface with a @chroma_type valid for any
|
||||||
|
* format in @formats; If there aren't any, the returned surface is
|
||||||
|
* created forcing the passed @chroma_type.
|
||||||
|
*
|
||||||
|
* Return value: the newly allocated #GstVaapiSurface object
|
||||||
|
*/
|
||||||
|
GstVaapiSurface *
|
||||||
|
gst_vaapi_surface_new_from_formats (GstVaapiDisplay * display,
|
||||||
|
GstVaapiChromaType chroma_type, guint width, guint height, GArray * formats)
|
||||||
|
{
|
||||||
|
GstVaapiSurface *surface;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
for (i = 0; i < formats->len; i++) {
|
||||||
|
GstVideoFormat format = g_array_index (formats, GstVideoFormat, i);
|
||||||
|
if (format == gst_vaapi_video_format_from_chroma (chroma_type))
|
||||||
|
return gst_vaapi_surface_new (display, chroma_type, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fallback: if there's no format valid for the chroma type let's
|
||||||
|
* just use the passed chroma */
|
||||||
|
surface = gst_vaapi_object_new (gst_vaapi_surface_class (), display);
|
||||||
|
if (!surface)
|
||||||
|
return NULL;
|
||||||
|
if (!gst_vaapi_surface_create (surface, chroma_type, width, height))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return surface;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
|
error:
|
||||||
|
{
|
||||||
|
gst_vaapi_object_unref (surface);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vaapi_surface_new:
|
* gst_vaapi_surface_new:
|
||||||
* @display: a #GstVaapiDisplay
|
* @display: a #GstVaapiDisplay
|
||||||
|
|
|
@ -169,6 +169,10 @@ typedef enum
|
||||||
typedef struct _GstVaapiSurface GstVaapiSurface;
|
typedef struct _GstVaapiSurface GstVaapiSurface;
|
||||||
typedef struct _GstVaapiSurfaceProxy GstVaapiSurfaceProxy;
|
typedef struct _GstVaapiSurfaceProxy GstVaapiSurfaceProxy;
|
||||||
|
|
||||||
|
GstVaapiSurface *
|
||||||
|
gst_vaapi_surface_new_from_formats (GstVaapiDisplay * display,
|
||||||
|
GstVaapiChromaType chroma_type, guint width, guint height, GArray * formts);
|
||||||
|
|
||||||
GstVaapiSurface *
|
GstVaapiSurface *
|
||||||
gst_vaapi_surface_new (GstVaapiDisplay * display,
|
gst_vaapi_surface_new (GstVaapiDisplay * display,
|
||||||
GstVaapiChromaType chroma_type, guint width, guint height);
|
GstVaapiChromaType chroma_type, guint width, guint height);
|
||||||
|
|
Loading…
Reference in a new issue