summaryrefslogtreecommitdiffstats
path: root/sub/img_convert.c
diff options
context:
space:
mode:
Diffstat (limited to 'sub/img_convert.c')
-rw-r--r--sub/img_convert.c198
1 files changed, 1 insertions, 197 deletions
diff --git a/sub/img_convert.c b/sub/img_convert.c
index 9437226c64..aa5c89401a 100644
--- a/sub/img_convert.c
+++ b/sub/img_convert.c
@@ -33,140 +33,11 @@
struct osd_conv_cache {
struct sub_bitmap part;
struct sub_bitmap *parts;
- // for osd_conv_cache_alloc_old_p() (SUBBITMAP_PLANAR)
- int allocated, stride;
- struct old_osd_planar bmp;
- // for osd_conv_idx_to_old_p(), a spudec.c handle
- void *spudec;
};
-static int osd_conv_cache_destroy(void *p)
-{
- struct osd_conv_cache *c = p;
- av_free(c->bmp.bitmap);
- av_free(c->bmp.alpha);
- if (c->spudec)
- spudec_free(c->spudec);
- return 0;
-}
-
struct osd_conv_cache *osd_conv_cache_new(void)
{
- struct osd_conv_cache *c = talloc_zero(NULL, struct osd_conv_cache);
- talloc_set_destructor(c, &osd_conv_cache_destroy);
- return c;
-}
-
-// allocates/enlarges the alpha/bitmap buffer
-static void osd_conv_cache_alloc_old_p(struct osd_conv_cache *c, int w, int h)
-{
- assert(w > 0 && h > 0);
- c->stride = (w + 7) & (~7);
- int len = c->stride * h;
- if (c->allocated < len) {
- av_free(c->bmp.bitmap);
- av_free(c->bmp.alpha);
- c->allocated = len;
- c->bmp.bitmap = av_malloc(len);
- c->bmp.alpha = av_malloc(len);
- }
- memset(c->bmp.bitmap, sub_bg_color, len);
- memset(c->bmp.alpha, sub_bg_alpha, len);
- c->part = (struct sub_bitmap) {
- .bitmap = &c->bmp,
- .stride = c->stride,
- .w = w, .h = h,
- .dw = w, .dh = h,
- };
-}
-
-static void draw_alpha_ass_to_old(unsigned char *src, int src_w, int src_h,
- int src_stride, unsigned char *dst_a,
- unsigned char *dst_i, size_t dst_stride,
- int dst_x, int dst_y, uint32_t color)
-{
- const unsigned int r = (color >> 24) & 0xff;
- const unsigned int g = (color >> 16) & 0xff;
- const unsigned int b = (color >> 8) & 0xff;
- const unsigned int a = 0xff - (color & 0xff);
-
- int gray = (r + g + b) / 3; // not correct
-
- dst_a += dst_y * dst_stride + dst_x;
- dst_i += dst_y * dst_stride + dst_x;
-
- int src_skip = src_stride - src_w;
- int dst_skip = dst_stride - src_w;
-
- for (int y = 0; y < src_h; y++) {
- for (int x = 0; x < src_w; x++) {
- unsigned char as = (*src * a) >> 8;
- unsigned char bs = (gray * as) >> 8;
- // to mplayer scale
- as = -as;
-
- unsigned char *a = dst_a;
- unsigned char *b = dst_i;
-
- // NOTE: many special cases, because alpha=0 means transparency,
- // while alpha=1..255 is opaque..transparent
- if (as) {
- *b = ((*b * as) >> 8) + bs;
- if (*a) {
- *a = (*a * as) >> 8;
- if (*a < 1)
- *a = 1;
- } else {
- *a = as;
- }
- }
-
- dst_a++;
- dst_i++;
- src++;
- }
- dst_a += dst_skip;
- dst_i += dst_skip;
- src += src_skip;
- }
-}
-
-static void render_ass_to_old(unsigned char *a, unsigned char *i,
- size_t stride, int x, int y,
- struct sub_bitmaps *imgs)
-{
- for (int n = 0; n < imgs->num_parts; n++) {
- struct sub_bitmap *p = &imgs->parts[n];
- draw_alpha_ass_to_old(p->bitmap, p->w, p->h, p->stride, a, i, stride,
- x + p->x, y + p->y, p->libass.color);
- }
-}
-
-// SUBBITMAP_LIBASS -> SUBBITMAP_OLD_PLANAR
-bool osd_conv_ass_to_old_p(struct osd_conv_cache *c, struct sub_bitmaps *imgs)
-{
- struct sub_bitmaps src = *imgs;
- if (src.format != SUBBITMAP_LIBASS || src.scaled)
- return false;
-
- imgs->format = SUBBITMAP_OLD_PLANAR;
- imgs->num_parts = 0;
- imgs->parts = NULL;
-
- int x1, y1, x2, y2;
- if (!sub_bitmaps_bb(&src, &x1, &y1, &x2, &y2))
- return true;
-
- osd_conv_cache_alloc_old_p(c, x2 - x1, y2 - y1);
-
- render_ass_to_old(c->bmp.alpha, c->bmp.bitmap, c->stride, -x1, -y1, &src);
-
- c->part.x = x1;
- c->part.y = y1;
-
- imgs->parts = &c->part;
- imgs->num_parts = 1;
- return true;
+ return talloc_zero(NULL, struct osd_conv_cache);
}
static void rgba_to_premultiplied_rgba(uint32_t *colors, size_t count)
@@ -216,70 +87,3 @@ bool osd_conv_idx_to_rgba(struct osd_conv_cache *c, struct sub_bitmaps *imgs)
}
return true;
}
-
-bool osd_conv_idx_to_old_p(struct osd_conv_cache *c, struct sub_bitmaps *imgs,
- int screen_w, int screen_h)
-{
- struct sub_bitmaps src = *imgs;
- if (src.format != SUBBITMAP_INDEXED)
- return false;
-
- imgs->format = SUBBITMAP_OLD_PLANAR;
- imgs->num_parts = 0;
- imgs->parts = NULL;
- if (src.num_parts == 0)
- return true;
-
- // assume they are all evenly scaled (and size 0 is not possible)
- // could put more effort into it to reduce rounding errors, but it doesn't
- // make much sense anyway
- struct sub_bitmap *s0 = &src.parts[0];
- double scale_x = (double)s0->w / s0->dw;
- double scale_y = (double)s0->h / s0->dh;
- double scale = FFMIN(scale_x, scale_y);
-
- int xmin, ymin, xmax, ymax;
-
- xmin = ymin = INT_MAX;
- xmax = ymax = INT_MIN;
- for (int n = 0; n < src.num_parts; n++) {
- struct sub_bitmap *s = &src.parts[n];
- int sx = s->x * scale;
- int sy = s->y * scale;
- xmin = FFMIN(xmin, sx);
- ymin = FFMIN(ymin, sy);
- xmax = FFMAX(xmax, sx + s->w);
- ymax = FFMAX(ymax, sy + s->h);
- }
-
- int w = xmax - xmin;
- int h = ymax - ymin;
-
- struct spu_packet_t *packet = spudec_packet_create(xmin, ymin, w, h);
- if (!packet)
- return false;
- spudec_packet_clear(packet);
- for (int n = 0; n < src.num_parts; n++) {
- struct sub_bitmap *s = &src.parts[n];
- struct osd_bmp_indexed *sb = s->bitmap;
- int sx = s->x * scale;
- int sy = s->y * scale;
- assert(sx >= xmin);
- assert(sy >= ymin);
- assert(sx - xmin + s->w <= w);
- assert(sy - ymin + s->h <= h);
- // assumes sub-images are not overlapping
- spudec_packet_fill(packet, sb->bitmap, s->stride, sb->palette,
- sx - xmin, sy - ymin, s->w, s->h);
- }
- if (!c->spudec)
- c->spudec = spudec_new_scaled(NULL, 0, 0, NULL, 0);
- spudec_packet_send(c->spudec, packet, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
- spudec_set_res(c->spudec, screen_w * scale, screen_h * scale);
- spudec_heartbeat(c->spudec, 0);
- spudec_get_bitmap(c->spudec, screen_w, screen_h, imgs);
- imgs->render_index = src.render_index;
- imgs->bitmap_id = src.bitmap_id;
- imgs->bitmap_pos_id = src.bitmap_pos_id;
- return true;
-}