From patchwork Wed Mar 27 10:21:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 47518 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp517212pzb; Wed, 27 Mar 2024 03:21:54 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVns3RpaiGKCULghdxeuAddyRMEais6RCAzwAPKQ2bnOyHLUAkRwSsBj49AINGrNadfcwXvG3ov4khIzwLgviNb0TWrcQfIB2F0Uw== X-Google-Smtp-Source: AGHT+IGJ88gyAiK7lmnR7OEO9u9eQjie6pwnsfcu4R94/u9WFRpUrVRAMsx8HEqAMsPP6iky2t+U X-Received: by 2002:a50:d7da:0:b0:56c:18b4:d2ab with SMTP id m26-20020a50d7da000000b0056c18b4d2abmr2025394edj.42.1711534914581; Wed, 27 Mar 2024 03:21:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711534914; cv=none; d=google.com; s=arc-20160816; b=BRdYhD2zgotiOnpgRjo/UjbReu1nVFdGEyGKY0b0JAaOkS11GclWx7wzNTppETDeGw 6vjIaMPVC9X8EWzg+kzAoWzeeONOnC92uJSQ780vfTCTUKh3vc1I8etwWsFAP1/eunIk 7924XFfbk3tLXh9g5Lmpq45kzBetmDVk8NnvZOJaA4cf1OO35fn9TKqklHMGN+6iXCxO PE3ukUsI55OQ/sfeSAgrjcmlqBD7yVqvMnu1zWPCWNFGVb0/lLs+KQM9gpRUyIUlfv5T ikJsMfKT6brEOBAZStr51XUDLdemJX5+sghq6cNll1YU14BoyQYHAoRpiN7a08HUVUHT QP7w== 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=rfq7jkoRuOWDzGaKJRifracA0G6I7j3v8OffTTPCf3Q=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=rlzrF2Ya+j3zxR9Jgbq/F78oy4elau4m9kOzRPczq8+aJjkG0nT/+nRZsoUg3j8Oi1 SD0Couys8yXo3XtJBl4e2XjqguE7K634eU6ZMmrE/LGkobWBDjsmHUD7ev7wLti0JJkR tZEf6IupatHNGmit6CqSoiNH0bKjYtEAWaVb211Np2/zcmjh6RWn5FFBu3fuLrXjafHT pt1l51vfzzgrQokOESvGfCy/IFCuoEgOEZMPe1qbpp9xBqUHun6E703EKDTk7tZDZn1z Bh2Uy4yzNUgcei/zAGemRB3i+VkOO79xxaL6wKkF1AS+Vw+GI9fZMleiq0vtoAqI7A7w Tcqg==; 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=YluuQBeB; 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 o18-20020a509b12000000b0056b94b44251si4523039edi.674.2024.03.27.03.21.54; Wed, 27 Mar 2024 03:21:54 -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=YluuQBeB; 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 C127B68D63E; Wed, 27 Mar 2024 12:21:42 +0200 (EET) 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 58CD168D500 for ; Wed, 27 Mar 2024 12:21:35 +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=YluuQBeB; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 01EB04D51 for ; Wed, 27 Mar 2024 11:21:35 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id WIU0O1-Smebw for ; Wed, 27 Mar 2024 11:21:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1711534892; bh=lXgbmt36K4MLzHqKuzCsOKnM/N32epHrXnDGGXKMkPQ=; h=From:To:Subject:Date:From; b=YluuQBeBEEQ4Lm0gB4vLBhMC2CKZ/E1W8C7LxZv6puJ1hm9wjQVnERje6gDSJLd5o o02jIYw/2ZikHv06PZqN3U2MnvAIAzm5XlT7E3yk+nm1IuFg6Ab42Bw6YtIzVhas3v La18Go1ThRaPUAibE4pan3jRWL2RPmgn4SoZxXqz2or7eubg27EHFGpFWDoeP7XdWU uIulno3QOGcpuG8wfsni1UJ7CYMlimldP41npsSC+NP2CKXTGdSp995Uq6teFe2Wrv D4Zq+y6WYJf91im/kFEMf+GkBDw0e4UXWPRDnFtp53ZOlg83eO72GD3IG4bQ2e0o4/ cKxUNbRHVr5iw== 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 1F58C4462 for ; Wed, 27 Mar 2024 11:21:32 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id EE4A33A0357 for ; Wed, 27 Mar 2024 11:21:31 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 27 Mar 2024 11:21:25 +0100 Message-ID: <20240327102126.14299-1-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] fftools/ffmpeg_sched: move sch_stop() to the bottom of the file 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: UMoJ7rGbijsx Will allow avoiding forward declarations in following commits. --- fftools/ffmpeg_sched.c | 138 ++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/fftools/ffmpeg_sched.c b/fftools/ffmpeg_sched.c index ec88017e21..67c32fb5a0 100644 --- a/fftools/ffmpeg_sched.c +++ b/fftools/ffmpeg_sched.c @@ -399,22 +399,6 @@ static int queue_alloc(ThreadQueue **ptq, unsigned nb_streams, unsigned queue_si static void *task_wrapper(void *arg); -static int task_stop(SchTask *task) -{ - int ret; - void *thread_ret; - - if (!task->thread_running) - return 0; - - ret = pthread_join(task->thread, &thread_ret); - av_assert0(ret == 0); - - task->thread_running = 0; - - return (intptr_t)thread_ret; -} - static int task_start(SchTask *task) { int ret; @@ -468,59 +452,6 @@ static int64_t trailing_dts(const Scheduler *sch, int count_finished) return min_dts == INT64_MAX ? AV_NOPTS_VALUE : min_dts; } -int sch_stop(Scheduler *sch, int64_t *finish_ts) -{ - int ret = 0, err; - - atomic_store(&sch->terminate, 1); - - for (unsigned type = 0; type < 2; type++) - for (unsigned i = 0; i < (type ? sch->nb_demux : sch->nb_filters); i++) { - SchWaiter *w = type ? &sch->demux[i].waiter : &sch->filters[i].waiter; - waiter_set(w, 1); - } - - for (unsigned i = 0; i < sch->nb_demux; i++) { - SchDemux *d = &sch->demux[i]; - - err = task_stop(&d->task); - ret = err_merge(ret, err); - } - - for (unsigned i = 0; i < sch->nb_dec; i++) { - SchDec *dec = &sch->dec[i]; - - err = task_stop(&dec->task); - ret = err_merge(ret, err); - } - - for (unsigned i = 0; i < sch->nb_filters; i++) { - SchFilterGraph *fg = &sch->filters[i]; - - err = task_stop(&fg->task); - ret = err_merge(ret, err); - } - - for (unsigned i = 0; i < sch->nb_enc; i++) { - SchEnc *enc = &sch->enc[i]; - - err = task_stop(&enc->task); - ret = err_merge(ret, err); - } - - for (unsigned i = 0; i < sch->nb_mux; i++) { - SchMux *mux = &sch->mux[i]; - - err = task_stop(&mux->task); - ret = err_merge(ret, err); - } - - if (finish_ts) - *finish_ts = trailing_dts(sch, 1); - - return ret; -} - void sch_free(Scheduler **psch) { Scheduler *sch = *psch; @@ -2518,3 +2449,72 @@ static void *task_wrapper(void *arg) return (void*)(intptr_t)ret; } + +static int task_stop(SchTask *task) +{ + int ret; + void *thread_ret; + + if (!task->thread_running) + return 0; + + ret = pthread_join(task->thread, &thread_ret); + av_assert0(ret == 0); + + task->thread_running = 0; + + return (intptr_t)thread_ret; +} + +int sch_stop(Scheduler *sch, int64_t *finish_ts) +{ + int ret = 0, err; + + atomic_store(&sch->terminate, 1); + + for (unsigned type = 0; type < 2; type++) + for (unsigned i = 0; i < (type ? sch->nb_demux : sch->nb_filters); i++) { + SchWaiter *w = type ? &sch->demux[i].waiter : &sch->filters[i].waiter; + waiter_set(w, 1); + } + + for (unsigned i = 0; i < sch->nb_demux; i++) { + SchDemux *d = &sch->demux[i]; + + err = task_stop(&d->task); + ret = err_merge(ret, err); + } + + for (unsigned i = 0; i < sch->nb_dec; i++) { + SchDec *dec = &sch->dec[i]; + + err = task_stop(&dec->task); + ret = err_merge(ret, err); + } + + for (unsigned i = 0; i < sch->nb_filters; i++) { + SchFilterGraph *fg = &sch->filters[i]; + + err = task_stop(&fg->task); + ret = err_merge(ret, err); + } + + for (unsigned i = 0; i < sch->nb_enc; i++) { + SchEnc *enc = &sch->enc[i]; + + err = task_stop(&enc->task); + ret = err_merge(ret, err); + } + + for (unsigned i = 0; i < sch->nb_mux; i++) { + SchMux *mux = &sch->mux[i]; + + err = task_stop(&mux->task); + ret = err_merge(ret, err); + } + + if (finish_ts) + *finish_ts = trailing_dts(sch, 1); + + return ret; +} From patchwork Wed Mar 27 10:21:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 47517 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp517131pzb; Wed, 27 Mar 2024 03:21:45 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVTj/VmxCc7dKZgPzL+DH7HPaoZTT2DGXoA0dxhz31CtAKPoSDCAbzI3I1ak+ZUokXyZ8pgBaDrzvUx/w89HGvaOXWbqAphZOaN2g== X-Google-Smtp-Source: AGHT+IF/0kIS9P27VLS3qH9DL+8wkV08psJiCIs6ci06WTq0inXN/9VE2QEdfyYO79j+2nkP6tb3 X-Received: by 2002:a50:8d17:0:b0:568:1a8:58b with SMTP id s23-20020a508d17000000b0056801a8058bmr2768628eds.14.1711534905287; Wed, 27 Mar 2024 03:21:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711534905; cv=none; d=google.com; s=arc-20160816; b=zwLBaqp65PhDYlKXRpzt0vmLO70U7Nv1vzUIAjEEOEoF9Oi+BOkKpHGQo/t2G2uMq8 R+zclO81uHr9asD03RBAcPfv5HvNSpl5yg8VGycZXbhXwcNUUDr47NnLQwaNtD9QyOaw /mKjtPRGdaK0MCiPw4aW0DTZMd5436D6BTAC+uWiGKDgADshjhN1GGtmgFAMIpTazXLX iPDUUPVd5fAFHf3gQ+uNM9A3uDtZDSpCkll4Y8QFjhe0vX9ePPv+YWm+RlalGYKJmDFa 8pxzvo0LNnCVbC6G0A4rTFHLcUhkeEu5g2IybTeBBsMjqEWl+g7HiMGRxrw3Llrkf5Fd EG1Q== 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:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=OFAJj7iB7STm2na2pSFQ7+FLxsdq63+u97Z6jRwxKEc=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=xc0uR3ztlI34qEm3o8duTnJB+hIuKvwux2BgYaxepMsC+jURTBOilide9gMadMeVZh Uq8qg+4v8ZSPDwc2oisrCnIsuGvtm4YuV0hgp1VYPYvkcX2xKpaYA22Rozited7LAIMH QrjWzNJy1HDbaSA4VlzILFHiUb9GjL6f4NQc+n/T8zU2IArbfoB52rWZlEMlGLN1Ri5m yrJFVV8wuLR7zu40ZQ0Qe/VNA1qw+/7vJHi05Ll+/7mT59r0tkSNUuUI3NiziVihS9WG bHx0+QgzhAhD/EuytCV4unzh4LrCrz39vteODYkoR3BsDUubNsyk7uUP43WBA+paXPK1 vXIw==; 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=KjufnhUu; 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 dj14-20020a05640231ae00b0056ba03b7f21si4367743edb.410.2024.03.27.03.21.44; Wed, 27 Mar 2024 03:21:45 -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=KjufnhUu; 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 C96A768D632; Wed, 27 Mar 2024 12:21:41 +0200 (EET) 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 02A0B68D500 for ; Wed, 27 Mar 2024 12:21:34 +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=KjufnhUu; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 5BB5C4D5D for ; Wed, 27 Mar 2024 11:21:34 +0100 (CET) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id KjPXZwyuGK6b for ; Wed, 27 Mar 2024 11:21:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1711534892; bh=DQQSMOmFC4jXTCsAgMZKUvVXZeo28oq4J30fpP3ZvBs=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KjufnhUutKvO5io5Z4/kRHVBaQSKfJgGsc3usEnNIQU2LH9dmvGuZPU+FjllShKeI pu/FHPs+7nGlA5+vHfyGEg80xjInLgEJBlw8Zw4b8lfId78Z9hZUwyri88k5s6iEcT 4BQt8EgZQNTIC5n83UYqS81jLHx6KCJF/0RelJm+l/Q/6QMwsUl8fWxB5gyrIRG5Dk qZl5qJUQk1zYkJW/n0T6nvPfhswdZSqMn5aTeIdQoYJzvhshXxZPdLrSKPpFRoPdns UT/yhvxCm289sQcHzoj9V/9gRWS1dmr0cLWt8Ni2tU73g74OUJwAo6qD697Gi8oJmg 7UQeukmneCu+w== 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 21EF24D51 for ; Wed, 27 Mar 2024 11:21:32 +0100 (CET) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 0729E3A0582 for ; Wed, 27 Mar 2024 11:21:32 +0100 (CET) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 27 Mar 2024 11:21:26 +0100 Message-ID: <20240327102126.14299-2-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240327102126.14299-1-anton@khirnov.net> References: <20240327102126.14299-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] fftools/ffmpeg_sched: make sure to always run task cleanup 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: VgB+uUzaO1VY Even in cases where the task failed to start due to pthread_create() failing. --- fftools/ffmpeg_sched.c | 68 +++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/fftools/ffmpeg_sched.c b/fftools/ffmpeg_sched.c index 67c32fb5a0..ee3af45908 100644 --- a/fftools/ffmpeg_sched.c +++ b/fftools/ffmpeg_sched.c @@ -260,6 +260,12 @@ typedef struct SchFilterGraph { int task_exited; } SchFilterGraph; +enum SchedulerState { + SCH_STATE_UNINIT, + SCH_STATE_STARTED, + SCH_STATE_STOPPED, +}; + struct Scheduler { const AVClass *class; @@ -292,7 +298,7 @@ struct Scheduler { char *sdp_filename; int sdp_auto; - int transcode_started; + enum SchedulerState state; atomic_int terminate; atomic_int task_failed; @@ -1144,7 +1150,8 @@ int sch_mux_stream_ready(Scheduler *sch, unsigned mux_idx, unsigned stream_idx) // this may be called during initialization - do not start // threads before sch_start() is called - if (++mux->nb_streams_ready == mux->nb_streams && sch->transcode_started) + if (++mux->nb_streams_ready == mux->nb_streams && + sch->state >= SCH_STATE_STARTED) ret = mux_init(sch, mux); pthread_mutex_unlock(&sch->mux_ready_lock); @@ -1514,7 +1521,8 @@ int sch_start(Scheduler *sch) if (ret < 0) return ret; - sch->transcode_started = 1; + av_assert0(sch->state == SCH_STATE_UNINIT); + sch->state = SCH_STATE_STARTED; for (unsigned i = 0; i < sch->nb_mux; i++) { SchMux *mux = &sch->mux[i]; @@ -1522,7 +1530,7 @@ int sch_start(Scheduler *sch) if (mux->nb_streams_ready == mux->nb_streams) { ret = mux_init(sch, mux); if (ret < 0) - return ret; + goto fail; } } @@ -1531,7 +1539,7 @@ int sch_start(Scheduler *sch) ret = task_start(&enc->task); if (ret < 0) - return ret; + goto fail; } for (unsigned i = 0; i < sch->nb_filters; i++) { @@ -1539,7 +1547,7 @@ int sch_start(Scheduler *sch) ret = task_start(&fg->task); if (ret < 0) - return ret; + goto fail; } for (unsigned i = 0; i < sch->nb_dec; i++) { @@ -1547,7 +1555,7 @@ int sch_start(Scheduler *sch) ret = task_start(&dec->task); if (ret < 0) - return ret; + goto fail; } for (unsigned i = 0; i < sch->nb_demux; i++) { @@ -1558,7 +1566,7 @@ int sch_start(Scheduler *sch) ret = task_start(&d->task); if (ret < 0) - return ret; + goto fail; } pthread_mutex_lock(&sch->schedule_lock); @@ -1566,6 +1574,9 @@ int sch_start(Scheduler *sch) pthread_mutex_unlock(&sch->schedule_lock); return 0; +fail: + sch_stop(sch, NULL); + return ret; } int sch_wait(Scheduler *sch, uint64_t timeout_us, int64_t *transcode_ts) @@ -2414,6 +2425,18 @@ int sch_filter_command(Scheduler *sch, unsigned fg_idx, AVFrame *frame) return send_to_filter(sch, fg, fg->nb_inputs, frame); } +static int task_cleanup(Scheduler *sch, SchedulerNode node) +{ + switch (node.type) { + case SCH_NODE_TYPE_DEMUX: return demux_done (sch, node.idx); + case SCH_NODE_TYPE_MUX: return mux_done (sch, node.idx); + case SCH_NODE_TYPE_DEC: return dec_done (sch, node.idx); + case SCH_NODE_TYPE_ENC: return enc_done (sch, node.idx); + case SCH_NODE_TYPE_FILTER_IN: return filter_done(sch, node.idx); + default: av_assert0(0); + } +} + static void *task_wrapper(void *arg) { SchTask *task = arg; @@ -2426,15 +2449,7 @@ static void *task_wrapper(void *arg) av_log(task->func_arg, AV_LOG_ERROR, "Task finished with error code: %d (%s)\n", ret, av_err2str(ret)); - switch (task->node.type) { - case SCH_NODE_TYPE_DEMUX: err = demux_done (sch, task->node.idx); break; - case SCH_NODE_TYPE_MUX: err = mux_done (sch, task->node.idx); break; - case SCH_NODE_TYPE_DEC: err = dec_done (sch, task->node.idx); break; - case SCH_NODE_TYPE_ENC: err = enc_done (sch, task->node.idx); break; - case SCH_NODE_TYPE_FILTER_IN: err = filter_done(sch, task->node.idx); break; - default: av_assert0(0); - } - + err = task_cleanup(sch, task->node); ret = err_merge(ret, err); // EOF is considered normal termination @@ -2450,13 +2465,13 @@ static void *task_wrapper(void *arg) return (void*)(intptr_t)ret; } -static int task_stop(SchTask *task) +static int task_stop(Scheduler *sch, SchTask *task) { int ret; void *thread_ret; if (!task->thread_running) - return 0; + return task_cleanup(sch, task->node); ret = pthread_join(task->thread, &thread_ret); av_assert0(ret == 0); @@ -2470,6 +2485,9 @@ int sch_stop(Scheduler *sch, int64_t *finish_ts) { int ret = 0, err; + if (sch->state != SCH_STATE_STARTED) + return 0; + atomic_store(&sch->terminate, 1); for (unsigned type = 0; type < 2; type++) @@ -2481,40 +2499,42 @@ int sch_stop(Scheduler *sch, int64_t *finish_ts) for (unsigned i = 0; i < sch->nb_demux; i++) { SchDemux *d = &sch->demux[i]; - err = task_stop(&d->task); + err = task_stop(sch, &d->task); ret = err_merge(ret, err); } for (unsigned i = 0; i < sch->nb_dec; i++) { SchDec *dec = &sch->dec[i]; - err = task_stop(&dec->task); + err = task_stop(sch, &dec->task); ret = err_merge(ret, err); } for (unsigned i = 0; i < sch->nb_filters; i++) { SchFilterGraph *fg = &sch->filters[i]; - err = task_stop(&fg->task); + err = task_stop(sch, &fg->task); ret = err_merge(ret, err); } for (unsigned i = 0; i < sch->nb_enc; i++) { SchEnc *enc = &sch->enc[i]; - err = task_stop(&enc->task); + err = task_stop(sch, &enc->task); ret = err_merge(ret, err); } for (unsigned i = 0; i < sch->nb_mux; i++) { SchMux *mux = &sch->mux[i]; - err = task_stop(&mux->task); + err = task_stop(sch, &mux->task); ret = err_merge(ret, err); } if (finish_ts) *finish_ts = trailing_dts(sch, 1); + sch->state = SCH_STATE_STOPPED; + return ret; }