1 /* 2 mkvextract -- extract tracks from Matroska files into other files 3 4 Distributed under the GPL v2 5 see the file COPYING for details 6 or visit https://www.gnu.org/licenses/old-licenses/gpl-2.0.html 7 8 extracts tracks from Matroska files into other files 9 10 Written by Moritz Bunkus <moritz@bunkus.org>. 11 */ 12 13 #pragma once 14 15 #include "common/common_pch.h" 16 17 #include "common/xml/xml.h" 18 #include "extract/xtr_base.h" 19 20 class xtr_srt_c: public xtr_base_c { 21 public: 22 int m_num_entries; 23 std::string m_sub_charset; 24 charset_converter_cptr m_conv; 25 26 struct { 27 int64_t m_timestamp{}, m_duration{}; 28 std::string m_text; 29 } m_entry; 30 31 public: 32 xtr_srt_c(const std::string &codec_id, int64_t tid, track_spec_t &tspec); 33 34 virtual void create_file(xtr_base_c *master, libmatroska::KaxTrackEntry &track); 35 virtual void handle_frame(xtr_frame_t &f); 36 get_container_name()37 virtual const char *get_container_name() { 38 return "SRT text subtitles"; 39 }; 40 41 virtual void flush_entry(); 42 }; 43 44 class xtr_ssa_c: public xtr_base_c { 45 public: 46 class ssa_line_c { 47 public: 48 std::string m_line; 49 int m_num; 50 51 bool operator < (const ssa_line_c &cmp) const { 52 return m_num < cmp.m_num; 53 } 54 ssa_line_c(std::string line,int num)55 ssa_line_c(std::string line, int num) 56 : m_line(line) 57 , m_num(num) 58 { } 59 }; 60 61 std::vector<std::string> m_ssa_format; 62 std::vector<ssa_line_c> m_lines; 63 std::string m_sub_charset, m_priv_post_events; 64 charset_converter_cptr m_conv; 65 bool m_warning_printed; 66 unsigned int m_num_fields; 67 68 public: 69 xtr_ssa_c(const std::string &codec_id, int64_t tid, track_spec_t &tspec); 70 71 virtual void create_file(xtr_base_c *master, libmatroska::KaxTrackEntry &track); 72 virtual void handle_frame(xtr_frame_t &f); 73 virtual void finish_file(); 74 get_container_name()75 virtual const char *get_container_name() { 76 return "SSA/ASS text subtitles"; 77 }; 78 }; 79 80 class xtr_usf_c: public xtr_base_c { 81 private: 82 struct usf_entry_t { 83 std::string m_text; 84 int64_t m_start, m_end; 85 usf_entry_tusf_entry_t86 usf_entry_t(const std::string &text, int64_t start, int64_t end): 87 m_text(text), m_start(start), m_end(end) { } 88 }; 89 90 std::string m_sub_charset, m_simplified_sub_charset, m_codec_private, m_language; 91 mtx::xml::document_cptr m_doc; 92 std::vector<usf_entry_t> m_entries; 93 94 public: 95 xtr_usf_c(const std::string &codec_id, int64_t tid, track_spec_t &tspec); 96 97 virtual void create_file(xtr_base_c *master, libmatroska::KaxTrackEntry &track); 98 virtual void handle_frame(xtr_frame_t &f); 99 virtual void finish_track(); 100 virtual void finish_file(); 101 get_container_name()102 virtual const char *get_container_name() { 103 return "XML (USF text subtitles)"; 104 }; 105 }; 106