From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 9F4AB48CB0 for ; Wed, 24 Jan 2024 10:46:38 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6E75168D0A0; Wed, 24 Jan 2024 12:46:34 +0200 (EET) Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E19FC68C53E for ; Wed, 24 Jan 2024 12:46:27 +0200 (EET) 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=GQP0/V01; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 1141919C0 for ; Wed, 24 Jan 2024 11:46:27 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id IpYpqHQzU-8w for ; Wed, 24 Jan 2024 11:46:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1706093186; bh=6x+E9llMXvn8Il6XL5DlDgfl/vwr2YwTYips82JzAvI=; h=From:To:Subject:Date:From; b=GQP0/V01zlPqVizO76diRwix9ILnLQzzgQstuyowF5P8FkwnoCMMHU1wDxzOvmVru bnqoUy0BD2OocHgSUIs/Ph0eMBca0tOOtt95sKJwFUQTLUgDOTk0YRtfXf9k0x3Mz9 /3iaAvlgaUWif+bEbvb8MAvIfm5lug4KeoDWA1k6AOmjCx64vTxvZDNw/PFyl3ldeM YxjpTAdsfpUSLnO+c6LvzzXG8cCiFDxrA7/GfS6dst+6Igev1wkjmznjGFxPUxCV25 uWoVqZRg4zNZWZsRE3pRrqLTPmcVmmCcSHxFr/2e947qOi+mN73KN8f5KYHHkjcQm4 k3etTka+LnMBA== 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 00186EEB for ; Wed, 24 Jan 2024 11:46:25 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id C98A83A0534 for ; Wed, 24 Jan 2024 11:46:25 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Jan 2024 11:46:20 +0100 Message-ID: <20240124104622.24343-1-anton@khirnov.net> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] fftools/ffmpeg_sched: add filter API to signal EOF on input 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --- fftools/ffmpeg_sched.c | 27 +++++++++++++++++++++++++-- fftools/ffmpeg_sched.h | 7 +++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/fftools/ffmpeg_sched.c b/fftools/ffmpeg_sched.c index 4fc5a33941..c6ed2e21ff 100644 --- a/fftools/ffmpeg_sched.c +++ b/fftools/ffmpeg_sched.c @@ -226,6 +226,7 @@ typedef struct SchFilterIn { SchedulerNode src; SchedulerNode src_sched; int send_finished; + int receive_finished; } SchFilterIn; typedef struct SchFilterOut { @@ -237,7 +238,8 @@ typedef struct SchFilterGraph { SchFilterIn *inputs; unsigned nb_inputs; - atomic_uint nb_inputs_finished; + atomic_uint nb_inputs_finished_send; + unsigned nb_inputs_finished_receive; SchFilterOut *outputs; unsigned nb_outputs; @@ -1959,7 +1961,7 @@ static int send_to_filter(Scheduler *sch, SchFilterGraph *fg, tq_send_finish(fg->queue, in_idx); // close the control stream when all actual inputs are done - if (atomic_fetch_add(&fg->nb_inputs_finished, 1) == fg->nb_inputs - 1) + if (atomic_fetch_add(&fg->nb_inputs_finished_send, 1) == fg->nb_inputs - 1) tq_send_finish(fg->queue, fg->nb_inputs); } return 0; @@ -2143,6 +2145,27 @@ int sch_filter_receive(Scheduler *sch, unsigned fg_idx, } } +void sch_filter_receive_finish(Scheduler *sch, unsigned fg_idx, unsigned in_idx) +{ + SchFilterGraph *fg; + SchFilterIn *fi; + + av_assert0(fg_idx < sch->nb_filters); + fg = &sch->filters[fg_idx]; + + av_assert0(in_idx < fg->nb_inputs); + fi = &fg->inputs[in_idx]; + + if (!fi->receive_finished) { + fi->receive_finished = 1; + tq_receive_finish(fg->queue, in_idx); + + // close the control stream when all actual inputs are done + if (++fg->nb_inputs_finished_receive == fg->nb_inputs) + tq_receive_finish(fg->queue, fg->nb_inputs); + } +} + int sch_filter_send(Scheduler *sch, unsigned fg_idx, unsigned out_idx, AVFrame *frame) { SchFilterGraph *fg; diff --git a/fftools/ffmpeg_sched.h b/fftools/ffmpeg_sched.h index b167d8d158..811146f6ed 100644 --- a/fftools/ffmpeg_sched.h +++ b/fftools/ffmpeg_sched.h @@ -388,6 +388,13 @@ int sch_dec_send(Scheduler *sch, unsigned dec_idx, struct AVFrame *frame); */ int sch_filter_receive(Scheduler *sch, unsigned fg_idx, unsigned *in_idx, struct AVFrame *frame); +/** + * Called by filter tasks to signal that a filter input will no longer accept input. + * + * @param fg_idx Filtergraph index previously returned from sch_add_filtergraph(). + * @param in_idx Index of the input to finish. + */ +void sch_filter_receive_finish(Scheduler *sch, unsigned fg_idx, unsigned in_idx); /** * Called by filtergraph tasks to send a filtered frame or EOF to consumers. -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".