+ return s;
+ }
+
+ int get_int (int offset, int length) const
+ {
+ int v = 0;
+ for (int i = 0; i < length; ++i) {
+ v |= _buffer[offset + i] << (8 * i);
+ }
+
+ return v;
+ }
+
+ Time get_timecode (int offset, int frame_rate) const
+ {
+ return Time::from_hmsf (_buffer[offset], _buffer[offset + 1], _buffer[offset + 2], _buffer[offset + 3], Rational (frame_rate, 1));
+ }
+
+private:
+ std::istream& _in;
+ unsigned char* _buffer;
+};
+
+STLBinaryReader::STLBinaryReader (istream& in)
+{
+ InputReader reader (in);
+ reader.read (1024, "GSI");
+
+ code_page_number = atoi (reader.get_string(0, 3).c_str());
+ frame_rate = stl_dfc_to_frame_rate (reader.get_string(3, 8));
+ display_standard = _tables.display_standard_file_to_enum (reader.get_string(11, 1));
+ language_group = _tables.language_group_file_to_enum (reader.get_string(12, 2));
+ language = _tables.language_file_to_enum (reader.get_string(14, 2));
+ original_programme_title = reader.get_string(16, 32);
+ original_episode_title = reader.get_string(48, 32);
+ translated_programme_title = reader.get_string(80, 32);
+ translated_episode_title = reader.get_string(112, 32);
+ translator_name = reader.get_string(144, 32);
+ translator_contact_details = reader.get_string(176, 32);
+ subtitle_list_reference_code = reader.get_string(208, 16);
+ creation_date = reader.get_string(224, 6);
+ revision_date = reader.get_string(230, 6);
+ revision_number = reader.get_string(236, 2);
+
+ tti_blocks = atoi (reader.get_string(238, 5).c_str());
+ number_of_subtitles = atoi (reader.get_string(243, 5).c_str());
+ subtitle_groups = atoi (reader.get_string(248, 3).c_str());
+ maximum_characters = atoi (reader.get_string(251, 2).c_str());
+ maximum_rows = atoi (reader.get_string(253, 2).c_str());
+ timecode_status = _tables.timecode_status_file_to_enum (reader.get_string(255, 1));
+ start_of_programme = reader.get_string(256, 8);
+ first_in_cue = reader.get_string(264, 8);
+ disks = atoi (reader.get_string(272, 1).c_str());
+ disk_sequence_number = atoi (reader.get_string(273, 1).c_str());
+ country_of_origin = reader.get_string(274, 3);
+ publisher = reader.get_string(277, 32);
+ editor_name = reader.get_string(309, 32);
+ editor_contact_details = reader.get_string(341, 32);
+
+ for (int i = 0; i < tti_blocks; ++i) {
+
+ reader.read (128, "TTI");
+
+ if (_tables.comment_file_to_enum (reader.get_int(15, 1)) == COMMENT_YES) {