Mercurial > mplayer.hg
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 } |