From patchwork Mon Jul 25 04:30:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 36951 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp1819658pzb; Sun, 24 Jul 2022 21:31:24 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vcMMSRrS+v4LJtV7Mj0X7kgcorxIeOt5JyneH3Nmkki5D+q5QD9SJf/U+XKGrEJjHhWxdN X-Received: by 2002:a05:6402:5489:b0:43b:b935:db37 with SMTP id fg9-20020a056402548900b0043bb935db37mr11388506edb.347.1658723484622; Sun, 24 Jul 2022 21:31:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658723484; cv=none; d=google.com; s=arc-20160816; b=gnF78BZhJ1lXxd7VnTiilbaxPqs3ifs9EGbgMZnjzvp2qtgCl9ohpFDUeDifOouR1B +UK4yRBg4XLMnVCcN9Pyj/PQkFoB5woAUviT9v/F+ohWDptAyGiEZ3V0Npnp+Yo/lePW n25um7tzWSE1CCj4rXRYUEY/H/ntOlNRtxmFvhckQPjp9Xn5hRMi5Gs1JI7h1Sji8wv0 xLekgMFE56yw+b98EmwyUGcA2i7Fngkv+7xWifR+2Po90+ZVxvaFJ+HzJ+RLweqSsVMt PMLljWxD8PKIie+98gGP/2fHr44/yHxHyFYmDRmRDLvsse3qJyW8sP0aM67Mhuoi0XLV i3Yg== 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=xm/983/QRmmpGysy5M+WdESIhN6w3rOGi9cSkozdXRM=; b=Y1arCwU+eD/wqk5nkZzCxNwjQS7LuFaSDI7LS8mTsAdbBQZcsTHZ9XJadX38z2n8br z1qUH2/HFTODDO7/EjE9ozFIIQaO7o/v9q8xnw3b/SRuhFbH2bpOSC76WEIYwfKWWHXX slK7z4mxyoasInOMG6k0G7G0pK0Yl682246Ohq33p/1oOo9ePdRh3uaSom6D4vixsExV WXss8E8dotZGpA3NAKUYuMcVPPPpRfU6x73ZhrjdBmpXnfvOYXFj6EfKXw6mgwPvjmfk A4HMgtlXXw37EO+9mpVQgxiHRUT2vQ/E0XFQ057D4NwfaTjxHRe8STMxMNUEUpjln/K0 4JhQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=i3v6NWDU; 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 hs11-20020a1709073e8b00b0072f664f368asi13262108ejc.199.2022.07.24.21.31.23; Sun, 24 Jul 2022 21:31:24 -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=i3v6NWDU; 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 E211868B559; Mon, 25 Jul 2022 07:31:20 +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 3DDBD68B559 for ; Mon, 25 Jul 2022 07:31:13 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1658723479; x=1690259479; h=from:to:cc:subject:date:message-id; bh=mRY8mUswz1EJ0L6ynCj/cCR/bRsx1Aj2ABzUwClKdfI=; b=i3v6NWDU/Dmdo9++VW/N316NfbgZZ5l7PE2vz4vdouRU/wCgEJOnN/R/ 86weZtDqxt464ou8AJ9FhmMsxTCUEBcD5Y8NJW8eW8VFlpNRzyrkykcLR 6HkEN5WCgUmJ7ruOvCGq2Dgj/ua9t+G9q6TxletkIZOnYyeC/etcxs0us 4JbMUQUcipcFAFUldI8TMILtoMk9fquWzb5KHe5XlgAqYyBdd6eqI6tbb 0L+h9auLeBLMKkAcn1STPRbT1A2DdH3gCDO+IY1gKna/DaJ3az+ZYcqv5 nDENc79EaHSrhIA8C3hBuR5rYl9k4Fu3Y6kUahhAU55Lck3fVT/RruETf Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10418"; a="286366644" X-IronPort-AV: E=Sophos;i="5.93,191,1654585200"; d="scan'208";a="286366644" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jul 2022 21:31:12 -0700 X-IronPort-AV: E=Sophos;i="5.93,191,1654585200"; d="scan'208";a="574889874" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jul 2022 21:31:10 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Mon, 25 Jul 2022 12:30:50 +0800 Message-Id: <20220725043051.9692-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v3 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: AzivmzIkXtoL 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 8ac73c0efc..2771c5d993 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -905,72 +905,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); @@ -1036,6 +971,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: