1 /*****************************************************************************
2 * desc_0a.h: ISO/IEC 13818-1 Descriptor 0x0A (ISO-639 language descriptor)
3 *****************************************************************************
4 * Copyright (C) 2009-2010 VideoLAN
5 *
6 * Authors: Christophe Massiot <massiot@via.ecp.fr>
7 * Georgi Chorbadzhiyski <georgi@unixsol.org>
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining
10 * a copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sublicense, and/or sell copies of the Software, and to
14 * permit persons to whom the Software is furnished to do so, subject
15 * to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be
18 * included in all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 *****************************************************************************/
28
29 /*
30 * Normative references:
31 * - ISO/IEC 13818-1:2007(E) (MPEG-2 Systems)
32 */
33
34 #ifndef __BITSTREAM_MPEG_DESC_0A_H__
35 #define __BITSTREAM_MPEG_DESC_0A_H__
36
37 #include <bitstream/common.h>
38 #include <bitstream/mpeg/psi/descriptors.h>
39
40 #ifdef __cplusplus
41 extern "C"
42 {
43 #endif
44
45 /*****************************************************************************
46 * Descriptor 0x0a: ISO-639 language descriptor
47 *****************************************************************************/
48 #define DESC0A_HEADER_SIZE DESC_HEADER_SIZE
49 #define DESC0A_LANGUAGE_SIZE 4
50
51 #define DESC0A_TYPE_UNDEFINED 0x0
52 #define DESC0A_TYPE_CLEAN 0x1
53 #define DESC0A_TYPE_HEARING_IMP 0x2
54 #define DESC0A_TYPE_VISUAL_IMP 0x3
55
desc0a_init(uint8_t * p_desc)56 static inline void desc0a_init(uint8_t *p_desc)
57 {
58 desc_set_tag(p_desc, 0x0a);
59 }
60
desc0a_get_language(uint8_t * p_desc,uint8_t n)61 static inline uint8_t *desc0a_get_language(uint8_t *p_desc, uint8_t n)
62 {
63 uint8_t *p_desc_n = p_desc + DESC0A_HEADER_SIZE + n * DESC0A_LANGUAGE_SIZE;
64 if (p_desc_n + DESC0A_LANGUAGE_SIZE - p_desc
65 > desc_get_length(p_desc) + DESC0A_HEADER_SIZE)
66 return NULL;
67 return p_desc_n;
68 }
69
desc0an_set_code(uint8_t * p_desc_n,const uint8_t p_code[3])70 static inline void desc0an_set_code(uint8_t *p_desc_n, const uint8_t p_code[3])
71 {
72 p_desc_n[0] = p_code[0];
73 p_desc_n[1] = p_code[1];
74 p_desc_n[2] = p_code[2];
75 }
76
desc0an_get_code(const uint8_t * p_desc_n)77 static inline const uint8_t *desc0an_get_code(const uint8_t *p_desc_n)
78 {
79 return p_desc_n;
80 }
81
desc0an_set_audiotype(uint8_t * p_desc_n,uint8_t i_type)82 static inline void desc0an_set_audiotype(uint8_t *p_desc_n, uint8_t i_type)
83 {
84 p_desc_n[3] = i_type;
85 }
86
desc0an_get_audiotype(const uint8_t * p_desc_n)87 static inline uint8_t desc0an_get_audiotype(const uint8_t *p_desc_n)
88 {
89 return p_desc_n[3];
90 }
91
desc0a_get_audiotype_txt(uint8_t audio_type)92 static inline const char *desc0a_get_audiotype_txt(uint8_t audio_type)
93 {
94 return audio_type == 0x00 ? "undefined" :
95 audio_type == 0x01 ? "clean effects" :
96 audio_type == 0x02 ? "hearing impaired" :
97 audio_type == 0x03 ? "visual impaired commentary" : "reserved";
98 }
99
desc0a_validate(const uint8_t * p_desc)100 static inline bool desc0a_validate(const uint8_t *p_desc)
101 {
102 return !(desc_get_length(p_desc) % DESC0A_LANGUAGE_SIZE);
103 }
104
desc0a_print(uint8_t * p_desc,f_print pf_print,void * opaque,print_type_t i_print_type)105 static inline void desc0a_print(uint8_t *p_desc, f_print pf_print,
106 void *opaque, print_type_t i_print_type)
107 {
108 uint8_t j = 0;
109 uint8_t *p_desc_n;
110
111 while ((p_desc_n = desc0a_get_language(p_desc, j)) != NULL) {
112 j++;
113 switch (i_print_type) {
114 case PRINT_XML:
115 pf_print(opaque, "<AUDIO_LANGUAGE_DESC language=\"%3.3s\" audiotype=\"%u\" audiotype_txt=\"%s\"/>",
116 (const char *)desc0an_get_code(p_desc_n),
117 desc0an_get_audiotype(p_desc_n),
118 desc0a_get_audiotype_txt(desc0an_get_audiotype(p_desc_n))
119 );
120 break;
121 default:
122 pf_print(opaque, " - desc 0a audio_language language=%3.3s audiotype=%u audiotype_txt=\"%s\"",
123 (const char *)desc0an_get_code(p_desc_n),
124 desc0an_get_audiotype(p_desc_n),
125 desc0a_get_audiotype_txt(desc0an_get_audiotype(p_desc_n))
126 );
127 }
128 }
129 }
130
131 #ifdef __cplusplus
132 }
133 #endif
134
135 #endif
136