From patchwork Tue Feb 20 22:33:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 46401 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:dda5:b0:19e:cdac:8cce with SMTP id kw37csp2150042pzb; Tue, 20 Feb 2024 14:33:50 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCVXa8YuhEhVvdbAMzOdLXJEXDPtBwsLy4igbNEXH92qt1J4DTktJtzi70ULVQjC67sF+V7pHGnDAxpei24HC6Cna+GPAISTAHiXDg== X-Google-Smtp-Source: AGHT+IGa0mzCym7UOM9fyL2EPccCs263KjZNvN13MGcsG9Kit7YXDEjGkB9Ge4crtjBOFd9Xd03T X-Received: by 2002:a17:906:538f:b0:a3f:161b:cc13 with SMTP id g15-20020a170906538f00b00a3f161bcc13mr1371894ejo.7.1708468429814; Tue, 20 Feb 2024 14:33:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1708468429; cv=none; d=google.com; s=arc-20160816; b=XkU+8n/AlSEDzHsfygz2rGnZmw33ArU8YK86HfkoMs8MgR4exWpOLrCdmDU61edmwT SVsx5WhxC6kSeXk3Tym/RtUrnqtoN7pHSvAyj4bfd9aGVoGLC2iJt+UTTMEmn+8Lx2Gh 77ohpOE8BB5nRdIbY5I92nZBOjOSH+GtG3ss1L6ReREQx9fdaW3vFN+wJQ2c1JzWcKHD Duk28jrcVkbBa6cUaes4EiX7DIhfe8S2m6Va2G8vh4GLx4MfXuLxobpDWeGgHQENAnkS jVPovTNXee+fbCJkqUxM4phkR6Pucp/lQaXHE1gQwdaogibhIk0QGV0M0QrYttTFJmDS 4VbA== 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=65RvW2tCwOIT8l3nHxolWpxhFn+XWEl0FHxFidXKbhk=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=m6fsVqHikwgVDWjzQ9+Wy7iCQYFd1Y0I1k8Cp6KeReyPBE0S6ZXX6XGNVYFbOqzW87 JahVrc6nyIHH3AGuuuCacn8ssIUyLBLCBh5giYlzKLxQszrzXDWo7NLRowbzw+sico/g YIEXJmLiv+6rYgR0neUoy0vKz0/gl21sYcJHcZ8HXQ5ujm9EMR5srN/Wkmu8JVW7agYf zluY6CTLky6xOFVEVfWd/FrrBPLE9C9WM1ZEQ85NNeFno83lx543GnlQT/zTJVCUplaL mHq2EAvNGJBpy93hombNPFRSQz26N8+PIfSKyykyB55nj+mZO+dbbJp/7WIovuhCjgDt Dh/A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=Sxi7QqW0; 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 gs18-20020a1709072d1200b00a3e819b857csi2696017ejc.82.2024.02.20.14.33.49; Tue, 20 Feb 2024 14:33:49 -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=20230601 header.b=Sxi7QqW0; 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 3FEE668D12E; Wed, 21 Feb 2024 00:33:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0244768CBAD for ; Wed, 21 Feb 2024 00:33:38 +0200 (EET) Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-6e46dcd8feaso1433708b3a.2 for ; Tue, 20 Feb 2024 14:33:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708468416; x=1709073216; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=+slv3+O+oFKMsigAqLN1QFs72lTIaO4Ejct8iMnMQxo=; b=Sxi7QqW0icjArF6g/QbNF6nExJfYANgSPqnJE2SJqyXaFKN7UeN94ZfYeXpjMNm8Js rY0X1ew8dPfI4jQ8hgYrM+W7fW2jco92SeYOD+WMo9izHACRZkDf/DXglJztwXp1g9OX Kt7zC7pex85SReg/9NchUBGeZE0+xNBb6BLxlwKWUbKVR04tvTYc9Sp/KVYUN/6rEJ2H fv5jgF5mRq5J1SPLCsXsjIJditR4GZrwwghwdjJNNkZFQPEpVEOlt7QOxdhjP42e2KsY Rf59Bf9SO4fMB+3P4CGcM5iFAS+ilRuaAzmO/EyFpzl6TUxKtAqomF2vjdX/oWFfEqKY 9SJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708468416; x=1709073216; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+slv3+O+oFKMsigAqLN1QFs72lTIaO4Ejct8iMnMQxo=; b=LcT3qrhUmIzhwT0caGOkhRF7kmUBJQwFy8+ehsRZO78U59Zf+tZd2gW8YUoUrU99Md 8jJ78igusVNTcMjNJ2sTrPapax9ziUuDrLy3K/P+rSuu8Vi4ggnKGESdgJbYn8iTQ0mK BRlE05zRXBNmbIMttObghd3LUio33RcmVxsS1tWVK5uYob5jwCw6IsO8XAdeE23zwDzL k/e6/IevA2VWC4Z8ANLKuoG1SXx/ld1rD+zWtjyOwj9eWlQUs4sckXlcseEBDwTkqXWr YgG+wZ8FTr5lyY1UUBDvjAT0pNNMA25s1OWAbpygK/Y2X7BPXYrnOcGHusl3OwsGqlo1 izKw== X-Gm-Message-State: AOJu0YwV3aPYEZZRha06m5T1czOJbAl5so9qxxznQjsGcHcp3UkZPwAT 8GihQGdeZRlqiQGogNA6Kn5Ox7ceIM8PPL2H1/Hp0/xwnpSdBFjEAZ9yMD6C X-Received: by 2002:a05:6a00:800b:b0:6e4:76d5:410a with SMTP id eg11-20020a056a00800b00b006e476d5410amr5130402pfb.18.1708468415889; Tue, 20 Feb 2024 14:33:35 -0800 (PST) Received: from localhost.localdomain ([190.194.169.124]) by smtp.gmail.com with ESMTPSA id 8-20020a630c48000000b005dc36761ad1sm7176386pgm.33.2024.02.20.14.33.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Feb 2024 14:33:35 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Feb 2024 19:33:23 -0300 Message-ID: <20240220223323.4165-1-jamrial@gmail.com> X-Mailer: git-send-email 2.43.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/av1dec: implement FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM 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: tZBq33bf1fNJ Fixes errors when opening streams with no extradata (like those from raw OBU sources). It also calls get_format() on new Sequence Headers when required. Signed-off-by: James Almer --- libavcodec/av1dec.c | 58 +++++++++++++++++++++++++++++---------------- libavcodec/av1dec.h | 2 ++ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 7debc4deda..48a3af2fca 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -620,6 +620,12 @@ static int get_pixel_format(AVCodecContext *avctx) *fmtp++ = pix_fmt; *fmtp = AV_PIX_FMT_NONE; + for (int i = 0; pix_fmts[i] != pix_fmt; i++) + if (pix_fmts[i] == avctx->pix_fmt) { + s->pix_fmt = pix_fmt; + return 1; + } + ret = ff_get_format(avctx, pix_fmts); /** @@ -715,6 +721,7 @@ static av_cold int av1_decode_free(AVCodecContext *avctx) av1_frame_unref(&s->cur_frame); av_frame_free(&s->cur_frame.f); } + av_buffer_unref(&s->seq_data_ref); ff_refstruct_unref(&s->seq_ref); ff_refstruct_unref(&s->header_ref); ff_refstruct_unref(&s->cll_ref); @@ -771,6 +778,9 @@ static int set_context_with_sequence(AVCodecContext *avctx, seq->timing_info.num_units_in_display_tick, seq->timing_info.time_scale); + if (avctx->pix_fmt == AV_PIX_FMT_NONE) + avctx->pix_fmt = get_sw_pixel_format(avctx, seq); + return 0; } @@ -869,8 +879,6 @@ static av_cold int av1_decode_init(AVCodecContext *avctx) goto end; } - avctx->pix_fmt = get_sw_pixel_format(avctx, seq); - end: ff_cbs_fragment_reset(&s->current_obu); } @@ -1174,6 +1182,23 @@ static int get_current_frame(AVCodecContext *avctx) avctx->skip_frame >= AVDISCARD_ALL) return 0; + if (s->pix_fmt == AV_PIX_FMT_NONE) { + ret = get_pixel_format(avctx); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to get pixel format.\n"); + return ret; + } + + if (!ret && FF_HW_HAS_CB(avctx, decode_params)) { + ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER, + s->seq_data_ref->data, s->seq_data_ref->size); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n"); + return ret; + } + } + } + ret = av1_frame_alloc(avctx, &s->cur_frame); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, @@ -1208,6 +1233,12 @@ static int av1_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) switch (unit->type) { case AV1_OBU_SEQUENCE_HEADER: + ret = av_buffer_replace(&s->seq_data_ref, unit->data_ref); + if (ret < 0) + goto end; + + s->seq_data_ref->data = unit->data; + s->seq_data_ref->size = unit->data_size; ff_refstruct_replace(&s->seq_ref, unit->content_ref); s->raw_seq = &obu->obu.sequence_header; @@ -1221,25 +1252,8 @@ static int av1_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) s->operating_point_idc = s->raw_seq->operating_point_idc[s->operating_point]; - if (s->pix_fmt == AV_PIX_FMT_NONE) { - ret = get_pixel_format(avctx); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, - "Failed to get pixel format.\n"); - s->raw_seq = NULL; - goto end; - } - } + s->pix_fmt = AV_PIX_FMT_NONE; - if (FF_HW_HAS_CB(avctx, decode_params)) { - ret = FF_HW_CALL(avctx, decode_params, unit->type, - unit->data, unit->data_size); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n"); - s->raw_seq = NULL; - goto end; - } - } break; case AV1_OBU_REDUNDANT_FRAME_HEADER: if (s->raw_frame_header) @@ -1416,6 +1430,8 @@ end: ff_cbs_fragment_reset(&s->current_obu); s->nb_unit = 0; } + if (!ret && !frame->buf[0]) + ret = AVERROR(EAGAIN); return ret; } @@ -1500,7 +1516,7 @@ const FFCodec ff_av1_decoder = { .close = av1_decode_free, FF_CODEC_RECEIVE_FRAME_CB(av1_receive_frame), .p.capabilities = AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, .flush = av1_decode_flush, .p.profiles = NULL_IF_CONFIG_SMALL(ff_av1_profiles), .p.priv_class = &av1_class, diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index b6a0c08e48..a6ad80c12a 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -23,6 +23,7 @@ #include +#include "libavutil/buffer.h" #include "libavutil/fifo.h" #include "libavutil/frame.h" #include "libavutil/pixfmt.h" @@ -69,6 +70,7 @@ typedef struct AV1DecContext { CodedBitstreamFragment current_obu; AVPacket *pkt; + AVBufferRef *seq_data_ref; AV1RawOBU *seq_ref; ///< RefStruct reference backing raw_seq AV1RawSequenceHeader *raw_seq; AV1RawOBU *header_ref; ///< RefStruct reference backing raw_frame_header