From patchwork Fri Jul 27 14:57:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 9816 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp896646jad; Fri, 27 Jul 2018 07:59:07 -0700 (PDT) X-Google-Smtp-Source: AAOMgpefU6vMAIBdf0z+NIS8b+87Yn7yYi1pbF75Zf+c09/EBzPAzyPxbInnvGMDxbxTiK1faA7D X-Received: by 2002:a1c:91c7:: with SMTP id t190-v6mr4710158wmd.2.1532703547357; Fri, 27 Jul 2018 07:59:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532703547; cv=none; d=google.com; s=arc-20160816; b=SIEgQHkhwLw31w7GnSK2Z9nkvaqdsiA6hi0Xqvn88qf4nhhtfMNXIMoR6s9hcMAvID tWYr2TsqgaijNEmUwc3ZF16YNuC9f44BPuPzmH9/PZ9f+UKgRyakeglnYjjOaYsGpYK3 POKEzcCZBfh+nPE/BeQawMRDiP1/NM3f4coqC+7NkyJTXxN3kYl3JBKvLhMOM4OwUjyO IywBQWsKTi8+ZaMgjq6o+92mEqf+W0E00cp6g4vrzq24WVvBeCjAZvQG8v/oaFQIvSxI mo37+JdtGY345o1sxLZV4jmGj0XxZ6r9sHZLA/ycdbxmoHDFaNuC0xlV+kuTE6Aiv7ic mLog== 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=vcFG7I9Jrv9xkNpYNyQ/72OQ/wcrE9kuTxqFv4myjqo=; b=VkbCRhCaS2gLGrXb2vD9+dvp0v+dDMqIMPoqWNNsv+8UxeNaQQSQDeregbehrpAZWZ 8ghjAlKT2Hij4UG7H6T6wjtHDBj4SXwqV6ipcXv6Gk1W1ishLpwsxbPeqHr/CduSbpaa P4dAYoIJT2qYJnYS9y2MjnMww8APE2N/fHhT+iOCkWAca+Dlcn058hPjk1Cl9rwALTDb kr5PCK7EgyjQRRfCGFwMDyv5MGuG7URcDOQ2qxSXcQGPYkc/Gm4SocphbXqkh8aBAel/ ZFUgrK4uZuJAaLvVYDl0Vy3WPXq7PpCVLKMNN9v7tl7vP4bdJkSLPZnf1v0JOetT+uSo yyzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=JiEyVsuN; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 5-v6si3616790wre.304.2018.07.27.07.59.06; Fri, 27 Jul 2018 07:59:07 -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=@gmail.com header.s=20161025 header.b=JiEyVsuN; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CB06F68A646; Fri, 27 Jul 2018 17:58:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f170.google.com (mail-qk0-f170.google.com [209.85.220.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 199BE68A63E for ; Fri, 27 Jul 2018 17:58:00 +0300 (EEST) Received: by mail-qk0-f170.google.com with SMTP id v17-v6so3428807qkb.11 for ; Fri, 27 Jul 2018 07:58:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=uuiLdNHbS5bivOzpzbVs5HyleUBGKakeAaviTvMH5gk=; b=JiEyVsuNmHzCviuYYQzBKhbjrd4SNboGYPIR33q3sDU8TGTiG8GlwUs80uLEQExMFV K7zxUgexfM3YO3mcJQ6yLM7cZcmuSM4lBGK6PKo2kzSaz27RSQ0Ex3rsq0FkhiVEpz4m nn6fKWyjAoMiHENB4vK1MxKngw3W4Xvd/9vpChMlMVaX4FKbArIP0JwC3AuLhwp53v8+ kSnvbrStR1I6qNpb4g6tn6l3k8LyDqmcHTTUwG9OlZx1rk0pL/LC7xIbCAe91EigJOJw m9ynwlNqU1AlRhqwIKFWXdgiS8EHg1uwhqwQA60+6Sj9vsiHZM5HKYJBf8fPV6Ln40HW O94A== 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=uuiLdNHbS5bivOzpzbVs5HyleUBGKakeAaviTvMH5gk=; b=XspsUunm61i0sMY1lCXdh6+Uj5/IKkBhv11QkpRxadqjkgngfmLQlrHe9FyNaQkZpk JXY38lDhMJi0Y/AIwLEpa3DOzDOz3NkvHQ7pUKUAXXAGLyqLa/45omjbuQzyk+lM2QZz +SfR74VhO5NjKmIeLaNlZSYbJEl0KStB4YWKy7bj/JUSRZFoeDueC9GZ3OcgkZJOYp1+ K4IKnbwY2kPFhlG6sHbq/g3GpyUCui+7zYa8JpM4158G/FHxgymlJoEvjAcnhLjKRRUT 59B8wJoSCrAdF7YEt39SZsSqPw2vSlJxPnuIMOrAI+s7aMZ6+LDkTfYFhnzFQgeKJrn2 jZ6A== X-Gm-Message-State: AOUpUlHx2k+jL22ZWanxJsR19friijLaM/cBPaDmjJbmR1G/nrHKGtGD LjfHeZUFOfZkX4jYSbtk2qKPh4GR X-Received: by 2002:a37:d60f:: with SMTP id t15-v6mr6334346qki.316.1532703494225; Fri, 27 Jul 2018 07:58:14 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id f63-v6sm2951731qtb.64.2018.07.27.07.58.13 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Jul 2018 07:58:13 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 27 Jul 2018 11:57:48 -0300 Message-Id: <20180727145749.9436-7-jamrial@gmail.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180727145749.9436-1-jamrial@gmail.com> References: <20180727145749.9436-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 7/8] avcodec/decode: flush the internal bsfs instead of constantly reinitalizing them 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" Initialize the bsfs once when opening the codec and uninitialize them once when closing it, instead of at every codec flush/seek. Signed-off-by: James Almer --- I think i didn't miss any bsf with internal state that needs a flush() callback, but an extra pair of eyes (or more) to make sure would come in handy. In any case, the only bsfs where this matters are those used during decoding, which essentially means those autoinserted by decoders given that the ffmpeg cli doesn't allow -bsf as an input option. But you can't know what an API user may do, so better get them all right. libavcodec/decode.c | 20 ++++++++++---------- libavcodec/decode.h | 2 ++ libavcodec/utils.c | 5 +++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/libavcodec/decode.c b/libavcodec/decode.c index db364ca700..2e82f6b506 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -182,7 +182,7 @@ static int unrefcount_frame(AVCodecInternal *avci, AVFrame *frame) return 0; } -static int bsfs_init(AVCodecContext *avctx) +int ff_decode_bsfs_init(AVCodecContext *avctx) { AVCodecInternal *avci = avctx->internal; DecodeFilterContext *s = &avci->filter; @@ -688,10 +688,6 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke if (avpkt && !avpkt->size && avpkt->data) return AVERROR(EINVAL); - ret = bsfs_init(avctx); - if (ret < 0) - return ret; - av_packet_unref(avci->buffer_pkt); if (avpkt && (avpkt->data || avpkt->side_data_elems)) { ret = av_packet_ref(avci->buffer_pkt, avpkt); @@ -751,10 +747,6 @@ int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) return AVERROR(EINVAL); - ret = bsfs_init(avctx); - if (ret < 0) - return ret; - if (avci->buffer_frame->buf[0]) { av_frame_move_ref(frame, avci->buffer_frame); } else { @@ -1978,6 +1970,14 @@ int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame) return ret; } +static void bsfs_flush(AVCodecContext *avctx) +{ + DecodeFilterContext *s = &avctx->internal->filter; + + for (int i = 0; i < s->nb_bsfs; i++) + av_bsf_flush(s->bsfs[i]); +} + void avcodec_flush_buffers(AVCodecContext *avctx) { avctx->internal->draining = 0; @@ -1998,7 +1998,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx) avctx->pts_correction_last_pts = avctx->pts_correction_last_dts = INT64_MIN; - ff_decode_bsfs_uninit(avctx); + bsfs_flush(avctx); if (!avctx->refcounted_frames) av_frame_unref(avctx->internal->to_free); diff --git a/libavcodec/decode.h b/libavcodec/decode.h index 15271c529a..c3e0e82f4c 100644 --- a/libavcodec/decode.h +++ b/libavcodec/decode.h @@ -64,6 +64,8 @@ typedef struct FrameDecodeData { */ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt); +int ff_decode_bsfs_init(AVCodecContext *avctx); + void ff_decode_bsfs_uninit(AVCodecContext *avctx); /** diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 4f9a2b76ef..d95a4fe71c 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -994,6 +994,10 @@ FF_ENABLE_DEPRECATION_WARNINGS if (avctx->framerate.num > 0 && avctx->framerate.den > 0) avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1})); #endif + + ret = ff_decode_bsfs_init(avctx); + if (ret < 0) + goto free_and_end; } if (codec->priv_data_size > 0 && avctx->priv_data && codec->priv_class) { av_assert0(*(const AVClass **)avctx->priv_data == codec->priv_class); @@ -1032,6 +1036,7 @@ FF_ENABLE_DEPRECATION_WARNINGS av_packet_free(&avctx->internal->last_pkt_props); av_packet_free(&avctx->internal->ds.in_pkt); + ff_decode_bsfs_uninit(avctx); av_freep(&avctx->internal->pool); }