CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, CProcessInfo &processInfo) { CSingleLock lock(videoCodecSection); std::unique_ptr<CDVDVideoCodec> pCodec; CDVDCodecOptions options; // addon handler for this stream ? if (hint.externalInterfaces) { ADDON::BinaryAddonBasePtr addonInfo; kodi::addon::IAddonInstance* parentInstance; hint.externalInterfaces->getAddonInstance(ADDON::IAddonProvider::INSTANCE_VIDEOCODEC, addonInfo, parentInstance); if (addonInfo && parentInstance) { pCodec.reset(new CAddonVideoCodec(processInfo, addonInfo, parentInstance)); if (pCodec && pCodec->Open(hint, options)) { return pCodec.release(); } } return nullptr; } // platform specifig video decoders if (!(hint.codecOptions & CODEC_FORCE_SOFTWARE)) { for (auto &codec : m_hwVideoCodecs) { pCodec.reset(CreateVideoCodecHW(codec.first, processInfo)); if (pCodec && pCodec->Open(hint, options)) { return pCodec.release(); } } if (!(hint.codecOptions & CODEC_ALLOW_FALLBACK)) return nullptr; } pCodec.reset(new CDVDVideoCodecFFmpeg(processInfo)); if (pCodec->Open(hint, options)) { return pCodec.release(); } return nullptr; }
CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, CProcessInfo &processInfo, const CRenderInfo &info) { CSingleLock lock(videoCodecSection); std::unique_ptr<CDVDVideoCodec> pCodec; CDVDCodecOptions options; if (info.formats.empty()) options.m_formats.push_back(RENDER_FMT_YUV420P); else options.m_formats = info.formats; options.m_opaque_pointer = info.opaque_pointer; // platform specifig video decoders if (!(hint.codecOptions & CODEC_FORCE_SOFTWARE)) { pCodec.reset(CreateVideoCodecHW(processInfo)); if (pCodec && pCodec->Open(hint, options)) { return pCodec.release(); } if (!(hint.codecOptions & CODEC_ALLOW_FALLBACK)) return nullptr; } std::string value = StringUtils::Format("%d", info.max_buffer_size); options.m_keys.push_back(CDVDCodecOption("surfaces", value)); pCodec.reset(new CDVDVideoCodecFFmpeg(processInfo)); if (pCodec->Open(hint, options)) { return pCodec.release(); } return nullptr; }