[FFmpeg-devel] [PATCH 14/18] fftools/ffmpeg_sched: factor initializing nodes into separate function

Anton Khirnov anton at khirnov.net
Wed Mar 6 13:03:15 EET 2024


Will be useful in following commits.
---
 fftools/ffmpeg_sched.c | 151 +++++++++++++++++++++++++----------------
 1 file changed, 91 insertions(+), 60 deletions(-)

diff --git a/fftools/ffmpeg_sched.c b/fftools/ffmpeg_sched.c
index e5435dd866..5f8ef04680 100644
--- a/fftools/ffmpeg_sched.c
+++ b/fftools/ffmpeg_sched.c
@@ -1303,11 +1303,65 @@ static void schedule_update_locked(Scheduler *sch)
 
 }
 
-int sch_start(Scheduler *sch)
+static int start_prepare(Scheduler *sch)
 {
     int ret;
 
-    sch->transcode_started = 1;
+    for (unsigned i = 0; i < sch->nb_demux; i++) {
+        SchDemux *d = &sch->demux[i];
+
+        for (unsigned j = 0; j < d->nb_streams; j++) {
+            SchDemuxStream *ds = &d->streams[j];
+
+            if (!ds->nb_dst) {
+                av_log(d, AV_LOG_ERROR,
+                       "Demuxer stream %u not connected to any sink\n", j);
+                return AVERROR(EINVAL);
+            }
+
+            ds->dst_finished = av_calloc(ds->nb_dst, sizeof(*ds->dst_finished));
+            if (!ds->dst_finished)
+                return AVERROR(ENOMEM);
+        }
+    }
+
+    for (unsigned i = 0; i < sch->nb_dec; i++) {
+        SchDec *dec = &sch->dec[i];
+
+        if (!dec->src.type) {
+            av_log(dec, AV_LOG_ERROR,
+                   "Decoder not connected to a source\n");
+            return AVERROR(EINVAL);
+        }
+        if (!dec->nb_dst) {
+            av_log(dec, AV_LOG_ERROR,
+                   "Decoder not connected to any sink\n");
+            return AVERROR(EINVAL);
+        }
+
+        dec->dst_finished = av_calloc(dec->nb_dst, sizeof(*dec->dst_finished));
+        if (!dec->dst_finished)
+            return AVERROR(ENOMEM);
+    }
+
+    for (unsigned i = 0; i < sch->nb_enc; i++) {
+        SchEnc *enc = &sch->enc[i];
+
+        if (!enc->src.type) {
+            av_log(enc, AV_LOG_ERROR,
+                   "Encoder not connected to a source\n");
+            return AVERROR(EINVAL);
+        }
+        if (!enc->nb_dst) {
+            av_log(enc, AV_LOG_ERROR,
+                   "Encoder not connected to any sink\n");
+            return AVERROR(EINVAL);
+        }
+
+        enc->dst_finished = av_calloc(enc->nb_dst, sizeof(*enc->dst_finished));
+        if (!enc->dst_finished)
+            return AVERROR(ENOMEM);
+    }
 
     for (unsigned i = 0; i < sch->nb_mux; i++) {
         SchMux *mux = &sch->mux[i];
@@ -1341,35 +1395,6 @@ int sch_start(Scheduler *sch)
                           QUEUE_PACKETS);
         if (ret < 0)
             return ret;
-
-        if (mux->nb_streams_ready == mux->nb_streams) {
-            ret = mux_init(sch, mux);
-            if (ret < 0)
-                return ret;
-        }
-    }
-
-    for (unsigned i = 0; i < sch->nb_enc; i++) {
-        SchEnc *enc = &sch->enc[i];
-
-        if (!enc->src.type) {
-            av_log(enc, AV_LOG_ERROR,
-                   "Encoder not connected to a source\n");
-            return AVERROR(EINVAL);
-        }
-        if (!enc->nb_dst) {
-            av_log(enc, AV_LOG_ERROR,
-                   "Encoder not connected to any sink\n");
-            return AVERROR(EINVAL);
-        }
-
-        enc->dst_finished = av_calloc(enc->nb_dst, sizeof(*enc->dst_finished));
-        if (!enc->dst_finished)
-            return AVERROR(ENOMEM);
-
-        ret = task_start(&enc->task);
-        if (ret < 0)
-            return ret;
     }
 
     for (unsigned i = 0; i < sch->nb_filters; i++) {
@@ -1396,6 +1421,41 @@ int sch_start(Scheduler *sch)
                 return AVERROR(EINVAL);
             }
         }
+    }
+
+    return 0;
+}
+
+int sch_start(Scheduler *sch)
+{
+    int ret;
+
+    ret = start_prepare(sch);
+    if (ret < 0)
+        return ret;
+
+    sch->transcode_started = 1;
+
+    for (unsigned i = 0; i < sch->nb_mux; i++) {
+        SchMux *mux = &sch->mux[i];
+
+        if (mux->nb_streams_ready == mux->nb_streams) {
+            ret = mux_init(sch, mux);
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    for (unsigned i = 0; i < sch->nb_enc; i++) {
+        SchEnc *enc = &sch->enc[i];
+
+        ret = task_start(&enc->task);
+        if (ret < 0)
+            return ret;
+    }
+
+    for (unsigned i = 0; i < sch->nb_filters; i++) {
+        SchFilterGraph *fg = &sch->filters[i];
 
         ret = task_start(&fg->task);
         if (ret < 0)
@@ -1405,21 +1465,6 @@ int sch_start(Scheduler *sch)
     for (unsigned i = 0; i < sch->nb_dec; i++) {
         SchDec *dec = &sch->dec[i];
 
-        if (!dec->src.type) {
-            av_log(dec, AV_LOG_ERROR,
-                   "Decoder not connected to a source\n");
-            return AVERROR(EINVAL);
-        }
-        if (!dec->nb_dst) {
-            av_log(dec, AV_LOG_ERROR,
-                   "Decoder not connected to any sink\n");
-            return AVERROR(EINVAL);
-        }
-
-        dec->dst_finished = av_calloc(dec->nb_dst, sizeof(*dec->dst_finished));
-        if (!dec->dst_finished)
-            return AVERROR(ENOMEM);
-
         ret = task_start(&dec->task);
         if (ret < 0)
             return ret;
@@ -1431,20 +1476,6 @@ int sch_start(Scheduler *sch)
         if (!d->nb_streams)
             continue;
 
-        for (unsigned j = 0; j < d->nb_streams; j++) {
-            SchDemuxStream *ds = &d->streams[j];
-
-            if (!ds->nb_dst) {
-                av_log(d, AV_LOG_ERROR,
-                       "Demuxer stream %u not connected to any sink\n", j);
-                return AVERROR(EINVAL);
-            }
-
-            ds->dst_finished = av_calloc(ds->nb_dst, sizeof(*ds->dst_finished));
-            if (!ds->dst_finished)
-                return AVERROR(ENOMEM);
-        }
-
         ret = task_start(&d->task);
         if (ret < 0)
             return ret;
-- 
2.43.0



More information about the ffmpeg-devel mailing list