Changeset fb0991c4183d6399b021e4baf1b4d3cf1c9e1763
- Timestamp:
- 18/07/06 10:48:53 (2 years ago)
- git-parent:
- Files:
-
- include/vlc_es.h (modified) (5 diffs)
- modules/demux/ts.c (modified) (1 diff)
- modules/mux/mpeg/ts.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
include/vlc_es.h
r2cb472d rfb0991c 157 157 when no other stream 158 158 >=0: priority */ 159 159 160 char *psz_language; 160 161 char *psz_description; 161 162 int i_extra_languages; 163 struct { 164 char *psz_language; 165 char *psz_description; 166 } *p_extra_languages; 167 162 168 audio_format_t audio; 163 169 video_format_t video; … … 191 197 fmt->psz_description = NULL; 192 198 199 fmt->i_extra_languages = 0; 200 fmt->p_extra_languages = NULL; 201 193 202 memset( &fmt->audio, 0, sizeof(audio_format_t) ); 194 203 memset( &fmt->video, 0, sizeof(video_format_t) ); … … 203 212 static inline void es_format_Copy( es_format_t *dst, es_format_t *src ) 204 213 { 214 int i; 205 215 memcpy( dst, src, sizeof( es_format_t ) ); 206 216 if( src->psz_language ) … … 230 240 sizeof( video_palette_t ) ); 231 241 } 242 243 dst->i_extra_languages = src->i_extra_languages; 244 dst->p_extra_languages = malloc( dst->i_extra_languages * sizeof(*dst->p_extra_languages ) ); 245 for( i = 0; i < dst->i_extra_languages; i++ ) { 246 if( src->p_extra_languages[i].psz_language ) 247 dst->p_extra_languages[i].psz_language = strdup(src->p_extra_languages[i].psz_language); 248 else 249 dst->p_extra_languages[i].psz_language = NULL; 250 if( src->p_extra_languages[i].psz_description ) 251 dst->p_extra_languages[i].psz_description = strdup(src->p_extra_languages[i].psz_description); 252 else 253 dst->p_extra_languages[i].psz_description = NULL; 254 } 232 255 } 233 256 … … 248 271 if( fmt->subs.psz_encoding ) free( fmt->subs.psz_encoding ); 249 272 fmt->subs.psz_encoding = NULL; 273 274 if( fmt->i_extra_languages && fmt->p_extra_languages ) { 275 int i = 0; 276 while( i < fmt->i_extra_languages ) { 277 if( fmt->p_extra_languages[i].psz_language ) 278 free( fmt->p_extra_languages[i].psz_language ); 279 if( fmt->p_extra_languages[i].psz_description ) 280 free( fmt->p_extra_languages[i].psz_description ); 281 i++; 282 } 283 free(fmt->p_extra_languages); 284 } 250 285 } 251 286 modules/demux/ts.c
r5e2c9b5 rfb0991c 3123 3123 if( p_decoded ) 3124 3124 { 3125 #if DR_0A_API_VER >= 2 3126 pid->es->fmt.psz_language = malloc( 4 ); 3127 memcpy( pid->es->fmt.psz_language, 3128 p_decoded->code[0].iso_639_code, 3 ); 3129 pid->es->fmt.psz_language[3] = 0; 3130 msg_Dbg( p_demux, "found language: %s", pid->es->fmt.psz_language); 3131 switch( p_decoded->code[0].i_audio_type ) { 3132 case 0: 3133 pid->es->fmt.psz_description = NULL; 3134 break; 3135 case 1: 3136 pid->es->fmt.psz_description = 3137 strdup(_("clean effects")); 3138 break; 3139 case 2: 3140 pid->es->fmt.psz_description = 3141 strdup(_("hearing impaired")); 3142 break; 3143 case 3: 3144 pid->es->fmt.psz_description = 3145 strdup(_("visual impaired commentary")); 3146 break; 3147 default: 3148 msg_Dbg( p_demux, "unknown audio type: %d", 3149 p_decoded->code[0].i_audio_type); 3150 pid->es->fmt.psz_description = NULL; 3151 break; 3152 } 3153 pid->es->fmt.i_extra_languages = p_decoded->i_code_count-1; 3154 pid->es->fmt.p_extra_languages = 3155 malloc( sizeof(*pid->es->fmt.p_extra_languages) * 3156 pid->es->fmt.i_extra_languages ); 3157 for( i = 0; i < pid->es->fmt.i_extra_languages; i++ ) { 3158 msg_Dbg( p_demux, "bang" ); 3159 pid->es->fmt.p_extra_languages[i].psz_language = 3160 malloc(4); 3161 memcpy(pid->es->fmt.p_extra_languages[i].psz_language, 3162 p_decoded->code[i+1].iso_639_code, 3 ); 3163 pid->es->fmt.p_extra_languages[i].psz_language[3] = '\0'; 3164 switch( p_decoded->code[i].i_audio_type ) { 3165 case 0: 3166 pid->es->fmt.p_extra_languages[i].psz_description = 3167 NULL; 3168 break; 3169 case 1: 3170 pid->es->fmt.p_extra_languages[i].psz_description = 3171 strdup(_("clean effects")); 3172 break; 3173 case 2: 3174 pid->es->fmt.p_extra_languages[i].psz_description = 3175 strdup(_("hearing impaired")); 3176 break; 3177 case 3: 3178 pid->es->fmt.p_extra_languages[i].psz_description = 3179 strdup(_("visual impaired commentary")); 3180 break; 3181 default: 3182 msg_Dbg( p_demux, "unknown audio type: %d", 3183 p_decoded->code[i].i_audio_type); 3184 pid->es->fmt.psz_description = NULL; 3185 break; 3186 } 3187 3188 } 3189 #else 3125 3190 pid->es->fmt.psz_language = malloc( 4 ); 3126 3191 memcpy( pid->es->fmt.psz_language, 3127 3192 p_decoded->i_iso_639_code, 3 ); 3128 3193 pid->es->fmt.psz_language[3] = 0; 3194 #endif 3129 3195 } 3130 3196 } modules/mux/mpeg/ts.c
r0b0cc6d rfb0991c 338 338 339 339 /* language is iso639-2T */ 340 uint8_t lang[3]; 340 int i_langs; 341 uint8_t *lang; 341 342 342 343 sout_buffer_chain_t chain_pes; … … 886 887 sout_mux_sys_t *p_sys = p_mux->p_sys; 887 888 ts_stream_t *p_stream; 889 int i; 888 890 889 891 p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) ); … … 1014 1016 } 1015 1017 1018 p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages; 1019 p_stream->lang = malloc(p_stream->i_langs*3); 1020 i = 1; 1016 1021 p_stream->lang[0] = 1017 1022 p_stream->lang[1] = … … 1041 1046 1042 1047 msg_Dbg( p_mux, " - lang=%c%c%c", 1043 p_stream->lang[0], p_stream->lang[1], p_stream->lang[2] ); 1044 } 1048 p_stream->lang[0], p_stream->lang[1], 1049 p_stream->lang[2] ); 1050 } 1051 } 1052 while( i < p_stream->i_langs ) { 1053 if( p_input->p_fmt->p_extra_languages[i-1].psz_language ) 1054 { 1055 char *psz = p_input->p_fmt->p_extra_languages[i-1].psz_language; 1056 const iso639_lang_t *pl = NULL; 1057 1058 if( strlen( psz ) == 2 ) 1059 { 1060 pl = GetLang_1( psz ); 1061 } 1062 else if( strlen( psz ) == 3 ) 1063 { 1064 pl = GetLang_2B( psz ); 1065 if( !strcmp( pl->psz_iso639_1, "??" ) ) 1066 { 1067 pl = GetLang_2T( psz ); 1068 } 1069 } 1070 if( pl && strcmp( pl->psz_iso639_1, "??" ) ) 1071 { 1072 p_stream->lang[i*3+0] = pl->psz_iso639_2T[0]; 1073 p_stream->lang[i*3+1] = pl->psz_iso639_2T[1]; 1074 p_stream->lang[i*3+2] = pl->psz_iso639_2T[2]; 1075 1076 msg_Dbg( p_mux, " - lang=%c%c%c", 1077 p_stream->lang[i*3+0], p_stream->lang[i*3+1], 1078 p_stream->lang[i*3+2] ); 1079 } 1080 } 1081 i++; 1045 1082 } 1046 1083 … … 1184 1221 BufferChainClean( p_mux->p_sout, &p_stream->chain_pes ); 1185 1222 1223 if( p_stream->lang ) 1224 { 1225 free(p_stream->lang); 1226 } 1186 1227 if( p_stream->p_decoder_specific_info ) 1187 1228 { … … 2486 2527 if( p_stream->lang[0] != 0 ) 2487 2528 { 2488 uint8_t data[4 ];2529 uint8_t data[4*p_stream->i_langs]; 2489 2530 2490 2531 /* I construct the content myself, way faster than looking at 2491 2532 * over complicated/mind broken libdvbpsi way */ 2492 data[0] = p_stream->lang[0]; 2493 data[1] = p_stream->lang[1]; 2494 data[2] = p_stream->lang[2]; 2495 data[3] = 0x00; /* audio type: 0x00 undefined */ 2496 2497 dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4, data ); 2533 for(i = 0; i < p_stream->i_langs; i++ ) 2534 { 2535 data[i*4+0] = p_stream->lang[i*3+0]; 2536 data[i*4+1] = p_stream->lang[i*3+1]; 2537 data[i*4+2] = p_stream->lang[i*3+2]; 2538 data[i*4+3] = 0x00; /* audio type: 0x00 undefined */ 2539 } 2540 dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4*p_stream->i_langs, data ); 2498 2541 } 2499 2542 }
