Commit b359093488 for ffmpeg

commit b3590934887c100404878cf9b697a200b4bde103
Author: Ruk Doe <info@doany.io>
Date:   Sat Oct 10 16:18:22 2026 +0900

    avcodec/libaribcaption: place single rect ass like the multi rect mode

    In multi rect mode each region position is made non-negative by adding
    the plane size when it is negative. Single rect mode instead took the
    minimum of the raw positions, then fixed only y. A negative x, or a mix
    of negative and non-negative y, put the single rect elsewhere than the
    regions it holds. Normalize each region position first, as multi rect
    mode does.

    Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01DdDiDRusmi6eD7qSrKBjHb

diff --git a/libavcodec/libaribcaption.c b/libavcodec/libaribcaption.c
index 5cc00619b6..6a1a0848c5 100644
--- a/libavcodec/libaribcaption.c
+++ b/libavcodec/libaribcaption.c
@@ -582,6 +582,15 @@ static void set_ass_color(AVBPrint *buf, int color_num,
                                           0xFF - ARIBCC_COLOR_A(new_color));
 }

+/* position of a region, keeping the existing wrapping of negative values
+   in ass mode */
+static void region_position(const ARIBCaptionContext *ctx,
+                            const aribcc_caption_region_t *region, int *x, int *y)
+{
+    *x = region->x < 0 ? region->x + ctx->plane_width  : region->x;
+    *y = region->y < 0 ? region->y + ctx->plane_height : region->y;
+}
+
 static int aribcaption_trans_ass_subtitle(ARIBCaptionContext *ctx)
 {
     AVSubtitle *sub = ctx->sub;
@@ -615,16 +624,13 @@ static int aribcaption_trans_ass_subtitle(ARIBCaptionContext *ctx)
         for (int i = 0; i < ctx->caption.region_count; i++) {
             if (ctx->caption.regions[i].is_ruby && ctx->ignore_ruby)
                 continue;
-            rx = ctx->caption.regions[i].x;
-            ry = ctx->caption.regions[i].y;
+            region_position(ctx, &ctx->caption.regions[i], &rx, &ry);
             if (rx < x)
                 x = rx;
             if (ry < y)
                 y = ry;
         }
         av_bprintf(&buf, "{\\an7}");
-        if (y < 0)
-            y += ctx->plane_height;
         if (x > 0 || y > 0)
             av_bprintf(&buf, "{\\pos(%d,%d)}", x, y);
     }
@@ -651,12 +657,8 @@ static int aribcaption_trans_ass_subtitle(ARIBCaptionContext *ctx)
         emitted = true;

         if (!single_rect) {
-            int x = region->x;
-            int y = region->y;
-            if (x < 0)
-                x += ctx->plane_width;
-            if (y < 0)
-                y += ctx->plane_height;
+            int x, y;
+            region_position(ctx, region, &x, &y);
             av_bprint_clear(&buf);
             av_bprintf(&buf, "{\\an7}");
             if (x > 0 || y > 0)