From f6fb2090f4180f8cd507d694f7eb663b3f25d2f0 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 29 May 2014 14:20:17 +0100 Subject: [PATCH] Separate out STL binary tables so that writer can use them; start of writer. --- run/tests | 12 +- src/stl_binary_reader.cc | 190 ++------------------- src/stl_binary_reader.h | 176 +------------------ src/stl_binary_tables.cc | 298 +++++++++++++++++++++++++++++++++ src/stl_binary_tables.h | 220 ++++++++++++++++++++++++ src/stl_binary_writer.cc | 45 +++-- src/stl_binary_writer.h | 3 +- src/time_pair.h | 57 +++++++ src/wscript | 2 + test/stl_binary_writer_test.cc | 52 ++++++ test/wscript | 1 + 11 files changed, 687 insertions(+), 369 deletions(-) create mode 100644 src/stl_binary_tables.cc create mode 100644 src/stl_binary_tables.h create mode 100644 src/time_pair.h create mode 100644 test/stl_binary_writer_test.cc diff --git a/run/tests b/run/tests index 6858a34..09e5880 100755 --- a/run/tests +++ b/run/tests @@ -1,4 +1,14 @@ #!/bin/bash -e +private=../libsub-test-private + export LD_LIBRARY_PATH=build/src -build/test/tests ../libsub-test-private $* +if [ "$1" == "--debug" ]; then + shift + gdb --args build/test/tests $private $* +elif [ "$1" == "--valgrind" ]; then + shift + valgrind --tool="memcheck" build/test/tests $private $* +else + build/test/tests $private $* +fi diff --git a/src/stl_binary_reader.cc b/src/stl_binary_reader.cc index ebcee1b..b0701b5 100644 --- a/src/stl_binary_reader.cc +++ b/src/stl_binary_reader.cc @@ -36,49 +36,14 @@ using boost::is_any_of; using boost::locale::conv::utf_to_utf; using namespace sub; -template -E -file_to_enum (F k, map > m, string name) -{ - typename map >::const_iterator i = m.find (k); - if (i == m.end ()) { - throw STLError (String::compose ("Unknown %1 %2 in binary STL file", name, k)); - } - - return i->second.value; -} - -template -string -enum_to_description (E v, map > const & m) -{ - for (typename map >::const_iterator i = m.begin(); i != m.end(); ++i) { - if (i->second.value == v) { - return i->second.description; - } - } - - return ""; -} - -template -void -code (map >& m, F k, E v, string d) -{ - m[k] = STLCode (v, d); -} - - STLBinaryReader::STLBinaryReader (istream& in) : _buffer (new unsigned char[1024]) { - create_tables (); - in.read ((char *) _buffer, 1024); if (in.gcount() != 1024) { throw STLError ("Could not read GSI block from binary STL file"); } - + code_page_number = atoi (get_string (0, 3).c_str ()); string const dfc = get_string (3, 8); @@ -92,9 +57,9 @@ STLBinaryReader::STLBinaryReader (istream& in) throw STLError (String::compose ("Unknown disk format code %1 in binary STL file", dfc)); } - display_standard = file_to_enum (get_string (11, 1), _display_standard_map, "display standard code"); - language_group = file_to_enum (get_string (12, 2), _language_group_map, "character code"); - language = file_to_enum (get_string (14, 2), _language_map, "language code"); + display_standard = _tables.display_standard_file_to_enum (get_string (11, 1)); + language_group = _tables.language_group_file_to_enum (get_string (12, 2)); + language = _tables.language_file_to_enum (get_string (14, 2)); original_programme_title = get_string (16, 32); original_episode_title = get_string (48, 32); translated_programme_title = get_string (80, 32); @@ -111,7 +76,7 @@ STLBinaryReader::STLBinaryReader (istream& in) subtitle_groups = atoi (get_string (248, 3).c_str ()); maximum_characters = atoi (get_string (251, 2).c_str ()); maximum_rows = atoi (get_string (253, 2).c_str ()); - timecode_status = file_to_enum (get_string (255, 1), _timecode_status_map, "timecode status code"); + timecode_status = _tables.timecode_status_file_to_enum (get_string (255, 1)); start_of_programme = get_string (256, 8); first_in_cue = get_string (256, 8); disks = atoi (get_string (272, 1).c_str ()); @@ -128,7 +93,7 @@ STLBinaryReader::STLBinaryReader (istream& in) throw STLError ("Could not read TTI block from binary STL file"); } - if (file_to_enum (get_int (15, 1), _comment_map, "comment flag") == COMMENT_YES) { + if (_tables.comment_file_to_enum (get_int (15, 1)) == COMMENT_YES) { continue; } @@ -201,9 +166,9 @@ STLBinaryReader::metadata () const m["Code page number"] = lexical_cast (code_page_number); m["Frame rate"] = lexical_cast (frame_rate); - m["Display standard"] = enum_to_description (display_standard, _display_standard_map); - m["Language group"] = enum_to_description (language_group, _language_group_map); - m["Language"] = enum_to_description (language, _language_map); + m["Display standard"] = _tables.display_standard_enum_to_description (display_standard); + m["Language group"] = _tables.language_group_enum_to_description (language_group); + m["Language"] = _tables.language_enum_to_description (language); m["Original programme title"] = original_programme_title; m["Original episode title"] = original_episode_title; m["Translated programme title"] = translated_programme_title; @@ -219,7 +184,7 @@ STLBinaryReader::metadata () const m["Subtitle groups"] = lexical_cast (subtitle_groups); m["Maximum characters"] = lexical_cast (maximum_characters); m["Maximum rows"] = lexical_cast (maximum_rows); - m["Timecode status"] = enum_to_description (timecode_status, _timecode_status_map); + m["Timecode status"] = _tables.timecode_status_enum_to_description (timecode_status); m["Start of programme"] = start_of_programme; m["First in cue"] = first_in_cue; m["Disks"] = lexical_cast (disks); @@ -231,138 +196,3 @@ STLBinaryReader::metadata () const return m; } - -void -STLBinaryReader::create_tables () -{ - code (_display_standard_map, " ", DISPLAY_STANDARD_UNDEFINED, "Undefined"); - code (_display_standard_map, "0", DISPLAY_STANDARD_OPEN_SUBTITLING, "Open subtitling"); - code (_display_standard_map, "1", DISPLAY_STANDARD_LEVEL_1_TELETEXT, "Level 1 teletext"); - code (_display_standard_map, "2", DISPLAY_STANDARD_LEVEL_2_TELETEXT, "Level 2 teletext"); - - code (_language_group_map, "00", LANGUAGE_GROUP_LATIN, "Latin"); - code (_language_group_map, "01", LANGUAGE_GROUP_LATIN_CYRILLIC, "Latin/Cyrillic"); - code (_language_group_map, "02", LANGUAGE_GROUP_LATIN_ARABIC, "Latin/Arabic"); - code (_language_group_map, "03", LANGUAGE_GROUP_LATIN_GREEK, "Latin/Greek"); - code (_language_group_map, "04", LANGUAGE_GROUP_LATIN_HEBREW, "Latin/Hebrew"); - - code (_language_map, "00", LANGUAGE_UNKNOWN, "Unknown"); - code (_language_map, "01", LANGUAGE_ALBANIAN, "Albanian"); - code (_language_map, "02", LANGUAGE_BRETON, "Breton"); - code (_language_map, "03", LANGUAGE_CATALAN, "Catalan"); - code (_language_map, "04", LANGUAGE_CROATIAN, "Croatian"); - code (_language_map, "05", LANGUAGE_WELSH, "Welsh"); - code (_language_map, "06", LANGUAGE_CZECH, "Czech"); - code (_language_map, "07", LANGUAGE_DANISH, "Danish"); - code (_language_map, "08", LANGUAGE_GERMAN, "German"); - code (_language_map, "09", LANGUAGE_ENGLISH, "English"); - code (_language_map, "0A", LANGUAGE_SPANISH, "Spanish"); - code (_language_map, "0B", LANGUAGE_ESPERANTO, "Esperanto"); - code (_language_map, "0C", LANGUAGE_ESTONIAN, "Estonian"); - code (_language_map, "0D", LANGUAGE_BASQUE, "Basque"); - code (_language_map, "0E", LANGUAGE_FAROESE, "Faroese"); - code (_language_map, "0F", LANGUAGE_FRENCH, "French"); - code (_language_map, "10", LANGUAGE_FRISIAN, "Frisian"); - code (_language_map, "11", LANGUAGE_IRISH, "Irish"); - code (_language_map, "12", LANGUAGE_GAELIC, "Gaelic"); - code (_language_map, "13", LANGUAGE_GALACIAN, "Galacian"); - code (_language_map, "14", LANGUAGE_ICELANDIC, "Icelandic"); - code (_language_map, "15", LANGUAGE_ITALIAN, "Italian"); - code (_language_map, "16", LANGUAGE_LAPPISH, "Lappish"); - code (_language_map, "17", LANGUAGE_LATIN, "Latin"); - code (_language_map, "18", LANGUAGE_LATVIAN, "Latvian"); - code (_language_map, "19", LANGUAGE_LUXEMBORGIAN, "Luxemborgian"); - code (_language_map, "1A", LANGUAGE_LITHUANIAN, "Lithuanian"); - code (_language_map, "1B", LANGUAGE_HUNGARIAN, "Hungarian"); - code (_language_map, "1C", LANGUAGE_MALTESE, "Maltese"); - code (_language_map, "1D", LANGUAGE_DUTCH, "Dutch"); - code (_language_map, "1E", LANGUAGE_NORWEGIAN, "Norwegian"); - code (_language_map, "1F", LANGUAGE_OCCITAN, "Occitan"); - code (_language_map, "20", LANGUAGE_POLISH, "Polish"); - code (_language_map, "21", LANGUAGE_PORTUGESE, "Portugese"); - code (_language_map, "22", LANGUAGE_ROMANIAN, "Romanian"); - code (_language_map, "23", LANGUAGE_ROMANSH, "Romansh"); - code (_language_map, "24", LANGUAGE_SERBIAN, "Serbian"); - code (_language_map, "25", LANGUAGE_SLOVAK, "Slovak"); - code (_language_map, "26", LANGUAGE_SLOVENIAN, "Slovenian"); - code (_language_map, "27", LANGUAGE_FINNISH, "Finnish"); - code (_language_map, "28", LANGUAGE_SWEDISH, "Swedish"); - code (_language_map, "29", LANGUAGE_TURKISH, "Turkish"); - code (_language_map, "2A", LANGUAGE_FLEMISH, "Flemish"); - code (_language_map, "2B", LANGUAGE_WALLON, "Wallon"); - code (_language_map, "7F", LANGUAGE_AMHARIC, "Amharic"); - code (_language_map, "7E", LANGUAGE_ARABIC, "Arabic"); - code (_language_map, "7D", LANGUAGE_ARMENIAN, "Armenian"); - code (_language_map, "7C", LANGUAGE_ASSAMESE, "Assamese"); - code (_language_map, "7B", LANGUAGE_AZERBAIJANI, "Azerbaijani"); - code (_language_map, "7A", LANGUAGE_BAMBORA, "Bambora"); - code (_language_map, "79", LANGUAGE_BIELORUSSIAN, "Bielorussian"); - code (_language_map, "78", LANGUAGE_BENGALI, "Bengali"); - code (_language_map, "77", LANGUAGE_BULGARIAN, "Bulgarian"); - code (_language_map, "76", LANGUAGE_BURMESE, "Burmese"); - code (_language_map, "75", LANGUAGE_CHINESE, "Chinese"); - code (_language_map, "74", LANGUAGE_CHURASH, "Churash"); - code (_language_map, "73", LANGUAGE_DARI, "Dari"); - code (_language_map, "72", LANGUAGE_FULANI, "Fulani"); - code (_language_map, "71", LANGUAGE_GEORGIAN, "Georgian"); - code (_language_map, "70", LANGUAGE_GREEK, "Greek"); - code (_language_map, "6F", LANGUAGE_GUJURATI, "Gujarati"); - code (_language_map, "6E", LANGUAGE_GURANI, "Gurani"); - code (_language_map, "6D", LANGUAGE_HAUSA, "Hausa"); - code (_language_map, "6C", LANGUAGE_HEBREW, "Hebrew"); - code (_language_map, "6B", LANGUAGE_HINDI, "Hindi"); - code (_language_map, "6A", LANGUAGE_INDONESIAN, "Indonesian"); - code (_language_map, "69", LANGUAGE_JAPANESE, "Japanese"); - code (_language_map, "68", LANGUAGE_KANNADA, "Kannada"); - code (_language_map, "67", LANGUAGE_KAZAKH, "Kazakh"); - code (_language_map, "66", LANGUAGE_KHMER, "Khmer"); - code (_language_map, "65", LANGUAGE_KOREAN, "Korean"); - code (_language_map, "64", LANGUAGE_LAOTIAN, "Laotian"); - code (_language_map, "63", LANGUAGE_MACEDONIAN, "Macedonian"); - code (_language_map, "62", LANGUAGE_MALAGASAY, "Malagasay"); - code (_language_map, "61", LANGUAGE_MALAYSIAN, "Malaysian"); - code (_language_map, "60", LANGUAGE_MOLDAVIAN, "Moldavian"); - code (_language_map, "5F", LANGUAGE_MARATHI, "Marathi"); - code (_language_map, "5E", LANGUAGE_NDEBELE, "Ndebele"); - code (_language_map, "5D", LANGUAGE_NEPALI, "Nepali"); - code (_language_map, "5C", LANGUAGE_ORIYA, "Oriya"); - code (_language_map, "5B", LANGUAGE_PAPAMIENTO, "Papamiento"); - code (_language_map, "5A", LANGUAGE_PERSIAN, "Persian"); - code (_language_map, "59", LANGUAGE_PUNJABI, "Punjabi"); - code (_language_map, "58", LANGUAGE_PUSHTU, "Pushtu"); - code (_language_map, "57", LANGUAGE_QUECHUA, "Quechua"); - code (_language_map, "56", LANGUAGE_RUSSIAN, "Russian"); - code (_language_map, "55", LANGUAGE_RUTHENIAN, "Ruthenian"); - code (_language_map, "54", LANGUAGE_SERBO_CROAT, "Serbo Croat"); - code (_language_map, "53", LANGUAGE_SHONA, "Shona"); - code (_language_map, "52", LANGUAGE_SINHALESE, "Sinhalese"); - code (_language_map, "51", LANGUAGE_SOMALI, "Somali"); - code (_language_map, "50", LANGUAGE_SRANAN_TONGO, "Sranan Tongo"); - code (_language_map, "4F", LANGUAGE_SWAHILI, "Swahili"); - code (_language_map, "4E", LANGUAGE_TADZHIK, "Tadzhik"); - code (_language_map, "4D", LANGUAGE_TAMIL, "Tamil"); - code (_language_map, "4C", LANGUAGE_TATAR, "Tatar"); - code (_language_map, "4B", LANGUAGE_TELUGU, "Telugu"); - code (_language_map, "4A", LANGUAGE_THAI, "Thai"); - code (_language_map, "49", LANGUAGE_UKRANIAN, "Ukranian"); - code (_language_map, "48", LANGUAGE_URDU, "Urdu"); - code (_language_map, "47", LANGUAGE_UZBEK, "Uzbek"); - code (_language_map, "46", LANGUAGE_VIETNAMESE, "Vietnamese"); - code (_language_map, "45", LANGUAGE_ZULU, "Zulu"); - - code (_timecode_status_map, "0", TIMECODE_STATUS_NOT_INTENDED_FOR_USE, "Not intended for use"); - code (_timecode_status_map, "1", TIMECODE_STATUS_INTENDED_FOR_USE, "Intended for use"); - - code (_cumulative_status_map, 0, CUMULATIVE_STATUS_NOT_CUMULATIVE, "Not part of a cumulative set"); - code (_cumulative_status_map, 1, CUMULATIVE_STATUS_FIRST, "First subtitle of a cumulative set"); - code (_cumulative_status_map, 2, CUMULATIVE_STATUS_INTERMEDIATE, "Intermediate subtitle of a cumulative set"); - code (_cumulative_status_map, 3, CUMULATIVE_STATUS_LAST, "Last subtitle of a cumulative set"); - - code (_justification_map, 0, JUSTIFICATION_NONE, "No justification"); - code (_justification_map, 1, JUSTIFICATION_LEFT, "Left justification"); - code (_justification_map, 2, JUSTIFICATION_CENTRE, "Centre justification"); - code (_justification_map, 3, JUSTIFICATION_CENTRE, "Right justification"); - - code (_comment_map, 0, COMMENT_NO, "Not a comment"); - code (_comment_map, 1, COMMENT_YES, "Is a comment"); -} diff --git a/src/stl_binary_reader.h b/src/stl_binary_reader.h index b049b93..0e3c7cf 100644 --- a/src/stl_binary_reader.h +++ b/src/stl_binary_reader.h @@ -17,28 +17,12 @@ */ -#include #include "reader.h" +#include "stl_binary_tables.h" +#include namespace sub { -template -class STLCode -{ -public: - STLCode () - : value ((T) 0) - {} - - STLCode (T v, std::string d) - : value (v) - , description (d) - {} - - T value; - std::string description; -}; - class STLBinaryReader : public Reader { public: @@ -47,151 +31,6 @@ public: std::map metadata () const; - enum DisplayStandard { - DISPLAY_STANDARD_UNDEFINED, - DISPLAY_STANDARD_OPEN_SUBTITLING, - DISPLAY_STANDARD_LEVEL_1_TELETEXT, - DISPLAY_STANDARD_LEVEL_2_TELETEXT - }; - - enum LanguageGroup { - LANGUAGE_GROUP_LATIN, - LANGUAGE_GROUP_LATIN_CYRILLIC, - LANGUAGE_GROUP_LATIN_ARABIC, - LANGUAGE_GROUP_LATIN_GREEK, - LANGUAGE_GROUP_LATIN_HEBREW - }; - - enum Language { - LANGUAGE_UNKNOWN, - LANGUAGE_ALBANIAN, - LANGUAGE_BRETON, - LANGUAGE_CATALAN, - LANGUAGE_CROATIAN, - LANGUAGE_WELSH, - LANGUAGE_CZECH, - LANGUAGE_DANISH, - LANGUAGE_GERMAN, - LANGUAGE_ENGLISH, - LANGUAGE_SPANISH, - LANGUAGE_ESPERANTO, - LANGUAGE_ESTONIAN, - LANGUAGE_BASQUE, - LANGUAGE_FAROESE, - LANGUAGE_FRENCH, - LANGUAGE_FRISIAN, - LANGUAGE_IRISH, - LANGUAGE_GAELIC, - LANGUAGE_GALACIAN, - LANGUAGE_ICELANDIC, - LANGUAGE_ITALIAN, - LANGUAGE_LAPPISH, - LANGUAGE_LATIN, - LANGUAGE_LATVIAN, - LANGUAGE_LUXEMBORGIAN, - LANGUAGE_LITHUANIAN, - LANGUAGE_HUNGARIAN, - LANGUAGE_MALTESE, - LANGUAGE_DUTCH, - LANGUAGE_NORWEGIAN, - LANGUAGE_OCCITAN, - LANGUAGE_POLISH, - LANGUAGE_PORTUGESE, - LANGUAGE_ROMANIAN, - LANGUAGE_ROMANSH, - LANGUAGE_SERBIAN, - LANGUAGE_SLOVAK, - LANGUAGE_SLOVENIAN, - LANGUAGE_FINNISH, - LANGUAGE_SWEDISH, - LANGUAGE_TURKISH, - LANGUAGE_FLEMISH, - LANGUAGE_WALLON, - LANGUAGE_AMHARIC, - LANGUAGE_ARABIC, - LANGUAGE_ARMENIAN, - LANGUAGE_ASSAMESE, - LANGUAGE_AZERBAIJANI, - LANGUAGE_BAMBORA, - LANGUAGE_BIELORUSSIAN, - LANGUAGE_BENGALI, - LANGUAGE_BULGARIAN, - LANGUAGE_BURMESE, - LANGUAGE_CHINESE, - LANGUAGE_CHURASH, - LANGUAGE_DARI, - LANGUAGE_FULANI, - LANGUAGE_GEORGIAN, - LANGUAGE_GREEK, - LANGUAGE_GUJURATI, - LANGUAGE_GURANI, - LANGUAGE_HAUSA, - LANGUAGE_HEBREW, - LANGUAGE_HINDI, - LANGUAGE_INDONESIAN, - LANGUAGE_JAPANESE, - LANGUAGE_KANNADA, - LANGUAGE_KAZAKH, - LANGUAGE_KHMER, - LANGUAGE_KOREAN, - LANGUAGE_LAOTIAN, - LANGUAGE_MACEDONIAN, - LANGUAGE_MALAGASAY, - LANGUAGE_MALAYSIAN, - LANGUAGE_MOLDAVIAN, - LANGUAGE_MARATHI, - LANGUAGE_NDEBELE, - LANGUAGE_NEPALI, - LANGUAGE_ORIYA, - LANGUAGE_PAPAMIENTO, - LANGUAGE_PERSIAN, - LANGUAGE_PUNJABI, - LANGUAGE_PUSHTU, - LANGUAGE_QUECHUA, - LANGUAGE_RUSSIAN, - LANGUAGE_RUTHENIAN, - LANGUAGE_SERBO_CROAT, - LANGUAGE_SHONA, - LANGUAGE_SINHALESE, - LANGUAGE_SOMALI, - LANGUAGE_SRANAN_TONGO, - LANGUAGE_SWAHILI, - LANGUAGE_TADZHIK, - LANGUAGE_TAMIL, - LANGUAGE_TATAR, - LANGUAGE_TELUGU, - LANGUAGE_THAI, - LANGUAGE_UKRANIAN, - LANGUAGE_URDU, - LANGUAGE_UZBEK, - LANGUAGE_VIETNAMESE, - LANGUAGE_ZULU - }; - - enum TimecodeStatus { - TIMECODE_STATUS_NOT_INTENDED_FOR_USE, - TIMECODE_STATUS_INTENDED_FOR_USE - }; - - enum CumulativeStatus { - CUMULATIVE_STATUS_NOT_CUMULATIVE, - CUMULATIVE_STATUS_FIRST, - CUMULATIVE_STATUS_INTERMEDIATE, - CUMULATIVE_STATUS_LAST - }; - - enum Justification { - JUSTIFICATION_NONE, - JUSTIFICATION_LEFT, - JUSTIFICATION_CENTRE, - JUSTIFICATION_RIGHT - }; - - enum Comment { - COMMENT_NO, - COMMENT_YES - }; - int code_page_number; int frame_rate; DisplayStandard display_standard; @@ -226,17 +65,8 @@ private: std::string get_string (int, int) const; int get_int (int, int) const; FrameTime get_timecode (int) const; - - void create_tables (); - - std::map > _display_standard_map; - std::map > _language_group_map; - std::map > _language_map; - std::map > _timecode_status_map; - std::map > _cumulative_status_map; - std::map > _justification_map; - std::map > _comment_map; + STLBinaryTables _tables; unsigned char* _buffer; }; diff --git a/src/stl_binary_tables.cc b/src/stl_binary_tables.cc new file mode 100644 index 0000000..664921d --- /dev/null +++ b/src/stl_binary_tables.cc @@ -0,0 +1,298 @@ +/* + Copyright (C) 2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "stl_binary_tables.h" +#include "exceptions.h" +#include "compose.hpp" +#include + +using std::map; +using std::string; +using namespace sub; + +template +void +code (map >& m, F k, E v, string d) +{ + m[k] = STLBinaryCode (v, d); +} + + +template +E +file_to_enum (F k, map > m, string name) +{ + typename map >::const_iterator i = m.find (k); + if (i == m.end ()) { + throw STLError (String::compose ("Unknown %1 %2 in binary STL file", name, k)); + } + + return i->second.value; +} + +template +F +enum_to_file (E k, map > m) +{ + for (typename map >::const_iterator i = m.begin(); i != m.end(); ++i) { + if (i->second.value == k) { + return i->first; + } + } + + assert (false); + return F (); +} + +template +string +enum_to_description (E v, map > const & m) +{ + for (typename map >::const_iterator i = m.begin(); i != m.end(); ++i) { + if (i->second.value == v) { + return i->second.description; + } + } + + return ""; +} + +DisplayStandard +STLBinaryTables::display_standard_file_to_enum (string s) const +{ + return file_to_enum (s, _display_standard_map, "display standard code"); +} + +LanguageGroup +STLBinaryTables::language_group_file_to_enum (string s) const +{ + return file_to_enum (s, _language_group_map, "language group code"); +} + +Language +STLBinaryTables::language_file_to_enum (string s) const +{ + return file_to_enum (s, _language_map, "language code"); +} + +TimecodeStatus +STLBinaryTables::timecode_status_file_to_enum (string s) const +{ + return file_to_enum (s, _timecode_status_map, "timecode status code"); +} + +CumulativeStatus +STLBinaryTables::cumulative_status_file_to_enum (int s) const +{ + return file_to_enum (s, _cumulative_status_map, "cumulative status code"); +} + +Justification +STLBinaryTables::justification_file_to_enum (int s) const +{ + return file_to_enum (s, _justification_map, "justification code"); +} + +Comment +STLBinaryTables::comment_file_to_enum (int s) const +{ + return file_to_enum (s, _comment_map, "comment code"); +} + +string +STLBinaryTables::language_enum_to_file (Language e) const +{ + return enum_to_file (e, _language_map); +} + +string +STLBinaryTables::display_standard_enum_to_description (DisplayStandard v) const +{ + return enum_to_description (v, _display_standard_map); +} + +string +STLBinaryTables::language_group_enum_to_description (LanguageGroup v) const +{ + return enum_to_description (v, _language_group_map); +} + +string +STLBinaryTables::language_enum_to_description (Language v) const +{ + return enum_to_description (v, _language_map); +} + +string +STLBinaryTables::timecode_status_enum_to_description (TimecodeStatus v) const +{ + return enum_to_description (v, _timecode_status_map); +} + +string +STLBinaryTables::cumulative_status_enum_to_description (CumulativeStatus v) const +{ + return enum_to_description (v, _cumulative_status_map); +} + +string +STLBinaryTables::justification_enum_to_description (Justification v) const +{ + return enum_to_description (v, _justification_map); +} + +string +STLBinaryTables::comment_enum_to_description (Comment v) const +{ + return enum_to_description (v, _comment_map); +} + +STLBinaryTables::STLBinaryTables () +{ + code (_display_standard_map, " ", DISPLAY_STANDARD_UNDEFINED, "Undefined"); + code (_display_standard_map, "0", DISPLAY_STANDARD_OPEN_SUBTITLING, "Open subtitling"); + code (_display_standard_map, "1", DISPLAY_STANDARD_LEVEL_1_TELETEXT, "Level 1 teletext"); + code (_display_standard_map, "2", DISPLAY_STANDARD_LEVEL_2_TELETEXT, "Level 2 teletext"); + + code (_language_group_map, "00", LANGUAGE_GROUP_LATIN, "Latin"); + code (_language_group_map, "01", LANGUAGE_GROUP_LATIN_CYRILLIC, "Latin/Cyrillic"); + code (_language_group_map, "02", LANGUAGE_GROUP_LATIN_ARABIC, "Latin/Arabic"); + code (_language_group_map, "03", LANGUAGE_GROUP_LATIN_GREEK, "Latin/Greek"); + code (_language_group_map, "04", LANGUAGE_GROUP_LATIN_HEBREW, "Latin/Hebrew"); + + code (_language_map, "00", LANGUAGE_UNKNOWN, "Unknown"); + code (_language_map, "01", LANGUAGE_ALBANIAN, "Albanian"); + code (_language_map, "02", LANGUAGE_BRETON, "Breton"); + code (_language_map, "03", LANGUAGE_CATALAN, "Catalan"); + code (_language_map, "04", LANGUAGE_CROATIAN, "Croatian"); + code (_language_map, "05", LANGUAGE_WELSH, "Welsh"); + code (_language_map, "06", LANGUAGE_CZECH, "Czech"); + code (_language_map, "07", LANGUAGE_DANISH, "Danish"); + code (_language_map, "08", LANGUAGE_GERMAN, "German"); + code (_language_map, "09", LANGUAGE_ENGLISH, "English"); + code (_language_map, "0A", LANGUAGE_SPANISH, "Spanish"); + code (_language_map, "0B", LANGUAGE_ESPERANTO, "Esperanto"); + code (_language_map, "0C", LANGUAGE_ESTONIAN, "Estonian"); + code (_language_map, "0D", LANGUAGE_BASQUE, "Basque"); + code (_language_map, "0E", LANGUAGE_FAROESE, "Faroese"); + code (_language_map, "0F", LANGUAGE_FRENCH, "French"); + code (_language_map, "10", LANGUAGE_FRISIAN, "Frisian"); + code (_language_map, "11", LANGUAGE_IRISH, "Irish"); + code (_language_map, "12", LANGUAGE_GAELIC, "Gaelic"); + code (_language_map, "13", LANGUAGE_GALACIAN, "Galacian"); + code (_language_map, "14", LANGUAGE_ICELANDIC, "Icelandic"); + code (_language_map, "15", LANGUAGE_ITALIAN, "Italian"); + code (_language_map, "16", LANGUAGE_LAPPISH, "Lappish"); + code (_language_map, "17", LANGUAGE_LATIN, "Latin"); + code (_language_map, "18", LANGUAGE_LATVIAN, "Latvian"); + code (_language_map, "19", LANGUAGE_LUXEMBORGIAN, "Luxemborgian"); + code (_language_map, "1A", LANGUAGE_LITHUANIAN, "Lithuanian"); + code (_language_map, "1B", LANGUAGE_HUNGARIAN, "Hungarian"); + code (_language_map, "1C", LANGUAGE_MALTESE, "Maltese"); + code (_language_map, "1D", LANGUAGE_DUTCH, "Dutch"); + code (_language_map, "1E", LANGUAGE_NORWEGIAN, "Norwegian"); + code (_language_map, "1F", LANGUAGE_OCCITAN, "Occitan"); + code (_language_map, "20", LANGUAGE_POLISH, "Polish"); + code (_language_map, "21", LANGUAGE_PORTUGESE, "Portugese"); + code (_language_map, "22", LANGUAGE_ROMANIAN, "Romanian"); + code (_language_map, "23", LANGUAGE_ROMANSH, "Romansh"); + code (_language_map, "24", LANGUAGE_SERBIAN, "Serbian"); + code (_language_map, "25", LANGUAGE_SLOVAK, "Slovak"); + code (_language_map, "26", LANGUAGE_SLOVENIAN, "Slovenian"); + code (_language_map, "27", LANGUAGE_FINNISH, "Finnish"); + code (_language_map, "28", LANGUAGE_SWEDISH, "Swedish"); + code (_language_map, "29", LANGUAGE_TURKISH, "Turkish"); + code (_language_map, "2A", LANGUAGE_FLEMISH, "Flemish"); + code (_language_map, "2B", LANGUAGE_WALLON, "Wallon"); + code (_language_map, "7F", LANGUAGE_AMHARIC, "Amharic"); + code (_language_map, "7E", LANGUAGE_ARABIC, "Arabic"); + code (_language_map, "7D", LANGUAGE_ARMENIAN, "Armenian"); + code (_language_map, "7C", LANGUAGE_ASSAMESE, "Assamese"); + code (_language_map, "7B", LANGUAGE_AZERBAIJANI, "Azerbaijani"); + code (_language_map, "7A", LANGUAGE_BAMBORA, "Bambora"); + code (_language_map, "79", LANGUAGE_BIELORUSSIAN, "Bielorussian"); + code (_language_map, "78", LANGUAGE_BENGALI, "Bengali"); + code (_language_map, "77", LANGUAGE_BULGARIAN, "Bulgarian"); + code (_language_map, "76", LANGUAGE_BURMESE, "Burmese"); + code (_language_map, "75", LANGUAGE_CHINESE, "Chinese"); + code (_language_map, "74", LANGUAGE_CHURASH, "Churash"); + code (_language_map, "73", LANGUAGE_DARI, "Dari"); + code (_language_map, "72", LANGUAGE_FULANI, "Fulani"); + code (_language_map, "71", LANGUAGE_GEORGIAN, "Georgian"); + code (_language_map, "70", LANGUAGE_GREEK, "Greek"); + code (_language_map, "6F", LANGUAGE_GUJURATI, "Gujarati"); + code (_language_map, "6E", LANGUAGE_GURANI, "Gurani"); + code (_language_map, "6D", LANGUAGE_HAUSA, "Hausa"); + code (_language_map, "6C", LANGUAGE_HEBREW, "Hebrew"); + code (_language_map, "6B", LANGUAGE_HINDI, "Hindi"); + code (_language_map, "6A", LANGUAGE_INDONESIAN, "Indonesian"); + code (_language_map, "69", LANGUAGE_JAPANESE, "Japanese"); + code (_language_map, "68", LANGUAGE_KANNADA, "Kannada"); + code (_language_map, "67", LANGUAGE_KAZAKH, "Kazakh"); + code (_language_map, "66", LANGUAGE_KHMER, "Khmer"); + code (_language_map, "65", LANGUAGE_KOREAN, "Korean"); + code (_language_map, "64", LANGUAGE_LAOTIAN, "Laotian"); + code (_language_map, "63", LANGUAGE_MACEDONIAN, "Macedonian"); + code (_language_map, "62", LANGUAGE_MALAGASAY, "Malagasay"); + code (_language_map, "61", LANGUAGE_MALAYSIAN, "Malaysian"); + code (_language_map, "60", LANGUAGE_MOLDAVIAN, "Moldavian"); + code (_language_map, "5F", LANGUAGE_MARATHI, "Marathi"); + code (_language_map, "5E", LANGUAGE_NDEBELE, "Ndebele"); + code (_language_map, "5D", LANGUAGE_NEPALI, "Nepali"); + code (_language_map, "5C", LANGUAGE_ORIYA, "Oriya"); + code (_language_map, "5B", LANGUAGE_PAPAMIENTO, "Papamiento"); + code (_language_map, "5A", LANGUAGE_PERSIAN, "Persian"); + code (_language_map, "59", LANGUAGE_PUNJABI, "Punjabi"); + code (_language_map, "58", LANGUAGE_PUSHTU, "Pushtu"); + code (_language_map, "57", LANGUAGE_QUECHUA, "Quechua"); + code (_language_map, "56", LANGUAGE_RUSSIAN, "Russian"); + code (_language_map, "55", LANGUAGE_RUTHENIAN, "Ruthenian"); + code (_language_map, "54", LANGUAGE_SERBO_CROAT, "Serbo Croat"); + code (_language_map, "53", LANGUAGE_SHONA, "Shona"); + code (_language_map, "52", LANGUAGE_SINHALESE, "Sinhalese"); + code (_language_map, "51", LANGUAGE_SOMALI, "Somali"); + code (_language_map, "50", LANGUAGE_SRANAN_TONGO, "Sranan Tongo"); + code (_language_map, "4F", LANGUAGE_SWAHILI, "Swahili"); + code (_language_map, "4E", LANGUAGE_TADZHIK, "Tadzhik"); + code (_language_map, "4D", LANGUAGE_TAMIL, "Tamil"); + code (_language_map, "4C", LANGUAGE_TATAR, "Tatar"); + code (_language_map, "4B", LANGUAGE_TELUGU, "Telugu"); + code (_language_map, "4A", LANGUAGE_THAI, "Thai"); + code (_language_map, "49", LANGUAGE_UKRANIAN, "Ukranian"); + code (_language_map, "48", LANGUAGE_URDU, "Urdu"); + code (_language_map, "47", LANGUAGE_UZBEK, "Uzbek"); + code (_language_map, "46", LANGUAGE_VIETNAMESE, "Vietnamese"); + code (_language_map, "45", LANGUAGE_ZULU, "Zulu"); + + code (_timecode_status_map, "0", TIMECODE_STATUS_NOT_INTENDED_FOR_USE, "Not intended for use"); + code (_timecode_status_map, "1", TIMECODE_STATUS_INTENDED_FOR_USE, "Intended for use"); + + code (_cumulative_status_map, 0, CUMULATIVE_STATUS_NOT_CUMULATIVE, "Not part of a cumulative set"); + code (_cumulative_status_map, 1, CUMULATIVE_STATUS_FIRST, "First subtitle of a cumulative set"); + code (_cumulative_status_map, 2, CUMULATIVE_STATUS_INTERMEDIATE, "Intermediate subtitle of a cumulative set"); + code (_cumulative_status_map, 3, CUMULATIVE_STATUS_LAST, "Last subtitle of a cumulative set"); + + code (_justification_map, 0, JUSTIFICATION_NONE, "No justification"); + code (_justification_map, 1, JUSTIFICATION_LEFT, "Left justification"); + code (_justification_map, 2, JUSTIFICATION_CENTRE, "Centre justification"); + code (_justification_map, 3, JUSTIFICATION_CENTRE, "Right justification"); + + code (_comment_map, 0, COMMENT_NO, "Not a comment"); + code (_comment_map, 1, COMMENT_YES, "Is a comment"); +} diff --git a/src/stl_binary_tables.h b/src/stl_binary_tables.h new file mode 100644 index 0000000..0a85dd8 --- /dev/null +++ b/src/stl_binary_tables.h @@ -0,0 +1,220 @@ +/* + Copyright (C) 2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +namespace sub { + +enum DisplayStandard { + DISPLAY_STANDARD_UNDEFINED, + DISPLAY_STANDARD_OPEN_SUBTITLING, + DISPLAY_STANDARD_LEVEL_1_TELETEXT, + DISPLAY_STANDARD_LEVEL_2_TELETEXT +}; + +enum LanguageGroup { + LANGUAGE_GROUP_LATIN, + LANGUAGE_GROUP_LATIN_CYRILLIC, + LANGUAGE_GROUP_LATIN_ARABIC, + LANGUAGE_GROUP_LATIN_GREEK, + LANGUAGE_GROUP_LATIN_HEBREW +}; + +enum Language { + LANGUAGE_UNKNOWN, + LANGUAGE_ALBANIAN, + LANGUAGE_BRETON, + LANGUAGE_CATALAN, + LANGUAGE_CROATIAN, + LANGUAGE_WELSH, + LANGUAGE_CZECH, + LANGUAGE_DANISH, + LANGUAGE_GERMAN, + LANGUAGE_ENGLISH, + LANGUAGE_SPANISH, + LANGUAGE_ESPERANTO, + LANGUAGE_ESTONIAN, + LANGUAGE_BASQUE, + LANGUAGE_FAROESE, + LANGUAGE_FRENCH, + LANGUAGE_FRISIAN, + LANGUAGE_IRISH, + LANGUAGE_GAELIC, + LANGUAGE_GALACIAN, + LANGUAGE_ICELANDIC, + LANGUAGE_ITALIAN, + LANGUAGE_LAPPISH, + LANGUAGE_LATIN, + LANGUAGE_LATVIAN, + LANGUAGE_LUXEMBORGIAN, + LANGUAGE_LITHUANIAN, + LANGUAGE_HUNGARIAN, + LANGUAGE_MALTESE, + LANGUAGE_DUTCH, + LANGUAGE_NORWEGIAN, + LANGUAGE_OCCITAN, + LANGUAGE_POLISH, + LANGUAGE_PORTUGESE, + LANGUAGE_ROMANIAN, + LANGUAGE_ROMANSH, + LANGUAGE_SERBIAN, + LANGUAGE_SLOVAK, + LANGUAGE_SLOVENIAN, + LANGUAGE_FINNISH, + LANGUAGE_SWEDISH, + LANGUAGE_TURKISH, + LANGUAGE_FLEMISH, + LANGUAGE_WALLON, + LANGUAGE_AMHARIC, + LANGUAGE_ARABIC, + LANGUAGE_ARMENIAN, + LANGUAGE_ASSAMESE, + LANGUAGE_AZERBAIJANI, + LANGUAGE_BAMBORA, + LANGUAGE_BIELORUSSIAN, + LANGUAGE_BENGALI, + LANGUAGE_BULGARIAN, + LANGUAGE_BURMESE, + LANGUAGE_CHINESE, + LANGUAGE_CHURASH, + LANGUAGE_DARI, + LANGUAGE_FULANI, + LANGUAGE_GEORGIAN, + LANGUAGE_GREEK, + LANGUAGE_GUJURATI, + LANGUAGE_GURANI, + LANGUAGE_HAUSA, + LANGUAGE_HEBREW, + LANGUAGE_HINDI, + LANGUAGE_INDONESIAN, + LANGUAGE_JAPANESE, + LANGUAGE_KANNADA, + LANGUAGE_KAZAKH, + LANGUAGE_KHMER, + LANGUAGE_KOREAN, + LANGUAGE_LAOTIAN, + LANGUAGE_MACEDONIAN, + LANGUAGE_MALAGASAY, + LANGUAGE_MALAYSIAN, + LANGUAGE_MOLDAVIAN, + LANGUAGE_MARATHI, + LANGUAGE_NDEBELE, + LANGUAGE_NEPALI, + LANGUAGE_ORIYA, + LANGUAGE_PAPAMIENTO, + LANGUAGE_PERSIAN, + LANGUAGE_PUNJABI, + LANGUAGE_PUSHTU, + LANGUAGE_QUECHUA, + LANGUAGE_RUSSIAN, + LANGUAGE_RUTHENIAN, + LANGUAGE_SERBO_CROAT, + LANGUAGE_SHONA, + LANGUAGE_SINHALESE, + LANGUAGE_SOMALI, + LANGUAGE_SRANAN_TONGO, + LANGUAGE_SWAHILI, + LANGUAGE_TADZHIK, + LANGUAGE_TAMIL, + LANGUAGE_TATAR, + LANGUAGE_TELUGU, + LANGUAGE_THAI, + LANGUAGE_UKRANIAN, + LANGUAGE_URDU, + LANGUAGE_UZBEK, + LANGUAGE_VIETNAMESE, + LANGUAGE_ZULU +}; + +enum TimecodeStatus { + TIMECODE_STATUS_NOT_INTENDED_FOR_USE, + TIMECODE_STATUS_INTENDED_FOR_USE +}; + +enum CumulativeStatus { + CUMULATIVE_STATUS_NOT_CUMULATIVE, + CUMULATIVE_STATUS_FIRST, + CUMULATIVE_STATUS_INTERMEDIATE, + CUMULATIVE_STATUS_LAST +}; + +enum Justification { + JUSTIFICATION_NONE, + JUSTIFICATION_LEFT, + JUSTIFICATION_CENTRE, + JUSTIFICATION_RIGHT +}; + +enum Comment { + COMMENT_NO, + COMMENT_YES +}; + +template +class STLBinaryCode +{ +public: + STLBinaryCode () + : value ((T) 0) + {} + + STLBinaryCode (T v, std::string d) + : value (v) + , description (d) + {} + + T value; + std::string description; +}; + +class STLBinaryTables +{ +public: + STLBinaryTables (); + + DisplayStandard display_standard_file_to_enum (std::string) const; + LanguageGroup language_group_file_to_enum (std::string) const; + Language language_file_to_enum (std::string) const; + TimecodeStatus timecode_status_file_to_enum (std::string) const; + CumulativeStatus cumulative_status_file_to_enum (int) const; + Justification justification_file_to_enum (int) const; + Comment comment_file_to_enum (int) const; + + std::string language_enum_to_file (Language) const; + + std::string display_standard_enum_to_description (DisplayStandard) const; + std::string language_group_enum_to_description (LanguageGroup) const; + std::string language_enum_to_description (Language) const; + std::string timecode_status_enum_to_description (TimecodeStatus) const; + std::string cumulative_status_enum_to_description (CumulativeStatus) const; + std::string justification_enum_to_description (Justification) const; + std::string comment_enum_to_description (Comment) const; + +private: + std::map > _display_standard_map; + std::map > _language_group_map; + std::map > _language_map; + std::map > _timecode_status_map; + std::map > _cumulative_status_map; + std::map > _justification_map; + std::map > _comment_map; +}; + +} diff --git a/src/stl_binary_writer.cc b/src/stl_binary_writer.cc index 34e4d73..8ec8c67 100644 --- a/src/stl_binary_writer.cc +++ b/src/stl_binary_writer.cc @@ -17,15 +17,18 @@ */ +#include "stl_binary_writer.h" +#include "compose.hpp" #include #include #include -#include "stl_binary_writer.h" -#include "compose.hpp" +#include using std::list; using std::ofstream; using std::string; +using std::setw; +using std::setfill; using namespace sub; static void @@ -35,10 +38,24 @@ put_string (char* p, string s) } static void -put_string (char* p, int n, string s) +put_string (char* p, unsigned int n, string s) { + assert (s.length() <= n); + memcpy (p, s.c_str (), s.length ()); - memset (p + s.length(), ' ', s.length () - n); + memset (p + s.length(), ' ', n - s.length ()); +} + +static void +put_int (char* p, int v, unsigned int n) +{ + std::stringstream s; + /* Be careful to ensure we get no thousands separators */ + s.imbue (std::locale::classic ()); + s << setw (n) << setfill ('0'); + s << v; + assert (s.str().length() == n); + put_string (p, s.str ()); } /** @param language ISO 3-character country code for the language of the subtitles */ @@ -46,7 +63,7 @@ void sub::write_stl_binary ( list subtitles, float frames_per_second, - string language, + Language language, string original_programme_title, string original_episode_title, string translated_programme_title, @@ -63,7 +80,6 @@ sub::write_stl_binary ( boost::filesystem::path file_name ) { - assert (language.size() == 3); assert (original_programme_title.size() <= 32); assert (original_episode_title.size() <= 32); assert (translated_programme_title.size() <= 32); @@ -80,6 +96,7 @@ sub::write_stl_binary ( char* buffer = new char[1024]; ofstream output (file_name.string().c_str ()); + STLBinaryTables tables; /* Code page: 850 */ put_string (buffer + 0, "850"); @@ -89,7 +106,7 @@ sub::write_stl_binary ( put_string (buffer + 11, "0"); /* Character code table: Latin (ISO 6937) */ put_string (buffer + 12, "00"); - put_string (buffer + 14, language); + put_string (buffer + 14, tables.language_enum_to_file (language)); put_string (buffer + 16, 32, original_programme_title); put_string (buffer + 48, 32, original_episode_title); put_string (buffer + 80, 32, translated_programme_title); @@ -100,11 +117,11 @@ sub::write_stl_binary ( put_string (buffer + 208, "0000000000000000"); put_string (buffer + 224, creation_date); put_string (buffer + 230, revision_date); - put_string (buffer + 236, String::compose ("%02d", revision_number)); + put_int (buffer + 236, revision_number, 2); /* TTI blocks */ - put_string (buffer + 238, String::compose ("%05d", subtitles.size ())); + put_int (buffer + 238, subtitles.size (), 5); /* Total number of subtitles */ - put_string (buffer + 243, String::compose ("%05d", subtitles.size ())); + put_int (buffer + 243, subtitles.size (), 5); /* Total number of subtitle groups */ put_string (buffer + 248, "000"); /* Maximum number of displayable characters in any text row */ @@ -123,10 +140,10 @@ sub::write_stl_binary ( put_string (buffer + 272, "1"); /* Disk sequence number */ put_string (buffer + 273, "1"); - put_string (buffer + 274, country_of_origin); - put_string (buffer + 277, publisher); - put_string (buffer + 309, editor_name); - put_string (buffer + 341, editor_contact_details); + put_string (buffer + 274, 32, country_of_origin); + put_string (buffer + 277, 32, publisher); + put_string (buffer + 309, 32, editor_name); + put_string (buffer + 341, 32, editor_contact_details); output.write (buffer, 1024); diff --git a/src/stl_binary_writer.h b/src/stl_binary_writer.h index 7dbf5a5..2494d17 100644 --- a/src/stl_binary_writer.h +++ b/src/stl_binary_writer.h @@ -17,6 +17,7 @@ */ +#include "stl_binary_tables.h" #include #include @@ -27,7 +28,7 @@ class Subtitle; extern void write_stl_binary ( std::list subtitles, float frames_per_second, - std::string language, + Language language, std::string original_programme_title, std::string original_episode_title, std::string translated_programme_title, diff --git a/src/time_pair.h b/src/time_pair.h new file mode 100644 index 0000000..0ed039d --- /dev/null +++ b/src/time_pair.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "frame_time.h" +#include "metric_time.h" +#include + +namespace sub { + +class TimePair +{ +public: + void set_frame (FrameTime t) { + _frame = t; + _metric = boost::optional (); + } + + void set_metric (MetricTime t) { + _metric = t; + _frame = boost::optional (); + } + + boost::optional frame () const { + return _frame; + } + + boost::optional metric () const { + return _metric; + } + + FrameTime frame (float frames_per_second) const; + MetricTime metric (float frames_per_second) const; + + bool operator== (TimePair const & other) const; + +private: + boost::optional _frame; + boost::optional _metric; +}; + +} diff --git a/src/wscript b/src/wscript index dd04aa9..dc954c9 100644 --- a/src/wscript +++ b/src/wscript @@ -21,6 +21,8 @@ def build(bld): reader.cc reader_factory.cc stl_binary_reader.cc + stl_binary_tables.cc + stl_binary_writer.cc stl_text_reader.cc time_pair.cc subtitle.cc diff --git a/test/stl_binary_writer_test.cc b/test/stl_binary_writer_test.cc new file mode 100644 index 0000000..3960ea2 --- /dev/null +++ b/test/stl_binary_writer_test.cc @@ -0,0 +1,52 @@ +/* + Copyright (C) 2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "stl_binary_writer.h" +#include "subtitle.h" +#include + +using std::list; + +/** Test writing of a binary STL file */ +BOOST_AUTO_TEST_CASE (stl_binary_writer_test) +{ + list subs; + + sub::write_stl_binary ( + subs, + 25, + sub::LANGUAGE_GERMAN, + "Original programme title", + "Original episode title", + "TX program title", + "TX episode title", + "TX name", + "TX contact", + "140212", + "140213", + 0, + "GBR", + "Publisher", + "Editor name", + "Editor contact", + "build/test/test.stl" + ); + +} + diff --git a/test/wscript b/test/wscript index d9ea727..cbc3dd1 100644 --- a/test/wscript +++ b/test/wscript @@ -19,6 +19,7 @@ def build(bld): dcp_reader_test.cc iso6937_test.cc stl_binary_reader_test.cc + stl_binary_writer_test.cc stl_text_reader_test.cc time_test.cc test.cc -- 2.30.2