void avi_reader_c::parse_subtitle_chunks() { int i; for (i = 0; AVI_text_tracks(m_avi) > i; ++i) { AVI_set_text_track(m_avi, i); if (AVI_text_chunks(m_avi) == 0) continue; int chunk_size = AVI_read_text_chunk(m_avi, nullptr); if (0 >= chunk_size) continue; memory_cptr chunk(memory_c::alloc(chunk_size)); chunk_size = AVI_read_text_chunk(m_avi, reinterpret_cast<char *>(chunk->get_buffer())); if (0 >= chunk_size) continue; avi_subs_demuxer_t demuxer; try { mm_mem_io_c io(chunk->get_buffer(), chunk_size); uint32_t tag = io.read_uint32_be(); if (GAB2_TAG != tag) continue; io.skip(1); while (!io.eof() && (io.getFilePointer() < static_cast<size_t>(chunk_size))) { uint16_t id = io.read_uint16_le(); int len = io.read_uint32_le(); if (GAB2_ID_SUBTITLES == id) { demuxer.m_subtitles = memory_c::alloc(len); len = io.read(demuxer.m_subtitles->get_buffer(), len); demuxer.m_subtitles->set_size(len); } else io.skip(len); } if (0 != demuxer.m_subtitles->get_size()) { mm_text_io_c text_io(new mm_mem_io_c(demuxer.m_subtitles->get_buffer(), demuxer.m_subtitles->get_size())); demuxer.m_type = srt_parser_c::probe(&text_io) ? avi_subs_demuxer_t::TYPE_SRT : ssa_parser_c::probe(&text_io) ? avi_subs_demuxer_t::TYPE_SSA : avi_subs_demuxer_t::TYPE_UNKNOWN; if (avi_subs_demuxer_t::TYPE_UNKNOWN != demuxer.m_type) m_subtitle_demuxers.push_back(demuxer); } } catch (...) { } } }
timecode_factory_cptr timecode_factory_c::create_fps_factory(int64_t default_duration, const std::string &source_name, int64_t tid) { mm_text_io_c text_io(new mm_mem_io_c(NULL, 0, 1024)); text_io.puts("# timecode format v1\n"); text_io.puts(boost::format("assume %1%\n") % to_string(1000000000.0 / default_duration, 9)); text_io.setFilePointer(0, seek_beginning); timecode_factory_cptr factory(new timecode_factory_v1_c("dummy", source_name, tid)); factory->parse(text_io); return factory; }
void avi_reader_c::identify_attachments() { size_t i; for (i = 0; m_subtitle_demuxers.size() > i; ++i) { try { avi_subs_demuxer_t &demuxer = m_subtitle_demuxers[i]; mm_text_io_c text_io(new mm_mem_io_c(demuxer.m_subtitles->get_buffer(), demuxer.m_subtitles->get_size())); ssa_parser_c parser(this, &text_io, m_ti.m_fname, i + 1 + AVI_audio_tracks(m_avi)); parser.set_attachment_id_base(g_attachments.size()); parser.parse(); } catch (...) { } } for (i = 0; i < g_attachments.size(); i++) id_result_attachment(g_attachments[i].ui_id, g_attachments[i].mime_type, g_attachments[i].data->get_size(), g_attachments[i].name, g_attachments[i].description); }