From patchwork Tue Oct 3 13:15:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 5394 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.61.8 with SMTP id n8csp2709781jan; Tue, 3 Oct 2017 06:20:34 -0700 (PDT) X-Received: by 10.223.179.73 with SMTP id k9mr16820343wrd.62.1507036834419; Tue, 03 Oct 2017 06:20:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507036834; cv=none; d=google.com; s=arc-20160816; b=pzTjSfhWY7yFTT5vlwW1eAm/1g83PIovIpCYwfJryL53PJBOBTW3m0eDTHCkwC8swb mI2/jG08iZOO8gFuKm9I0cALVJWpDmVAaMz7qNAt3fO8cvV/Pk1Q7dXAE0+U+HrQQRtf tqtHsg/K1KqxiFrDj0vycQDw/73lgFu5zblY7SD4g4yA7M1bHbmwlvASqUooonD/mBQZ 9pnmz2J5+qYhvPXRpqbWSGPQx//XLTa84+euKsihokOceGwkGdYGcNZX3LwOxJjP1xDg w1qVjatvml3pk+sqN3Jz0/Hj7mz70IF6EQcvh51Hx7DZD9zZW4iHKQqAa4Cwu6++uCEP FU2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=8DqOagzcBogXo2EDVzSMq140qysE/L/ruxlzGwiIUxY=; b=QYAFcwKfSQujoPlwl1dFaX/LZHTBZOuosMtLFFOPWHX22vcQoWjRYiqv6TSks/cD/u 2pDWHpLuAGvNitG2BpEe+Syddlbav/Vo+j7FaQ3WsXAFG2EHobXAFnU5iSUgfP7yS1Xo LqZDpmJ3cAUHaQKNvlR6R+/EfjDQ92Sj+9Z9Mhg4SpVjXqxyaOl9ukUwvLu0rhz+SkX4 cDoRa50htGs9GLrBQlPATp0scG9TTE87KX53sTMcnjRMQ223vIs7ta7M4TBUL+O1P4vP gyAeujfgvQ43bKJWuJ2kOET2lcFI4GczzM+CGfVlB3hi/7xisYCk/TNH/5+AXcWfP6c2 V7uw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=Xx3c9xmf; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b126si9741331wmb.219.2017.10.03.06.20.34; Tue, 03 Oct 2017 06:20:34 -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=@googlemail.com header.s=20161025 header.b=Xx3c9xmf; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8049C689FD8; Tue, 3 Oct 2017 16:20:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f66.google.com (mail-lf0-f66.google.com [209.85.215.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C18DE689FD2 for ; Tue, 3 Oct 2017 16:20:14 +0300 (EEST) Received: by mail-lf0-f66.google.com with SMTP id c82so5838838lfc.6 for ; Tue, 03 Oct 2017 06:20:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=lKd4LFKfWGIRoIhop8MoH27ytx2jhEt2pHORZYrnWks=; b=Xx3c9xmf8R5FMDpRGMllm0BAqoHeCBkgaWw4HhwblqqYQjvW16oAZAqtE1pEIuVRVF Jf73Qe30JNeFZvgo2TXDZHz+IILWuk36xWXIvhV7Yx48G7R+MEYcV33RB7PVSic0U3fW haEjW2MM3sUIFy4NKXF4459aqdwgraztdhzOBMnXl4mEsu0hC6M9qkqw+Zi0lIJp/v2x z3SD1jkYLLk5/dkXxQWUnf8lpH0fFdKGfnUwKTmIEs5yzXjs5Rp+5iRFGv2to+L2RvQm rc6ZWpvvF/5R8nQ3J12aHWOQa3WNqboXoerrNBxGmG0XtxjPk77rZw1Hq1Cf2Cv2adYF 8Daw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=lKd4LFKfWGIRoIhop8MoH27ytx2jhEt2pHORZYrnWks=; b=izc/LIbWiZ0zD/jY95nlNfWQRANv3muU68bB7U2T/ZLoYhnBbRatc/+VPEo07LS9IO TlVlR/vJAfLusFPWadnMoC50IMPb/jlQjC9cgiZgRqRIDHs8XuAcMBJIxt2vVUsHCSmd XHtAOXzqIToq0I9l1uuYk/TKLp22YPreEL4J2dxrOmeytp8u5DjV3UaxjifLVhGHtGI0 r+BIM67iBs66F4WN8TYNiAcFNsWgYs9aOM/3+4pIq8i3Nk0KVFhPb7I37LAvfQXcGaxo Ljlaj/rhRU0VmOPRR5FDxDw9NFDUmZs9jHhFp0bEdvouyOR7egdJNvR0PxlYnhEbkYUv zshA== X-Gm-Message-State: AMCzsaVAn/vbsBT0qRRgvtUnzAqspLCH++AehrDZHG30OU3h+qm4nth5 zhxS0sod0aB5Y+1qNlbF4mHGqA== X-Google-Smtp-Source: AOwi7QBN+fViy4ozkrOAjXFx0aoEJEOW9CC03c85FNSYI3INISBC/54hXCbFCIZkF+UhhDcCAnSLoA== X-Received: by 10.25.16.218 with SMTP id 87mr378903lfq.66.1507036503284; Tue, 03 Oct 2017 06:15:03 -0700 (PDT) Received: from debian.speedport.ip (p2003006CCD5CDB6820D8428BCA02F6C5.dip0.t-ipconnect.de. [2003:6c:cd5c:db68:20d8:428b:ca02:f6c5]) by smtp.googlemail.com with ESMTPSA id 6sm2892024lju.45.2017.10.03.06.15.01 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 Oct 2017 06:15:02 -0700 (PDT) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Tue, 3 Oct 2017 15:15:17 +0200 Message-Id: <20171003131518.4557-7-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171003131518.4557-1-nfxjfg@googlemail.com> References: <20171003131518.4557-1-nfxjfg@googlemail.com> Subject: [FFmpeg-devel] [PATCH 6/7] avcodec: allow multiple hwaccels for the same codec/pixfmt 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Currently, AVHWAccels are looked up using a (codec_id, pixfmt) tuple. This means it's impossible to have 2 decoders for the same codec and using the same opaque hardware pixel format. This breaks merging Libav's CUVID hwaccel. FFmpeg has its own CUVID support, but it's a full stream decoder, using NVIDIA's codec parser. The Libav one is a true hwaccel, which is based on the builtin software decoders. Fix this by introducing another field to disambiguate AVHWAccels, and use it for our CUVID decoders. FF_CODEC_CAP_HWACCEL_REQUIRE_CLASS makes this mechanism backwards compatible and optional. --- libavcodec/Makefile | 1 + libavcodec/avcodec.h | 5 +++++ libavcodec/cuviddec.c | 2 ++ libavcodec/decode.c | 12 ++++++++---- libavcodec/internal.h | 5 +++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index fa3ab8f08a..3e0d654541 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -820,6 +820,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o # hardware accelerators +OBJS-$(CONFIG_CUVID) += cuvid.o OBJS-$(CONFIG_D3D11VA) += dxva2.o OBJS-$(CONFIG_DXVA2) += dxva2.o OBJS-$(CONFIG_VAAPI) += vaapi_decode.o diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 52cc5b0ca0..ecc49e5643 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -4000,6 +4000,11 @@ typedef struct AVHWAccel { * Internal hwaccel capabilities. */ int caps_internal; + + /** + * Some hwaccels are ambiguous if only + */ + const AVClass *decoder_class; } AVHWAccel; /** diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index 2ba8e00c6a..6370348639 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -1106,6 +1106,7 @@ static const AVOption options[] = { .type = AVMEDIA_TYPE_VIDEO, \ .id = AV_CODEC_ID_##X, \ .pix_fmt = AV_PIX_FMT_CUDA, \ + .decoder_class = &x##_cuvid_class, \ }; \ AVCodec ff_##x##_cuvid_decoder = { \ .name = #x "_cuvid", \ @@ -1120,6 +1121,7 @@ static const AVOption options[] = { .receive_frame = cuvid_output_frame, \ .flush = cuvid_flush, \ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ + .caps_internal = FF_CODEC_CAP_HWACCEL_REQUIRE_CLASS, \ .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \ AV_PIX_FMT_NV12, \ AV_PIX_FMT_P010, \ diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 668ef9667f..7060f6a3b7 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -1152,15 +1152,19 @@ enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const en return fmt[0]; } -static AVHWAccel *find_hwaccel(enum AVCodecID codec_id, +static AVHWAccel *find_hwaccel(AVCodecContext *avctx, enum AVPixelFormat pix_fmt) { AVHWAccel *hwaccel = NULL; + const AVClass *av_class = + (avctx->codec->caps_internal & FF_CODEC_CAP_HWACCEL_REQUIRE_CLASS) + ? avctx->av_class : NULL; - while ((hwaccel = av_hwaccel_next(hwaccel))) - if (hwaccel->id == codec_id + while ((hwaccel = av_hwaccel_next(hwaccel))) { + if (hwaccel->decoder_class == av_class && hwaccel->id == avctx->codec_id && hwaccel->pix_fmt == pix_fmt) return hwaccel; + } return NULL; } @@ -1168,7 +1172,7 @@ static int setup_hwaccel(AVCodecContext *avctx, const enum AVPixelFormat fmt, const char *name) { - AVHWAccel *hwa = find_hwaccel(avctx->codec_id, fmt); + AVHWAccel *hwa = find_hwaccel(avctx, fmt); int ret = 0; if (!hwa) { diff --git a/libavcodec/internal.h b/libavcodec/internal.h index faa923c11f..0177ea6521 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -69,6 +69,11 @@ */ #define FF_CODEC_CAP_SLICE_THREAD_HAS_MF (1 << 5) +/** + * Allow only AVHWAccels which have a matching decoder_class field. + */ +#define FF_CODEC_CAP_HWACCEL_REQUIRE_CLASS (1 << 6) + #ifdef TRACE # define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__) #else