MPAPI::Decoder *AndroidMediaPluginHost::CreateDecoder(MediaResource *aResource, const MediaContentType& aMimeType) { NS_ENSURE_TRUE(aResource, nullptr); nsAutoPtr<Decoder> decoder(new Decoder()); if (!decoder) { return nullptr; } const char *chars; size_t len = NS_CStringGetData(aMimeType.Type().AsString(), &chars, nullptr); for (size_t n = 0; n < mPlugins.Length(); ++n) { Manifest *plugin = mPlugins[n]; const char* const *codecs; if (!plugin->CanDecode(chars, len, &codecs)) { continue; } nsCString url; nsresult rv = mResourceServer->AddResource(aResource, url); if (NS_FAILED (rv)) continue; decoder->mResource = strdup(url.get()); if (plugin->CreateDecoder(&sPluginHost, decoder, chars, len)) { return decoder.forget(); } } return nullptr; }
MPAPI::Decoder *MediaPluginHost::CreateDecoder(MediaResource *aResource, const nsACString& aMimeType) { const char *chars; size_t len = NS_CStringGetData(aMimeType, &chars, nullptr); Decoder *decoder = new Decoder(); if (!decoder) { return nullptr; } decoder->mResource = aResource; for (size_t n = 0; n < mPlugins.Length(); ++n) { Manifest *plugin = mPlugins[n]; const char* const *codecs; if (!plugin->CanDecode(chars, len, &codecs)) { continue; } if (plugin->CreateDecoder(&sPluginHost, decoder, chars, len)) { return decoder; } } return nullptr; }