static bool app_ensure_filter_surface(App *app, uint32_t width, uint32_t height) { FFVASurface * const s = &app->filter_surface; VASurfaceID va_surface; VASurfaceAttrib attrib; VAStatus va_status; if (!app->filter) return true; // VPP not needed (checked in app_ensure_filter()) if (width == s->width && height == s->height) return true; attrib.flags = VA_SURFACE_ATTRIB_SETTABLE; attrib.type = VASurfaceAttribPixelFormat; attrib.value.type = VAGenericValueTypeInteger; attrib.value.value.i = app->filter_fourcc; va_destroy_surface(app->va_display, &s->id); va_status = vaCreateSurfaces(app->va_display, app->filter_chroma, width, height, &va_surface, 1, &attrib, 1); if (!va_check_status(va_status, "vaCreateSurfaces()")) return false; ffva_surface_init(s, va_surface, app->filter_chroma, width, height); s->fourcc = app->filter_fourcc; return true; }
static bool display_init(FFVADisplay *display, const char *name) { const FFVADisplayClass * const klass = ffva_display_class(); int major_version, minor_version; VAStatus va_status; if (name) { display->display_name = strdup(name); if (!display->display_name) return false; } display->klass = klass; if (klass->open && (!klass->open(display) || !display->va_display)) return false; va_status = vaInitialize(display->va_display, &major_version, &minor_version); if (!va_check_status(va_status, "vaInitialize()")) return false; return true; }