* [FFmpeg-devel] [PATCH 1/2] ffmpeg: send only one rect per packet when encoding ASS
@ 2023-03-08 21:36 rcombs
2023-03-08 21:36 ` [FFmpeg-devel] [PATCH 2/2] lavc/ass: error if not passed exactly 1 rect rcombs
0 siblings, 1 reply; 2+ messages in thread
From: rcombs @ 2023-03-08 21:36 UTC (permalink / raw)
To: ffmpeg-devel
The packet and rect formats are identical,
so there's no support for multiple rects per packet.
---
fftools/ffmpeg.c | 25 +++++++++++++++----------
1 file 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);
--
2.39.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 2+ messages in thread
* [FFmpeg-devel] [PATCH 2/2] lavc/ass: error if not passed exactly 1 rect
2023-03-08 21:36 [FFmpeg-devel] [PATCH 1/2] ffmpeg: send only one rect per packet when encoding ASS rcombs
@ 2023-03-08 21:36 ` rcombs
0 siblings, 0 replies; 2+ messages in thread
From: rcombs @ 2023-03-08 21:36 UTC (permalink / raw)
To: ffmpeg-devel
This never produced valid output.
---
libavcodec/assenc.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/libavcodec/assenc.c b/libavcodec/assenc.c
index db6fd25dd7..41332d33fb 100644
--- a/libavcodec/assenc.c
+++ b/libavcodec/assenc.c
@@ -45,27 +45,26 @@ static int ass_encode_frame(AVCodecContext *avctx,
unsigned char *buf, int bufsize,
const AVSubtitle *sub)
{
- int i, len, total_len = 0;
+ int len;
- for (i=0; i<sub->num_rects; i++) {
- const char *ass = sub->rects[i]->ass;
-
- if (sub->rects[i]->type != SUBTITLE_ASS) {
- av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
- return AVERROR(EINVAL);
- }
+ if (sub->num_rects != 0) {
+ av_log(avctx, AV_LOG_ERROR, "Only one rect per AVSubtitle is supported in ASS.\n");
+ return AVERROR_INVALIDDATA;
+ }
- len = av_strlcpy(buf+total_len, ass, bufsize-total_len);
+ if (sub->rects[0]->type != SUBTITLE_ASS) {
+ av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
+ return AVERROR(EINVAL);
+ }
- if (len > bufsize-total_len-1) {
- av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
- return AVERROR_BUFFER_TOO_SMALL;
- }
+ len = av_strlcpy(buf, sub->rects[0]->ass, bufsize);
- total_len += len;
+ if (len > bufsize - 1) {
+ av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
+ return AVERROR_BUFFER_TOO_SMALL;
}
- return total_len;
+ return len;
}
#if CONFIG_SSA_ENCODER
--
2.39.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-03-08 21:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-08 21:36 [FFmpeg-devel] [PATCH 1/2] ffmpeg: send only one rect per packet when encoding ASS rcombs
2023-03-08 21:36 ` [FFmpeg-devel] [PATCH 2/2] lavc/ass: error if not passed exactly 1 rect rcombs
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git