[PR] libaribcaption: emit an empty subtitle for an explicit clear in BITMAP mode (PR #24067)

5ym via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178633768324.59.10216198474229250894@29965ddac10e>
PR #24067 opened by 5ym
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24067
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24067.patch

An ARIB caption statement whose data units contain only CS (clear screen)
decodes to a caption with region_count == 0.  In SUBTITLE_TEXT mode this is
translated into a rect holding "" so that the previous caption is erased.
In SUBTITLE_BITMAP mode nothing is rendered, the function returns 0 and
*got_sub_ptr is left at 0, so the caller never learns that the caption ended.

Broadcasters send such a statement at the end of every caption segment (for
example when going to a commercial break).  Combined with wait_duration ==
ARIBCC_DURATION_INDEFINITE, which maps to end_display_time = UINT32_MAX, the
last caption of a segment stays on screen until the next one arrives - in a
real recording that was 22 minutes later.

Report an empty subtitle (num_rects = 0) in that case, which sub2video and
the usual subtitle consumers already treat as "erase".

# Summary of changes

Briefly describe what this PR does and why.

<!--
If this PR requires new FATE test samples, attach them to the PR and
list their target paths below (relative to the fate-suite root).

Attached filenames must match the sample's filename:

```fate-samples
# e.g. vorbis/new-sample.ogg
```
-->



>From db032398dd3ba29ecda20ad48f722cf72498dc15 Mon Sep 17 00:00:00 2001
From: Ruk Doe <[email protected]>
Date: Mon, 10 Aug 2026 13:42:57 +0900
Subject: [PATCH] libaribcaption: emit an empty subtitle for an explicit clear
 in BITMAP mode

An ARIB caption statement whose data units contain only CS (clear screen)
decodes to a caption with region_count == 0.  In SUBTITLE_TEXT mode this is
translated into a rect holding "" so that the previous caption is erased.
In SUBTITLE_BITMAP mode nothing is rendered, the function returns 0 and
*got_sub_ptr is left at 0, so the caller never learns that the caption ended.

Broadcasters send such a statement at the end of every caption segment (for
example when going to a commercial break).  Combined with wait_duration ==
ARIBCC_DURATION_INDEFINITE, which maps to end_display_time = UINT32_MAX, the
last caption of a segment stays on screen until the next one arrives - in a
real recording that was 22 minutes later.

Report an empty subtitle (num_rects = 0) in that case, which sub2video and
the usual subtitle consumers already treat as "erase".
---
 libavcodec/libaribcaption.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/libavcodec/libaribcaption.c b/libavcodec/libaribcaption.c
index 66d18b9d38..739e048842 100644
--- a/libavcodec/libaribcaption.c
+++ b/libavcodec/libaribcaption.c
@@ -360,6 +360,14 @@ static int aribcaption_trans_bitmap_subtitle(ARIBCaptionContext *ctx)
 
     case ARIBCC_RENDER_STATUS_NO_IMAGE:
         ff_dlog(ctx, "no image\n");
+        /* A caption carrying no region is an explicit clear screen (CS).
+           Report an empty subtitle so that the previously displayed bitmap
+           is erased; the TEXT path already does this by emitting "". */
+        if (ctx->caption.region_count == 0) {
+            sub->format = 0; /* graphic */
+            sub->num_rects = 0;
+            return 1;
+        }
         return 0;
 
     case ARIBCC_RENDER_STATUS_ERROR:
@@ -377,6 +385,11 @@ static int aribcaption_trans_bitmap_subtitle(ARIBCaptionContext *ctx)
     if (!ctx->render_result.image_count || ctx->render_result.images == NULL) {
         aribcc_render_result_cleanup(&ctx->render_result);
         ff_dlog(ctx, "no image (%d)\n", ctx->render_result.image_count);
+        if (ctx->caption.region_count == 0) {
+            sub->format = 0; /* graphic */
+            sub->num_rects = 0;
+            return 1;
+        }
         return 0;
     }
 
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.