aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Ekström <jan.ekstrom@24i.com>2021-12-13 18:30:37 +0200
committerJan Ekström <jeebjp@gmail.com>2023-02-03 12:21:02 +0200
commitfcc50674ded2d70b44be32be0331c7d925aa53dc (patch)
tree45f6fdd3a7dfa3553ffebbcb385c339622d4b590
parentb92028346c35dad837dd1160930435d88bd838b5 (diff)
downloadffmpeg-fcc50674ded2d70b44be32be0331c7d925aa53dc.tar.gz
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@24i.com> Signed-off-by: Jan Ekström <jan.ekstrom@24i.com>
-rw-r--r--fftools/ffmpeg.c49
1 files 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;