[FFmpeg-cvslog] fftools/ffmpeg_dec: move sub2video submission to ffmpeg_filter
Anton Khirnov
git at videolan.org
Wed May 31 17:26:05 EEST 2023
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue May 23 13:00:12 2023 +0200| [5d530e3a7286df72026f77f7b02f4cf7f083f57c] | committer: Anton Khirnov
fftools/ffmpeg_dec: move sub2video submission to ffmpeg_filter
This code is a sub2video analogue of ifilter_send_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.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5d530e3a7286df72026f77f7b02f4cf7f083f57c
---
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 --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);
More information about the ffmpeg-cvslog
mailing list