comparison 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
comparison
equal deleted inserted replaced
32390:b33aed46ecda 32391:b4c3659d16b1
26 #include "mpcommon.h" 26 #include "mpcommon.h"
27 #include "path.h" 27 #include "path.h"
28 #include "subreader.h" 28 #include "subreader.h"
29 29
30 #include "ass_mp.h" 30 #include "ass_mp.h"
31 #include "eosd.h"
32 #include "mpcommon.h"
33 #include "libvo/sub.h"
31 #include "help_mp.h" 34 #include "help_mp.h"
32 #include "libvo/font_load.h" 35 #include "libvo/font_load.h"
33 #include "stream/stream.h" 36 #include "stream/stream.h"
34 37
35 #ifdef CONFIG_FONTCONFIG 38 #ifdef CONFIG_FONTCONFIG
311 ass_set_font_scale(priv, ass_font_scale); 314 ass_set_font_scale(priv, ass_font_scale);
312 ass_force_reload = 0; 315 ass_force_reload = 0;
313 } 316 }
314 return ass_render_frame(priv, track, now, detect_change); 317 return ass_render_frame(priv, track, now, detect_change);
315 } 318 }
319
320 /* EOSD source for ASS subtitles. */
321
322 static ASS_Renderer *ass_renderer;
323 static int prev_visibility;
324
325 static void eosd_ass_update(struct mp_eosd_source *src, const struct mp_eosd_settings *res, double ts)
326 {
327 long long ts_ms = (ts + sub_delay) * 1000 + .5;
328 ASS_Image *aimg;
329 struct mp_eosd_image *img;
330 if (res->changed) {
331 double dar = (double) (res->w - res->ml - res->mr) / (res->h - res->mt - res->mb);
332 ass_configure(ass_renderer, res->w, res->h, res->unscaled);
333 ass_set_margins(ass_renderer, res->mt, res->mb, res->ml, res->mr);
334 ass_set_aspect_ratio(ass_renderer, dar, (double)res->srcw / res->srch);
335 }
336 aimg = sub_visibility && ass_track && ts != MP_NOPTS_VALUE ?
337 ass_mp_render_frame(ass_renderer, ass_track, ts_ms, &src->changed) :
338 NULL;
339 if (!aimg != !src->images)
340 src->changed = 2;
341 if (src->changed) {
342 eosd_image_remove_all(src);
343 while (aimg) {
344 img = eosd_image_alloc();
345 img->w = aimg->w;
346 img->h = aimg->h;
347 img->bitmap = aimg->bitmap;
348 img->stride = aimg->stride;
349 img->color = aimg->color;
350 img->dst_x = aimg->dst_x;
351 img->dst_y = aimg->dst_y;
352 eosd_image_append(src, img);
353 aimg = aimg->next;
354 }
355 }
356 prev_visibility = sub_visibility;
357 }
358
359 static void eosd_ass_uninit(struct mp_eosd_source *src)
360 {
361 eosd_image_remove_all(src);
362 ass_renderer_done(ass_renderer);
363 }
364
365 static struct mp_eosd_source eosd_ass = {
366 .uninit = eosd_ass_uninit,
367 .update = eosd_ass_update,
368 .z_index = 10,
369 };
370
371 void eosd_ass_init(ASS_Library *ass_library)
372 {
373 ass_renderer = ass_renderer_init(ass_library);
374 if (!ass_renderer)
375 return;
376 ass_configure_fonts(ass_renderer);
377 eosd_register(&eosd_ass);
378 }