From patchwork Thu Jun 30 02:45:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wu, Tong1" X-Patchwork-Id: 36536 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp13838pzh; Wed, 29 Jun 2022 19:47:27 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s6c9a065YfFG5jRKjW2yKBBYj4g9Y8a7EMdtFdlu9m1z0ueCfQQSRXwjjbfnxh8OQljMRE X-Received: by 2002:a05:6402:b34:b0:435:d064:8762 with SMTP id bo20-20020a0564020b3400b00435d0648762mr8500101edb.238.1656557246999; Wed, 29 Jun 2022 19:47:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656557246; cv=none; d=google.com; s=arc-20160816; b=u6Z8D2zcqV0AegXT7b4WI5Dm5wWBA+IzirFlZ25cYaHm36vgIHS5oLZpJe/NiFiQZa gIaRzKAv07FDVSVk53lJzkrEEAqjjL+bE61Ufe7EbCDlJAMsXqd0yANZSfXLoy8jCHwK Xi7ZRI9EJmC4yyzzA73n+FtBsI545td8tB/7fRnmbhlyJ14Yr0RhLEEGjB+XzyRyaTtb n00yrL5y0EPcwYSOlwQxLM8efIk/fjEyJdQbTyiA0mr+CD8GENpKVkORJ8hmSu5YWZYv YHaavUrcDsSnL8Si5vJ/r9+aDkCehZ/MWkOgHT8NRtHNp4ilAKBK1mgCBpXNQ7Up+6A6 xxRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=DtrJWgp+Rdbbx0lt6b6x0YWh+NhSdURFwvrvaIxuQR4=; b=mvSr900SUNtP5Bo8i89+QCNT2oDOrqU4oW6Y9KK4zdbKkNmOLby3dS+JrHm2K2gY5Q CELE5OlIaXhdTe3z+P4hmfw2SAsc21UkQxzm/3Bhlcd9dP2AU8aaEtcNT8MXIW2rmKEt 6DXiWApTzIsHqOhXvjFWW0lZJgA+lQcWUQ0ORGymSOTMVzPMU6Rj51x0GqoqPKext2Eh Dv++gRowPVRj9XbZoJobLlQbcTB7xxMJemUfLTg+9jz/NBj4VKkTc+KTlDnsvl9wV6X9 +olWb0VSfg7+UfxotnzW5Uqg27RqlqJQdiWxrS1PGHi2VFQR7gw2I2JP16cz0sQNni6w ATbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=Gom+RJDf; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id mp37-20020a1709071b2500b00711d89b831esi25786143ejc.721.2022.06.29.19.47.26; Wed, 29 Jun 2022 19:47:26 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=Gom+RJDf; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D7FA868B78C; Thu, 30 Jun 2022 05:47:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2A6D468B3B1 for ; Thu, 30 Jun 2022 05:47:15 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656557241; x=1688093241; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=IYR8XUwKlj+wHdhMoBWYkmfNO1QamE/XcqsEP+Vc2eA=; b=Gom+RJDfJrTEaj49sliarSDwFndi45mPanhfSXJ+XSMaTOv6vrA3hAAD tiodc+C6ySbzWV5EbaQFKWjhVMf+PjIMnCWOhHCGCuibj2oRCrCsbO0xr 4QfJNwSgArYyefrMvcwY3pW4EP2BMV5qYeC7/pC6Uz3lQnkr9uBg5SRyp n585jZWDYMDJT3zkeqckYtn6Re77j3KwtYqKObTYw35gJ+uYgH58fMpD7 CrCIma8fMRoOkq8xFqk0VnVhEmpEfz6CTJi8eTL7kZib7keErof8pXKiH fkTpxpmNiUaUjyUu03qPCKpeSUru3GjdrP3UhodJo5c2hipr/L2vmT2eD A==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="265257537" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="265257537" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 19:47:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="837387130" Received: from desktop-qn7n0nf.sh.intel.com (HELO localhost.localdomain) ([10.239.160.39]) by fmsmga006.fm.intel.com with ESMTP; 29 Jun 2022 19:47:12 -0700 From: Tong Wu To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 Jun 2022 10:45:56 +0800 Message-Id: <20220630024558.1444-1-tong1.wu@intel.com> X-Mailer: git-send-email 2.35.1.windows.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/3] avutil/hwcontext: add a function to get the AVHWDeviceType X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Tong Wu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0K9oAjAUL6/E Add a function to get the corresponding AVHWDeviceType from a given hardware pixel format. Signed-off-by: Tong Wu --- libavutil/hwcontext.c | 12 ++++++++++++ libavutil/hwcontext.h | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c index ab9ad3703e..3521ed34f4 100644 --- a/libavutil/hwcontext.c +++ b/libavutil/hwcontext.c @@ -80,6 +80,18 @@ static const char *const hw_type_names[] = { [AV_HWDEVICE_TYPE_VULKAN] = "vulkan", }; +enum AVHWDeviceType av_hwdevice_get_type_by_pix_fmt(enum AVPixelFormat fmt) +{ + int i, j; + for (i = 0; hw_table[i]; i++) { + for (j = 0; hw_table[i]->pix_fmts[j] != AV_PIX_FMT_NONE; j++) { + if (hw_table[i]->pix_fmts[j] == fmt) + return hw_table[i]->type; + } + } + return AV_HWDEVICE_TYPE_NONE; +} + enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name) { int type; diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h index c18b7e1e8b..97f94403e2 100644 --- a/libavutil/hwcontext.h +++ b/libavutil/hwcontext.h @@ -229,6 +229,15 @@ typedef struct AVHWFramesContext { int width, height; } AVHWFramesContext; +/** + * Get the device type by a given pixel format. + * + * @param fmt Pixel format from enum AVPixelFormat. + * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if + * not found. + */ +enum AVHWDeviceType av_hwdevice_get_type_by_pix_fmt(enum AVPixelFormat fmt); + /** * Look up an AVHWDeviceType by name. * From patchwork Thu Jun 30 02:45:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wu, Tong1" X-Patchwork-Id: 36537 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp13978pzh; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vZw2orw0qY/WpwhtAutWVKQpGzO/qc87wGzUuRzxi55s002K3SK11pz5qmS2Si/bxR34bz X-Received: by 2002:a17:907:d17:b0:726:a3be:bba4 with SMTP id gn23-20020a1709070d1700b00726a3bebba4mr6448308ejc.584.1656557268459; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656557268; cv=none; d=google.com; s=arc-20160816; b=QfCFcn20jhepXZsfPrLfP085dKhg6DbDMEmngpKxHpVAFUGVELSGfYr8tPTmNhBk0e Q3Lpz10ru9m4Q46CFlkEEERRFIQGNOgrj/1gDgmYGditClre9rX5TI3rCohdC4KmKw88 sNfzkeIuBVkcpefncvtcvahFq8qUGC29I1GfFuxs/3J1X4GwzQvB182jykdxmSeCeN0a xBEXWOXHHmFxrwaixLPBNSCLUi670pkY9MvdH83vS0fFJvq7P8MaEIL+hq1uj+r7Mo+i 94OHrLpeKFFbDTfCN8KQP8ARyGqx/lsw4mgozdzl8f583wJY4tYmloT377sFLubw8CUI q/HQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=vpofT/q28jEGNaacad9u7x9cnGudxjrewqle8BjotGc=; b=vfuuiHTo+ImMg5y2t2Jnr75q2JUy+QUF3mjP0+1u5TlERfSb229TfmuX9DnEVELEsN 8EapJyGId3EeGizVV1XY8bJe+dtsoEzFAutkzkMWoiTI8I4zd1EUihLNmmnW4xeI3gTf R3n8P9p2fcMi+yircIPu75PoQd0X530BwMlVrp+KvrV/J/Wir9mnO1kHY8m2VzR+P35E oGzH0d/E2Moe1ORqTXGlVPIKw9Uk8XgfgjZS1o5bg/P6QKiQgnD7uFxkmcLedFxWgcwK QRNvGTIliYEn+sLBC0FIsy/KSW2TSt6f7m8q7aoUj4zj2HikJTLT0++GhacKYZKFWyQW C4IQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=Ktj7n7at; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w8-20020a05640234c800b0043575b6d886si5572705edc.454.2022.06.29.19.47.35; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=Ktj7n7at; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DAC9668B3B1; Thu, 30 Jun 2022 05:47:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 137F268B791 for ; Thu, 30 Jun 2022 05:47:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656557243; x=1688093243; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VTVU6VTM9SA0K33No4B79KdBGL9MhosH2TQTkdpLHeI=; b=Ktj7n7atFYRVoSfoIqtjRsmCH6oIkQvuHGzvr7DU9aCm34cI5uuLzLrS GWJgj5Xub5VV59n1uK/EGSYWSA+XX+nZgxs3ybC43XMlQxi7ZPfJqX10d YhmNt4vWdNYAie5WT9KRUJV/Nae4SmoIs26e9Bpv3bZ+/S09xtbciUj1s f/1GUDgTm1iHIuhDgR6vZkoWdvvgLsDGx2N4fyJE2vVlqZWBqyadjk25E 0miywq3PlfsUK84LHCwrLVXdgUR7zV0HPutOte/4F0CeF4z7CW/+wcC9V 3pvTIlcqXrP/FOb+I7JUTJOEajC677mpRZuUP0BBmRcUUIsVAt6Dk3A7i w==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="265257546" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="265257546" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 19:47:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="837387148" Received: from desktop-qn7n0nf.sh.intel.com (HELO localhost.localdomain) ([10.239.160.39]) by fmsmga006.fm.intel.com with ESMTP; 29 Jun 2022 19:47:13 -0700 From: Tong Wu To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 Jun 2022 10:45:57 +0800 Message-Id: <20220630024558.1444-2-tong1.wu@intel.com> X-Mailer: git-send-email 2.35.1.windows.2 In-Reply-To: <20220630024558.1444-1-tong1.wu@intel.com> References: <20220630024558.1444-1-tong1.wu@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Tong Wu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ov2ldvobq6AU When a derive_device_type is not specified, the hwmap filter should be able to retrieve AVHWDeviceType from outlink->format and create corresponding hwdevice context. Signed-off-by: Tong Wu Signed-off-by: Tong Wu > --- libavfilter/vf_hwmap.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_hwmap.c b/libavfilter/vf_hwmap.c index 2e03dfc1fe..136980c982 100644 --- a/libavfilter/vf_hwmap.c +++ b/libavfilter/vf_hwmap.c @@ -70,23 +70,32 @@ static int hwmap_config_output(AVFilterLink *outlink) device_is_derived = 0; if (inlink->hw_frames_ctx) { + enum AVHWDeviceType type; hwfc = (AVHWFramesContext*)inlink->hw_frames_ctx->data; if (ctx->derive_device_type) { - enum AVHWDeviceType type; - type = av_hwdevice_find_type_by_name(ctx->derive_device_type); if (type == AV_HWDEVICE_TYPE_NONE) { av_log(avctx, AV_LOG_ERROR, "Invalid device type.\n"); err = AVERROR(EINVAL); goto fail; } + } else { + type = av_hwdevice_get_type_by_pix_fmt(outlink->format); + if (type == AV_HWDEVICE_TYPE_NONE) { + av_log(avctx, AV_LOG_ERROR, "Could not get device type from " + "format %s.\n", av_get_pix_fmt_name(outlink->format)); + err = AVERROR(EINVAL); + goto fail; + } + } + if (!device || ctx->derive_device_type) { err = av_hwdevice_ctx_create_derived(&device, type, - hwfc->device_ref, 0); + hwfc->device_ref, 0); if (err < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to created derived " - "device context: %d.\n", err); + "device context: %d.\n", err); goto fail; } device_is_derived = 1; From patchwork Thu Jun 30 02:45:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wu, Tong1" X-Patchwork-Id: 36538 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp13984pzh; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vNGNSPxRCDD/TQEMHril7brv15E2mL5b46/TVEEZTjADVIZ7LdMLnpUwdjUvxmX82yacHN X-Received: by 2002:a05:6402:3708:b0:433:2d3b:ed5 with SMTP id ek8-20020a056402370800b004332d3b0ed5mr8479765edb.246.1656557268719; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656557268; cv=none; d=google.com; s=arc-20160816; b=v6lH5oHf1SCyeqii4mrNjuj+p0Ct/bpVnqifwiPCdCCC/AncQdRd9EiT5iWHffYOoG noOQCfAjQyQ+9MXdaKa3Q8xZMO42LySnhIRN4ITB0odLcyU/fq32CuZzuHbTYdjhSMZl B7zHAfRsD+pWgmawAWUfVHb/weneTv4wHYfSXCuGrniEMl1jLkBmpkN4PMz56l5/F4S+ hVh1CjKjJyf0VKnsl//X6z91KU4X/igTAdT7vprZidmoZGLAEN/JimgnQkSsXU/uC81S jiQSg1DGYJb31Jyo2UvuO274LSt2wMHIbv0PzaqlXEN6Tkjw5F/2L7QIqkQbEytbxzyE 02+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=D5XxK0Xx9XpnBBotC6kX6Y0NpEbsq2Kj3/bWGztEscs=; b=De5JxAYXl8euwW20zzP0UumGrbh9ph6RDn9yVnTsoGx3HkEnaOt/HdNjR8c8tpPKQv Ic69+w7Kh0Ui2O1wn8sOgq3Hxh/ygSWa3WTUkfiFW4c/wjSo832iG3qTmEyToD5n1y7V iBYqUj9WnwUfpfJDPSlqQ08JVJY7v6Q46xgXZYHBMTpQiZ/rlQefdGX/3vRQvkqH9jJJ +1/FvLz4TiJ9BzUVsNHbCBlvMDSphDYReRHny+No+FsNyjkHtMxtXsqMtGXy4utEIW2b IX9uVYM3YYxULR0d7fnNG/3/vWARVvnozNyYm9ArEQDvcNV4U4qWMkl6VGn+zsssEpO3 QHCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=GaZcEEdx; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e7-20020a056402190700b0043586d19cf9si4402905edz.465.2022.06.29.19.47.44; Wed, 29 Jun 2022 19:47:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=GaZcEEdx; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F036668B7B2; Thu, 30 Jun 2022 05:47:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3057868B677 for ; Thu, 30 Jun 2022 05:47:22 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1656557247; x=1688093247; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ifNYro8pdK3DM4EPpAnibbBqlSocyDLs5IfIGQwXivQ=; b=GaZcEEdxvlVFn5r9ysVRzXRNE+jzZN09F3PlcqjbJEr9/A8N3rDx0uwe Kxm+Lnp4UlT8cg2dIgXYE1AD2XqywyqxDLyerq3/GDjkXtBpAkqWqihSX v+eR8RhXiMoent0D7ATef4iApnpY1H7BZ4Z4TdhnTCb8Btw87V8fQRcRZ tL8I4ibK5f0QV2aySlobvnT0ckuHs3A1y42etbiIhn1hBjZQvhWjOfHxB 35P7yz0S6eLno97EQuYSuQKRGDdRbb4Fyz+rFRILtk500vWhcdQbgTAg+ iQOzpfL+mka5gx3ESmmvQinmToUd7/a1K1tWkyi3zlS6MABmJHXUYtSi1 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10393"; a="265257553" X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="265257553" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jun 2022 19:47:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,232,1650956400"; d="scan'208";a="837387168" Received: from desktop-qn7n0nf.sh.intel.com (HELO localhost.localdomain) ([10.239.160.39]) by fmsmga006.fm.intel.com with ESMTP; 29 Jun 2022 19:47:14 -0700 From: Tong Wu To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 Jun 2022 10:45:58 +0800 Message-Id: <20220630024558.1444-3-tong1.wu@intel.com> X-Mailer: git-send-email 2.35.1.windows.2 In-Reply-To: <20220630024558.1444-1-tong1.wu@intel.com> References: <20220630024558.1444-1-tong1.wu@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/3] avfilter/avfiltergraph: add an auto hwmap filter X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Tong Wu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wvsYZzCJivG8 When two formats lists cannot be merged, a scale filter is auto-inserted. However, when it comes to hardware map, we have to manually add a hwmap filter to do the conversion. This patch introduces an auto hwmap filter to do the hwmap conversion automatically and modifies the negotiation structures, making it extensible for more auto filters. Signed-off-by: Tong Wu --- libavfilter/avfiltergraph.c | 183 ++++++++++++++++++++++++------------ libavfilter/formats.c | 26 ++++- libavfilter/formats.h | 9 +- 3 files changed, 150 insertions(+), 68 deletions(-) diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index b7dbfc063b..0f12f2d802 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -393,6 +393,83 @@ static int formats_declared(AVFilterContext *f) return 1; } +static int insert_auto_filter(AVFilterContext **convert, AVFilterGraph *graph, + AVFilterLink *link, const AVFilterNegotiation *neg, + unsigned conv_step, int *converter_count, void *log_ctx) +{ + int ret; + const AVFilter *filter; + AVFilterContext *ctx; + AVFilterLink *inlink, *outlink; + char inst_name[30]; + const char *opts = neg->conversion_filters[conv_step].conversion_opts_offset == 0 ? NULL : + FF_FIELD_AT(char *, neg->conversion_filters[conv_step].conversion_opts_offset, *graph); + const char *name = neg->conversion_filters[conv_step].conversion_filter; + + if (graph->disable_auto_convert) { + av_log(log_ctx, AV_LOG_ERROR, + "The filters '%s' and '%s' do not have a common format " + "and automatic conversion is disabled.\n", + link->src->name, link->dst->name); + return AVERROR(EINVAL); + } + + if (!(filter = avfilter_get_by_name(name))) { + av_log(log_ctx, AV_LOG_ERROR, + "'%s' filter not present, cannot convert formats.\n", + name); + return AVERROR(EINVAL); + } + snprintf(inst_name, sizeof(inst_name), "auto_%s_%d", + name, (*converter_count)++); + ret = avfilter_graph_create_filter(&ctx, filter, inst_name, opts, NULL, graph); + if (ret < 0) + return ret; + + if ((ret = avfilter_insert_filter(link, ctx, 0, 0)) < 0) + return ret; + + if ((ret = filter_query_formats(ctx)) < 0) + return ret; + + inlink = ctx->inputs[0]; + outlink = ctx->outputs[0]; + av_assert0( inlink->incfg.formats->refcount > 0); + av_assert0( inlink->outcfg.formats->refcount > 0); + av_assert0(outlink->incfg.formats->refcount > 0); + av_assert0(outlink->outcfg.formats->refcount > 0); + if (outlink->type == AVMEDIA_TYPE_AUDIO) { + av_assert0( inlink-> incfg.samplerates->refcount > 0); + av_assert0( inlink->outcfg.samplerates->refcount > 0); + av_assert0(outlink-> incfg.samplerates->refcount > 0); + av_assert0(outlink->outcfg.samplerates->refcount > 0); + av_assert0( inlink-> incfg.channel_layouts->refcount > 0); + av_assert0( inlink->outcfg.channel_layouts->refcount > 0); + av_assert0(outlink-> incfg.channel_layouts->refcount > 0); + av_assert0(outlink->outcfg.channel_layouts->refcount > 0); + } + + *convert = ctx; + return 0; +} + +static int merge_auto_filter(AVFilterContext *convert, const AVFilterNegotiation *neg) +{ + int neg_step, ret; + AVFilterLink *inlink = convert->inputs[0]; + AVFilterLink *outlink = convert->outputs[0]; +#define MERGE(merger, link) \ + ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg), \ + FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg))) + for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) { + const AVFilterFormatsMerger *m = &neg->mergers[neg_step]; + if ((ret = MERGE(m, inlink)) <= 0 || + (ret = MERGE(m, outlink)) <= 0) + break; + } + return ret; +} + /** * Perform one round of query_formats() and merging formats lists on the * filter graph. @@ -433,7 +510,7 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx) for (j = 0; j < filter->nb_inputs; j++) { AVFilterLink *link = filter->inputs[j]; const AVFilterNegotiation *neg; - unsigned neg_step; + unsigned neg_step, conv_step; int convert_needed = 0; if (!link) @@ -469,68 +546,50 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx) } if (convert_needed) { - AVFilterContext *convert; - const AVFilter *filter; - AVFilterLink *inlink, *outlink; - char inst_name[30]; - const char *opts; - - if (graph->disable_auto_convert) { - av_log(log_ctx, AV_LOG_ERROR, - "The filters '%s' and '%s' do not have a common format " - "and automatic conversion is disabled.\n", - link->src->name, link->dst->name); - return AVERROR(EINVAL); - } - - /* couldn't merge format lists. auto-insert conversion filter */ - if (!(filter = avfilter_get_by_name(neg->conversion_filter))) { - av_log(log_ctx, AV_LOG_ERROR, - "'%s' filter not present, cannot convert formats.\n", - neg->conversion_filter); - return AVERROR(EINVAL); - } - snprintf(inst_name, sizeof(inst_name), "auto_%s_%d", - neg->conversion_filter, converter_count++); - opts = FF_FIELD_AT(char *, neg->conversion_opts_offset, *graph); - ret = avfilter_graph_create_filter(&convert, filter, inst_name, opts, NULL, graph); - if (ret < 0) - return ret; - if ((ret = avfilter_insert_filter(link, convert, 0, 0)) < 0) - return ret; - - if ((ret = filter_query_formats(convert)) < 0) - return ret; + for (conv_step = 0; conv_step < neg->nb_conversion_filters; conv_step++) { + AVFilterContext *convert; + ret = insert_auto_filter(&convert, graph, link, neg, + conv_step, &converter_count, log_ctx); + if (ret < 0) { + av_log(log_ctx, AV_LOG_ERROR, "Failed to insert an auto filter.\n"); + return ret; + } - inlink = convert->inputs[0]; - outlink = convert->outputs[0]; - av_assert0( inlink->incfg.formats->refcount > 0); - av_assert0( inlink->outcfg.formats->refcount > 0); - av_assert0(outlink->incfg.formats->refcount > 0); - av_assert0(outlink->outcfg.formats->refcount > 0); - if (outlink->type == AVMEDIA_TYPE_AUDIO) { - av_assert0( inlink-> incfg.samplerates->refcount > 0); - av_assert0( inlink->outcfg.samplerates->refcount > 0); - av_assert0(outlink-> incfg.samplerates->refcount > 0); - av_assert0(outlink->outcfg.samplerates->refcount > 0); - av_assert0( inlink-> incfg.channel_layouts->refcount > 0); - av_assert0( inlink->outcfg.channel_layouts->refcount > 0); - av_assert0(outlink-> incfg.channel_layouts->refcount > 0); - av_assert0(outlink->outcfg.channel_layouts->refcount > 0); - } -#define MERGE(merger, link) \ - ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg), \ - FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg))) - for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) { - const AVFilterFormatsMerger *m = &neg->mergers[neg_step]; - if ((ret = MERGE(m, inlink)) <= 0 || - (ret = MERGE(m, outlink)) <= 0) { - if (ret < 0) - return ret; - av_log(log_ctx, AV_LOG_ERROR, - "Impossible to convert between the formats supported by the filter " - "'%s' and the filter '%s'\n", link->src->name, link->dst->name); - return AVERROR(ENOSYS); + ret = merge_auto_filter(convert, neg); + if (ret < 0) + return ret; + else if (ret > 0) + break; + else if (conv_step < neg->nb_conversion_filters - 1) { + AVFilterLink *inlink = convert->inputs[0]; + AVFilterLink *outlink = convert->outputs[0]; + av_log(log_ctx, AV_LOG_VERBOSE, + "Impossible to convert between the formats supported by the filter " + "'%s' and the filter '%s', try another conversion filter.\n", + link->src->name, link->dst->name); + unsigned dstpad_idx = outlink->dstpad - outlink->dst->input_pads; + converter_count--; + /* re-hookup the link */ + inlink->dst = outlink->dst; + inlink->dstpad = &outlink->dst->input_pads[dstpad_idx]; + outlink->dst->inputs[dstpad_idx] = inlink; + if (outlink->outcfg.formats) + ff_formats_changeref(&outlink->outcfg.formats, + &inlink->outcfg.formats); + if (outlink->outcfg.samplerates) + ff_formats_changeref(&outlink->outcfg.samplerates, + &inlink->outcfg.samplerates); + if (outlink->outcfg.channel_layouts) + ff_channel_layouts_changeref(&outlink->outcfg.channel_layouts, + &inlink->outcfg.channel_layouts); + /* remove the previous auto filter */ + convert->inputs[0] = NULL; + convert->outputs[0]->dst = NULL; + avfilter_free(convert); + } else { + av_log(log_ctx, AV_LOG_ERROR, + "Impossible to convert between the formats supported by the filter " + "'%s' and the filter '%s'\n", link->src->name, link->dst->name); } } } diff --git a/libavfilter/formats.c b/libavfilter/formats.c index e8c2888c0c..fee10fa0ee 100644 --- a/libavfilter/formats.c +++ b/libavfilter/formats.c @@ -326,18 +326,36 @@ static const AVFilterFormatsMerger mergers_audio[] = { }, }; +static const AVFilterFormatsFilter filters_video[] = { + { + .conversion_filter = "scale", + .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts), + }, + { + .conversion_filter = "hwmap", + .conversion_opts_offset = 0, + } +}; + +static const AVFilterFormatsFilter filters_audio[] = { + { + .conversion_filter = "aresample", + .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts), + } +}; + static const AVFilterNegotiation negotiate_video = { .nb_mergers = FF_ARRAY_ELEMS(mergers_video), .mergers = mergers_video, - .conversion_filter = "scale", - .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts), + .nb_conversion_filters = FF_ARRAY_ELEMS(filters_video), + .conversion_filters = filters_video, }; static const AVFilterNegotiation negotiate_audio = { .nb_mergers = FF_ARRAY_ELEMS(mergers_audio), .mergers = mergers_audio, - .conversion_filter = "aresample", - .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts), + .nb_conversion_filters = FF_ARRAY_ELEMS(filters_audio), + .conversion_filters = filters_audio, }; const AVFilterNegotiation *ff_filter_get_negotiation(AVFilterLink *link) diff --git a/libavfilter/formats.h b/libavfilter/formats.h index 22224dce2d..9943fb8aa3 100644 --- a/libavfilter/formats.h +++ b/libavfilter/formats.h @@ -330,6 +330,11 @@ typedef struct AVFilterFormatMerger { int (*can_merge)(const void *a, const void *b); } AVFilterFormatsMerger; +typedef struct AVFilterFormatFilter { + const char *conversion_filter; + unsigned conversion_opts_offset; +} AVFilterFormatsFilter; + /** * Callbacks and properties to describe the steps of a format negotiation. * @@ -418,8 +423,8 @@ typedef struct AVFilterFormatMerger { typedef struct AVFilterNegotiation { unsigned nb_mergers; const AVFilterFormatsMerger *mergers; - const char *conversion_filter; - unsigned conversion_opts_offset; + unsigned nb_conversion_filters; + const AVFilterFormatsFilter *conversion_filters; } AVFilterNegotiation; const AVFilterNegotiation *ff_filter_get_negotiation(AVFilterLink *link);