From patchwork Sun Jan 9 19:18:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 33167 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2150730iog; Sun, 9 Jan 2022 11:19:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJzrOa8BFYxQ6l4pyClircZ/h5s7S243x9P0JJotHx9MYYNbptgJrZL8L94RL1NTvPXTRMsf X-Received: by 2002:a17:906:86cb:: with SMTP id j11mr13398971ejy.40.1641755973070; Sun, 09 Jan 2022 11:19:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641755973; cv=none; d=google.com; s=arc-20160816; b=hOGDIk/xOeQvrep7U++/r7JMBa3Xe9Dh+9L89K2bW71UMIxFf+QrZXYRC2bBHV8OlC lGtiYVBH/X+eF/H+GOlGTZETzVPjVVcPdvwiFBbFARUUE1aN+DqI4txMyf2ivpoqTPT5 R6kd8fFgdesJDjaaOo7LajacmuDBpu5Zdf7bATb5GO5vFGt843YHY4zN91KUWklkVzMA LxsT/4EUS6K0MrDIDMUhi9x4lr8ciOPrLx1rIejLzEg5LYWbIjg+Zzq4WgBYArAwaJAy aySdd/VvwknG/7V2m2QeIwjTbsdabcKKDa1hPNvKf3vjBTWS5yVj3+pcYFU4pgNAe1Ym 03aw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=kW5tOWIPhXnBuZWtszgSix8vDqafXhKUbTsqzlMx8I0=; b=VECQAl6lQfIkZExam+Gm+AvL9HNt8V0UGXuS8r56cz+GsITHqLpDx2/kJKiGJNAZDC bsJlag4OxX4FXbSKbgUp4lmwb2YFTIJ384NubiOVepKkjtxyNCK29lp4lb6JbU8KHylz EUfB/03OCj+LyisaWbcXqxPyW4kEABPUXgDAPKWbvqIawcELK5nraa5s/UTWSZDvR0Pn TY01SLwy1p/l0epysQYoPh05ixH+KIsjs63rce6zFg0NyNv3t2A5BmZE6DTewKxIzHKc Jfl3LugSxpFUe4KsJB+gTkrwoX+6e6lxGrhJrsV0ykLNBGU0ozwBAYDLncd+WWdUNjJp aZ2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=c6MGzpr0; 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 i38si1258032eda.199.2022.01.09.11.19.24; Sun, 09 Jan 2022 11:19:33 -0800 (PST) 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=20210112 header.b=c6MGzpr0; 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 2731968AB9D; Sun, 9 Jan 2022 21:19:21 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EC25C68A16A for ; Sun, 9 Jan 2022 21:19:13 +0200 (EET) Received: by mail-vk1-f172.google.com with SMTP id 191so2250253vkc.1 for ; Sun, 09 Jan 2022 11:19:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=dtJ3IIQppCGTbdxuKHLlpNoJrg7tb2q0ttqGTmEqzb0=; b=c6MGzpr03hTy4sbpskPnmWZX18gpYSQ+OHyLDanDTuLIsBLRVE31seGyTCn5aSvzra NqinMB9wypLT+HhVlC47vw2qea3EvuC6XhphGSpPpBjpNmio4BvKx67mN9SLanhTSgWC i2+GbNs+4/p891YzlBP4gvuH9p6KO8tkz+HEpna8mYMgIuP+DWK1SaNHSnqvqdl+icYp stTf28+4BzEIuXi6qMPfHOOqc8FdkHxE6hg0PFKk1HQJkSSiGJrnQAVflUXiNQiHGiLC kyXo4TSp79oWSAZpSsR4nDd6VMfWkEINFtvqNvkrbvHwRVhqEGlEx+LHESB0hXGl2QXb CI1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=dtJ3IIQppCGTbdxuKHLlpNoJrg7tb2q0ttqGTmEqzb0=; b=SE80gdb1gzlgcIvl64M50DGcNtKjk87q166C0vU6/Gt851U5w2lfA+UFPjCANeVY5n erlAo93igwPrnzS0ATWKuEAdAT8vjiGmVjJE5vnC3Ko2uH9nMn/bOi1e/LiA5gPdbDMh OR3kIoLw2Trq3zLkGJHqowl8MAwdiyKwk4iB6UOyTy4aSCM/gQz0zN5BaNNhSpJ29Clw Cteu5tLVntfTr6j2xQf5ZtJyl2bAXYLsc6lD2qOObFdtw5HqRGtuYYdlohnrx/jKHkh/ HZKbuezg+q/V2mnueS0DCbM28TfjgUALPdiL2EUWZpQWg7j/OPA1pklXiPD2XQMnrmeS kbyA== X-Gm-Message-State: AOAM530QxhsdaVbnD8czlfdXIIyhLvWd1PIF8BxPx3KcAlQe6yAQrceO VLlSqRkWi03n39C3D/C5dsrgqFR1vds= X-Received: by 2002:a05:6122:ca1:: with SMTP id ba33mr26317701vkb.14.1641755951702; Sun, 09 Jan 2022 11:19:11 -0800 (PST) Received: from localhost.localdomain ([186.136.131.95]) by smtp.gmail.com with ESMTPSA id u7sm2592709vkf.12.2022.01.09.11.19.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Jan 2022 11:19:11 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 9 Jan 2022 16:18:55 -0300 Message-Id: <20220109191855.2106-1-jamrial@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avcodec/av1dec: honor the requested skip_frame level 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: L5cKMr/ym45w This supports dropping non-intra, non-key, or all frames. Signed-off-by: James Almer --- Now dropping the frames without decoding them. Untested with actual hardware. libavcodec/av1dec.c | 68 ++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 09df2bf421..62d459cded 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -585,16 +585,19 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s { int ret; - ret = ff_thread_ref_frame(&dst->tf, &src->tf); + ret = av_buffer_replace(&dst->header_ref, src->header_ref); if (ret < 0) return ret; - dst->header_ref = av_buffer_ref(src->header_ref); - if (!dst->header_ref) - goto fail; - dst->raw_frame_header = src->raw_frame_header; + if (!src->tf.f->buf[0]) + return 0; + + ret = ff_thread_ref_frame(&dst->tf, &src->tf); + if (ret < 0) + goto fail; + if (src->hwaccel_picture_private) { dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf); if (!dst->hwaccel_priv_buf) @@ -800,12 +803,6 @@ static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f) return ret; } - f->header_ref = av_buffer_ref(s->header_ref); - if (!f->header_ref) - return AVERROR(ENOMEM); - - f->raw_frame_header = s->raw_frame_header; - if ((ret = ff_thread_get_buffer(avctx, &f->tf, AV_GET_BUFFER_FLAG_REF)) < 0) goto fail; @@ -945,8 +942,7 @@ static int update_reference_list(AVCodecContext *avctx) for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) { if (header->refresh_frame_flags & (1 << i)) { - if (s->ref[i].tf.f->buf[0]) - av1_frame_unref(avctx, &s->ref[i]); + av1_frame_unref(avctx, &s->ref[i]); if ((ret = av1_frame_ref(avctx, &s->ref[i], &s->cur_frame)) < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to update frame %d in reference list\n", i); @@ -962,19 +958,32 @@ static int get_current_frame(AVCodecContext *avctx) AV1DecContext *s = avctx->priv_data; int ret; - if (s->cur_frame.tf.f->buf[0]) - av1_frame_unref(avctx, &s->cur_frame); + av1_frame_unref(avctx, &s->cur_frame); - ret = av1_frame_alloc(avctx, &s->cur_frame); + s->cur_frame.header_ref = av_buffer_ref(s->header_ref); + if (!s->cur_frame.header_ref) + return AVERROR(ENOMEM); + + s->cur_frame.raw_frame_header = s->raw_frame_header; + + ret = init_tile_data(s); if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, - "Failed to allocate space for current frame.\n"); + av_log(avctx, AV_LOG_ERROR, "Failed to init tile data.\n"); return ret; } - ret = init_tile_data(s); + if ((avctx->skip_frame >= AVDISCARD_NONINTRA && + (s->raw_frame_header->frame_type != AV1_FRAME_KEY && + s->raw_frame_header->frame_type != AV1_FRAME_INTRA_ONLY)) || + (avctx->skip_frame >= AVDISCARD_NONKEY && + s->raw_frame_header->frame_type != AV1_FRAME_KEY) || + avctx->skip_frame >= AVDISCARD_ALL) + return 0; + + ret = av1_frame_alloc(avctx, &s->cur_frame); if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "Failed to init tile data.\n"); + av_log(avctx, AV_LOG_ERROR, + "Failed to allocate space for current frame.\n"); return ret; } @@ -1077,8 +1086,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, s->raw_frame_header = &obu->obu.frame_header; if (s->raw_frame_header->show_existing_frame) { - if (s->cur_frame.tf.f->buf[0]) - av1_frame_unref(avctx, &s->cur_frame); + av1_frame_unref(avctx, &s->cur_frame); ret = av1_frame_ref(avctx, &s->cur_frame, &s->ref[s->raw_frame_header->frame_to_show_map_idx]); @@ -1093,9 +1101,11 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, goto end; } - ret = set_output_frame(avctx, frame, pkt, got_frame); - if (ret < 0) - av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n"); + if (s->cur_frame.tf.f->buf[0]) { + ret = set_output_frame(avctx, frame, pkt, got_frame); + if (ret < 0) + av_log(avctx, AV_LOG_ERROR, "Set output frame error.\n"); + } s->raw_frame_header = NULL; @@ -1111,7 +1121,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, s->cur_frame.spatial_id = header->spatial_id; s->cur_frame.temporal_id = header->temporal_id; - if (avctx->hwaccel) { + if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { ret = avctx->hwaccel->start_frame(avctx, unit->data, unit->data_size); if (ret < 0) { @@ -1138,7 +1148,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, if (ret < 0) goto end; - if (avctx->hwaccel) { + if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { ret = avctx->hwaccel->decode_slice(avctx, raw_tile_group->tile_data.data, raw_tile_group->tile_data.data_size); @@ -1161,7 +1171,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, } if (raw_tile_group && (s->tile_num == raw_tile_group->tg_end + 1)) { - if (avctx->hwaccel) { + if (avctx->hwaccel && s->cur_frame.tf.f->buf[0]) { ret = avctx->hwaccel->end_frame(avctx); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "HW accel end frame fail.\n"); @@ -1175,7 +1185,7 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, goto end; } - if (s->raw_frame_header->show_frame) { + if (s->raw_frame_header->show_frame && s->cur_frame.tf.f->buf[0]) { ret = set_output_frame(avctx, frame, pkt, got_frame); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Set output frame error\n");