[FFmpeg-cvslog] fftools/ffmpeg_dec: deobfuscate subtitle decoding

Anton Khirnov git at videolan.org
Mon May 22 18:12:14 EEST 2023


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Wed May 17 09:44:37 2023 +0200| [172f901e3555f222852723a42a7aa93774069a48] | committer: Anton Khirnov

fftools/ffmpeg_dec: deobfuscate subtitle decoding

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=172f901e3555f222852723a42a7aa93774069a48
---

 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);
         }
 



More information about the ffmpeg-cvslog mailing list