1 /*
2    mkvmerge -- utility for splicing together matroska files
3    from component media subtypes
4 
5    Distributed under the GPL v2
6    see the file COPYING for details
7    or visit https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
8 
9    WebVTT subtitle reader
10 
11    Written by Moritz Bunkus <moritz@bunkus.org>.
12 */
13 
14 #include "common/common_pch.h"
15 
16 #include "common/codec.h"
17 #include "common/id_info.h"
18 #include "common/mm_proxy_io.h"
19 #include "common/mm_text_io.h"
20 #include "input/r_webvtt.h"
21 #include "output/p_webvtt.h"
22 #include "merge/input_x.h"
23 
24 bool
probe_file()25 webvtt_reader_c::probe_file() {
26   return m_in->getline(100).find("WEBVTT") == 0;
27 }
28 
29 void
read_headers()30 webvtt_reader_c::read_headers() {
31   show_demuxer_info();
32 }
33 
34 void
parse_file()35 webvtt_reader_c::parse_file() {
36   auto size    = m_in->get_size() - m_in->getFilePointer();
37   auto content = m_in->read(size);
38 
39   m_parser     = std::make_shared<mtx::webvtt::parser_c>();
40 
41   m_parser->add_joined_lines(*content);
42   m_parser->flush();
43 
44   m_bytes_to_process = m_parser->get_total_number_of_bytes();
45 }
46 
47 void
create_packetizer(int64_t)48 webvtt_reader_c::create_packetizer(int64_t) {
49   if (!demuxing_requested('s', 0) || !m_reader_packetizers.empty())
50     return;
51 
52   parse_file();
53 
54   m_ti.m_private_data = m_parser->get_codec_private();
55 
56   add_packetizer(new webvtt_packetizer_c(this, m_ti));
57 
58   show_packetizer_info(0, ptzr(0));
59 }
60 
61 file_status_e
read(generic_packetizer_c *,bool)62 webvtt_reader_c::read(generic_packetizer_c *,
63                       bool) {
64   if (!m_parser->cue_available())
65     return FILE_STATUS_DONE;
66 
67   auto cue    = m_parser->get_cue();
68   auto packet = std::make_shared<packet_t>(cue->m_content, cue->m_start.to_ns(), cue->m_duration.to_ns());
69 
70   if (cue->m_addition) {
71     m_bytes_processed += cue->m_addition->get_size();
72     packet->data_adds.emplace_back(cue->m_addition);
73   }
74 
75   m_bytes_processed += cue->m_content->get_size();
76 
77   ptzr(0).process(packet);
78 
79   return FILE_STATUS_MOREDATA;
80 }
81 
82 int64_t
get_progress()83 webvtt_reader_c::get_progress() {
84   return m_bytes_processed;
85 }
86 
87 int64_t
get_maximum_progress()88 webvtt_reader_c::get_maximum_progress() {
89   return m_bytes_to_process;
90 }
91 
92 void
identify()93 webvtt_reader_c::identify() {
94   auto info = mtx::id::info_c{};
95   info.add(mtx::id::text_subtitles, true);
96   info.add(mtx::id::encoding,       "UTF-8");
97 
98   id_result_container();
99   id_result_track(0, ID_RESULT_TRACK_SUBTITLES, codec_c::get_name(codec_c::type_e::S_WEBVTT, "WebVTT"), info.get());
100 }
101