00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "avlanguage.h"
00022 #include "libavutil/avstring.h"
00023 #include "libavutil/common.h"
00024 #include <stdlib.h>
00025 #include <stdint.h>
00026 #include <string.h>
00027
00028 typedef struct LangEntry {
00029 const char str[4];
00030 uint16_t next_equivalent;
00031 } LangEntry;
00032
00033 static const uint16_t lang_table_counts[] = { 484, 20, 184 };
00034 static const uint16_t lang_table_offsets[] = { 0, 484, 504 };
00035
00036 static const LangEntry lang_table[] = {
00037
00038 { "aar", 504 },
00039 { "abk", 505 },
00040 { "ace", 2 },
00041 { "ach", 3 },
00042 { "ada", 4 },
00043 { "ady", 5 },
00044 { "afa", 6 },
00045 { "afh", 7 },
00046 { "afr", 507 },
00047 { "ain", 9 },
00048 { "aka", 508 },
00049 { "akk", 11 },
00050 { "alb", 502 },
00051 { "ale", 13 },
00052 { "alg", 14 },
00053 { "alt", 15 },
00054 { "amh", 509 },
00055 { "ang", 17 },
00056 { "anp", 18 },
00057 { "apa", 19 },
00058 { "ara", 511 },
00059 { "arc", 21 },
00060 { "arg", 510 },
00061 { "arm", 492 },
00062 { "arn", 24 },
00063 { "arp", 25 },
00064 { "art", 26 },
00065 { "arw", 27 },
00066 { "asm", 512 },
00067 { "ast", 29 },
00068 { "ath", 30 },
00069 { "aus", 31 },
00070 { "ava", 513 },
00071 { "ave", 506 },
00072 { "awa", 34 },
00073 { "aym", 514 },
00074 { "aze", 515 },
00075 { "bad", 37 },
00076 { "bai", 38 },
00077 { "bak", 516 },
00078 { "bal", 40 },
00079 { "bam", 521 },
00080 { "ban", 42 },
00081 { "baq", 489 },
00082 { "bas", 44 },
00083 { "bat", 45 },
00084 { "bej", 46 },
00085 { "bel", 517 },
00086 { "bem", 48 },
00087 { "ben", 522 },
00088 { "ber", 50 },
00089 { "bho", 51 },
00090 { "bih", 519 },
00091 { "bik", 53 },
00092 { "bin", 54 },
00093 { "bis", 520 },
00094 { "bla", 56 },
00095 { "bnt", 57 },
00096 { "bos", 525 },
00097 { "bra", 59 },
00098 { "bre", 524 },
00099 { "btk", 61 },
00100 { "bua", 62 },
00101 { "bug", 63 },
00102 { "bul", 518 },
00103 { "bur", 498 },
00104 { "byn", 66 },
00105 { "cad", 67 },
00106 { "cai", 68 },
00107 { "car", 69 },
00108 { "cat", 526 },
00109 { "cau", 71 },
00110 { "ceb", 72 },
00111 { "cel", 73 },
00112 { "cha", 528 },
00113 { "chb", 75 },
00114 { "che", 527 },
00115 { "chg", 77 },
00116 { "chi", 503 },
00117 { "chk", 79 },
00118 { "chm", 80 },
00119 { "chn", 81 },
00120 { "cho", 82 },
00121 { "chp", 83 },
00122 { "chr", 84 },
00123 { "chu", 532 },
00124 { "chv", 533 },
00125 { "chy", 87 },
00126 { "cmc", 88 },
00127 { "cop", 89 },
00128 { "cor", 593 },
00129 { "cos", 529 },
00130 { "cpe", 92 },
00131 { "cpf", 93 },
00132 { "cpp", 94 },
00133 { "cre", 530 },
00134 { "crh", 96 },
00135 { "crp", 97 },
00136 { "csb", 98 },
00137 { "cus", 99 },
00138 { "cze", 485 },
00139 { "dak", 101 },
00140 { "dan", 535 },
00141 { "dar", 103 },
00142 { "day", 104 },
00143 { "del", 105 },
00144 { "den", 106 },
00145 { "dgr", 107 },
00146 { "din", 108 },
00147 { "div", 537 },
00148 { "doi", 110 },
00149 { "dra", 111 },
00150 { "dsb", 112 },
00151 { "dua", 113 },
00152 { "dum", 114 },
00153 { "dut", 499 },
00154 { "dyu", 116 },
00155 { "dzo", 538 },
00156 { "efi", 118 },
00157 { "egy", 119 },
00158 { "eka", 120 },
00159 { "elx", 121 },
00160 { "eng", 541 },
00161 { "enm", 123 },
00162 { "epo", 542 },
00163 { "est", 544 },
00164 { "ewe", 539 },
00165 { "ewo", 127 },
00166 { "fan", 128 },
00167 { "fao", 550 },
00168 { "fat", 130 },
00169 { "fij", 549 },
00170 { "fil", 132 },
00171 { "fin", 548 },
00172 { "fiu", 134 },
00173 { "fon", 135 },
00174 { "fre", 491 },
00175 { "frm", 137 },
00176 { "fro", 138 },
00177 { "frr", 139 },
00178 { "frs", 140 },
00179 { "fry", 552 },
00180 { "ful", 547 },
00181 { "fur", 143 },
00182 { "gaa", 144 },
00183 { "gay", 145 },
00184 { "gba", 146 },
00185 { "gem", 147 },
00186 { "geo", 494 },
00187 { "ger", 487 },
00188 { "gez", 150 },
00189 { "gil", 151 },
00190 { "gla", 554 },
00191 { "gle", 553 },
00192 { "glg", 555 },
00193 { "glv", 558 },
00194 { "gmh", 156 },
00195 { "goh", 157 },
00196 { "gon", 158 },
00197 { "gor", 159 },
00198 { "got", 160 },
00199 { "grb", 161 },
00200 { "grc", 162 },
00201 { "gre", 488 },
00202 { "grn", 556 },
00203 { "gsw", 165 },
00204 { "guj", 557 },
00205 { "gwi", 167 },
00206 { "hai", 168 },
00207 { "hat", 564 },
00208 { "hau", 559 },
00209 { "haw", 171 },
00210 { "heb", 560 },
00211 { "her", 567 },
00212 { "hil", 174 },
00213 { "him", 175 },
00214 { "hin", 561 },
00215 { "hit", 177 },
00216 { "hmn", 178 },
00217 { "hmo", 562 },
00218 { "hrv", 563 },
00219 { "hsb", 181 },
00220 { "hun", 565 },
00221 { "hup", 183 },
00222 { "iba", 184 },
00223 { "ibo", 571 },
00224 { "ice", 493 },
00225 { "ido", 574 },
00226 { "iii", 572 },
00227 { "ijo", 189 },
00228 { "iku", 577 },
00229 { "ile", 570 },
00230 { "ilo", 192 },
00231 { "ina", 568 },
00232 { "inc", 194 },
00233 { "ind", 569 },
00234 { "ine", 196 },
00235 { "inh", 197 },
00236 { "ipk", 573 },
00237 { "ira", 199 },
00238 { "iro", 200 },
00239 { "ita", 576 },
00240 { "jav", 579 },
00241 { "jbo", 203 },
00242 { "jpn", 578 },
00243 { "jpr", 205 },
00244 { "jrb", 206 },
00245 { "kaa", 207 },
00246 { "kab", 208 },
00247 { "kac", 209 },
00248 { "kal", 585 },
00249 { "kam", 211 },
00250 { "kan", 587 },
00251 { "kar", 213 },
00252 { "kas", 590 },
00253 { "kau", 589 },
00254 { "kaw", 216 },
00255 { "kaz", 584 },
00256 { "kbd", 218 },
00257 { "kha", 219 },
00258 { "khi", 220 },
00259 { "khm", 586 },
00260 { "kho", 222 },
00261 { "kik", 582 },
00262 { "kin", 640 },
00263 { "kir", 594 },
00264 { "kmb", 226 },
00265 { "kok", 227 },
00266 { "kom", 592 },
00267 { "kon", 581 },
00268 { "kor", 588 },
00269 { "kos", 231 },
00270 { "kpe", 232 },
00271 { "krc", 233 },
00272 { "krl", 234 },
00273 { "kro", 235 },
00274 { "kru", 236 },
00275 { "kua", 583 },
00276 { "kum", 238 },
00277 { "kur", 591 },
00278 { "kut", 240 },
00279 { "lad", 241 },
00280 { "lah", 242 },
00281 { "lam", 243 },
00282 { "lao", 600 },
00283 { "lat", 595 },
00284 { "lav", 603 },
00285 { "lez", 247 },
00286 { "lim", 598 },
00287 { "lin", 599 },
00288 { "lit", 601 },
00289 { "lol", 251 },
00290 { "loz", 252 },
00291 { "ltz", 596 },
00292 { "lua", 254 },
00293 { "lub", 602 },
00294 { "lug", 597 },
00295 { "lui", 257 },
00296 { "lun", 258 },
00297 { "luo", 259 },
00298 { "lus", 260 },
00299 { "mac", 495 },
00300 { "mad", 262 },
00301 { "mag", 263 },
00302 { "mah", 605 },
00303 { "mai", 265 },
00304 { "mak", 266 },
00305 { "mal", 608 },
00306 { "man", 268 },
00307 { "mao", 496 },
00308 { "map", 270 },
00309 { "mar", 610 },
00310 { "mas", 272 },
00311 { "may", 497 },
00312 { "mdf", 274 },
00313 { "mdr", 275 },
00314 { "men", 276 },
00315 { "mga", 277 },
00316 { "mic", 278 },
00317 { "min", 279 },
00318 { "mis", 280 },
00319 { "mkh", 281 },
00320 { "mlg", 604 },
00321 { "mlt", 612 },
00322 { "mnc", 284 },
00323 { "mni", 285 },
00324 { "mno", 286 },
00325 { "moh", 287 },
00326 { "mon", 609 },
00327 { "mos", 289 },
00328 { "mul", 290 },
00329 { "mun", 291 },
00330 { "mus", 292 },
00331 { "mwl", 293 },
00332 { "mwr", 294 },
00333 { "myn", 295 },
00334 { "myv", 296 },
00335 { "nah", 297 },
00336 { "nai", 298 },
00337 { "nap", 299 },
00338 { "nau", 614 },
00339 { "nav", 623 },
00340 { "nbl", 622 },
00341 { "nde", 616 },
00342 { "ndo", 618 },
00343 { "nds", 305 },
00344 { "nep", 617 },
00345 { "new", 307 },
00346 { "nia", 308 },
00347 { "nic", 309 },
00348 { "niu", 310 },
00349 { "nno", 620 },
00350 { "nob", 615 },
00351 { "nog", 313 },
00352 { "non", 314 },
00353 { "nor", 621 },
00354 { "nqo", 316 },
00355 { "nso", 317 },
00356 { "nub", 318 },
00357 { "nwc", 319 },
00358 { "nya", 624 },
00359 { "nym", 321 },
00360 { "nyn", 322 },
00361 { "nyo", 323 },
00362 { "nzi", 324 },
00363 { "oci", 625 },
00364 { "oji", 626 },
00365 { "ori", 628 },
00366 { "orm", 627 },
00367 { "osa", 329 },
00368 { "oss", 629 },
00369 { "ota", 331 },
00370 { "oto", 332 },
00371 { "paa", 333 },
00372 { "pag", 334 },
00373 { "pal", 335 },
00374 { "pam", 336 },
00375 { "pan", 630 },
00376 { "pap", 338 },
00377 { "pau", 339 },
00378 { "peo", 340 },
00379 { "per", 490 },
00380 { "phi", 342 },
00381 { "phn", 343 },
00382 { "pli", 631 },
00383 { "pol", 632 },
00384 { "pon", 346 },
00385 { "por", 634 },
00386 { "pra", 348 },
00387 { "pro", 349 },
00388 { "pus", 633 },
00389 { "que", 635 },
00390 { "raj", 352 },
00391 { "rap", 353 },
00392 { "rar", 354 },
00393 { "roa", 355 },
00394 { "roh", 636 },
00395 { "rom", 357 },
00396 { "rum", 500 },
00397 { "run", 637 },
00398 { "rup", 360 },
00399 { "rus", 639 },
00400 { "sad", 362 },
00401 { "sag", 645 },
00402 { "sah", 364 },
00403 { "sai", 365 },
00404 { "sal", 366 },
00405 { "sam", 367 },
00406 { "san", 641 },
00407 { "sas", 369 },
00408 { "sat", 370 },
00409 { "scn", 371 },
00410 { "sco", 372 },
00411 { "sel", 373 },
00412 { "sem", 374 },
00413 { "sga", 375 },
00414 { "sgn", 376 },
00415 { "shn", 377 },
00416 { "sid", 378 },
00417 { "sin", 646 },
00418 { "sio", 380 },
00419 { "sit", 381 },
00420 { "sla", 382 },
00421 { "slo", 501 },
00422 { "slv", 648 },
00423 { "sma", 385 },
00424 { "sme", 644 },
00425 { "smi", 387 },
00426 { "smj", 388 },
00427 { "smn", 389 },
00428 { "smo", 649 },
00429 { "sms", 391 },
00430 { "sna", 650 },
00431 { "snd", 643 },
00432 { "snk", 394 },
00433 { "sog", 395 },
00434 { "som", 651 },
00435 { "son", 397 },
00436 { "sot", 655 },
00437 { "spa", 543 },
00438 { "srd", 642 },
00439 { "srn", 401 },
00440 { "srp", 653 },
00441 { "srr", 403 },
00442 { "ssa", 404 },
00443 { "ssw", 654 },
00444 { "suk", 406 },
00445 { "sun", 656 },
00446 { "sus", 408 },
00447 { "sux", 409 },
00448 { "swa", 658 },
00449 { "swe", 657 },
00450 { "syc", 412 },
00451 { "syr", 413 },
00452 { "tah", 672 },
00453 { "tai", 415 },
00454 { "tam", 659 },
00455 { "tat", 670 },
00456 { "tel", 660 },
00457 { "tem", 419 },
00458 { "ter", 420 },
00459 { "tet", 421 },
00460 { "tgk", 661 },
00461 { "tgl", 665 },
00462 { "tha", 662 },
00463 { "tib", 484 },
00464 { "tig", 426 },
00465 { "tir", 663 },
00466 { "tiv", 428 },
00467 { "tkl", 429 },
00468 { "tlh", 430 },
00469 { "tli", 431 },
00470 { "tmh", 432 },
00471 { "tog", 433 },
00472 { "ton", 667 },
00473 { "tpi", 435 },
00474 { "tsi", 436 },
00475 { "tsn", 666 },
00476 { "tso", 669 },
00477 { "tuk", 664 },
00478 { "tum", 440 },
00479 { "tup", 441 },
00480 { "tur", 668 },
00481 { "tut", 443 },
00482 { "tvl", 444 },
00483 { "twi", 671 },
00484 { "tyv", 446 },
00485 { "udm", 447 },
00486 { "uga", 448 },
00487 { "uig", 673 },
00488 { "ukr", 674 },
00489 { "umb", 451 },
00490 { "und", 452 },
00491 { "urd", 675 },
00492 { "uzb", 676 },
00493 { "vai", 455 },
00494 { "ven", 677 },
00495 { "vie", 678 },
00496 { "vol", 679 },
00497 { "vot", 459 },
00498 { "wak", 460 },
00499 { "wal", 461 },
00500 { "war", 462 },
00501 { "was", 463 },
00502 { "wel", 486 },
00503 { "wen", 465 },
00504 { "wln", 680 },
00505 { "wol", 681 },
00506 { "xal", 468 },
00507 { "xho", 682 },
00508 { "yao", 470 },
00509 { "yap", 471 },
00510 { "yid", 683 },
00511 { "yor", 684 },
00512 { "ypk", 474 },
00513 { "zap", 475 },
00514 { "zbl", 476 },
00515 { "zen", 477 },
00516 { "zha", 685 },
00517 { "znd", 479 },
00518 { "zul", 687 },
00519 { "zun", 481 },
00520 { "zxx", 482 },
00521 { "zza", 483 },
00522
00523 { "bod", 523 },
00524 { "ces", 531 },
00525 { "cym", 534 },
00526 { "deu", 536 },
00527 { "ell", 540 },
00528 { "eus", 545 },
00529 { "fas", 546 },
00530 { "fra", 551 },
00531 { "hye", 566 },
00532 { "isl", 575 },
00533 { "kat", 580 },
00534 { "mkd", 607 },
00535 { "mri", 606 },
00536 { "msa", 611 },
00537 { "mya", 613 },
00538 { "nld", 619 },
00539 { "ron", 638 },
00540 { "slk", 647 },
00541 { "sqi", 652 },
00542 { "zho", 686 },
00543
00544 { "aa" , 0 },
00545 { "ab" , 1 },
00546 { "ae" , 33 },
00547 { "af" , 8 },
00548 { "ak" , 10 },
00549 { "am" , 16 },
00550 { "an" , 22 },
00551 { "ar" , 20 },
00552 { "as" , 28 },
00553 { "av" , 32 },
00554 { "ay" , 35 },
00555 { "az" , 36 },
00556 { "ba" , 39 },
00557 { "be" , 47 },
00558 { "bg" , 64 },
00559 { "bh" , 52 },
00560 { "bi" , 55 },
00561 { "bm" , 41 },
00562 { "bn" , 49 },
00563 { "bo" , 425 },
00564 { "br" , 60 },
00565 { "bs" , 58 },
00566 { "ca" , 70 },
00567 { "ce" , 76 },
00568 { "ch" , 74 },
00569 { "co" , 91 },
00570 { "cr" , 95 },
00571 { "cs" , 100 },
00572 { "cu" , 85 },
00573 { "cv" , 86 },
00574 { "cy" , 464 },
00575 { "da" , 102 },
00576 { "de" , 149 },
00577 { "dv" , 109 },
00578 { "dz" , 117 },
00579 { "ee" , 126 },
00580 { "el" , 163 },
00581 { "en" , 122 },
00582 { "eo" , 124 },
00583 { "es" , 399 },
00584 { "et" , 125 },
00585 { "eu" , 43 },
00586 { "fa" , 341 },
00587 { "ff" , 142 },
00588 { "fi" , 133 },
00589 { "fj" , 131 },
00590 { "fo" , 129 },
00591 { "fr" , 136 },
00592 { "fy" , 141 },
00593 { "ga" , 153 },
00594 { "gd" , 152 },
00595 { "gl" , 154 },
00596 { "gn" , 164 },
00597 { "gu" , 166 },
00598 { "gv" , 155 },
00599 { "ha" , 170 },
00600 { "he" , 172 },
00601 { "hi" , 176 },
00602 { "ho" , 179 },
00603 { "hr" , 180 },
00604 { "ht" , 169 },
00605 { "hu" , 182 },
00606 { "hy" , 23 },
00607 { "hz" , 173 },
00608 { "ia" , 193 },
00609 { "id" , 195 },
00610 { "ie" , 191 },
00611 { "ig" , 185 },
00612 { "ii" , 188 },
00613 { "ik" , 198 },
00614 { "io" , 187 },
00615 { "is" , 186 },
00616 { "it" , 201 },
00617 { "iu" , 190 },
00618 { "ja" , 204 },
00619 { "jv" , 202 },
00620 { "ka" , 148 },
00621 { "kg" , 229 },
00622 { "ki" , 223 },
00623 { "kj" , 237 },
00624 { "kk" , 217 },
00625 { "kl" , 210 },
00626 { "km" , 221 },
00627 { "kn" , 212 },
00628 { "ko" , 230 },
00629 { "kr" , 215 },
00630 { "ks" , 214 },
00631 { "ku" , 239 },
00632 { "kv" , 228 },
00633 { "kw" , 90 },
00634 { "ky" , 225 },
00635 { "la" , 245 },
00636 { "lb" , 253 },
00637 { "lg" , 256 },
00638 { "li" , 248 },
00639 { "ln" , 249 },
00640 { "lo" , 244 },
00641 { "lt" , 250 },
00642 { "lu" , 255 },
00643 { "lv" , 246 },
00644 { "mg" , 282 },
00645 { "mh" , 264 },
00646 { "mi" , 269 },
00647 { "mk" , 261 },
00648 { "ml" , 267 },
00649 { "mn" , 288 },
00650 { "mr" , 271 },
00651 { "ms" , 273 },
00652 { "mt" , 283 },
00653 { "my" , 65 },
00654 { "na" , 300 },
00655 { "nb" , 312 },
00656 { "nd" , 303 },
00657 { "ne" , 306 },
00658 { "ng" , 304 },
00659 { "nl" , 115 },
00660 { "nn" , 311 },
00661 { "no" , 315 },
00662 { "nr" , 302 },
00663 { "nv" , 301 },
00664 { "ny" , 320 },
00665 { "oc" , 325 },
00666 { "oj" , 326 },
00667 { "om" , 328 },
00668 { "or" , 327 },
00669 { "os" , 330 },
00670 { "pa" , 337 },
00671 { "pi" , 344 },
00672 { "pl" , 345 },
00673 { "ps" , 350 },
00674 { "pt" , 347 },
00675 { "qu" , 351 },
00676 { "rm" , 356 },
00677 { "rn" , 359 },
00678 { "ro" , 358 },
00679 { "ru" , 361 },
00680 { "rw" , 224 },
00681 { "sa" , 368 },
00682 { "sc" , 400 },
00683 { "sd" , 393 },
00684 { "se" , 386 },
00685 { "sg" , 363 },
00686 { "si" , 379 },
00687 { "sk" , 383 },
00688 { "sl" , 384 },
00689 { "sm" , 390 },
00690 { "sn" , 392 },
00691 { "so" , 396 },
00692 { "sq" , 12 },
00693 { "sr" , 402 },
00694 { "ss" , 405 },
00695 { "st" , 398 },
00696 { "su" , 407 },
00697 { "sv" , 411 },
00698 { "sw" , 410 },
00699 { "ta" , 416 },
00700 { "te" , 418 },
00701 { "tg" , 422 },
00702 { "th" , 424 },
00703 { "ti" , 427 },
00704 { "tk" , 439 },
00705 { "tl" , 423 },
00706 { "tn" , 437 },
00707 { "to" , 434 },
00708 { "tr" , 442 },
00709 { "ts" , 438 },
00710 { "tt" , 417 },
00711 { "tw" , 445 },
00712 { "ty" , 414 },
00713 { "ug" , 449 },
00714 { "uk" , 450 },
00715 { "ur" , 453 },
00716 { "uz" , 454 },
00717 { "ve" , 456 },
00718 { "vi" , 457 },
00719 { "vo" , 458 },
00720 { "wa" , 466 },
00721 { "wo" , 467 },
00722 { "xh" , 469 },
00723 { "yi" , 472 },
00724 { "yo" , 473 },
00725 { "za" , 478 },
00726 { "zh" , 78 },
00727 { "zu" , 480 },
00728 { "", 0 }
00729 };
00730
00731 static int lang_table_compare(const void *lhs, const void *rhs)
00732 {
00733 return strcmp(lhs, ((const LangEntry *)rhs)->str);
00734 }
00735
00736 const char *av_convert_lang_to(const char *lang, enum AVLangCodespace target_codespace)
00737 {
00738 int i;
00739 const LangEntry *entry = NULL;
00740 const int NB_CODESPACES = FF_ARRAY_ELEMS(lang_table_counts);
00741
00742 if (target_codespace >= NB_CODESPACES)
00743 return NULL;
00744
00745 for (i=0; !entry && i<NB_CODESPACES; i++)
00746 entry = bsearch(lang,
00747 lang_table + lang_table_offsets[i],
00748 lang_table_counts[i],
00749 sizeof(LangEntry),
00750 lang_table_compare);
00751 if (!entry)
00752 return NULL;
00753
00754 for (i=0; i<NB_CODESPACES; i++)
00755 if (entry >= lang_table + lang_table_offsets[target_codespace] &&
00756 entry < lang_table + lang_table_offsets[target_codespace] + lang_table_counts[target_codespace])
00757 return entry->str;
00758 else
00759 entry = lang_table + entry->next_equivalent;
00760
00761 if (target_codespace == AV_LANG_ISO639_2_TERM)
00762 return av_convert_lang_to(lang, AV_LANG_ISO639_2_BIBL);
00763
00764 return NULL;
00765 }