| @@ -523,102 +523,14 @@ fail: | |||||
| static AVClass *vaapi_log = &vaapi_class; | static AVClass *vaapi_log = &vaapi_class; | ||||
| static av_cold void vaapi_device_uninit(AVHWDeviceContext *hwdev) | |||||
| { | |||||
| AVVAAPIDeviceContext *hwctx = hwdev->hwctx; | |||||
| av_log(&vaapi_log, AV_LOG_VERBOSE, "Terminating VAAPI connection.\n"); | |||||
| vaTerminate(hwctx->display); | |||||
| } | |||||
| av_cold int vaapi_device_init(const char *device) | av_cold int vaapi_device_init(const char *device) | ||||
| { | { | ||||
| AVHWDeviceContext *hwdev; | |||||
| AVVAAPIDeviceContext *hwctx; | |||||
| VADisplay display; | |||||
| VAStatus vas; | |||||
| int major, minor, err; | |||||
| display = 0; | |||||
| #if HAVE_VAAPI_X11 | |||||
| if (!display) { | |||||
| Display *x11_display; | |||||
| // Try to open the device as an X11 display. | |||||
| x11_display = XOpenDisplay(device); | |||||
| if (!x11_display) { | |||||
| av_log(&vaapi_log, AV_LOG_WARNING, "Cannot open X11 display " | |||||
| "%s.\n", XDisplayName(device)); | |||||
| } else { | |||||
| display = vaGetDisplay(x11_display); | |||||
| if (!display) { | |||||
| av_log(&vaapi_log, AV_LOG_WARNING, "Cannot open a VA display " | |||||
| "from X11 display %s.\n", XDisplayName(device)); | |||||
| XCloseDisplay(x11_display); | |||||
| } else { | |||||
| av_log(&vaapi_log, AV_LOG_VERBOSE, "Opened VA display via " | |||||
| "X11 display %s.\n", XDisplayName(device)); | |||||
| } | |||||
| } | |||||
| } | |||||
| #endif | |||||
| #if HAVE_VAAPI_DRM | |||||
| if (!display && device) { | |||||
| int drm_fd; | |||||
| // Try to open the device as a DRM path. | |||||
| drm_fd = open(device, O_RDWR); | |||||
| if (drm_fd < 0) { | |||||
| av_log(&vaapi_log, AV_LOG_WARNING, "Cannot open DRM device %s.\n", | |||||
| device); | |||||
| } else { | |||||
| display = vaGetDisplayDRM(drm_fd); | |||||
| if (!display) { | |||||
| av_log(&vaapi_log, AV_LOG_WARNING, "Cannot open a VA display " | |||||
| "from DRM device %s.\n", device); | |||||
| close(drm_fd); | |||||
| } else { | |||||
| av_log(&vaapi_log, AV_LOG_VERBOSE, "Opened VA display via " | |||||
| "DRM device %s.\n", device); | |||||
| } | |||||
| } | |||||
| } | |||||
| #endif | |||||
| if (!display) { | |||||
| av_log(&vaapi_log, AV_LOG_ERROR, "No VA display found for " | |||||
| "device %s.\n", device); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| vas = vaInitialize(display, &major, &minor); | |||||
| if (vas != VA_STATUS_SUCCESS) { | |||||
| av_log(&vaapi_log, AV_LOG_ERROR, "Failed to initialise VAAPI " | |||||
| "connection: %d (%s).\n", vas, vaErrorStr(vas)); | |||||
| return AVERROR(EIO); | |||||
| } | |||||
| av_log(&vaapi_log, AV_LOG_VERBOSE, "Initialised VAAPI connection: " | |||||
| "version %d.%d\n", major, minor); | |||||
| hw_device_ctx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI); | |||||
| if (!hw_device_ctx) { | |||||
| av_log(&vaapi_log, AV_LOG_ERROR, "Failed to create VAAPI " | |||||
| "hardware context.\n"); | |||||
| vaTerminate(display); | |||||
| return AVERROR(ENOMEM); | |||||
| } | |||||
| hwdev = (AVHWDeviceContext*)hw_device_ctx->data; | |||||
| hwdev->free = &vaapi_device_uninit; | |||||
| hwctx = hwdev->hwctx; | |||||
| hwctx->display = display; | |||||
| int err; | |||||
| err = av_hwdevice_ctx_init(hw_device_ctx); | |||||
| err = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, | |||||
| device, NULL, 0); | |||||
| if (err < 0) { | if (err < 0) { | ||||
| av_log(&vaapi_log, AV_LOG_ERROR, "Failed to initialise VAAPI " | |||||
| "hardware context: %d\n", err); | |||||
| av_log(&vaapi_log, AV_LOG_ERROR, "Failed to create a VAAPI device\n"); | |||||
| return err; | return err; | ||||
| } | } | ||||