[FFmpeg-cvslog] ffmpeg: refactor post-decoding steps for subtitles into a function
Jan Ekström
git at videolan.org
Fri Feb 3 17:39:58 EET 2023
ffmpeg | branch: master | Jan Ekström <jan.ekstrom at 24i.com> | Mon Dec 13 18:30:37 2021 +0200| [fcc50674ded2d70b44be32be0331c7d925aa53dc] | committer: Jan Ekström
ffmpeg: refactor post-decoding steps for subtitles into a function
This enables us to later call this when generating additional
subtitles for splitting purposes.
Co-authored-by: Andrzej Nadachowski <andrzej.nadachowski at 24i.com>
Signed-off-by: Jan Ekström <jan.ekstrom at 24i.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fcc50674ded2d70b44be32be0331c7d925aa53dc
---
fftools/ffmpeg.c | 49 ++++++++++++++++++++++++++++---------------------
1 file changed, 28 insertions(+), 21 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 92fd61f315..ba045b454c 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -2296,27 +2296,15 @@ fail:
return err < 0 ? err : ret;
}
-static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
- int *decode_failed)
+static int process_subtitle(InputStream *ist, AVSubtitle *subtitle, int *got_output)
{
- AVSubtitle subtitle;
+ int ret = 0;
int free_sub = 1;
- int ret = avcodec_decode_subtitle2(ist->dec_ctx,
- &subtitle, got_output, pkt);
-
- check_decode_result(NULL, got_output, ret);
-
- if (ret < 0 || !*got_output) {
- *decode_failed = 1;
- if (!pkt->size)
- sub2video_flush(ist);
- return ret;
- }
if (ist->fix_sub_duration) {
int end = 1;
if (ist->prev_sub.got_output) {
- end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
+ end = av_rescale(subtitle->pts - ist->prev_sub.subtitle.pts,
1000, AV_TIME_BASE);
if (end < ist->prev_sub.subtitle.end_display_time) {
av_log(NULL, AV_LOG_DEBUG,
@@ -2328,7 +2316,7 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
}
FFSWAP(int, *got_output, ist->prev_sub.got_output);
FFSWAP(int, ret, ist->prev_sub.ret);
- FFSWAP(AVSubtitle, subtitle, ist->prev_sub.subtitle);
+ FFSWAP(AVSubtitle, *subtitle, ist->prev_sub.subtitle);
if (end <= 0)
goto out;
}
@@ -2337,20 +2325,20 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
return ret;
if (ist->sub2video.frame) {
- sub2video_update(ist, INT64_MIN, &subtitle);
+ 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);
+ ret = av_fifo_write(ist->sub2video.sub_queue, subtitle, 1);
if (ret < 0)
exit_program(1);
free_sub = 0;
}
- if (!subtitle.num_rects)
+ if (!subtitle->num_rects)
goto out;
ist->frames_decoded++;
@@ -2360,15 +2348,34 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
|| ost->enc_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)
continue;
- do_subtitle_out(output_files[ost->file_index], ost, &subtitle);
+ do_subtitle_out(output_files[ost->file_index], ost, subtitle);
}
out:
if (free_sub)
- avsubtitle_free(&subtitle);
+ avsubtitle_free(subtitle);
return ret;
}
+static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
+ int *decode_failed)
+{
+ AVSubtitle subtitle;
+ int ret = avcodec_decode_subtitle2(ist->dec_ctx,
+ &subtitle, got_output, pkt);
+
+ check_decode_result(NULL, got_output, ret);
+
+ if (ret < 0 || !*got_output) {
+ *decode_failed = 1;
+ if (!pkt->size)
+ sub2video_flush(ist);
+ return ret;
+ }
+
+ return process_subtitle(ist, &subtitle, got_output);
+}
+
static int send_filter_eof(InputStream *ist)
{
int i, ret;
More information about the ffmpeg-cvslog
mailing list