diff options
author | rcombs <rcombs@rcombs.me> | 2023-02-20 18:24:25 -0600 |
---|---|---|
committer | rcombs <rcombs@rcombs.me> | 2023-03-21 14:24:31 -0400 |
commit | b68a6ba469daae89fcf651d5ec44cc1821a014e4 (patch) | |
tree | 90036fd5ab280ee1ea396c019b01127518bdb7bb | |
parent | 0a3ce5f73842714de9bc29719ae5f965901bd1de (diff) | |
download | ffmpeg-b68a6ba469daae89fcf651d5ec44cc1821a014e4.tar.gz |
ffmpeg: send only one rect per packet when encoding ASS
The packet and rect formats are identical,
so there's no support for multiple rects per packet.
-rw-r--r-- | fftools/ffmpeg.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index d721a5e721..438bee8fef 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1072,6 +1072,8 @@ static void do_subtitle_out(OutputFile *of, /* XXX: signal it in the codec context ? */ if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) nb = 2; + else if (enc->codec_id == AV_CODEC_ID_ASS) + nb = FFMAX(sub->num_rects, 1); else nb = 1; @@ -1080,7 +1082,7 @@ static void do_subtitle_out(OutputFile *of, if (output_files[ost->file_index]->start_time != AV_NOPTS_VALUE) pts -= output_files[ost->file_index]->start_time; for (i = 0; i < nb; i++) { - unsigned save_num_rects = sub->num_rects; + AVSubtitle local_sub = *sub; if (!check_recording_time(ost, pts, AV_TIME_BASE_Q)) return; @@ -1089,19 +1091,22 @@ static void do_subtitle_out(OutputFile *of, if (ret < 0) report_and_exit(AVERROR(ENOMEM)); - sub->pts = pts; + local_sub.pts = pts; // start_display_time is required to be 0 - sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); - sub->end_display_time -= sub->start_display_time; - sub->start_display_time = 0; - if (i == 1) - sub->num_rects = 0; + local_sub.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); + local_sub.end_display_time -= sub->start_display_time; + local_sub.start_display_time = 0; + + if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE && i == 1) + local_sub.num_rects = 0; + else if (enc->codec_id == AV_CODEC_ID_ASS && sub->num_rects > 0) { + local_sub.num_rects = 1; + local_sub.rects += i; + } ost->frames_encoded++; - subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, sub); - if (i == 1) - sub->num_rects = save_num_rects; + subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, &local_sub); if (subtitle_out_size < 0) { av_log(ost, AV_LOG_FATAL, "Subtitle encoding failed\n"); exit_program(1); |