mirror of https://git.ffmpeg.org/ffmpeg.git
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.
This commit is contained in:
parent
0a3ce5f738
commit
b68a6ba469
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue