surface: try to determine the underlying VA surface format.

If a VA surface was allocated with the chroma-format interface, try to
determine the underlying pixel format on gst_vaapi_surface_get_format(),
or return GST_VIDEO_FORMAT_ENCODED if this is not a supported operation.
This commit is contained in:
Gwenole Beauchesne 2013-07-10 13:58:55 +02:00
parent a1b27c920b
commit 8663ad9492

View file

@ -118,7 +118,7 @@ gst_vaapi_surface_create(GstVaapiSurface *surface,
if (!vaapi_check_status(status, "vaCreateSurfaces()")) if (!vaapi_check_status(status, "vaCreateSurfaces()"))
return FALSE; return FALSE;
surface->format = GST_VIDEO_FORMAT_ENCODED; surface->format = GST_VIDEO_FORMAT_UNKNOWN;
surface->chroma_type = chroma_type; surface->chroma_type = chroma_type;
surface->width = width; surface->width = width;
surface->height = height; surface->height = height;
@ -318,6 +318,16 @@ gst_vaapi_surface_get_format(GstVaapiSurface *surface)
{ {
g_return_val_if_fail(surface != NULL, 0); g_return_val_if_fail(surface != NULL, 0);
/* Try to determine the underlying VA surface format */
if (surface->format == GST_VIDEO_FORMAT_UNKNOWN) {
GstVaapiImage * const image = gst_vaapi_surface_derive_image(surface);
if (image) {
surface->format = gst_vaapi_image_get_format(image);
gst_vaapi_object_unref(image);
}
if (surface->format == GST_VIDEO_FORMAT_UNKNOWN)
surface->format = GST_VIDEO_FORMAT_ENCODED;
}
return GST_VAAPI_SURFACE_FORMAT(surface); return GST_VAAPI_SURFACE_FORMAT(surface);
} }