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 4198E4A386 for ; Wed, 27 Mar 2024 10:21:44 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8BACD68D631; Wed, 27 Mar 2024 12:21:41 +0200 (EET) 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 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: 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; } -- 2.43.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".