summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/common.h2
-rw-r--r--libhb/dvd.c24
-rw-r--r--libhb/lang.h362
-rw-r--r--libhb/muxmp4.c8
4 files changed, 217 insertions, 179 deletions
diff --git a/libhb/common.h b/libhb/common.h
index 14f0719a8..d09c2d279 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -221,6 +221,7 @@ struct hb_audio_s
int id;
char lang[1024];
char lang_simple[1024];
+ char iso639_2[4];
int codec;
int rate;
int bitrate;
@@ -267,6 +268,7 @@ struct hb_subtitle_s
{
int id;
char lang[1024];
+ char iso639_2[4];
#ifdef __LIBHB__
/* Internal data */
diff --git a/libhb/dvd.c b/libhb/dvd.c
index a9bf4309f..9b4ba3fe7 100644
--- a/libhb/dvd.c
+++ b/libhb/dvd.c
@@ -213,6 +213,7 @@ hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
hb_audio_t * audio, * audio_tmp;
int audio_format, lang_code, audio_control,
position, j;
+ iso639_lang_t * lang;
hb_log( "scan: checking audio %d", i + 1 );
@@ -280,15 +281,19 @@ hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
continue;
}
+ lang = lang_for_code( vts->vtsi_mat->vts_audio_attr[i].lang_code );
+
snprintf( audio->lang, sizeof( audio->lang ), "%s (%s)",
- lang_for_code( vts->vtsi_mat->vts_audio_attr[i].lang_code ),
+ strlen(lang->native_name) ? lang->native_name : lang->eng_name,
audio->codec == HB_ACODEC_AC3 ? "AC3" : ( audio->codec ==
HB_ACODEC_MPGA ? "MPEG" : "LPCM" ) );
snprintf( audio->lang_simple, sizeof( audio->lang_simple ), "%s",
- lang_for_code( vts->vtsi_mat->vts_audio_attr[i].lang_code ) );
+ strlen(lang->native_name) ? lang->native_name : lang->eng_name );
+ snprintf( audio->iso639_2, sizeof( audio->iso639_2 ), "%s",
+ lang->iso639_2);
- hb_log( "scan: id=%x, lang=%s", audio->id,
- audio->lang );
+ hb_log( "scan: id=%x, lang=%s, 3cc=%s", audio->id,
+ audio->lang, audio->iso639_2 );
hb_list_add( title->list_audio, audio );
}
@@ -309,6 +314,7 @@ hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
hb_subtitle_t * subtitle;
int spu_control;
int position;
+ iso639_lang_t * lang;
hb_log( "scan: checking subtitle %d", i + 1 );
@@ -340,13 +346,17 @@ hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
position = ( spu_control >> 24 ) & 0x7F;
}
+ lang = lang_for_code( vts->vtsi_mat->vts_subp_attr[i].lang_code );
+
subtitle = calloc( sizeof( hb_subtitle_t ), 1 );
subtitle->id = ( ( 0x20 + position ) << 8 ) | 0xbd;
snprintf( subtitle->lang, sizeof( subtitle->lang ), "%s",
- lang_for_code( vts->vtsi_mat->vts_subp_attr[i].lang_code ) );
+ strlen(lang->native_name) ? lang->native_name : lang->eng_name);
+ snprintf( subtitle->iso639_2, sizeof( subtitle->iso639_2 ), "%s",
+ lang->iso639_2);
- hb_log( "scan: id=%x, lang=%s", subtitle->id,
- subtitle->lang );
+ hb_log( "scan: id=%x, lang=%s, 3cc=%s", subtitle->id,
+ subtitle->lang, subtitle->iso639_2 );
hb_list_add( title->list_subtitle, subtitle );
}
diff --git a/libhb/lang.h b/libhb/lang.h
index f88f539ff..ac734a7b1 100644
--- a/libhb/lang.h
+++ b/libhb/lang.h
@@ -12,177 +12,200 @@ typedef struct iso639_lang_t
char * eng_name; /* Description in English */
char * native_name; /* Description in native language */
char * iso639_1; /* ISO-639-1 (2 characters) code */
+ char * iso639_2; /* ISO-639-2 (3 character) code */
} iso639_lang_t;
static const iso639_lang_t languages[] =
-{ { "Afar", "", "aa" },
- { "Abkhazian", "", "ab" },
- { "Afrikaans", "", "af" },
- { "Albanian", "", "sq" },
- { "Amharic", "", "am" },
- { "Arabic", "", "ar" },
- { "Armenian", "", "hy" },
- { "Assamese", "", "as" },
- { "Avestan", "", "ae" },
- { "Aymara", "", "ay" },
- { "Azerbaijani", "", "az" },
- { "Bashkir", "", "ba" },
- { "Basque", "", "eu" },
- { "Belarusian", "", "be" },
- { "Bengali", "", "bn" },
- { "Bihari", "", "bh" },
- { "Bislama", "", "bi" },
- { "Bosnian", "", "bs" },
- { "Breton", "", "br" },
- { "Bulgarian", "", "bg" },
- { "Burmese", "", "my" },
- { "Catalan", "", "ca" },
- { "Chamorro", "", "ch" },
- { "Chechen", "", "ce" },
- { "Chinese", "", "zh" },
- { "Church Slavic", "", "cu" },
- { "Chuvash", "", "cv" },
- { "Cornish", "", "kw" },
- { "Corsican", "", "co" },
- { "Czech", "", "cs" },
- { "Danish", "Dansk", "da" },
- { "Dutch", "Nederlands", "nl" },
- { "Dzongkha", "", "dz" },
- { "English", "English", "en" },
- { "Esperanto", "", "eo" },
- { "Estonian", "", "et" },
- { "Faroese", "", "fo" },
- { "Fijian", "", "fj" },
- { "Finnish", "Suomi", "fi" },
- { "French", "Francais", "fr" },
- { "Frisian", "", "fy" },
- { "Georgian", "", "ka" },
- { "German", "Deutsch", "de" },
- { "Gaelic (Scots)", "", "gd" },
- { "Irish", "", "ga" },
- { "Gallegan", "", "gl" },
- { "Manx", "", "gv" },
- { "Greek, Modern ()", "", "el" },
- { "Guarani", "", "gn" },
- { "Gujarati", "", "gu" },
- { "Hebrew", "", "he" },
- { "Herero", "", "hz" },
- { "Hindi", "", "hi" },
- { "Hiri Motu", "", "ho" },
- { "Hungarian", "Magyar", "hu" },
- { "Icelandic", "Islenska", "is" },
- { "Inuktitut", "", "iu" },
- { "Interlingue", "", "ie" },
- { "Interlingua", "", "ia" },
- { "Indonesian", "", "id" },
- { "Inupiaq", "", "ik" },
- { "Italian", "Italiano", "it" },
- { "Javanese", "", "jv" },
- { "Japanese", "", "ja" },
- { "Kalaallisut (Greenlandic)", "", "kl" },
- { "Kannada", "", "kn" },
- { "Kashmiri", "", "ks" },
- { "Kazakh", "", "kk" },
- { "Khmer", "", "km" },
- { "Kikuyu", "", "ki" },
- { "Kinyarwanda", "", "rw" },
- { "Kirghiz", "", "ky" },
- { "Komi", "", "kv" },
- { "Korean", "", "ko" },
- { "Kuanyama", "", "kj" },
- { "Kurdish", "", "ku" },
- { "Lao", "", "lo" },
- { "Latin", "", "la" },
- { "Latvian", "", "lv" },
- { "Lingala", "", "ln" },
- { "Lithuanian", "", "lt" },
- { "Letzeburgesch", "", "lb" },
- { "Macedonian", "", "mk" },
- { "Marshall", "", "mh" },
- { "Malayalam", "", "ml" },
- { "Maori", "", "mi" },
- { "Marathi", "", "mr" },
- { "Malay", "", "ms" },
- { "Malagasy", "", "mg" },
- { "Maltese", "", "mt" },
- { "Moldavian", "", "mo" },
- { "Mongolian", "", "mn" },
- { "Nauru", "", "na" },
- { "Navajo", "", "nv" },
- { "Ndebele, South", "", "nr" },
- { "Ndebele, North", "", "nd" },
- { "Ndonga", "", "ng" },
- { "Nepali", "", "ne" },
- { "Norwegian", "Norsk", "no" },
- { "Norwegian Nynorsk", "", "nn" },
- { "Norwegian Bokmål", "", "nb" },
- { "Chichewa; Nyanja", "", "ny" },
- { "Occitan (post 1500); Provençal", "", "oc" },
- { "Oriya", "", "or" },
- { "Oromo", "", "om" },
- { "Ossetian; Ossetic", "", "os" },
- { "Panjabi", "", "pa" },
- { "Persian", "", "fa" },
- { "Pali", "", "pi" },
- { "Polish", "", "pl" },
- { "Portuguese", "Portugues", "pt" },
- { "Pushto", "", "ps" },
- { "Quechua", "", "qu" },
- { "Raeto-Romance", "", "rm" },
- { "Romanian", "", "ro" },
- { "Rundi", "", "rn" },
- { "Russian", "", "ru" },
- { "Sango", "", "sg" },
- { "Sanskrit", "", "sa" },
- { "Serbian", "", "sr" },
- { "Croatian", "Hrvatski", "hr" },
- { "Sinhalese", "", "si" },
- { "Slovak", "", "sk" },
- { "Slovenian", "", "sl" },
- { "Northern Sami", "", "se" },
- { "Samoan", "", "sm" },
- { "Shona", "", "sn" },
- { "Sindhi", "", "sd" },
- { "Somali", "", "so" },
- { "Sotho, Southern", "", "st" },
- { "Spanish", "Espanol", "es" },
- { "Sardinian", "", "sc" },
- { "Swati", "", "ss" },
- { "Sundanese", "", "su" },
- { "Swahili", "", "sw" },
- { "Swedish", "Svenska", "sv" },
- { "Tahitian", "", "ty" },
- { "Tamil", "", "ta" },
- { "Tatar", "", "tt" },
- { "Telugu", "", "te" },
- { "Tajik", "", "tg" },
- { "Tagalog", "", "tl" },
- { "Thai", "", "th" },
- { "Tibetan", "", "bo" },
- { "Tigrinya", "", "ti" },
- { "Tonga (Tonga Islands)", "", "to" },
- { "Tswana", "", "tn" },
- { "Tsonga", "", "ts" },
- { "Turkish", "", "tr" },
- { "Turkmen", "", "tk" },
- { "Twi", "", "tw" },
- { "Uighur", "", "ug" },
- { "Ukrainian", "", "uk" },
- { "Urdu", "", "ur" },
- { "Uzbek", "", "uz" },
- { "Vietnamese", "", "vi" },
- { "Volapük", "", "vo" },
- { "Welsh", "", "cy" },
- { "Wolof", "", "wo" },
- { "Xhosa", "", "xh" },
- { "Yiddish", "", "yi" },
- { "Yoruba", "", "yo" },
- { "Zhuang", "", "za" },
- { "Zulu", "", "zu" },
+{ { "Unknown", "", "", "und" },
+ { "Afar", "", "aa", "aar" },
+ { "Abkhazian", "", "ab", "abk" },
+ { "Afrikaans", "", "af", "afr" },
+ { "Akan", "", "ak", "aka" },
+ { "Albanian", "", "sq", "alb" },
+ { "Amharic", "", "am", "amh" },
+ { "Arabic", "", "ar", "ara" },
+ { "Aragonese", "", "an", "arg" },
+ { "Armenian", "", "hy", "arm" },
+ { "Assamese", "", "as", "asm" },
+ { "Avaric", "", "av", "ava" },
+ { "Avestan", "", "ae", "ave" },
+ { "Aymara", "", "ay", "aym" },
+ { "Azerbaijani", "", "az", "aze" },
+ { "Bashkir", "", "ba", "bak" },
+ { "Bambara", "", "bm", "bam" },
+ { "Basque", "", "eu", "baq" },
+ { "Belarusian", "", "be", "bel" },
+ { "Bengali", "", "bn", "ben" },
+ { "Bihari", "", "bh", "bih" },
+ { "Bislama", "", "bi", "bis" },
+ { "Bosnian", "", "bs", "bos" },
+ { "Breton", "", "br", "bre" },
+ { "Bulgarian", "", "bg", "bul" },
+ { "Burmese", "", "my", "bur" },
+ { "Catalan", "", "ca", "cat" },
+ { "Chamorro", "", "ch", "cha" },
+ { "Chechen", "", "ce", "che" },
+ { "Chinese", "", "zh", "chi" },
+ { "Church Slavic", "", "cu", "chu" },
+ { "Chuvash", "", "cv", "chv" },
+ { "Cornish", "", "kw", "cor" },
+ { "Corsican", "", "co", "cos" },
+ { "Cree", "", "cr", "cre" },
+ { "Czech", "", "cs", "cze" },
+ { "Danish", "Dansk", "da", "dan" },
+ { "Divehi", "", "dv", "div" },
+ { "Dutch", "Nederlands", "nl", "dut" },
+ { "Dzongkha", "", "dz", "dzo" },
+ { "English", "English", "en", "eng" },
+ { "Esperanto", "", "eo", "epo" },
+ { "Estonian", "", "et", "est" },
+ { "Ewe", "", "ee", "ewe" },
+ { "Faroese", "", "fo", "fao" },
+ { "Fijian", "", "fj", "fij" },
+ { "Finnish", "Suomi", "fi", "fin" },
+ { "French", "Francais", "fr", "fre" },
+ { "Western Frisian", "", "fy", "fry" },
+ { "Fulah", "", "ff", "ful" },
+ { "Georgian", "", "ka", "geo" },
+ { "German", "Deutsch", "de", "ger" },
+ { "Gaelic (Scots)", "", "gd", "gla" },
+ { "Irish", "", "ga", "gle" },
+ { "Galician", "", "gl", "glg" },
+ { "Manx", "", "gv", "glv" },
+ { "Greek, Modern", "", "el", "gre" },
+ { "Guarani", "", "gn", "grn" },
+ { "Gujarati", "", "gu", "guj" },
+ { "Haitian", "", "ht", "hat" },
+ { "Hausa", "", "ha", "hau" },
+ { "Hebrew", "", "he", "heb" },
+ { "Herero", "", "hz", "her" },
+ { "Hindi", "", "hi", "hin" },
+ { "Hiri Motu", "", "ho", "hmo" },
+ { "Hungarian", "Magyar", "hu", "hun" },
+ { "Igbo", "", "ig", "ibo" },
+ { "Icelandic", "Islenska", "is", "ice" },
+ { "Ido", "", "io", "ido" },
+ { "Sichuan Yi", "", "ii", "iii" },
+ { "Inuktitut", "", "iu", "iku" },
+ { "Interlingue", "", "ie", "ile" },
+ { "Interlingua", "", "ia", "ina" },
+ { "Indonesian", "", "id", "ind" },
+ { "Inupiaq", "", "ik", "ipk" },
+ { "Italian", "Italiano", "it", "ita" },
+ { "Javanese", "", "jv", "jav" },
+ { "Japanese", "", "ja", "jpn" },
+ { "Kalaallisut (Greenlandic)", "", "kl", "kal" },
+ { "Kannada", "", "kn", "kan" },
+ { "Kashmiri", "", "ks", "kas" },
+ { "Kanuri", "", "kr", "kau" },
+ { "Kazakh", "", "kk", "kaz" },
+ { "Central Khmer", "", "km", "khm" },
+ { "Kikuyu", "", "ki", "kik" },
+ { "Kinyarwanda", "", "rw", "kin" },
+ { "Kirghiz", "", "ky", "kir" },
+ { "Komi", "", "kv", "kom" },
+ { "Kongo", "", "kg", "kon" },
+ { "Korean", "", "ko", "kor" },
+ { "Kuanyama", "", "kj", "kua" },
+ { "Kurdish", "", "ku", "kur" },
+ { "Lao", "", "lo", "lao" },
+ { "Latin", "", "la", "lat" },
+ { "Latvian", "", "lv", "lav" },
+ { "Limburgan", "", "li", "lim" },
+ { "Lingala", "", "ln", "lin" },
+ { "Lithuanian", "", "lt", "lit" },
+ { "Luxembourgish", "", "lb", "ltz" },
+ { "Luba-Katanga", "", "lu", "lub" },
+ { "Ganda", "", "lg", "lug" },
+ { "Macedonian", "", "mk", "mac" },
+ { "Marshallese", "", "mh", "mah" },
+ { "Malayalam", "", "ml", "mal" },
+ { "Maori", "", "mi", "mao" },
+ { "Marathi", "", "mr", "mar" },
+ { "Malay", "", "ms", "may" },
+ { "Malagasy", "", "mg", "mlg" },
+ { "Maltese", "", "mt", "mlt" },
+ { "Moldavian", "", "mo", "mol" },
+ { "Mongolian", "", "mn", "mon" },
+ { "Nauru", "", "na", "nau" },
+ { "Navajo", "", "nv", "nav" },
+ { "Ndebele, South", "", "nr", "nbl" },
+ { "Ndebele, North", "", "nd", "nde" },
+ { "Ndonga", "", "ng", "ndo" },
+ { "Nepali", "", "ne", "nep" },
+ { "Norwegian Nynorsk", "", "nn", "nno" },
+ { "Norwegian Bokmål", "", "nb", "nob" },
+ { "Norwegian", "Norsk", "no", "nor" },
+ { "Chichewa; Nyanja", "", "ny", "nya" },
+ { "Occitan (post 1500); Provençal", "", "oc", "oci" },
+ { "Ojibwa", "", "oj", "oji" },
+ { "Oriya", "", "or", "ori" },
+ { "Oromo", "", "om", "orm" },
+ { "Ossetian; Ossetic", "", "os", "oss" },
+ { "Panjabi", "", "pa", "pan" },
+ { "Persian", "", "fa", "per" },
+ { "Pali", "", "pi", "pli" },
+ { "Polish", "", "pl", "pol" },
+ { "Portuguese", "Portugues", "pt", "por" },
+ { "Pushto", "", "ps", "pus" },
+ { "Quechua", "", "qu", "que" },
+ { "Romansh", "", "rm", "roh" },
+ { "Romanian", "", "ro", "rum" },
+ { "Rundi", "", "rn", "run" },
+ { "Russian", "", "ru", "rus" },
+ { "Sango", "", "sg", "sag" },
+ { "Sanskrit", "", "sa", "san" },
+ { "Serbian", "", "sr", "scc" },
+ { "Croatian", "Hrvatski", "hr", "scr" },
+ { "Sinhala", "", "si", "sin" },
+ { "Slovak", "", "sk", "slo" },
+ { "Slovenian", "", "sl", "slv" },
+ { "Northern Sami", "", "se", "sme" },
+ { "Samoan", "", "sm", "smo" },
+ { "Shona", "", "sn", "sna" },
+ { "Sindhi", "", "sd", "snd" },
+ { "Somali", "", "so", "som" },
+ { "Sotho, Southern", "", "st", "sot" },
+ { "Spanish", "Espanol", "es", "spa" },
+ { "Sardinian", "", "sc", "srd" },
+ { "Swati", "", "ss", "ssw" },
+ { "Sundanese", "", "su", "sun" },
+ { "Swahili", "", "sw", "swa" },
+ { "Swedish", "Svenska", "sv", "swe" },
+ { "Tahitian", "", "ty", "tah" },
+ { "Tamil", "", "ta", "tam" },
+ { "Tatar", "", "tt", "tat" },
+ { "Telugu", "", "te", "tel" },
+ { "Tajik", "", "tg", "tgk" },
+ { "Tagalog", "", "tl", "tgl" },
+ { "Thai", "", "th", "tha" },
+ { "Tibetan", "", "bo", "tib" },
+ { "Tigrinya", "", "ti", "tir" },
+ { "Tonga (Tonga Islands)", "", "to", "ton" },
+ { "Tswana", "", "tn", "tsn" },
+ { "Tsonga", "", "ts", "tso" },
+ { "Turkmen", "", "tk", "tuk" },
+ { "Turkish", "", "tr", "tur" },
+ { "Twi", "", "tw", "twi" },
+ { "Uighur", "", "ug", "uig" },
+ { "Ukrainian", "", "uk", "ukr" },
+ { "Urdu", "", "ur", "urd" },
+ { "Uzbek", "", "uz", "uzb" },
+ { "Venda", "", "ve", "ven" },
+ { "Vietnamese", "", "vi", "vie" },
+ { "Volapük", "", "vo", "vol" },
+ { "Welsh", "", "cy", "wel" },
+ { "Walloon", "", "wa", "wln" },
+ { "Wolof", "", "wo", "wol" },
+ { "Xhosa", "", "xh", "xho" },
+ { "Yiddish", "", "yi", "yid" },
+ { "Yoruba", "", "yo", "yor" },
+ { "Zhuang", "", "za", "zha" },
+ { "Zulu", "", "zu", "zul" },
{ NULL, NULL, NULL } };
-static char * lang_for_code( int code )
+iso639_lang_t * lang_for_code( int code )
{
char code_string[2];
iso639_lang_t * lang;
@@ -194,16 +217,11 @@ static char * lang_for_code( int code )
{
if( !strncmp( lang->iso639_1, code_string, 2 ) )
{
- if( *lang->native_name )
- {
- return lang->native_name;
- }
-
- return lang->eng_name;
+ return lang;
}
}
- return "Unknown";
+ return (iso639_lang_t*) languages;
}
#endif
diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c
index 458de7be3..f06527295 100644
--- a/libhb/muxmp4.c
+++ b/libhb/muxmp4.c
@@ -44,6 +44,7 @@ static int MP4Init( hb_mux_object_t * m )
hb_audio_t * audio;
hb_mux_data_t * mux_data;
int i;
+ u_int16_t language_code;
/* Create an empty mp4 file */
m->file = MP4Create( job->file, MP4_DETAILS_ERROR, 0 );
@@ -164,6 +165,13 @@ static int MP4Init( hb_mux_object_t * m )
MP4SetAudioProfileLevel( m->file, 0x0F );
MP4SetTrackESConfiguration( m->file, mux_data->track,
audio->config.aac.bytes, audio->config.aac.length );
+
+ /* Set the language for this track */
+ /* The language is stored as 5-bit text - 0x60 */
+ language_code = audio->iso639_2[0] - 0x60; language_code <<= 5;
+ language_code |= audio->iso639_2[1] - 0x60; language_code <<= 5;
+ language_code |= audio->iso639_2[2] - 0x60;
+ MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.mdhd.language", language_code);
/* store a reference to the first audio track,
so we can use it to feed the chapter text track's sample rate */