summaryrefslogtreecommitdiffstats
path: root/sub
diff options
context:
space:
mode:
Diffstat (limited to 'sub')
-rw-r--r--sub/dec_sub.c3
-rw-r--r--sub/dec_sub.h49
-rw-r--r--sub/sd_ass.c28
-rw-r--r--sub/sd_lavc.c5
4 files changed, 67 insertions, 18 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 4a048b27a6..31b06b9b80 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -62,7 +62,8 @@ void sub_get_bitmaps(struct osd_state *osd, struct sub_bitmaps *res)
{
struct MPOpts *opts = osd->opts;
- *res = (struct sub_bitmaps){ .type = SUBBITMAP_EMPTY,
+ *res = (struct sub_bitmaps){ .render_index = 0,
+ .format = SUBBITMAP_EMPTY,
.bitmap_id = osd->bitmap_id,
.bitmap_pos_id = osd->bitmap_pos_id };
if (!opts->sub_visibility || !osd->sh_sub || !osd->sh_sub->active) {
diff --git a/sub/dec_sub.h b/sub/dec_sub.h
index c71a2348aa..df6aaf9b91 100644
--- a/sub/dec_sub.h
+++ b/sub/dec_sub.h
@@ -1,14 +1,22 @@
#ifndef MPLAYER_DEC_SUB_H
#define MPLAYER_DEC_SUB_H
+#include <stdbool.h>
+#include <stdint.h>
+
+#define MAX_OSD_PARTS 8
+
struct sh_sub;
struct osd_state;
struct ass_track;
-enum sub_bitmap_type {
+enum sub_bitmap_format {
SUBBITMAP_EMPTY,
- SUBBITMAP_LIBASS,
- SUBBITMAP_RGBA,
+ SUBBITMAP_LIBASS, // A8, with a per-surface blend color (libass.color)
+ SUBBITMAP_RGBA, // B8G8R8A8
+ SUBBITMAP_OLD, // I8A8 (monochrome), premultiplied alpha
+
+ SUBBITMAP_COUNT
};
typedef struct mp_eosd_res {
@@ -16,21 +24,34 @@ typedef struct mp_eosd_res {
int mt, mb, ml, mr; // borders (top, bottom, left, right)
} mp_eosd_res_t;
+struct sub_bitmap {
+ void *bitmap;
+ int stride;
+ int w, h;
+ int x, y;
+ // Note: not clipped, going outside the screen area is allowed
+ int dw, dh;
+
+ union {
+ struct {
+ uint32_t color;
+ } libass;
+ };
+};
+
typedef struct sub_bitmaps {
- enum sub_bitmap_type type;
+ int render_index; // for VO cache state (limited by MAX_OSD_PARTS)
- struct ass_image *imgs;
+ enum sub_bitmap_format format;
+ bool scaled; // if false, dw==w && dh==h
- struct sub_bitmap {
- int w, h;
- int x, y;
- // Note: not clipped, going outside the screen area is allowed
- int dw, dh;
- void *bitmap;
- } *parts;
- int part_count;
+ struct sub_bitmap *parts;
+ int num_parts;
+
+ // Provided for VOs with old code
+ struct ass_image *imgs;
- bool scaled;
+ // Incremented on each change
int bitmap_id, bitmap_pos_id;
} mp_eosd_images_t;
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 9295cab07d..aa190ee4ac 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -36,6 +36,7 @@ struct sd_ass_priv {
struct ass_track *ass_track;
bool vsfilter_aspect;
bool incomplete_event;
+ struct sub_bitmap *parts;
};
static void free_last_event(ASS_Track *track)
@@ -147,7 +148,32 @@ static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
res->bitmap_id = ++res->bitmap_pos_id;
else if (changed)
res->bitmap_pos_id++;
- res->type = SUBBITMAP_LIBASS;
+ res->format = SUBBITMAP_LIBASS;
+
+ int num_parts = 0;
+ int num_parts_alloc = MP_TALLOC_ELEMS(ctx->parts);
+ struct ass_image *img = res->imgs;
+ while (img) {
+ if (img->w == 0 || img->h == 0)
+ continue;
+ if (num_parts >= num_parts_alloc) {
+ num_parts_alloc = FFMAX(num_parts_alloc * 2, 32);
+ ctx->parts = talloc_realloc(ctx, ctx->parts, struct sub_bitmap,
+ num_parts_alloc);
+ }
+ struct sub_bitmap *p = &ctx->parts[num_parts];
+ p->bitmap = img->bitmap;
+ p->stride = img->stride;
+ p->libass.color = img->color;
+ p->dw = p->w = img->w;
+ p->dh = p->h = img->h;
+ p->x = img->dst_x;
+ p->y = img->dst_y;
+ img = img->next;
+ num_parts++;
+ }
+ res->parts = ctx->parts;
+ res->num_parts = num_parts;
}
static void reset(struct sh_sub *sh, struct osd_state *osd)
diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c
index 1da33ffca1..39e4891fb1 100644
--- a/sub/sd_lavc.c
+++ b/sub/sd_lavc.c
@@ -175,6 +175,7 @@ static void decode(struct sh_sub *sh, struct osd_state *osd, void *data,
uint32_t *outbmp = talloc_size(priv->inbitmaps,
r->w * r->h * 4);
b->bitmap = outbmp;
+ b->stride = r->w * 4;
b->w = r->w;
b->h = r->h;
b->x = r->x;
@@ -233,13 +234,13 @@ static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
SET(bo->dh, bi->h * yscale);
}
res->parts = priv->outbitmaps;
- res->part_count = priv->count;
+ res->num_parts = priv->count;
if (priv->bitmaps_changed)
res->bitmap_id = ++res->bitmap_pos_id;
else if (pos_changed)
res->bitmap_pos_id++;
priv->bitmaps_changed = false;
- res->type = SUBBITMAP_RGBA;
+ res->format = SUBBITMAP_RGBA;
res->scaled = xscale != 1 || yscale != 1;
}