It is currently handled in the same loop as audio and video, but this
obscures the actual flow, because only one iteration is ever performed
for subtitles.
Also, avoid a pointless packet reference.
---
fftools/ffmpeg_dec.c | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c
index 30fe75d8a6..646b587f9e 100644
--- a/fftools/ffmpeg_dec.c
+++ b/fftools/ffmpeg_dec.c
@@ -456,25 +456,31 @@ out:
return ret;
}
-static int transcode_subtitles(InputStream *ist, const AVPacket *pkt,
- int *got_output, int *decode_failed)
+static int transcode_subtitles(InputStream *ist, const AVPacket *pkt)
{
AVSubtitle subtitle;
+ int got_output;
int ret = avcodec_decode_subtitle2(ist->dec_ctx,
- &subtitle, got_output, pkt);
+ &subtitle, &got_output, pkt);
- check_decode_result(ist, got_output, ret);
+ if (ret < 0) {
+ av_log(ist, AV_LOG_ERROR, "Error decoding subtitles: %s\n",
+ av_err2str(ret));
+ if (exit_on_error)
+ exit_program(1);
+ }
- if (ret < 0 || !*got_output) {
- *decode_failed = 1;
+ check_decode_result(ist, &got_output, ret);
+
+ if (ret < 0 || !got_output) {
if (!pkt->size)
sub2video_flush(ist);
- return ret;
+ return ret < 0 ? ret : AVERROR_EOF;
}
ist->frames_decoded++;
- return process_subtitle(ist, &subtitle, got_output);
+ return process_subtitle(ist, &subtitle, &got_output);
}
static int send_filter_eof(InputStream *ist)
@@ -493,9 +499,13 @@ static int send_filter_eof(InputStream *ist)
int dec_packet(InputStream *ist, const AVPacket *pkt, int no_eof)
{
+ AVCodecContext *dec = ist->dec_ctx;
AVPacket *avpkt = ist->pkt;
int ret, repeating = 0;
+ if (dec->codec_type == AVMEDIA_TYPE_SUBTITLE)
+ return transcode_subtitles(ist, pkt ? pkt : ist->pkt);
+
if (pkt) {
av_packet_unref(avpkt);
ret = av_packet_ref(avpkt, pkt);
@@ -520,14 +530,6 @@ int dec_packet(InputStream *ist, const AVPacket *pkt, int
no_eof)
av_packet_unref(avpkt);
break;
- case AVMEDIA_TYPE_SUBTITLE:
- if (repeating)
- break;
- ret = transcode_subtitles(ist, avpkt, &got_output, &decode_failed);
- if (!pkt && ret >= 0)
- ret = AVERROR_EOF;
- av_packet_unref(avpkt);
- break;
default: av_assert0(0);
}
--
2.39.2
_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".