static void show_audio_subs_languages(dvdnav_t *nav) { uint8_t lg; uint16_t i, lang, format, id, channels; int base[7] = {128, 0, 0, 0, 160, 136, 0}; for(i=0; i<8; i++) { char tmp[] = "unknown"; lg = dvdnav_get_audio_logical_stream(nav, i); if(lg == 0xff) continue; channels = dvdnav_audio_stream_channels(nav, lg); if(channels == 0xFFFF) channels = 2; //unknown else channels--; lang = dvdnav_audio_stream_to_lang(nav, lg); if(lang != 0xFFFF) { tmp[0] = lang >> 8; tmp[1] = lang & 0xFF; tmp[2] = 0; } format = dvdnav_audio_stream_format(nav, lg); if(format == 0xFFFF || format > 6) format = 1; //unknown id = i + base[format]; mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDaudioStreamInfo, i, dvd_audio_stream_types[format], dvd_audio_stream_channels[channels], tmp, id); if (lang != 0xFFFF && lang && tmp[0]) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", id, tmp); }
/** * \brief dvdnav_aid_from_lang() returns the audio id corresponding to the language code 'lang' * \param stream: - stream pointer * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */ int dvdnav_aid_from_lang(stream_t *stream, unsigned char *language) { dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv; int k; uint8_t format, lg; uint16_t lang, lcode;; while(language && strlen(language)>=2) { lcode = (language[0] << 8) | (language[1]); for(k=0; k<32; k++) { lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k); if(lg == 0xff) continue; lang = dvdnav_audio_stream_to_lang(priv->dvdnav, lg); if(lang != 0xFFFF && lang == lcode) { format = dvdnav_audio_stream_format(priv->dvdnav, lg); switch(format) { case DVDNAV_FORMAT_AC3: return k+128; case DVDNAV_FORMAT_DTS: return k+136; case DVDNAV_FORMAT_LPCM: return k+160; case DVDNAV_FORMAT_MPEGAUDIO: return k; default: return -1; } } } language += 2; while(language[0]==',' || language[0]==' ') ++language; } return -1; }