From f0446eeeb2c1d8c58bfda935e58099c7e7df8757 Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 4 Nov 2012 15:39:48 +0100 Subject: [PATCH] libspark/libeplayer: rudimentary subtitle support, probably unstable --- libeplayer3/container/container_ass.c | 37 +++++++++++++++++++++++++ libeplayer3/include/subtitle.h | 3 ++ libeplayer3/output/writer/framebuffer.c | 10 +++++++ 3 files changed, 50 insertions(+) diff --git a/libeplayer3/container/container_ass.c b/libeplayer3/container/container_ass.c index d2ace9e..ab0a7eb 100644 --- a/libeplayer3/container/container_ass.c +++ b/libeplayer3/container/container_ass.c @@ -76,7 +76,11 @@ if (debug_level >= level) printf("[%s:%s] " fmt, FILENAME, __FUNCTION__, ## x); #define ASS_RING_SIZE 5 +#ifdef MARTII +#define ASS_FONT "/share/fonts/neutrino.ttf" +#else #define ASS_FONT "/usr/share/fonts/FreeSans.ttf" +#endif /* ***************************** */ /* Types */ @@ -383,14 +387,22 @@ static void ASSThread(Context_t *context) { continue; } +#ifndef MARTII getMutex(__LINE__); +#endif //FIXME: durch den sleep bleibt die cpu usage zw. 5 und 13%, ohne // steigt sie bei Verwendung von subtiteln bis auf 95%. // ich hoffe dadurch gehen keine subtitle verloren, wenn die playPts // durch den sleep verschlafen wird. Besser wäre es den nächsten // subtitel zeitpunkt zu bestimmen und solange zu schlafen. +#ifdef MARTII + usleep(10000); + getMutex(__LINE__); + checkRegions(); +#else usleep(1000); +#endif if(ass_renderer && ass_track) img = ass_render_frame(ass_renderer, ass_track, playPts / 90.0, &change); @@ -415,7 +427,11 @@ static void ASSThread(Context_t *context) { if (ass_track && ass_track->events) { +#ifdef MARTII + undisplay = now + (ass_track->events->Duration + 500) / 90000; +#else undisplay = now + ass_track->events->Duration / 1000 + 0.5; +#endif } ass_printf(100, "w %d h %d s %d x %d y %d c %d chg %d now %ld und %ld\n", @@ -532,12 +548,21 @@ static void ASSThread(Context_t *context) { } /* cleanup no longer used but not overwritten regions */ +#ifdef MARTII + getMutex(__LINE__); +#endif checkRegions(); +#ifdef MARTII + releaseMutex(__LINE__); +#endif } /* while */ hasPlayThreadStarted = 0; ass_printf(10, "terminating\n"); +#ifdef MARTII +pthread_exit(NULL); +#endif } /* **************************** */ @@ -615,10 +640,18 @@ int container_ass_init(Context_t *context) } ass_set_use_margins(ass_renderer, 0 ); +#ifdef MARTII + ass_set_font_scale(ass_renderer, (ass_font_scale * screen_height) / 240.0); +#else ass_set_font_scale(ass_renderer, ass_font_scale); +#endif ass_set_hinting(ass_renderer, ASS_HINTING_LIGHT); +#ifdef MARTII + ass_set_line_spacing(ass_renderer, (ass_line_spacing * screen_height) / 240.0); +#else ass_set_line_spacing(ass_renderer, ass_line_spacing); +#endif ass_set_fonts(ass_renderer, ASS_FONT, "Arial", 0, NULL, 1); if(threeDMode == 0){ @@ -657,6 +690,10 @@ int container_ass_process_data(Context_t *context, SubtitleData_t* data) ass_err("error creating ass_track\n"); return cERR_CONTAINER_ASS_ERROR; } +#ifdef MARTII + ass_track->PlayResX = screen_width; + ass_track->PlayResY = screen_height; +#endif } if ((data->extradata) && (first_kiss)) diff --git a/libeplayer3/include/subtitle.h b/libeplayer3/include/subtitle.h index 00a92cc..2b7afdb 100644 --- a/libeplayer3/include/subtitle.h +++ b/libeplayer3/include/subtitle.h @@ -36,6 +36,9 @@ Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text static inline unsigned char* text_to_ass(char *text, long long int pts, double duration) { char buf[1024]; +#ifdef MARTII + unsigned +#endif int x,pos=0; for(x=0;x