ASS_Track *mp_ass_read_stream(ASS_Library *library, const char *fname, char *charset) { ASS_Track *track; struct stream *s = open_stream(fname, NULL, NULL); if (!s) // Stream code should have printed an error already return NULL; struct bstr content = stream_read_complete(s, NULL, 100000000, 1); if (content.start == NULL) mp_tmsg(MSGT_ASS, MSGL_ERR, "Refusing to load subtitle file " "larger than 100 MB: %s\n", fname); free_stream(s); if (content.len == 0) { talloc_free(content.start); return NULL; } content.start[content.len] = 0; track = ass_read_memory(library, content.start, content.len, charset); if (track) { free(track->name); track->name = strdup(fname); } talloc_free(content.start); return track; }
csri_inst *csri_open_mem(csri_rend *renderer, const void *data, size_t length, struct csri_openflag *flags) { csri_inst *rv; if (renderer != &csri_libass) return NULL; rv = (csri_inst *)malloc(sizeof(csri_inst)); if (!rv) return NULL; rv->ass_renderer = ass_renderer_init(renderer->ass_library); if (!rv->ass_renderer) { free(rv); return NULL; } ass_set_font_scale(rv->ass_renderer, 1.); ass_set_fonts(rv->ass_renderer, NULL, "Sans"); rv->ass_track = ass_read_memory(csri_libass.ass_library, (void *)data, length, "UTF-8"); if (!rv->ass_track) { ass_renderer_done(rv->ass_renderer); free(rv); return NULL; } return rv; }
/// @brief Load subtitles /// @param subs /// void LibassSubtitlesProvider::LoadSubtitles(AssFile *subs) { // Prepare subtitles std::vector<char> data; subs->SaveMemory(data); // Load file if (ass_track) ass_free_track(ass_track); ass_track = ass_read_memory(ass_library, &data[0], data.size(),(char *)"UTF-8"); if (!ass_track) throw "libass failed to load subtitles."; }
ASS_Track *mp_ass_read_stream(ASS_Library *library, const char *fname, char *charset) { int i; char *buf = NULL; ASS_Track *track; size_t sz = 0; size_t buf_alloc = 0; stream_t *fd; fd = open_stream(fname, NULL, NULL); if (!fd) // Stream code should have printed an error already return NULL; if (fd->end_pos > STREAM_BUFFER_SIZE) /* read entire file if size is known */ buf_alloc = fd->end_pos; else buf_alloc = 1000; for (;;) { if (sz > 100000000) { mp_tmsg(MSGT_ASS, MSGL_ERR, "Refusing to load subtitle file " "larger than 100 MB: %s\n", fname); sz = 0; break; } buf_alloc = FFMAX(buf_alloc, sz + (sz >> 1)); buf_alloc = FFMIN(buf_alloc, 100000001); buf = realloc(buf, buf_alloc + 1); i = stream_read(fd, buf + sz, buf_alloc - sz); if (i <= 0) break; sz += i; } free_stream(fd); if (!sz) { free(buf); return NULL; } buf[sz] = 0; buf = realloc(buf, sz + 1); track = ass_read_memory(library, buf, sz, charset); if (track) { free(track->name); track->name = strdup(fname); } free(buf); return track; }
bool CDVDSubtitlesLibass::CreateTrack(char* buf, size_t size) { CSingleLock lock(m_section); if(!m_library) { CLog::Log(LOGERROR, "CDVDSubtitlesLibass: %s - No ASS library struct", __FUNCTION__); return false; } CLog::Log(LOGINFO, "SSA Parser: Creating m_track from SSA buffer"); m_track = ass_read_memory(m_library, buf, size, 0); if(m_track == NULL) return false; return true; }
ASS_Track* ass_read_stream(ASS_Library* library, const char *fname, char *charset) { char *buf = NULL; ASS_Track *track; size_t sz = 0; size_t buf_alloc = 0; stream_t *fd; fd = open_stream(fname, NULL, NULL); if (!fd) { mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FopenFailed, fname); return NULL; } if (fd->end_pos > STREAM_BUFFER_SIZE) /* read entire file if size is known */ buf_alloc = fd->end_pos; for (;;) { int i; if (buf_alloc >= 100*1024*1024) { mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_RefusingToLoadSubtitlesLargerThan100M, fname); sz = 0; break; } if (buf_alloc < sz + STREAM_BUFFER_SIZE) buf_alloc += STREAM_BUFFER_SIZE; buf = realloc(buf, buf_alloc + 1); i = stream_read(fd, buf + sz, buf_alloc - sz); if (i <= 0) break; sz += i; } free_stream(fd); if (!sz) { free(buf); return NULL; } buf[sz] = 0; buf = realloc(buf, sz + 1); track = ass_read_memory(library, buf, sz, charset); if (track) { free(track->name); track->name = strdup(fname); } free(buf); return track; }
bool SubtitleProcessorLibASS::process(QIODevice *dev) { if (!ass::api::loaded()) return false; if (m_track) { ass_free_track(m_track); m_track = 0; } if (!dev->isOpen()) { if (!dev->open(QIODevice::ReadOnly)) { qWarning() << "open qiodevice error: " << dev->errorString(); return false; } } QByteArray data(dev->readAll()); m_track = ass_read_memory(m_ass, (char*)data.constData(), data.size(), NULL); //utf-8 if (!m_track) { qWarning("ass_read_memory error, ass track init failed!"); return false; } processTrack(m_track); return true; }
int main(int argc, char *argv[]) { POINT mouse; //while (true) { GetCursorPos(&mouse); printf("\r%d-%d ", mouse.x, mouse.y); } return interlace_RGB(); return matrix(); // char URI[] = "//mnt/sdcard/%E9%98%BF%E4%B8%BD%E4%BA%9A%E5%A8%9C%E5%90%89%E5%88%A9%E6%96%AF-%20Shake%E8%8B%B9%E6%9E%9C.3dv"; char URI[] = "//mnt/sdcard/HELLO!.3dv"; char decoded_URI[1024]; URIDecode(URI, decoded_URI, sizeof(decoded_URI)); char k = 0xef; bool a = k == 0xef; const int frame_w = 1920; const int frame_h = 1080; setlocale(LC_ALL, "CHS"); if (argc < 4) { printf("usage: %s <image file> <subtitle file> <time>\n", argv[0]); exit(1); } char *imgfile = argv[1]; char *subfile = argv[2]; double tm = strtod(argv[3], 0); FILE * f = fopen(subfile, "rb"); fseek(f, 0, SEEK_END); int file_size = ftell(f); fseek(f, 0, SEEK_SET); char *src = (char*)malloc(file_size); char *utf8 = (char*)malloc(file_size*3); fread(src, 1, file_size, f); fclose(f); int utf8_size = ConvertToUTF8(src, file_size, utf8, file_size*3); ass_library = ass_library_init(); if (!ass_library) { printf("ass_library_init failed!\n"); exit(1); } //ass_set_message_cb(ass_library, msg_callback, NULL); //ass_set_extract_fonts(ass_library, 0); //ass_set_style_overrides(ass_library, NULL); ass_renderer = ass_renderer_init(ass_library); if (!ass_renderer) { printf("ass_renderer_init failed!\n"); exit(1); } ass_set_frame_size(ass_renderer, frame_w, frame_h); ass_set_font_scale(ass_renderer, 1.0); //ass_set_hinting(ass_renderer, ASS_HINTING_NORMAL); ass_set_fonts(ass_renderer, "Arial", "Sans", 1, "Z:\\fonts.conf", 1); ASS_Track *track = ass_read_memory(ass_library, utf8, utf8_size, NULL); free(src); free(utf8); if (!track) { printf("track init failed!\n"); return 1; } ASS_Image *img = NULL; int n = 0; int changed = 0; image_t *frame = gen_image(frame_w, frame_h); int n2 = 0; int l = GetTickCount(); timeBeginPeriod(1); for(int i=0; i<int(tm*1000); i+=40) { img = ass_render_frame(ass_renderer, track, i, &changed); if (n==0) l = GetTickCount(); if (changed && img) { int l = timeGetTime(); n++; memset(frame->buffer, 63, frame->stride * frame->height); blend(frame, img); wchar_t pathname[MAX_PATH]; wsprintfW(pathname, L"Z:\\ass%02d.bmp", n); save_bitmap((DWORD*)frame->buffer, pathname, frame_w, frame_h); //printf("\rrender cost %dms.\t\t\n", timeGetTime()-l); } n2 ++; if (i%10000 == 0) printf("\r%d/%d ms rendered, %d frame output.", i, int(tm*1000), n); } ass_free_track(track); ass_renderer_done(ass_renderer); ass_library_done(ass_library); free(frame->buffer); free(frame); return 0; }