From patchwork Fri Jun 19 06:47:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 20494 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 54C8E44B142 for ; Fri, 19 Jun 2020 09:48:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3044668B5C6; Fri, 19 Jun 2020 09:48:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3685468B510 for ; Fri, 19 Jun 2020 09:48:09 +0300 (EEST) IronPort-SDR: AHzfpikHoc4dhj36y+8ksS322uOJUPXQktcHUtuWLoxzYGNwbXKVOquRDyHRzHFYB3OOofdQTb EK12X+rbd5pg== X-IronPort-AV: E=McAfee;i="6000,8403,9656"; a="140396357" X-IronPort-AV: E=Sophos;i="5.75,254,1589266800"; d="scan'208";a="140396357" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2020 23:48:07 -0700 IronPort-SDR: xa2/KNj3fORz/PvlnUSWd+/QVQ0XvEL5rEAJ3GudwPRIhWZhcPdpD4zdVys9oyYdBPDdTsD8VK zunNe7jwttvw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,254,1589266800"; d="scan'208";a="277905068" Received: from xhh-tgl64.sh.intel.com ([10.239.159.24]) by orsmga006.jf.intel.com with ESMTP; 18 Jun 2020 23:48:06 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Jun 2020 14:47:32 +0800 Message-Id: <20200619064733.146001-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] hwcontext_vaapi: the first parameter is the AVHWFramesContext for dst X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Haihao Xiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" vaapi_map_from_drm() is the implementation of map_to when src format is AV_PIX_FMT_DRM_PRIME, and the first parameter of map_to is the AVHWFramesContext for dst Signed-off-by: Haihao Xiang --- libavutil/hwcontext_vaapi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index b31cf95850..a378bcd12a 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -999,11 +999,11 @@ static void vaapi_unmap_from_drm(AVHWFramesContext *dst_fc, vaDestroySurfaces(dst_dev->display, &surface_id, 1); } -static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, +static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, const AVFrame *src, int flags) { - AVHWFramesContext *dst_fc = - (AVHWFramesContext*)dst->hw_frames_ctx->data; + AVHWFramesContext *src_fc = + (AVHWFramesContext*)src->hw_frames_ctx->data; AVVAAPIDeviceContext *dst_dev = dst_fc->device_ctx->hwctx; const AVDRMFrameDescriptor *desc; const VAAPIFormatDescriptor *format_desc; From patchwork Fri Jun 19 06:47:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 20495 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 8FA1E44B142 for ; Fri, 19 Jun 2020 09:48:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 78DB568B647; Fri, 19 Jun 2020 09:48:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B13E068B12F for ; Fri, 19 Jun 2020 09:48:15 +0300 (EEST) IronPort-SDR: uXZ2hRQ/q8OaPiJxo7JdbXVy/Gt3Ze8hDJmCc7KypFvegKNMJ+Aa+gTPxRsUlLXazk1npYBHJq xAlAQ51cHKEg== X-IronPort-AV: E=McAfee;i="6000,8403,9656"; a="141153247" X-IronPort-AV: E=Sophos;i="5.75,254,1589266800"; d="scan'208";a="141153247" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2020 23:48:13 -0700 IronPort-SDR: oKDU1xbTNGI9dqjjcOhuy7FPRMfMcVZKduTU/rdLIexoOMs9s4Zi+LFa0q8kPGKtifZO45ZUgx gstVoCycqHzQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,254,1589266800"; d="scan'208";a="277905119" Received: from xhh-tgl64.sh.intel.com ([10.239.159.24]) by orsmga006.jf.intel.com with ESMTP; 18 Jun 2020 23:48:12 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Jun 2020 14:47:33 +0800 Message-Id: <20200619064733.146001-2-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200619064733.146001-1-haihao.xiang@intel.com> References: <20200619064733.146001-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] hwcontext_vaapi: try VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 firstly when importing a DMABuf X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Haihao Xiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" User should provide the modifier when importing a DMABuf if this DMABuf has modifier. Signed-off-by: Haihao Xiang --- libavutil/hwcontext_vaapi.c | 137 +++++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 11 deletions(-) diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index a378bcd12a..514bb07a20 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -999,8 +999,9 @@ static void vaapi_unmap_from_drm(AVHWFramesContext *dst_fc, vaDestroySurfaces(dst_dev->display, &surface_id, 1); } -static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, - const AVFrame *src, int flags) +static VASurfaceID vaapi_get_surface_from_drm_prime(AVHWFramesContext *dst_fc, + AVFrame *dst, + const AVFrame *src) { AVHWFramesContext *src_fc = (AVHWFramesContext*)src->hw_frames_ctx->data; @@ -1010,7 +1011,7 @@ static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, VASurfaceID surface_id; VAStatus vas; uint32_t va_fourcc; - int err, i, j, k; + int i, j, k; unsigned long buffer_handle; VASurfaceAttribExternalBuffers buffer_desc; @@ -1030,13 +1031,6 @@ static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, }; desc = (AVDRMFrameDescriptor*)src->data[0]; - - if (desc->nb_objects != 1) { - av_log(dst_fc, AV_LOG_ERROR, "VAAPI can only map frames " - "made from a single DRM object.\n"); - return AVERROR(EINVAL); - } - va_fourcc = 0; for (i = 0; i < FF_ARRAY_ELEMS(vaapi_drm_format_map); i++) { if (desc->nb_layers != vaapi_drm_format_map[i].nb_layer_formats) @@ -1092,9 +1086,130 @@ static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, src->width, src->height, &surface_id, 1, attrs, FF_ARRAY_ELEMS(attrs)); + + if (vas != VA_STATUS_SUCCESS) { + av_log(dst_fc, AV_LOG_DEBUG, "Failed to create surface from DRM_PRIME " + "object: %d (%s).\n", vas, vaErrorStr(vas)); + return VA_INVALID_ID; + } + + return surface_id; +} + +static VASurfaceID vaapi_get_surface_from_drm_prime2(AVHWFramesContext *dst_fc, + AVFrame *dst, + const AVFrame *src) +{ + AVHWFramesContext *src_fc = + (AVHWFramesContext*)src->hw_frames_ctx->data; + AVVAAPIDeviceContext *dst_dev = dst_fc->device_ctx->hwctx; + const AVDRMFrameDescriptor *desc; + const VAAPIFormatDescriptor *format_desc; + VASurfaceID surface_id; + VAStatus vas; + uint32_t va_fourcc; + int i, j; + + VADRMPRIMESurfaceDescriptor surface_desc; + VASurfaceAttrib attrs[2] = { + { + .type = VASurfaceAttribMemoryType, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypeInteger, + .value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, + }, + { + .type = VASurfaceAttribExternalBufferDescriptor, + .flags = VA_SURFACE_ATTRIB_SETTABLE, + .value.type = VAGenericValueTypePointer, + .value.value.p = &surface_desc, + } + }; + + desc = (AVDRMFrameDescriptor*)src->data[0]; + va_fourcc = 0; + for (i = 0; i < FF_ARRAY_ELEMS(vaapi_drm_format_map); i++) { + if (desc->nb_layers != vaapi_drm_format_map[i].nb_layer_formats) + continue; + for (j = 0; j < desc->nb_layers; j++) { + if (desc->layers[j].format != + vaapi_drm_format_map[i].layer_formats[j]) + break; + } + if (j != desc->nb_layers) + continue; + va_fourcc = vaapi_drm_format_map[i].va_fourcc; + break; + } + if (!va_fourcc) { + av_log(dst_fc, AV_LOG_ERROR, "DRM format not supported " + "by VAAPI.\n"); + return AVERROR(EINVAL); + } + + av_log(dst_fc, AV_LOG_DEBUG, "Map DRM object %d to VAAPI as " + "%08x.\n", desc->objects[0].fd, va_fourcc); + + format_desc = vaapi_format_from_fourcc(va_fourcc); + av_assert0(format_desc && !format_desc->chroma_planes_swapped); + + surface_desc.fourcc = va_fourcc; + surface_desc.width = src_fc->width; + surface_desc.height = src_fc->height; + surface_desc.num_objects = 1; + surface_desc.objects[0].fd = desc->objects[0].fd; + surface_desc.objects[0].size = desc->objects[0].size; + surface_desc.objects[0].drm_format_modifier = desc->objects[0].format_modifier; + surface_desc.num_layers = desc->nb_layers; + + for (i = 0; i < desc->nb_layers; i++) { + surface_desc.layers[i].drm_format = desc->layers[i].format; + surface_desc.layers[i].num_planes = desc->layers[i].nb_planes; + + for (j = 0; j < desc->layers[i].nb_planes; j++) { + surface_desc.layers[i].object_index[j] = desc->layers[i].planes[j].object_index; + surface_desc.layers[i].offset[j] = desc->layers[i].planes[j].offset; + surface_desc.layers[i].pitch[j] = desc->layers[i].planes[j].pitch; + } + } + + vas = vaCreateSurfaces(dst_dev->display, format_desc->rt_format, + src->width, src->height, + &surface_id, 1, + attrs, FF_ARRAY_ELEMS(attrs)); + if (vas != VA_STATUS_SUCCESS) { - av_log(dst_fc, AV_LOG_ERROR, "Failed to create surface from DRM " + av_log(dst_fc, AV_LOG_DEBUG, "Failed to create surface from DRM_PRIME_2" "object: %d (%s).\n", vas, vaErrorStr(vas)); + return VA_INVALID_ID; + } + + return surface_id; +} + +static int vaapi_map_from_drm(AVHWFramesContext *dst_fc, AVFrame *dst, + const AVFrame *src, int flags) +{ + const AVDRMFrameDescriptor *desc; + VASurfaceID surface_id; + int err; + + desc = (AVDRMFrameDescriptor*)src->data[0]; + + if (desc->nb_objects != 1) { + av_log(dst_fc, AV_LOG_ERROR, "VAAPI can only map frames " + "made from a single DRM object.\n"); + return AVERROR(EINVAL); + } + + surface_id = vaapi_get_surface_from_drm_prime2(dst_fc, dst, src); + + if (surface_id == VA_INVALID_SURFACE) + surface_id = vaapi_get_surface_from_drm_prime(dst_fc, dst, src); + + if (surface_id == VA_INVALID_SURFACE) { + av_log(dst_fc, AV_LOG_ERROR, "Failed to create surface from " + "DRM_PRIME2 or DRM_PRIME.\n"); return AVERROR(EIO); } av_log(dst_fc, AV_LOG_DEBUG, "Create surface %#x.\n", surface_id);