Coverage Report

Created: 2026-09-03 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vlc/modules/demux/mp4/languages.h
Line
Count
Source
1
/*****************************************************************************
2
 * languages.h: Quicktime language codes and ISO-639-2/T conversion
3
 *****************************************************************************
4
 * Copyright (C) 2014 VLC authors and VideoLAN
5
 *
6
 * This program is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU Lesser General Public License as published by
8
 * the Free Software Foundation; either version 2.1 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public License
17
 * along with this program; if not, write to the Free Software Foundation,
18
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19
 *****************************************************************************/
20
#ifndef VLC_MP4_LANGUAGES_H_
21
#define VLC_MP4_LANGUAGES_H_
22
23
static bool decodeQtLanguageCode( uint16_t i_language_code, char *psz_iso,
24
                                  bool *b_mactables )
25
1.50k
{
26
1.50k
    static const char * psz_qt_to_iso639_2T_lower =
27
1.50k
            "eng"    "fra"    "deu"    "ita"    "nld"
28
1.50k
            "swe"    "spa"    "dan"    "por"    "nor" /* 5-9 */
29
1.50k
            "heb"    "jpn"    "ara"    "fin"    "gre"
30
1.50k
            "isl"    "mlt"    "tur"    "hrv"    "zho" /* 15-19 */
31
1.50k
            "urd"    "hin"    "tha"    "kor"    "lit"
32
1.50k
            "pol"    "hun"    "est"    "lav"    "sme" /* 25-29 */
33
1.50k
            "fao"    "fas"    "rus"    "zho"    "nld" /* nld==flemish */
34
1.50k
            "gle"    "sqi"    "ron"    "ces"    "slk" /* 35-39 */
35
1.50k
            "slv"    "yid"    "srp"    "mkd"    "bul"
36
1.50k
            "ukr"    "bel"    "uzb"    "kaz"    "aze" /* 45-49 */
37
1.50k
            "aze"    "hye"    "kat"    "mol"    "kir"
38
1.50k
            "tgk"    "tuk"    "mon"    "mon"    "pus" /* 55-59 */
39
1.50k
            "kur"    "kas"    "snd"    "bod"    "nep"
40
1.50k
            "san"    "mar"    "ben"    "asm"    "guj" /* 65-69 */
41
1.50k
            "pan"    "ori"    "mal"    "kan"    "tam"
42
1.50k
            "tel"    "sin"    "mya"    "khm"    "lao" /* 75-79 */
43
1.50k
            "vie"    "ind"    "tgl"    "msa"    "msa"
44
1.50k
            "amh"    "tir"    "orm"    "som"    "swa" /* 85-89 */
45
1.50k
            "kin"    "run"    "nya"    "mlg"    "epo" /* 90-94 */
46
1.50k
            ;
47
48
1.50k
    static const char * psz_qt_to_iso639_2T_upper =
49
1.50k
            "cym"    "eus"    "cat"    "lat"    "que" /* 128-132 */
50
1.50k
            "grn"    "aym"    "tat"    "uig"    "dzo"
51
1.50k
            "jaw"    "sun"    "glg"    "afr"    "bre" /* 138-142 */
52
1.50k
            "iku"    "gla"    "glv"    "gle"    "ton"
53
1.50k
            "gre"                                     /* 148 */
54
1.50k
            ;
55
56
1.50k
    if ( i_language_code < 0x400 || i_language_code == 0x7FFF )
57
660
    {
58
660
        const void *p_data;
59
660
        *b_mactables = true;
60
660
        if ( i_language_code <= 94 )
61
533
        {
62
533
            p_data = psz_qt_to_iso639_2T_lower + i_language_code * 3;
63
533
        }
64
127
        else if ( i_language_code >= 128 && i_language_code <= 148 )
65
0
        {
66
0
            i_language_code -= 128;
67
0
            p_data = psz_qt_to_iso639_2T_upper + i_language_code * 3;
68
0
        }
69
127
        else
70
127
            return false;
71
533
        memcpy( psz_iso, p_data, 3 );
72
533
    }
73
847
    else
74
847
    {
75
847
        *b_mactables = false;
76
        /*
77
         * to build code: ( ( 'f' - 0x60 ) << 10 ) | ( ('r' - 0x60) << 5 ) | ('a' - 0x60)
78
         */
79
847
        if( i_language_code == 0x55C4 ) /* "und" */
80
429
        {
81
429
            memset( psz_iso, 0, 3 );
82
429
            return false;
83
429
        }
84
85
1.67k
        for( unsigned i = 0; i < 3; i++ )
86
1.25k
            psz_iso[i] = ( ( i_language_code >> ( (2-i)*5 ) )&0x1f ) + 0x60;
87
418
    }
88
951
    return true;
89
1.50k
}
meta.c:decodeQtLanguageCode
Line
Count
Source
25
161
{
26
161
    static const char * psz_qt_to_iso639_2T_lower =
27
161
            "eng"    "fra"    "deu"    "ita"    "nld"
28
161
            "swe"    "spa"    "dan"    "por"    "nor" /* 5-9 */
29
161
            "heb"    "jpn"    "ara"    "fin"    "gre"
30
161
            "isl"    "mlt"    "tur"    "hrv"    "zho" /* 15-19 */
31
161
            "urd"    "hin"    "tha"    "kor"    "lit"
32
161
            "pol"    "hun"    "est"    "lav"    "sme" /* 25-29 */
33
161
            "fao"    "fas"    "rus"    "zho"    "nld" /* nld==flemish */
34
161
            "gle"    "sqi"    "ron"    "ces"    "slk" /* 35-39 */
35
161
            "slv"    "yid"    "srp"    "mkd"    "bul"
36
161
            "ukr"    "bel"    "uzb"    "kaz"    "aze" /* 45-49 */
37
161
            "aze"    "hye"    "kat"    "mol"    "kir"
38
161
            "tgk"    "tuk"    "mon"    "mon"    "pus" /* 55-59 */
39
161
            "kur"    "kas"    "snd"    "bod"    "nep"
40
161
            "san"    "mar"    "ben"    "asm"    "guj" /* 65-69 */
41
161
            "pan"    "ori"    "mal"    "kan"    "tam"
42
161
            "tel"    "sin"    "mya"    "khm"    "lao" /* 75-79 */
43
161
            "vie"    "ind"    "tgl"    "msa"    "msa"
44
161
            "amh"    "tir"    "orm"    "som"    "swa" /* 85-89 */
45
161
            "kin"    "run"    "nya"    "mlg"    "epo" /* 90-94 */
46
161
            ;
47
48
161
    static const char * psz_qt_to_iso639_2T_upper =
49
161
            "cym"    "eus"    "cat"    "lat"    "que" /* 128-132 */
50
161
            "grn"    "aym"    "tat"    "uig"    "dzo"
51
161
            "jaw"    "sun"    "glg"    "afr"    "bre" /* 138-142 */
52
161
            "iku"    "gla"    "glv"    "gle"    "ton"
53
161
            "gre"                                     /* 148 */
54
161
            ;
55
56
161
    if ( i_language_code < 0x400 || i_language_code == 0x7FFF )
57
0
    {
58
0
        const void *p_data;
59
0
        *b_mactables = true;
60
0
        if ( i_language_code <= 94 )
61
0
        {
62
0
            p_data = psz_qt_to_iso639_2T_lower + i_language_code * 3;
63
0
        }
64
0
        else if ( i_language_code >= 128 && i_language_code <= 148 )
65
0
        {
66
0
            i_language_code -= 128;
67
0
            p_data = psz_qt_to_iso639_2T_upper + i_language_code * 3;
68
0
        }
69
0
        else
70
0
            return false;
71
0
        memcpy( psz_iso, p_data, 3 );
72
0
    }
73
161
    else
74
161
    {
75
161
        *b_mactables = false;
76
        /*
77
         * to build code: ( ( 'f' - 0x60 ) << 10 ) | ( ('r' - 0x60) << 5 ) | ('a' - 0x60)
78
         */
79
161
        if( i_language_code == 0x55C4 ) /* "und" */
80
3
        {
81
3
            memset( psz_iso, 0, 3 );
82
3
            return false;
83
3
        }
84
85
632
        for( unsigned i = 0; i < 3; i++ )
86
474
            psz_iso[i] = ( ( i_language_code >> ( (2-i)*5 ) )&0x1f ) + 0x60;
87
158
    }
88
158
    return true;
89
161
}
libmp4.c:decodeQtLanguageCode
Line
Count
Source
25
1.34k
{
26
1.34k
    static const char * psz_qt_to_iso639_2T_lower =
27
1.34k
            "eng"    "fra"    "deu"    "ita"    "nld"
28
1.34k
            "swe"    "spa"    "dan"    "por"    "nor" /* 5-9 */
29
1.34k
            "heb"    "jpn"    "ara"    "fin"    "gre"
30
1.34k
            "isl"    "mlt"    "tur"    "hrv"    "zho" /* 15-19 */
31
1.34k
            "urd"    "hin"    "tha"    "kor"    "lit"
32
1.34k
            "pol"    "hun"    "est"    "lav"    "sme" /* 25-29 */
33
1.34k
            "fao"    "fas"    "rus"    "zho"    "nld" /* nld==flemish */
34
1.34k
            "gle"    "sqi"    "ron"    "ces"    "slk" /* 35-39 */
35
1.34k
            "slv"    "yid"    "srp"    "mkd"    "bul"
36
1.34k
            "ukr"    "bel"    "uzb"    "kaz"    "aze" /* 45-49 */
37
1.34k
            "aze"    "hye"    "kat"    "mol"    "kir"
38
1.34k
            "tgk"    "tuk"    "mon"    "mon"    "pus" /* 55-59 */
39
1.34k
            "kur"    "kas"    "snd"    "bod"    "nep"
40
1.34k
            "san"    "mar"    "ben"    "asm"    "guj" /* 65-69 */
41
1.34k
            "pan"    "ori"    "mal"    "kan"    "tam"
42
1.34k
            "tel"    "sin"    "mya"    "khm"    "lao" /* 75-79 */
43
1.34k
            "vie"    "ind"    "tgl"    "msa"    "msa"
44
1.34k
            "amh"    "tir"    "orm"    "som"    "swa" /* 85-89 */
45
1.34k
            "kin"    "run"    "nya"    "mlg"    "epo" /* 90-94 */
46
1.34k
            ;
47
48
1.34k
    static const char * psz_qt_to_iso639_2T_upper =
49
1.34k
            "cym"    "eus"    "cat"    "lat"    "que" /* 128-132 */
50
1.34k
            "grn"    "aym"    "tat"    "uig"    "dzo"
51
1.34k
            "jaw"    "sun"    "glg"    "afr"    "bre" /* 138-142 */
52
1.34k
            "iku"    "gla"    "glv"    "gle"    "ton"
53
1.34k
            "gre"                                     /* 148 */
54
1.34k
            ;
55
56
1.34k
    if ( i_language_code < 0x400 || i_language_code == 0x7FFF )
57
660
    {
58
660
        const void *p_data;
59
660
        *b_mactables = true;
60
660
        if ( i_language_code <= 94 )
61
533
        {
62
533
            p_data = psz_qt_to_iso639_2T_lower + i_language_code * 3;
63
533
        }
64
127
        else if ( i_language_code >= 128 && i_language_code <= 148 )
65
0
        {
66
0
            i_language_code -= 128;
67
0
            p_data = psz_qt_to_iso639_2T_upper + i_language_code * 3;
68
0
        }
69
127
        else
70
127
            return false;
71
533
        memcpy( psz_iso, p_data, 3 );
72
533
    }
73
686
    else
74
686
    {
75
686
        *b_mactables = false;
76
        /*
77
         * to build code: ( ( 'f' - 0x60 ) << 10 ) | ( ('r' - 0x60) << 5 ) | ('a' - 0x60)
78
         */
79
686
        if( i_language_code == 0x55C4 ) /* "und" */
80
426
        {
81
426
            memset( psz_iso, 0, 3 );
82
426
            return false;
83
426
        }
84
85
1.04k
        for( unsigned i = 0; i < 3; i++ )
86
780
            psz_iso[i] = ( ( i_language_code >> ( (2-i)*5 ) )&0x1f ) + 0x60;
87
260
    }
88
793
    return true;
89
1.34k
}
90
91
#endif