From patchwork Mon Sep 23 15:01:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 51755 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d154:0:b0:48e:c0f8:d0de with SMTP id bt20csp2516780vqb; Mon, 23 Sep 2024 08:02:18 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVE6+a1i7VMsk1GB/KsaFFa+7jlmm3OEn8Ss6L03cBd/vdiivMMABqWvXKQ7Diiu/OYal/uOGCJs0xa/92sTr9D@gmail.com X-Google-Smtp-Source: AGHT+IFYJK9LLxnD5MBLqys96V1wNk7+vXb9bOajCJDvgitgX9nP+MK2qW/q4folApQZDos6lp44 X-Received: by 2002:a17:907:1ca0:b0:a90:17fc:3f60 with SMTP id a640c23a62f3a-a90d5052578mr477685466b.8.1727103738140; Mon, 23 Sep 2024 08:02:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727103738; cv=none; d=google.com; s=arc-20240605; b=aOP7NSh2tgjGzfjRZyb2TIPGL6R6VmgTHGb5Fi2Grqta8Q9NSJlhO6f9k1SFTM10k6 0tNVwrGRHhyjXjP0rmSGhu3MXix4qp2YJWNuQC+ePhO8jGJPYSYD84rhPYn+Y7WAtpPY dmAytDv4aNSXeKAvNvfuR6ZFtUL1Q0MZoS0JI9YKIjbjpdl32v+Fu3RCj5WWmO0JMT/E LdEbKoUa2B046I+41eWgvx2Qh4amK9i4oJXLPsKwVQbS1zfV0KAPW8+a4C2nF/v6u6iB rvROsdkzI00w1nGLdPdjRlrRtLqvnXGhvhRmI0JlPMPHkzNfqwdVZYhFjTkLXE3zv5Gj iBaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; 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:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=klWONip6+pEA73In7g8NtYynYCKbUx3r2TKZ038SMrw=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=EwwToq2dIhR3PD33AQB5rqYx6iMF/OI6fPK59qh4RD/rBtpv4oulrnrXJNj2aFiVRK 7LHSRcAeSNzW4h/Rt+A74En3bYh9yVA83cZSakfsdrvkPc2jYi5cylHUWAm7+O/tEFe5 LZ/dLfgOUJRDPBzg9rQqnEjXn5T1/oOvf/LvYEmXAl0yqkD4h+R8aDSzXJMCn/Qvk7d3 DnMpF//UzZGUvzKeVN6U2dSyj4olvi68H3eeckoF4QxXrCjKRKN5bPoEVzcIpNyvb2y0 bmNsbcNPwYd76NTDPzpKurQyhAuhnB9odTEa39qBz29lxePNcjzXqIeu3BIRjO3jICLW qEIQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b="Cj6Q/G0C"; 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 a640c23a62f3a-a90613879c6si1413306566b.1037.2024.09.23.08.02.17; Mon, 23 Sep 2024 08:02:18 -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=@khirnov.net header.s=mail header.b="Cj6Q/G0C"; 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 9763A68DC28; Mon, 23 Sep 2024 18:02:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 80FEE68D841 for ; Mon, 23 Sep 2024 18:02:06 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=Cj6Q/G0C; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id AFDDA4E08 for ; Mon, 23 Sep 2024 17:02:05 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id Sp068QtOJUkx for ; Mon, 23 Sep 2024 17:02:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1727103724; bh=NLoZvY3Lqnk5RWsHskV1b5srnt5R/7+3cKYnGmUzDaU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Cj6Q/G0C8KfGTVPjAkIbZiZGelnVMlBWGuDJvydJYPADc1T5yu5GoFV7+ipoZ5vnE /u26zXtWw4pN9QWbJ4RH2qHFPLW6+kRxznb1obAbShcMNYUx2loGjDuynW8vezXku9 1Rn10OVS3hAyJY47i4xu+ROgDZ3XqyXGIhAOesq6Krn3IuIJjpTa+qeZa+gXB2cWju F02enrloXVawGP5zjnrjqh2HuioYoMAtI+eg6Svw636wP1QOzDr7OIoq/t7vjNjWrR uz0vxEhwDZvq1+x/iSyMoq/bcd+5sq6rjjSszX5mfEclJstCT0sVSmBgCx4CguObtw Lm8VQoDQYYWbg== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 5D4CD4DD7 for ; Mon, 23 Sep 2024 17:02:04 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 3CF213A086F for ; Mon, 23 Sep 2024 17:02:04 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Sep 2024 17:01:40 +0200 Message-ID: <20240923150146.31693-2-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240923150146.31693-1-anton@khirnov.net> References: <20240923150146.31693-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/7] lavfi/buffersink: add a flag for retrieving stream parameters 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: f+EdVe7j1yQv This way, av_buffersink_get_frame_flags() can replace almost all av_buffersink_get_*(), including some future parameters we will want to export. --- doc/APIchanges | 1 + libavfilter/buffersink.c | 47 ++++++++++++++++++++++++++++++++++++++++ libavfilter/buffersink.h | 16 ++++++++++++-- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index b392c756d7..5ddd7189f8 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -4,6 +4,7 @@ API changes, most recent first: 2024-09-xx - xxxxxxxxxx - lavfi 10.4.100 Buffersink now sets AVFrame.time_base on the frames it outputs. + Add AV_BUFFERSINK_FLAG_PARAMS. 2024-09-23 - xxxxxxxxxx - lavc 61.18.100 - avcodec.h Add a new flag AV_CODEC_EXPORT_DATA_ENHANCEMENTS for export_side_data. diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c index 575075ff47..d9cd074f17 100644 --- a/libavfilter/buffersink.c +++ b/libavfilter/buffersink.c @@ -128,8 +128,55 @@ static int get_frame_internal(AVFilterContext *ctx, AVFrame *frame, int flags, i } } +static int get_frame_params(AVFilterContext *ctx, AVFrame *frame) +{ + FilterLink *l = ff_filter_link(ctx->inputs[0]); + int ret = 0; + + frame->time_base = l->pub.time_base; + frame->format = l->pub.format; + + switch (l->pub.type) { + case AVMEDIA_TYPE_AUDIO: + ret = av_channel_layout_copy(&frame->ch_layout, &l->pub.ch_layout); + if (ret < 0) + goto fail; + + frame->sample_rate = l->pub.sample_rate; + break; + case AVMEDIA_TYPE_VIDEO: + frame->width = l->pub.w; + frame->height = l->pub.h; + frame->sample_aspect_ratio = l->pub.sample_aspect_ratio; + frame->colorspace = l->pub.colorspace; + frame->color_range = l->pub.color_range; + break; + default: av_assert0(0); + } + + if (l->hw_frames_ctx) { + frame->hw_frames_ctx = av_buffer_ref(l->hw_frames_ctx); + if (!frame->hw_frames_ctx) { + ret = AVERROR(ENOMEM); + goto fail; + } + } + + return 0; +fail: + av_frame_unref(frame); + return ret; +} + int attribute_align_arg av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags) { + if (flags & AV_BUFFERSINK_FLAG_PARAMS) { + if (flags & ~AV_BUFFERSINK_FLAG_PARAMS) + return AVERROR(EINVAL); + + return get_frame_params(ctx, frame); + } + return get_frame_internal(ctx, frame, flags, ff_filter_link(ctx->inputs[0])->min_samples); } diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h index 361d603679..9c4468af5b 100644 --- a/libavfilter/buffersink.h +++ b/libavfilter/buffersink.h @@ -87,14 +87,26 @@ int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flag * reference, but not remove it from the buffer. This is useful if you * need only to read a video/samples buffer, without to fetch it. */ -#define AV_BUFFERSINK_FLAG_PEEK 1 +#define AV_BUFFERSINK_FLAG_PEEK (1 << 0) /** * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. * If a frame is already buffered, it is read (and removed from the buffer), * but if no frame is present, return AVERROR(EAGAIN). */ -#define AV_BUFFERSINK_FLAG_NO_REQUEST 2 +#define AV_BUFFERSINK_FLAG_NO_REQUEST (1 << 1) + +/** + * Retrieve stream parameters rather than frame data. + * + * When this flag is set, av_buffersink_get_frame_flags() fills the non-data + * fields of the supplied frame without causing any filtergraph activity. + * + * @note While frame data will be NULL, certain other allocated fields may be + * filled (e.g. ch_layout, hw_frames_ctx), so the frame should still be + * unreffed before reuse. + */ +#define AV_BUFFERSINK_FLAG_PARAMS (1 << 2) /** * Set the frame size for an audio buffer sink.