ICodec* CodecFactory::CreateCodecDemux(const std::string& strFile, const std::string& strContent, unsigned int filecache) { CURL urlFile(strFile); std::string content = strContent; StringUtils::ToLower(content); if (!content.empty()) { VECADDONS codecs; CAddonMgr::GetInstance().GetAddons(ADDON_AUDIODECODER, codecs); for (size_t i=0;i<codecs.size();++i) { std::shared_ptr<CAudioDecoder> dec(std::static_pointer_cast<CAudioDecoder>(codecs[i])); std::vector<std::string> mime = StringUtils::Split(dec->GetMimetypes(), "|"); if (std::find(mime.begin(), mime.end(), content) != mime.end()) { CAudioDecoder* result = new CAudioDecoder(*dec); static_cast<AudioDecoderDll&>(*result).Create(); return result; } } } if( content == "audio/mpeg" || content == "audio/mpeg3" || content == "audio/mp3" || content == "audio/aac" || content == "audio/aacp" || content == "audio/x-ms-wma" || content == "audio/x-ape" || content == "audio/ape" || content == "application/ogg" || content == "audio/ogg" || content == "audio/x-xbmc-pcm" || content == "audio/flac" || content == "audio/x-flac" || content == "application/x-flac" ) { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType(content); return dvdcodec; } else if (urlFile.IsProtocol("shout")) { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType("audio/mp3"); return dvdcodec; // if we got this far with internet radio - content-type was wrong. gamble on mp3. } else if (urlFile.IsFileType("wav") || content == "audio/wav" || content == "audio/x-wav") { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType("audio/x-spdif-compressed"); if (dvdcodec->Init(strFile, filecache)) { return dvdcodec; } dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType(content); return dvdcodec; } else return CreateCodec(urlFile.GetFileType()); }
ICodec* CodecFactory::CreateCodecDemux(const CFileItem& file, unsigned int filecache) { CURL urlFile(file.GetDynPath()); std::string content = file.GetMimeType(); StringUtils::ToLower(content); if (!content.empty()) { BinaryAddonBaseList addonInfos; CServiceBroker::GetBinaryAddonManager().GetAddonInfos(addonInfos, true, ADDON_AUDIODECODER); for (const auto& addonInfo : addonInfos) { if (CAudioDecoder::GetMimetypes(addonInfo).find(content) != std::string::npos) { CAudioDecoder* result = new CAudioDecoder(addonInfo); if (!result->CreateDecoder()) { delete result; return nullptr; } return result; } } } if( content == "audio/mpeg" || content == "audio/mpeg3" || content == "audio/mp3" || content == "audio/aac" || content == "audio/aacp" || content == "audio/x-ms-wma" || content == "audio/x-ape" || content == "audio/ape" || content == "application/ogg" || content == "audio/ogg" || content == "audio/x-xbmc-pcm" || content == "audio/flac" || content == "audio/x-flac" || content == "application/x-flac" ) { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType(content); return dvdcodec; } else if (urlFile.IsProtocol("shout")) { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType("audio/mp3"); return dvdcodec; // if we got this far with internet radio - content-type was wrong. gamble on mp3. } else if (urlFile.IsFileType("wav") || content == "audio/wav" || content == "audio/x-wav") { VideoPlayerCodec *dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType("audio/x-spdif-compressed"); if (dvdcodec->Init(file, filecache)) { return dvdcodec; } dvdcodec = new VideoPlayerCodec(); dvdcodec->SetContentType(content); return dvdcodec; } else return CreateCodec(urlFile.GetFileType()); }