diff ass_mp.c @ 32391:b4c3659d16b1

Use a dynamic list for the sources of EOSD elements.
author cigaes
date Sun, 10 Oct 2010 09:27:11 +0000
parents f6ff1c427ff3
children b3110e526e19
line wrap: on
line diff
--- a/ass_mp.c	Sat Oct 09 17:52:35 2010 +0000
+++ b/ass_mp.c	Sun Oct 10 09:27:11 2010 +0000
@@ -28,6 +28,9 @@
 #include "subreader.h"
 
 #include "ass_mp.h"
+#include "eosd.h"
+#include "mpcommon.h"
+#include "libvo/sub.h"
 #include "help_mp.h"
 #include "libvo/font_load.h"
 #include "stream/stream.h"
@@ -313,3 +316,63 @@
 	}
 	return ass_render_frame(priv, track, now, detect_change);
 }
+
+/* EOSD source for ASS subtitles. */
+
+static ASS_Renderer *ass_renderer;
+static int prev_visibility;
+
+static void eosd_ass_update(struct mp_eosd_source *src, const struct mp_eosd_settings *res, double ts)
+{
+	long long ts_ms = (ts + sub_delay) * 1000 + .5;
+	ASS_Image *aimg;
+	struct mp_eosd_image *img;
+	if (res->changed) {
+		double dar = (double) (res->w - res->ml - res->mr) / (res->h - res->mt - res->mb);
+		ass_configure(ass_renderer, res->w, res->h, res->unscaled);
+		ass_set_margins(ass_renderer, res->mt, res->mb, res->ml, res->mr);
+		ass_set_aspect_ratio(ass_renderer, dar, (double)res->srcw / res->srch);
+	}
+	aimg = sub_visibility && ass_track && ts != MP_NOPTS_VALUE ?
+		ass_mp_render_frame(ass_renderer, ass_track, ts_ms, &src->changed) :
+		NULL;
+	if (!aimg != !src->images)
+		src->changed = 2;
+	if (src->changed) {
+		eosd_image_remove_all(src);
+		while (aimg) {
+			img = eosd_image_alloc();
+			img->w      = aimg->w;
+			img->h      = aimg->h;
+			img->bitmap = aimg->bitmap;
+			img->stride = aimg->stride;
+			img->color  = aimg->color;
+			img->dst_x  = aimg->dst_x;
+			img->dst_y  = aimg->dst_y;
+			eosd_image_append(src, img);
+			aimg = aimg->next;
+		}
+	}
+	prev_visibility = sub_visibility;
+}
+
+static void eosd_ass_uninit(struct mp_eosd_source *src)
+{
+	eosd_image_remove_all(src);
+	ass_renderer_done(ass_renderer);
+}
+
+static struct mp_eosd_source eosd_ass = {
+	.uninit  = eosd_ass_uninit,
+	.update  = eosd_ass_update,
+	.z_index = 10,
+};
+
+void eosd_ass_init(ASS_Library *ass_library)
+{
+	ass_renderer = ass_renderer_init(ass_library);
+	if (!ass_renderer)
+		return;
+	ass_configure_fonts(ass_renderer);
+	eosd_register(&eosd_ass);
+}