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 |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | fail | Make fate failed |
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 [...]
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 --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); }