From patchwork Tue Aug 2 07:56:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 37085 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp2978730pzb; Tue, 2 Aug 2022 00:56:27 -0700 (PDT) X-Google-Smtp-Source: AGRyM1udeCuLHgojKPk9aimDlCFEUXB+LPfIBp/Oh4FvKk52CwlmZle6OrHhY6eTcUWbNQej1o1l X-Received: by 2002:a05:6402:248d:b0:437:dd4c:e70e with SMTP id q13-20020a056402248d00b00437dd4ce70emr19123853eda.75.1659426987462; Tue, 02 Aug 2022 00:56:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659426987; cv=none; d=google.com; s=arc-20160816; b=JBLUhvOXf4dKM6q5/ACf9Xhm63kHvUMjSZuP86iFpVeFOj5XJ023OvpjKYsi/Y+Q6l vxemwwPnLdtRW+ayrYsUYmN8DpKC6daQzIGguqRR4izNZVF55nChV/Iz1aRX6ofqI77t adBKku5bRQOcmWQEuY0D5JOZpOIjxn+/vaGmwrMKpCrehIv4dMeUljLfS+8BHLnulzMx aLzV4EXrkX1EsKnX0MZq16M41irhk2ptX0FgAMFmGg2ceY+8Szi7JVSM13FFh5RwYKmi fn7G+b0O/msmdoogo8J9JD2r2sXqEtCR5mxnEBDgq9V2DN5zApyWuIGVcGnrqRptkolJ dJ/A== 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:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to; bh=+ZZnqX+7wF1c3bQOHH6nszqDg1FsKVWLM5+kzi9QuOU=; b=qEmtU1lKAmbkl3gNQnIzVLC2U53Cr7V36CGs/rYlPmvE6SpO78Wjj1n3EBS42kVeP7 EZfIdZyGaTU3Rpnt3d4SyO1uP0gpnTyay4aV2tA+JvmnatBUFFvf0YY9Aj7fgkO+lB7d r/8Ji+h18xeG6GfPfevRoscWSSkohcIb4YkJ1ehmkl1xHlHdTBXIiFyD3Z3ZLhjDxThG x/Gf/PZMWEvDbrazVSS6iAw5RiYB6+ss+5bsp63oPZqSwmfPucs1SI/ruH1+Cp1UFlzL ApMHC0D9taEgcoSLaNxTDQAeVm5m4yDzlXPepwbB9c5GHzFcFPKtb/VILHSNCqD/+qhK MdUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="l/POIoOH"; 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 t7-20020a056402240700b0043ae94f98a8si12122274eda.276.2022.08.02.00.56.26; Tue, 02 Aug 2022 00:56:27 -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="l/POIoOH"; 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 E94BA68BA2D; Tue, 2 Aug 2022 10:56:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 08AB768B8CF for ; Tue, 2 Aug 2022 10:56: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=1659426981; x=1690962981; h=from:to:cc:subject:date:message-id; bh=Vqk15nd6aiyBx9raUd2AZGFMqhb3UviNMIG3id7Ay10=; b=l/POIoOHxrLHmWyGsXc3mbvlvWynKll+0gEXs9dobRse/NGPheQI2AUd mV7xLfHCZWKDWoORk05DqfNd5cZ6RjDPWzJxP2bT7CTsvCcNRk0RJJMtK GM8EudbzlYsfAFYlJ0nRYBv87Tf/9u0EiAxPG4A0xvtyQHRgG6HsHOFV+ Rb20kECXKkYuQphDhz17vxkMbnwJrjwgrMnibfszhSDNNiWDw0sKP8SYI FQAWwMdxIDHG18Z8Ss/AqWmJYjh/ouQws3yc+61Y9AO5dca967d0HJcyb gOnLqinmwGM65apSMQgxCy3UVJSXd+qWV2U0qAcdDDxELtHiSaXrtuB7e Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="290563057" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="290563057" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 00:56:13 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="929873786" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 00:56:12 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Aug 2022 15:56:00 +0800 Message-Id: <20220802075601.31925-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v4 1/2] ffmpeg_opt: select a decoder after getting values for per-stream hwdec options 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: fFl0MYjP5FLX From: Haihao Xiang After applying this patch, the desired HW acceleration method is known before selecting decoder, so we may take HW acceleration method into account when selecting decoder for input stream in the next commit There should be no functional changes in this patch Signed-off-by: Haihao Xiang --- fftools/ffmpeg_opt.c | 134 ++++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index a96bcf9b8a..cf0c31bdc2 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -935,72 +935,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) st->codecpar->codec_tag = tag; } - ist->dec = choose_decoder(o, ic, st); - ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec); - - ist->reinit_filters = -1; - MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st); - - MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st); - ist->user_set_discard = AVDISCARD_NONE; - - if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) || - (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) || - (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) || - (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)) - ist->user_set_discard = AVDISCARD_ALL; - - if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) { - av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n", - discard_str); - exit_program(1); - } - - ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE; - ist->prev_pkt_pts = AV_NOPTS_VALUE; - - ist->dec_ctx = avcodec_alloc_context3(ist->dec); - if (!ist->dec_ctx) { - av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n"); - exit_program(1); - } - - ret = avcodec_parameters_to_context(ist->dec_ctx, par); - if (ret < 0) { - av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n"); - exit_program(1); - } - - ist->decoded_frame = av_frame_alloc(); - if (!ist->decoded_frame) - exit_program(1); - - ist->pkt = av_packet_alloc(); - if (!ist->pkt) - exit_program(1); - - if (o->bitexact) - ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT; - - switch (par->codec_type) { - case AVMEDIA_TYPE_VIDEO: - if(!ist->dec) - ist->dec = avcodec_find_decoder(par->codec_id); - - // avformat_find_stream_info() doesn't set this for us anymore. - ist->dec_ctx->framerate = st->avg_frame_rate; - - MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st); - if (framerate && av_parse_video_rate(&ist->framerate, - framerate) < 0) { - av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n", - framerate); - exit_program(1); - } - - ist->top_field_first = -1; - MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st); - + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st); MATCH_PER_STREAM_OPT(hwaccel_output_formats, str, hwaccel_output_format, ic, st); @@ -1066,6 +1001,73 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) } ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE; + } + + ist->dec = choose_decoder(o, ic, st); + ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec); + + ist->reinit_filters = -1; + MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st); + + MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st); + ist->user_set_discard = AVDISCARD_NONE; + + if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) || + (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) || + (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) || + (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)) + ist->user_set_discard = AVDISCARD_ALL; + + if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n", + discard_str); + exit_program(1); + } + + ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE; + ist->prev_pkt_pts = AV_NOPTS_VALUE; + + ist->dec_ctx = avcodec_alloc_context3(ist->dec); + if (!ist->dec_ctx) { + av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n"); + exit_program(1); + } + + ret = avcodec_parameters_to_context(ist->dec_ctx, par); + if (ret < 0) { + av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n"); + exit_program(1); + } + + ist->decoded_frame = av_frame_alloc(); + if (!ist->decoded_frame) + exit_program(1); + + ist->pkt = av_packet_alloc(); + if (!ist->pkt) + exit_program(1); + + if (o->bitexact) + ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT; + + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + if(!ist->dec) + ist->dec = avcodec_find_decoder(par->codec_id); + + // avformat_find_stream_info() doesn't set this for us anymore. + ist->dec_ctx->framerate = st->avg_frame_rate; + + MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st); + if (framerate && av_parse_video_rate(&ist->framerate, + framerate) < 0) { + av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n", + framerate); + exit_program(1); + } + + ist->top_field_first = -1; + MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st); break; case AVMEDIA_TYPE_AUDIO: From patchwork Tue Aug 2 07:56:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 37086 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp2978820pzb; Tue, 2 Aug 2022 00:56:38 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ur26lX1ECtWwCsdUt4KY/5hT0xg1kFEwoVjmWxhcz2dKZjeBiCtC/1aFdqPCSRkWcSWdNX X-Received: by 2002:a05:6402:248d:b0:437:dd4c:e70e with SMTP id q13-20020a056402248d00b00437dd4ce70emr19124400eda.75.1659426997825; Tue, 02 Aug 2022 00:56:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659426997; cv=none; d=google.com; s=arc-20160816; b=cvigIHeuEDmOi/XTpjWtE8qxTH6WdPRuO8iMscHh10/tIWdpc4Hl3+acRMMHXULGdC RmCBblFChvujdnLYSKdNipODLkrpQfCc8eWcVexXEoKdtg1bzyhwm11Xqd8twN8kMmDz xttXWOskpucD2Qm+3uqdgLavFO8kkfWZVnIRH6l3/oNVrSXqmRXLE7yk8dGVv1rmA46e FOmTJh74uZFdUHydV/d1Gtn0GmLUcWuYoGIm1Ts8kVKxsNagaNbLNA21K1Ad6M6QuC9v eZS3kTdPfYYSVzs0vvKs+6qE6YpsXcDINNQzyaAdPXDKmyXprOcOCzi+JlJieSoHLMGr KJnA== 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:cc: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; bh=5aXn3NxkXPrC/EGrd/9yzUUdUycQThsIr5ZKp/sv/L8=; b=vHY18M7CeRNlqrI3vudJS+qiCQ8M6IgLwjliI0CF7igZPo7imDrB9i5YXLOGMR57IE bimOWbTjATzUUn1u0eoA3S8jNl7iPRq17txw5IRR6yVr+Go3LasS+3B5AomvgPJsumfv nBcc+dJUjGVboyBzR7TMBr9jy+mCmtiGchKyhk24oLi4OJpoZmzjeQ4ewokK7z96P0Wu UNOrZ1vN5B7aaGdEjaJnOCVXO6lyBarFG/VYSiHSzvBkEyFkyrZuxfqUYzjFLrbWR1D9 ZO86zYdKA3O0wFA0WjJ+sxSNqMDAtopbocWkGchLGs8MYEb+whRKZ4iorNxoAakKzE/V V4Og== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=XVkR0Zil; 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 n26-20020aa7c45a000000b0043d5334b5b9si7045621edr.511.2022.08.02.00.56.37; Tue, 02 Aug 2022 00:56:37 -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=XVkR0Zil; 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 0B6D768BA71; Tue, 2 Aug 2022 10:56:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E7B1668B71B for ; Tue, 2 Aug 2022 10:56:21 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659426987; x=1690962987; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=z8ckmGnItsD7APqktrHbgRAb+B56Jgzq8x1IPXtiJhM=; b=XVkR0Zillv1RC3RfJDpWuqXi9HYUskiNyA6nOyV5d0rJsryf0PK4aYh0 SPJsFhk35ycaiSEmrLN8gWYY827Y+v+vjKbjF+7YYGZwxUkMtnhiz+0fs yAlu+X6F++ZefFqEY8K8lSz/Zf+DrwKdqYQKqjsr5UEkKmuYoQZro+GWm 0VIdw0zKP7t1l+Tlz0VTuEVdeXK/uzSAMDRLgTUaikgDsgReY6Lz69Ag8 jl1dL8xcY2vOt/8TEejALkaS4gtkTi5NV4I9X/8bDM2IkvA4H4q3UbDi8 n44ZCL8E9Pp2ZOPFQ4sUFJ8YONkcepCwMuWx7zyWkChsSjY2MuyGHkktx A==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="290563062" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="290563062" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 00:56:14 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="929873798" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 00:56:13 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Aug 2022 15:56:01 +0800 Message-Id: <20220802075601.31925-2-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220802075601.31925-1-haihao.xiang@intel.com> References: <20220802075601.31925-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 2/2] ffmpeg_opt: consider HW acceleration method when selecting decoder 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lBz91RQ+URlN From: Haihao Xiang Usually a HW decoder is expected when user specifies a HW acceleration method via -hwaccel option, however the current implementation doesn't take HW acceleration method into account, it is possible to select a SW decoder. For example: $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null - $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null - $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null - [...] Stream #0:0 -> #0:0 (av1 (libdav1d) -> wrapped_avframe (native)) libdav1d is selected in this case even if vaapi, nvdec or vdpau is specified. After applying this patch, the native av1 decoder (with vaapi, nvdec or vdpau support) is selected for decoding(libdav1d is still used for probing format). $ ffmpeg -hwaccel vaapi -i av1.mp4 -f null - $ ffmpeg -hwaccel nvdec -i av1.mp4 -f null - $ ffmpeg -hwaccel vdpau -i av1.mp4 -f null - [...] Stream #0:0 -> #0:0 (av1 (native) -> wrapped_avframe (native)) Tested-by: Mario Roy Signed-off-by: Haihao Xiang --- fftools/ffmpeg_opt.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index cf0c31bdc2..db51cca66d 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -857,7 +857,9 @@ static const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, return codec; } -static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st) +static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st, + enum HWAccelID hwaccel_id, enum AVHWDeviceType hwaccel_device_type) + { char *codec_name = NULL; @@ -868,8 +870,29 @@ static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVSt if (recast_media && st->codecpar->codec_type != codec->type) st->codecpar->codec_type = codec->type; return codec; - } else + } else { + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && + hwaccel_id == HWACCEL_GENERIC && + hwaccel_device_type != AV_HWDEVICE_TYPE_NONE) { + const AVCodec *c; + void *i = NULL; + + while ((c = av_codec_iterate(&i))) { + const AVCodecHWConfig *config; + + if (c->id != st->codecpar->codec_id || + !av_codec_is_decoder(c)) + continue; + + for (int j = 0; config = avcodec_get_hw_config(c, j); j++) { + if (config->device_type == hwaccel_device_type) + return c; + } + } + } + return avcodec_find_decoder(st->codecpar->codec_id); + } } static int guess_input_channel_layout(InputStream *ist) @@ -1003,7 +1026,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic) ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE; } - ist->dec = choose_decoder(o, ic, st); + ist->dec = choose_decoder(o, ic, st, ist->hwaccel_id, ist->hwaccel_device_type); ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec); ist->reinit_filters = -1; @@ -1309,7 +1332,7 @@ static int open_input_file(OptionsContext *o, const char *filename) /* apply forced codec ids */ for (i = 0; i < ic->nb_streams; i++) - choose_decoder(o, ic, ic->streams[i]); + choose_decoder(o, ic, ic->streams[i], HWACCEL_NONE, AV_HWDEVICE_TYPE_NONE); if (find_stream_info) { AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);