diff mbox series

[FFmpeg-devel,30/36] fftools/ffmpeg_dec: deobfuscate subtitle decoding

Message ID 20230517102029.541-30-anton@khirnov.net
State Accepted
Commit 172f901e3555f222852723a42a7aa93774069a48
Headers show
Series [FFmpeg-devel,01/36] fftools/ffmpeg: shorten a variable name | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 fail Make fate failed

Commit Message

Anton Khirnov May 17, 2023, 10:20 a.m. UTC
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(-)

Comments

Michael Niedermayer May 17, 2023, 8:15 p.m. UTC | #1
On Wed, May 17, 2023 at 12:20:23PM +0200, Anton Khirnov wrote:
> 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(-)

The following results in a really large file now: (i stoped it so maybe infinite loop)
./ffmpeg -f lavfi -i "movie=tickets/1332/Starship_Troopers.vob[out0+subcc]"  -vn -map s -y eia608.srt

[...]
Anton Khirnov May 18, 2023, 2:34 p.m. UTC | #2
Quoting Michael Niedermayer (2023-05-17 22:15:37)
> On Wed, May 17, 2023 at 12:20:23PM +0200, Anton Khirnov wrote:
> > 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(-)
> 
> The following results in a really large file now: (i stoped it so maybe infinite loop)
> ./ffmpeg -f lavfi -i "movie=tickets/1332/Starship_Troopers.vob[out0+subcc]"  -vn -map s -y eia608.srt

This was a bug in ccaption decoder, fixed by Paul in c48eff209c.
diff mbox series

Patch

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