You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Merge commit '9f7590f4e497c12693247d7f935a20d7773a64dd'
* commit '9f7590f4e497c12693247d7f935a20d7773a64dd': avconv_vaapi: use the hwcontext device creation API Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
This commit is contained in:
		| @@ -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; |     int err; | ||||||
|     AVVAAPIDeviceContext *hwctx; |  | ||||||
|     VADisplay display; |  | ||||||
|     VAStatus vas; |  | ||||||
|     int major, minor, err; |  | ||||||
|  |  | ||||||
|     display = 0; |     err = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_VAAPI, | ||||||
|  |                                  device, NULL, 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; |  | ||||||
|  |  | ||||||
|     err = av_hwdevice_ctx_init(hw_device_ctx); |  | ||||||
|     if (err < 0) { |     if (err < 0) { | ||||||
|         av_log(&vaapi_log, AV_LOG_ERROR, "Failed to initialise VAAPI " |         av_log(&vaapi_log, AV_LOG_ERROR, "Failed to create a VAAPI device\n"); | ||||||
|                "hardware context: %d\n", err); |  | ||||||
|         return err; |         return err; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user