/* check whether the decoded surface size has changed */ static gboolean is_surface_resolution_changed (GstVaapiDecode * decode, GstVaapiSurface * surface) { GstVideoInfo *vinfo = &decode->decoded_info; GstVideoFormat surface_format; guint surface_width, surface_height; g_return_val_if_fail (surface != NULL, FALSE); gst_vaapi_surface_get_size (surface, &surface_width, &surface_height); if (GST_VIDEO_INFO_WIDTH (vinfo) == surface_width && GST_VIDEO_INFO_HEIGHT (vinfo) == surface_height) return FALSE; /* doing gst_vaapi_surface_get_format() only if necessary since it * execute vaDeriveImage in the background. This will usually get * executed only once */ surface_format = GST_VIDEO_INFO_FORMAT (vinfo); if (surface_format == GST_VIDEO_FORMAT_UNKNOWN) { surface_format = gst_vaapi_surface_get_format (surface); /* if the VA context delivers a currently unrecognized format * (ICM3, e.g.), we can assume NV12 "safely" */ if (surface_format == GST_VIDEO_FORMAT_UNKNOWN || surface_format == GST_VIDEO_FORMAT_ENCODED) surface_format = GST_VIDEO_FORMAT_NV12; } gst_video_info_set_format (vinfo, surface_format, surface_width, surface_height); return TRUE; }
static gboolean ensure_image (GstVaapiVideoMemory * mem) { if (!mem->image && mem->use_direct_rendering) { mem->image = gst_vaapi_surface_derive_image (mem->surface); if (!mem->image) { GST_WARNING ("failed to derive image, fallbacking to copy"); mem->use_direct_rendering = FALSE; } else if (gst_vaapi_surface_get_format (mem->surface) != GST_VIDEO_INFO_FORMAT (mem->image_info)) { gst_vaapi_object_replace (&mem->image, NULL); mem->use_direct_rendering = FALSE; } } if (!mem->image) { GstVaapiVideoAllocator *const allocator = GST_VAAPI_VIDEO_ALLOCATOR_CAST (GST_MEMORY_CAST (mem)->allocator); mem->image = gst_vaapi_video_pool_get_object (allocator->image_pool); if (!mem->image) return FALSE; } gst_vaapi_video_meta_set_image (mem->meta, mem->image); return TRUE; }