diff options
Diffstat (limited to 'sub')
-rw-r--r-- | sub/img_convert.c | 2 | ||||
-rw-r--r-- | sub/osd.h | 16 | ||||
-rw-r--r-- | sub/sd_lavc.c | 13 |
3 files changed, 30 insertions, 1 deletions
diff --git a/sub/img_convert.c b/sub/img_convert.c index 2015e49ca6..348811e773 100644 --- a/sub/img_convert.c +++ b/sub/img_convert.c @@ -80,6 +80,7 @@ bool osd_scale_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) talloc_free(c->parts); imgs->parts = c->parts = talloc_array(c, struct sub_bitmap, src.num_parts); + imgs->packed = NULL; // Note: we scale all parts, since most likely all need scaling anyway, and // to get a proper copy of all data in the imgs list. @@ -158,6 +159,7 @@ bool osd_conv_ass_to_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs) imgs->format = SUBBITMAP_RGBA; imgs->parts = c->part; imgs->num_parts = num_bb; + imgs->packed = NULL; size_t newsize = 0; for (int n = 0; n < num_bb; n++) { @@ -42,6 +42,11 @@ struct sub_bitmap { int x, y; int dw, dh; + // If the containing struct sub_bitmaps has the packed field set, then this + // is the position within the source. (Strictly speaking this is redundant + // with the bitmap pointer.) + int src_x, src_y; + struct { uint32_t color; } libass; @@ -60,6 +65,17 @@ struct sub_bitmaps { struct sub_bitmap *parts; int num_parts; + // Packed representation of the bitmap data. If non-NULL, then the + // parts[].bitmap pointer points into the image data here (and stride will + // correspond to packed->stride[0]). + // SUBBITMAP_RGBA: IMGFMT_BGRA (exact match) + // Other formats have this set to NULL. + struct mp_image *packed; + + // Bounding box for the packed image. All parts will be within the bounding + // box. (The origin of the box is at (0,0).) + int packed_w, packed_h; + int change_id; // Incremented on each change }; diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c index cc72efc54d..b7420d33c6 100644 --- a/sub/sd_lavc.c +++ b/sub/sd_lavc.c @@ -44,6 +44,7 @@ struct sub { struct sub_bitmap *inbitmaps; int count; struct mp_image *data; + int bound_w, bound_h; int src_w, src_h; double pts; double endpts; @@ -254,7 +255,10 @@ static void read_sub_bitmaps(struct sd *sd, struct sub *sub) struct pos bb[2]; packer_get_bb(priv->packer, bb); - if (!sub->data || sub->data->w < bb[1].x || sub->data->h < bb[1].y) { + sub->bound_w = bb[1].x; + sub->bound_h = bb[1].y; + + if (!sub->data || sub->data->w < sub->bound_w || sub->data->h < sub->bound_h) { talloc_free(sub->data); sub->data = mp_image_alloc(IMGFMT_BGRA, priv->packer->w, priv->packer->h); if (!sub->data) { @@ -279,6 +283,8 @@ static void read_sub_bitmaps(struct sd *sd, struct sub *sub) b->h = r->h; b->x = r->x; b->y = r->y; + b->src_x = pos.x; + b->src_y = pos.y; b->stride = sub->data->stride[0]; b->bitmap = sub->data->planes[0] + pos.y * b->stride + pos.x * 4; @@ -307,6 +313,8 @@ static void read_sub_bitmaps(struct sd *sd, struct sub *sub) } b->bitmap = (char*)b->bitmap - extend * b->stride - extend * 4; + b->src_x -= extend; + b->src_y -= extend; b->x -= extend; b->y -= extend; b->w += extend * 2; @@ -443,6 +451,9 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res d, double pts, if (priv->displayed_id != current->id) res->change_id++; priv->displayed_id = current->id; + res->packed = current->data; + res->packed_w = current->bound_w; + res->packed_h = current->bound_h; res->format = SUBBITMAP_RGBA; double video_par = 0; |