#include "config.h" #include "mputils.h" #include #include #include #include #include #include #ifdef CONFIG_ENCA #include #endif void my_mp_msg(int lvl, char *lvl_str, char *fmt, ...) { va_list va; if(lvl > MSGL_V) return; printf("[ass] **%s**: ", lvl_str); va_start(va, fmt); vprintf(fmt, va); va_end(va); } unsigned utf8_get_char(char **str) { uint8_t *strp = (uint8_t *)*str; unsigned c = *strp++; unsigned mask = 0x80; int len = -1; while (c & mask) { mask >>= 1; len++; } if (len <= 0 || len > 4) goto no_utf8; c &= mask - 1; while ((*strp & 0xc0) == 0x80) { if (len-- <= 0) goto no_utf8; c = (c << 6) | (*strp++ & 0x3f); } if (len) goto no_utf8; *str = (char *)strp; return c; no_utf8: strp = (uint8_t *)*str; c = *strp++; *str = (char *)strp; return c; } // gaussian blur void blur( unsigned char *buffer, unsigned short *tmp2, int width, int height, int stride, int *m2, int r, int mwidth) { int x, y; unsigned char *s = buffer; unsigned short *t = tmp2+1; for(y=0; y>8; unsigned *m3= m2 + src2*mwidth; int mx; *srcp= 128; for(mx=r-1; mx>8; unsigned *m3= m2 + src2*mwidth; int mx; *srcp= 128; for(mx=0; mx>8; unsigned *m3= m2 + src2*mwidth; int mx; *srcp= 128; for(mx=0; mx>8; } s+= stride; t+= width + 1; } } #ifdef CONFIG_ENCA void* guess_buffer_cp(unsigned char* buffer, int buflen, char *preferred_language, char *fallback) { const char **languages; size_t langcnt; EncaAnalyser analyser; EncaEncoding encoding; char *detected_sub_cp = NULL; int i; languages = enca_get_languages(&langcnt); mp_msg(MSGT_ASS, MSGL_V, "ENCA supported languages: "); for (i = 0; i < langcnt; i++) { mp_msg(MSGT_ASS, MSGL_V, "%s ", languages[i]); } mp_msg(MSGT_ASS, MSGL_V, "\n"); for (i = 0; i < langcnt; i++) { const char *tmp; if (strcasecmp(languages[i], preferred_language) != 0) continue; analyser = enca_analyser_alloc(languages[i]); encoding = enca_analyse_const(analyser, buffer, buflen); tmp = enca_charset_name(encoding.charset, ENCA_NAME_STYLE_ICONV); if (tmp && encoding.charset != ENCA_CS_UNKNOWN) { detected_sub_cp = strdup(tmp); mp_msg(MSGT_ASS, MSGL_INFO, "ENCA detected charset: %s\n", tmp); } enca_analyser_free(analyser); } free(languages); if (!detected_sub_cp) { detected_sub_cp = strdup(fallback); mp_msg(MSGT_ASS, MSGL_INFO, "ENCA detection failed: fallback to %s\n", fallback); } return detected_sub_cp; } #endif