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