Skip to content

Commit

Permalink
Merge commit '9f7590f4e497c12693247d7f935a20d7773a64dd'
Browse files Browse the repository at this point in the history
* commit '9f7590f4e497c12693247d7f935a20d7773a64dd':
  avconv_vaapi: use the hwcontext device creation API

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
  • Loading branch information
Nevcairiel committed Jun 26, 2016
2 parents 06a0e18 + 9f7590f commit 4e6f2db
Showing 1 changed file with 4 additions and 92 deletions.
96 changes: 4 additions & 92 deletions ffmpeg_vaapi.c
Expand Up @@ -523,102 +523,14 @@ int vaapi_decode_init(AVCodecContext *avctx)

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)
{
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) {
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;
}

Expand Down

0 comments on commit 4e6f2db

Please sign in to comment.