void scan_Clean( scan_t *p_scan ) { if( p_scan->p_dialog != NULL ) dialog_ProgressDestroy( p_scan->p_dialog ); for( int i = 0; i < p_scan->i_service; i++ ) scan_service_Delete( p_scan->pp_service[i] ); TAB_CLEAN( p_scan->i_service, p_scan->pp_service ); }
void FontConfig_BuildCache( filter_t *p_filter ) { /* */ msg_Dbg( p_filter, "Building font databases."); mtime_t t1, t2; t1 = mdate(); #ifdef __OS2__ FcInit(); #endif #if defined( _WIN32 ) || defined( __APPLE__ ) dialog_progress_bar_t *p_dialog = NULL; FcConfig *fcConfig = FcInitLoadConfig(); p_dialog = dialog_ProgressCreate( p_filter, _("Building font cache"), _("Please wait while your font cache is rebuilt.\n" "This should take less than a few minutes."), NULL ); /* if( p_dialog ) dialog_ProgressSet( p_dialog, NULL, 0.5 ); */ FcConfigBuildFonts( fcConfig ); #if defined( __APPLE__ ) // By default, scan only the directory /System/Library/Fonts. // So build the set of available fonts under another directories, // and add the set to the current configuration. FcConfigAppFontAddDir( NULL, "~/Library/Fonts" ); FcConfigAppFontAddDir( NULL, "/Library/Fonts" ); FcConfigAppFontAddDir( NULL, "/Network/Library/Fonts" ); //FcConfigAppFontAddDir( NULL, "/System/Library/Fonts" ); #endif if( p_dialog ) { // dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); p_dialog = NULL; } #endif t2 = mdate(); msg_Dbg( p_filter, "Took %ld microseconds", (long)((t2 - t1)) ); }
int FontConfig_Prepare( filter_t *p_filter ) { /* */ msg_Dbg( p_filter, "Building font databases."); mtime_t t1, t2; t1 = mdate(); #ifdef __OS2__ FcInit(); #endif #if defined( _WIN32 ) dialog_progress_bar_t *p_dialog = NULL; FcConfig *fcConfig = FcInitLoadConfig(); p_dialog = dialog_ProgressCreate( p_filter, _("Building font cache"), _("Please wait while your font cache is rebuilt.\n" "This should take less than a few minutes."), NULL ); /* if( p_dialog ) dialog_ProgressSet( p_dialog, NULL, 0.5 ); */ if( FcConfigBuildFonts( fcConfig ) == FcFalse ) return VLC_ENOMEM; if( p_dialog ) { // dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); p_dialog = NULL; } #endif t2 = mdate(); msg_Dbg( p_filter, "Took %ld microseconds", (long)((t2 - t1)) ); return VLC_SUCCESS; }
/***************************************************************************** * Create: Open libass decoder. *****************************************************************************/ static int Create( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys; if( p_dec->fmt_in.i_codec != VLC_CODEC_SSA ) return VLC_EGENERIC; p_dec->pf_decode_sub = DecodeBlock; p_dec->pf_flush = Flush; p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; /* */ vlc_mutex_init( &p_sys->lock ); p_sys->i_refcount = 1; memset( &p_sys->fmt, 0, sizeof(p_sys->fmt) ); p_sys->i_max_stop = VLC_TS_INVALID; p_sys->p_library = NULL; p_sys->p_renderer = NULL; p_sys->p_track = NULL; /* Create libass library */ ASS_Library *p_library = p_sys->p_library = ass_library_init(); if( !p_library ) { msg_Warn( p_dec, "Libass library creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } /* load attachments */ input_attachment_t **pp_attachments; int i_attachments; if( decoder_GetInputAttachments( p_dec, &pp_attachments, &i_attachments )) { i_attachments = 0; pp_attachments = NULL; } for( int k = 0; k < i_attachments; k++ ) { input_attachment_t *p_attach = pp_attachments[k]; bool found = false; /* Check mimetype*/ if( !strcasecmp( p_attach->psz_mime, "application/x-truetype-font" ) ) found = true; /* Then extension */ else if( !found && strlen( p_attach->psz_name ) > 4 ) { char *ext = p_attach->psz_name + strlen( p_attach->psz_name ) - 4; if( !strcasecmp( ext, ".ttf" ) || !strcasecmp( ext, ".otf" ) || !strcasecmp( ext, ".ttc" ) ) found = true; } if( found ) { msg_Dbg( p_dec, "adding embedded font %s", p_attach->psz_name ); ass_add_font( p_sys->p_library, p_attach->psz_name, p_attach->p_data, p_attach->i_data ); } vlc_input_attachment_Delete( p_attach ); } free( pp_attachments ); ass_set_extract_fonts( p_library, true ); ass_set_style_overrides( p_library, NULL ); /* Create the renderer */ ASS_Renderer *p_renderer = p_sys->p_renderer = ass_renderer_init( p_library ); if( !p_renderer ) { msg_Warn( p_dec, "Libass renderer creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_set_use_margins( p_renderer, false); //if( false ) // ass_set_margins( p_renderer, int t, int b, int l, int r); ass_set_hinting( p_renderer, ASS_HINTING_LIGHT ); ass_set_font_scale( p_renderer, 1.0 ); ass_set_line_spacing( p_renderer, 0.0 ); #if defined( __ANDROID__ ) const char *psz_font = "/system/fonts/DroidSans-Bold.ttf"; const char *psz_family = "Droid Sans Bold"; #elif defined( __APPLE__ ) const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Helvetica Neue"; /* Use HN if we can't find anything more suitable - Arial is not on all Apple platforms */ #else const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ #endif #ifdef HAVE_FONTCONFIG #if defined(_WIN32) dialog_progress_bar_t *p_dialog = dialog_ProgressCreate( p_dec, _("Building font cache"), _( "Please wait while your font cache is rebuilt.\n" "This should take less than a minute." ), NULL ); #endif ass_set_fonts( p_renderer, psz_font, psz_family, 1, NULL, 1 ); // setup default font/family #if defined(_WIN32) if( p_dialog ) { dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); } #endif #else ass_set_fonts( p_renderer, psz_font, psz_family, 1, NULL, 1 ); #endif /* Add a track */ ASS_Track *p_track = p_sys->p_track = ass_new_track( p_sys->p_library ); if( !p_track ) { DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_process_codec_private( p_track, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra ); p_dec->fmt_out.i_cat = SPU_ES; p_dec->fmt_out.i_codec = VLC_CODEC_RGBA; return VLC_SUCCESS; }
static ass_handle_t *AssHandleHold( decoder_t *p_dec ) { vlc_mutex_lock( &libass_lock ); ass_handle_t *p_ass = NULL; ASS_Library *p_library = NULL; ASS_Renderer *p_renderer = NULL; vlc_value_t val; var_Create( p_dec->p_libvlc, "libass-handle", VLC_VAR_ADDRESS ); if( var_Get( p_dec->p_libvlc, "libass-handle", &val ) ) val.p_address = NULL; if( val.p_address ) { p_ass = val.p_address; p_ass->i_refcount++; vlc_mutex_unlock( &libass_lock ); return p_ass; } /* */ p_ass = malloc( sizeof(*p_ass) ); if( !p_ass ) goto error; /* */ p_ass->p_libvlc = VLC_OBJECT(p_dec->p_libvlc); p_ass->i_refcount = 1; /* Create libass library */ p_ass->p_library = p_library = ass_library_init(); if( !p_library ) goto error; /* load attachments */ input_attachment_t **pp_attachments; int i_attachments; if( decoder_GetInputAttachments( p_dec, &pp_attachments, &i_attachments )) { i_attachments = 0; pp_attachments = NULL; } for( int k = 0; k < i_attachments; k++ ) { input_attachment_t *p_attach = pp_attachments[k]; if( !strcasecmp( p_attach->psz_mime, "application/x-truetype-font" ) ) { msg_Dbg( p_dec, "adding embedded font %s", p_attach->psz_name ); ass_add_font( p_ass->p_library, p_attach->psz_name, p_attach->p_data, p_attach->i_data ); } vlc_input_attachment_Delete( p_attach ); } free( pp_attachments ); ass_set_extract_fonts( p_library, true ); ass_set_style_overrides( p_library, NULL ); /* Create the renderer */ p_ass->p_renderer = p_renderer = ass_renderer_init( p_library ); if( !p_renderer ) goto error; ass_set_use_margins( p_renderer, false); //if( false ) // ass_set_margins( p_renderer, int t, int b, int l, int r); ass_set_hinting( p_renderer, ASS_HINTING_LIGHT ); ass_set_font_scale( p_renderer, 1.0 ); ass_set_line_spacing( p_renderer, 0.0 ); const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ #ifdef HAVE_FONTCONFIG #if defined(WIN32) dialog_progress_bar_t *p_dialog = dialog_ProgressCreate( p_dec, _("Building font cache"), _( "Please wait while your font cache is rebuilt.\n" "This should take less than a minute." ), NULL ); if( p_dialog ) dialog_ProgressSet( p_dialog, NULL, 0.2 ); #endif #if defined( LIBASS_VERSION ) && LIBASS_VERSION >= 0x00907000 ass_set_fonts( p_renderer, psz_font, psz_family, true, NULL, 1 ); // setup default font/family #else ass_set_fonts( p_renderer, psz_font, psz_family ); // setup default font/family #endif #ifdef WIN32 if( p_dialog ) { dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); p_dialog = NULL; } #endif #else /* FIXME you HAVE to give him a font if no fontconfig */ #if defined( LIBASS_VERSION ) && LIBASS_VERSION >= 0x00907000 ass_set_fonts( p_renderer, psz_font, psz_family, false, NULL, 1 ); #else ass_set_fonts_nofc( p_renderer, psz_font, psz_family ); #endif #endif memset( &p_ass->fmt, 0, sizeof(p_ass->fmt) ); /* */ val.p_address = p_ass; var_Set( p_dec->p_libvlc, "libass-handle", val ); /* */ vlc_mutex_unlock( &libass_lock ); return p_ass; error: if( p_renderer ) ass_renderer_done( p_renderer ); if( p_library ) ass_library_done( p_library ); msg_Warn( p_dec, "Libass creation failed" ); free( p_ass ); vlc_mutex_unlock( &libass_lock ); return NULL; }
/***************************************************************************** * Create: Open libass decoder. *****************************************************************************/ static int Create( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys; if( p_dec->fmt_in.i_codec != VLC_CODEC_SSA ) return VLC_EGENERIC; p_dec->pf_decode_sub = DecodeBlock; p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; /* */ vlc_mutex_init( &p_sys->lock ); p_sys->i_refcount = 1; memset( &p_sys->fmt, 0, sizeof(p_sys->fmt) ); p_sys->i_max_stop = VLC_TS_INVALID; p_sys->p_library = NULL; p_sys->p_renderer = NULL; p_sys->p_track = NULL; /* Create libass library */ ASS_Library *p_library = p_sys->p_library = ass_library_init(); if( !p_library ) { msg_Warn( p_dec, "Libass library creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } /* load attachments */ input_attachment_t **pp_attachments; int i_attachments; if( decoder_GetInputAttachments( p_dec, &pp_attachments, &i_attachments )) { i_attachments = 0; pp_attachments = NULL; } for( int k = 0; k < i_attachments; k++ ) { input_attachment_t *p_attach = pp_attachments[k]; if( !strcasecmp( p_attach->psz_mime, "application/x-truetype-font" ) ) { msg_Dbg( p_dec, "adding embedded font %s", p_attach->psz_name ); ass_add_font( p_sys->p_library, p_attach->psz_name, p_attach->p_data, p_attach->i_data ); } vlc_input_attachment_Delete( p_attach ); } free( pp_attachments ); ass_set_extract_fonts( p_library, true ); ass_set_style_overrides( p_library, NULL ); /* Create the renderer */ ASS_Renderer *p_renderer = p_sys->p_renderer = ass_renderer_init( p_library ); if( !p_renderer ) { msg_Warn( p_dec, "Libass renderer creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_set_use_margins( p_renderer, false); //if( false ) // ass_set_margins( p_renderer, int t, int b, int l, int r); ass_set_hinting( p_renderer, ASS_HINTING_LIGHT ); ass_set_font_scale( p_renderer, 1.0 ); ass_set_line_spacing( p_renderer, 0.0 ); const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ #ifdef ANDROID /* is this useful? */ ass_set_fonts_dir( p_library, "/system/fonts" ); /* don't crash libass */ psz_font = "/system/fonts/DroidSansFallback.ttf"; #endif #ifdef HAVE_FONTCONFIG #if defined(WIN32) dialog_progress_bar_t *p_dialog = dialog_ProgressCreate( p_dec, _("Building font cache"), _( "Please wait while your font cache is rebuilt.\n" "This should take less than a minute." ), NULL ); if( p_dialog ) dialog_ProgressSet( p_dialog, NULL, 0.2 ); #endif ass_set_fonts( p_renderer, psz_font, psz_family, true, NULL, 1 ); // setup default font/family #ifdef WIN32 if( p_dialog ) { dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); } #endif #else /* FIXME you HAVE to give him a font if no fontconfig */ ass_set_fonts( p_renderer, psz_font, psz_family, false, NULL, 1 ); #endif /* Add a track */ ASS_Track *p_track = p_sys->p_track = ass_new_track( p_sys->p_library ); if( !p_track ) { DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_process_codec_private( p_track, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra ); p_dec->fmt_out.i_cat = SPU_ES; p_dec->fmt_out.i_codec = VLC_CODEC_RGBA; return VLC_SUCCESS; }
/***************************************************************************** * Create: Open libass decoder. *****************************************************************************/ static int Create( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys; if( p_dec->fmt_in.i_codec != VLC_CODEC_SSA ) return VLC_EGENERIC; p_dec->pf_decode_sub = DecodeBlock; p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; /* */ vlc_mutex_init( &p_sys->lock ); p_sys->i_refcount = 1; memset( &p_sys->fmt, 0, sizeof(p_sys->fmt) ); p_sys->i_max_stop = VLC_TS_INVALID; p_sys->p_library = NULL; p_sys->p_renderer = NULL; p_sys->p_track = NULL; /* Create libass library */ ASS_Library *p_library = p_sys->p_library = ass_library_init(); if( !p_library ) { msg_Warn( p_dec, "Libass library creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } /* load attachments */ input_attachment_t **pp_attachments; int i_attachments; if( decoder_GetInputAttachments( p_dec, &pp_attachments, &i_attachments )) { i_attachments = 0; pp_attachments = NULL; } for( int k = 0; k < i_attachments; k++ ) { input_attachment_t *p_attach = pp_attachments[k]; bool found = false; /* Check mimetype*/ if( !strcasecmp( p_attach->psz_mime, "application/x-truetype-font" ) ) found = true; /* Then extension */ else if( !found && strlen( p_attach->psz_name ) > 4 ) { char *ext = p_attach->psz_name + strlen( p_attach->psz_name ) - 4; if( !strcasecmp( ext, ".ttf" ) || !strcasecmp( ext, ".otf" ) || !strcasecmp( ext, ".ttc" ) ) found = true; } if( found ) { msg_Dbg( p_dec, "adding embedded font %s", p_attach->psz_name ); ass_add_font( p_sys->p_library, p_attach->psz_name, p_attach->p_data, p_attach->i_data ); } vlc_input_attachment_Delete( p_attach ); } free( pp_attachments ); ass_set_extract_fonts( p_library, true ); ass_set_style_overrides( p_library, NULL ); /* Create the renderer */ ASS_Renderer *p_renderer = p_sys->p_renderer = ass_renderer_init( p_library ); if( !p_renderer ) { msg_Warn( p_dec, "Libass renderer creation failed" ); DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_set_use_margins( p_renderer, false); //if( false ) // ass_set_margins( p_renderer, int t, int b, int l, int r); ass_set_hinting( p_renderer, ASS_HINTING_LIGHT ); ass_set_font_scale( p_renderer, 1.0 ); ass_set_line_spacing( p_renderer, 0.0 ); #if defined( __ANDROID__ ) const char *psz_font = "/system/fonts/DroidSans-Bold.ttf"; const char *psz_family = "Droid Sans Bold"; #elif defined (__APPLE__) #if !TARGET_OS_IPHONE const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ #else CFURLRef fileURL; fileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("OpenSans-Regular.ttf"), NULL, NULL); if (!fileURL) return VLC_EGENERIC; CFStringRef urlString = CFURLCopyFileSystemPath(fileURL, kCFURLPOSIXPathStyle); CFRelease(fileURL); if (!urlString) return VLC_EGENERIC; CFIndex length = CFStringGetLength(urlString); if (!length) return VLC_EGENERIC; length++; char *psz_path = (char *)malloc(length); CFStringGetCString(urlString, psz_path, length, kCFStringEncodingUTF8); CFRelease(urlString); const char *psz_font = (const char *)strdup(psz_path); free(psz_path); const char *psz_family = "Open Sans"; #endif #else const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ #endif #ifdef HAVE_FONTCONFIG #if defined(_WIN32) || defined(__APPLE__) dialog_progress_bar_t *p_dialog = dialog_ProgressCreate( p_dec, _("Building font cache"), _( "Please wait while your font cache is rebuilt.\n" "This should take less than a minute." ), NULL ); #endif ass_set_fonts( p_renderer, psz_font, psz_family, true, NULL, 1 ); // setup default font/family #if defined(_WIN32) || defined(__APPLE__) if( p_dialog ) { dialog_ProgressSet( p_dialog, NULL, 1.0 ); dialog_ProgressDestroy( p_dialog ); } #endif #else /* FIXME you HAVE to give him a font if no fontconfig */ ass_set_fonts( p_renderer, psz_font, psz_family, false, NULL, 1 ); #endif /* Add a track */ ASS_Track *p_track = p_sys->p_track = ass_new_track( p_sys->p_library ); if( !p_track ) { DecSysRelease( p_sys ); return VLC_EGENERIC; } ass_process_codec_private( p_track, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra ); p_dec->fmt_out.i_cat = SPU_ES; p_dec->fmt_out.i_codec = VLC_CODEC_RGBA; return VLC_SUCCESS; }