From 07f4ac6132fc30f880e1eb014ef6b7b6f9d8e751 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 22 Sep 2003 13:14:30 +0000 Subject: [PATCH] Added automatic conversion of language index codes in the VobSub reader. --- src/iso639.cpp | 25 +++++++++++++++++++++++-- src/iso639.h | 8 +++++--- src/r_vobsub.cpp | 12 ++++++++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/iso639.cpp b/src/iso639.cpp index 2fe7afd34..28e074d93 100644 --- a/src/iso639.cpp +++ b/src/iso639.cpp @@ -24,7 +24,7 @@ #include "common.h" #include "iso639.h" -iso639_language_t iso639_languages[] = +const iso639_language_t iso639_languages[] = {{"Abkhazian", "abk", "ab"}, {"Achinese", "ace", NULL}, {"Acoli", "ach", NULL}, @@ -535,7 +535,7 @@ iso639_language_t iso639_languages[] = {"Zuni", "zun", NULL}, {NULL, NULL, NULL}}; -char *get_iso639_english_name(const char *iso639_2_code) { +const char *get_iso639_english_name(const char *iso639_2_code) { int i; i = 0; @@ -579,3 +579,24 @@ void list_iso639_languages() { i++; } } + +const char *map_iso639_1_to_iso639_2(const char *iso639_1_code) { + uint32_t i; + + for (i = 0; iso639_languages[i].iso639_2_code != NULL; i++) + if ((iso639_languages[i].iso639_1_code != NULL) && + !strcmp(iso639_1_code, iso639_languages[i].iso639_1_code)) + return iso639_languages[i].iso639_2_code; + + return NULL; +} + +const char *map_iso639_2_to_iso639_1(const char *iso639_2_code) { + uint32_t i; + + for (i = 0; iso639_languages[i].iso639_2_code != NULL; i++) + if (!strcmp(iso639_2_code, iso639_languages[i].iso639_2_code)) + return iso639_languages[i].iso639_1_code; + + return NULL; +} diff --git a/src/iso639.h b/src/iso639.h index ee809420a..05c3bb975 100644 --- a/src/iso639.h +++ b/src/iso639.h @@ -22,13 +22,15 @@ #define __ISO639_H typedef struct { - char *english_name, *iso639_2_code, *iso639_1_code; + const char *english_name, *iso639_2_code, *iso639_1_code; } iso639_language_t; -extern iso639_language_t iso639_languages[]; +extern const iso639_language_t iso639_languages[]; int is_valid_iso639_2_code(const char *iso639_2_code); -char *get_iso639_english_name(const char *iso639_2_code); +const char *get_iso639_english_name(const char *iso639_2_code); +const char *map_iso639_1_to_iso639_2(const char *iso639_1_code); +const char *map_iso639_2_to_iso639_1(const char *iso639_2_code); void list_iso639_languages(); #endif // __ISO639_H diff --git a/src/r_vobsub.cpp b/src/r_vobsub.cpp index 235315b1c..16dc19942 100644 --- a/src/r_vobsub.cpp +++ b/src/r_vobsub.cpp @@ -25,6 +25,7 @@ #include #include "common.h" +#include "iso639.h" #include "mm_io.h" #include "p_vobsub.h" #include "r_vobsub.h" @@ -148,13 +149,19 @@ vobsub_reader_c::~vobsub_reader_c() { void vobsub_reader_c::create_packetizers() { uint32_t i, k; int64_t avg_duration; + char language[4]; + const char *c; for (i = 0; i < tracks.size(); i++) { if (!demuxing_requested('s', i)) continue; ti->id = i; -// ti.language = tracks[i]->language; + if ((c = map_iso639_1_to_iso639_2(tracks[i]->language)) != NULL) { + strcpy(language, c); + ti->language = language; + } else + ti->language = NULL; tracks[i]->packetizer = new vobsub_packetizer_c(this, idx_data.c_str(), idx_data.length(), COMPRESSION_ZLIB, COMPRESSION_NONE, ti); @@ -215,7 +222,8 @@ void vobsub_reader_c::parse_headers() { continue; } - if (!strncasecmp(sline, "alt:", 4)) + if (!strncasecmp(sline, "alt:", 4) || + !strncasecmp(sline, "langidx:", 8)) continue; if ((version == 7) && isvobsubline_v7(sline)) {