OMX_S32 AudioDecoder::FindAudioCodec(sh_audio_t *sh_audio){ unsigned int orig_fourcc = sh_audio->wf ? sh_audio->wf->wFormatTag : 0; int force = 0; unsigned int i; sh_audio->codec = NULL; sh_audio->ad_driver = 0; // restore original fourcc: if (sh_audio->wf) sh_audio->wf->wFormatTag = i = orig_fourcc; while(1) { sh_audio->codec = find_audio_codec(sh_audio->format, sh_audio->wf ? (&i) : NULL, sh_audio->codec, force); if(!sh_audio->codec){ ALOGE("not find codec!"); return 0; } sh_audio->ad_driver = (ad_functions *)decFactor.CreateAudioDecoder(sh_audio->codec->drv); if(!sh_audio->ad_driver) continue; ALOGE("sh_audio->codec->drv=%s dll=%s",sh_audio->codec->drv,sh_audio->codec->dll); if (init_audio_codec(sh_audio)) { break; }else decFactor.~DecFactor(); } if (sh_audio->wf) sh_audio->wf->wFormatTag = i; return 1; }
static int init_audio(sh_audio_t *sh_audio, char *codecname, char *afm, int status, stringset_t *selected) { unsigned int orig_fourcc = sh_audio->wf ? sh_audio->wf->wFormatTag : 0; int force = 0; if (codecname && codecname[0] == '+') { codecname = &codecname[1]; force = 1; } sh_audio->codec = NULL; while (1) { const ad_functions_t *mpadec; int i; sh_audio->ad_driver = 0; // restore original fourcc: if (sh_audio->wf) sh_audio->wf->wFormatTag = i = orig_fourcc; if (!(sh_audio->codec = find_audio_codec(sh_audio->format, sh_audio->wf ? (&i) : NULL, sh_audio->codec, force))) break; if (sh_audio->wf) sh_audio->wf->wFormatTag = i; // ok we found one codec if (stringset_test(selected, sh_audio->codec->name)) continue; // already tried & failed if (codecname && strcmp(sh_audio->codec->name, codecname)) continue; // -ac if (afm && strcmp(sh_audio->codec->drv, afm)) continue; // afm doesn't match if (!force && sh_audio->codec->status < status) continue; // too unstable stringset_add(selected, sh_audio->codec->name); // tagging it // ok, it matches all rules, let's find the driver! for (i = 0; mpcodecs_ad_drivers[i] != NULL; i++) if (!strcmp(mpcodecs_ad_drivers[i]->info->short_name, sh_audio->codec->drv)) break; mpadec = mpcodecs_ad_drivers[i]; #ifdef CONFIG_DYNAMIC_PLUGINS if (!mpadec) { /* try to open shared decoder plugin */ int buf_len; char *buf; ad_functions_t *funcs_sym; ad_info_t *info_sym; buf_len = strlen(MPLAYER_LIBDIR) + strlen(sh_audio->codec->drv) + 16; buf = malloc(buf_len); if (!buf) break; snprintf(buf, buf_len, "%s/mplayer/ad_%s.so", MPLAYER_LIBDIR, sh_audio->codec->drv); mp_msg(MSGT_DECAUDIO, MSGL_DBG2, "Trying to open external plugin: %s\n", buf); sh_audio->dec_handle = dlopen(buf, RTLD_LAZY); if (!sh_audio->dec_handle) break; snprintf(buf, buf_len, "mpcodecs_ad_%s", sh_audio->codec->drv); funcs_sym = dlsym(sh_audio->dec_handle, buf); if (!funcs_sym || !funcs_sym->info || !funcs_sym->preinit || !funcs_sym->init || !funcs_sym->uninit || !funcs_sym->control || !funcs_sym->decode_audio) break; info_sym = funcs_sym->info; if (strcmp(info_sym->short_name, sh_audio->codec->drv)) break; free(buf); mpadec = funcs_sym; mp_msg(MSGT_DECAUDIO, MSGL_V, "Using external decoder plugin (%s/mplayer/ad_%s.so)!\n", MPLAYER_LIBDIR, sh_audio->codec->drv); } #endif if (!mpadec) { // driver not available (==compiled in) mp_tmsg(MSGT_DECAUDIO, MSGL_ERR, "Requested audio codec family [%s] (afm=%s) not available.\nEnable it at compilation.\n", sh_audio->codec->name, sh_audio->codec->drv); continue; } // it's available, let's try to init! // init() mp_tmsg(MSGT_DECAUDIO, MSGL_INFO, "Opening audio decoder: [%s] %s\n", mpadec->info->short_name, mpadec->info->name); sh_audio->ad_driver = mpadec; if (!init_audio_codec(sh_audio)) { mp_tmsg(MSGT_DECAUDIO, MSGL_WARN, "Could not open audio decoder %s.\n", mpadec->info->short_name); continue; // try next... } // Yeah! We got it! return 1; } return 0; }