diff mbox series

[FFmpeg-devel,13/24] fftools/ffmpeg_dec: move sub2video submission to ffmpeg_filter

Message ID 20230528091416.17927-13-anton@khirnov.net
State Accepted
Commit 5d530e3a7286df72026f77f7b02f4cf7f083f57c
Headers show
Series [FFmpeg-devel,01/24] fftools/ffmpeg_mux_init: merge ost_add_from_filter() to ost_add() | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov May 28, 2023, 9:14 a.m. UTC
This code is analogous to ifilter_send_frame() for normal video frame,
so it properly belongs to the filtering code.

Note that using sub2video with more than one target for a given input
subtitle stream is currently broken and this commit does not change
that. It will be addressed in following commits.
---
 fftools/ffmpeg.c        |  2 +-
 fftools/ffmpeg.h        |  2 ++
 fftools/ffmpeg_dec.c    | 23 ++++++++---------------
 fftools/ffmpeg_filter.c | 30 ++++++++++++++++++++++++++++++
 4 files changed, 41 insertions(+), 16 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 9c68add0a4..9ee16ee8e0 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -755,7 +755,7 @@  static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
     first_report = 0;
 }
 
-static int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src)
+int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src)
 {
     int ret = AVERROR_BUG;
     AVSubtitle tmp = {
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 451d18db6f..fa5824ee7b 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -744,9 +744,11 @@  int init_complex_filtergraph(FilterGraph *fg);
 
 void sub2video_update(InputStream *ist, int64_t heartbeat_pts,
                       const AVSubtitle *sub);
+int copy_av_subtitle(AVSubtitle *dst, const AVSubtitle *src);
 
 int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_reference);
 int ifilter_send_eof(InputFilter *ifilter, int64_t pts, AVRational tb);
+int ifilter_sub2video(InputFilter *ifilter, const AVSubtitle *sub);
 
 /**
  * Set up fallback filtering parameters from a decoder context. They will only
diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c
index c89630512a..a7acaf67c2 100644
--- a/fftools/ffmpeg_dec.c
+++ b/fftools/ffmpeg_dec.c
@@ -336,7 +336,6 @@  static void sub2video_flush(InputStream *ist)
 int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
 {
     int ret = 0;
-    int free_sub = 1;
 
     if (ist->fix_sub_duration) {
         int end = 1;
@@ -361,18 +360,13 @@  int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
     if (!*got_output)
         return ret;
 
-    if (ist->sub2video.frame) {
-        sub2video_update(ist, INT64_MIN, subtitle);
-    } else if (ist->nb_filters) {
-        if (!ist->sub2video.sub_queue)
-            ist->sub2video.sub_queue = av_fifo_alloc2(8, sizeof(AVSubtitle), AV_FIFO_FLAG_AUTO_GROW);
-        if (!ist->sub2video.sub_queue)
-            report_and_exit(AVERROR(ENOMEM));
-
-        ret = av_fifo_write(ist->sub2video.sub_queue, subtitle, 1);
-        if (ret < 0)
-            exit_program(1);
-        free_sub = 0;
+    for (int i = 0; i < ist->nb_filters; i++) {
+        ret = ifilter_sub2video(ist->filters[i], subtitle);
+        if (ret < 0) {
+            av_log(ist, AV_LOG_ERROR, "Error sending a subtitle for filtering: %s\n",
+                   av_err2str(ret));
+            goto out;
+        }
     }
 
     if (!subtitle->num_rects)
@@ -387,8 +381,7 @@  int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
     }
 
 out:
-    if (free_sub)
-        avsubtitle_free(subtitle);
+    avsubtitle_free(subtitle);
     return ret;
 }
 
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 3bf1862ab6..acfd83244b 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -1638,6 +1638,36 @@  int reap_filters(int flush)
     return 0;
 }
 
+int ifilter_sub2video(InputFilter *ifilter, const AVSubtitle *subtitle)
+{
+    InputFilterPriv *ifp = ifp_from_ifilter(ifilter);
+    InputStream     *ist = ifp->ist;
+    int ret;
+
+    if (ist->sub2video.frame) {
+        sub2video_update(ist, INT64_MIN, subtitle);
+    } else {
+        AVSubtitle sub;
+
+        if (!ist->sub2video.sub_queue)
+            ist->sub2video.sub_queue = av_fifo_alloc2(8, sizeof(AVSubtitle), AV_FIFO_FLAG_AUTO_GROW);
+        if (!ist->sub2video.sub_queue)
+            return AVERROR(ENOMEM);
+
+        ret = copy_av_subtitle(&sub, subtitle);
+        if (ret < 0)
+            return ret;
+
+        ret = av_fifo_write(ist->sub2video.sub_queue, &sub, 1);
+        if (ret < 0) {
+            avsubtitle_free(&sub);
+            return ret;
+        }
+    }
+
+    return 0;
+}
+
 int ifilter_send_eof(InputFilter *ifilter, int64_t pts, AVRational tb)
 {
     InputFilterPriv *ifp = ifp_from_ifilter(ifilter);