CDVDAudioCodec* CDVDFactoryCodec::CreateAudioCodec(CDVDStreamInfo &hint, bool allowpassthrough, bool allowdtshddecode) { CDVDAudioCodec* pCodec = NULL; CDVDCodecOptions options; if (!allowdtshddecode) options.m_keys.push_back(CDVDCodecOption("allowdtshddecode", "0")); // we don't use passthrough if "sync playback to display" is enabled if (allowpassthrough) { pCodec = OpenCodec(new CDVDAudioCodecPassthrough(), hint, options); if (pCodec) return pCodec; } pCodec = OpenCodec(new CDVDAudioCodecFFmpeg(), hint, options); if (pCodec) return pCodec; return NULL; }
CDVDAudioCodec* CDVDFactoryCodec::CreateAudioCodec(CDVDStreamInfo &hint, CProcessInfo &processInfo, bool allowpassthrough, bool allowdtshddecode, CAEStreamInfo::DataType ptStreamType) { std::unique_ptr<CDVDAudioCodec> pCodec; CDVDCodecOptions options; // platform specifig audio decoders for (auto &codec : m_hwAudioCodecs) { pCodec.reset(CreateAudioCodecHW(codec.first, processInfo)); if (pCodec && pCodec->Open(hint, options)) { return pCodec.release(); } } if (!allowdtshddecode) options.m_keys.push_back(CDVDCodecOption("allowdtshddecode", "0")); // we don't use passthrough if "sync playback to display" is enabled if (allowpassthrough && ptStreamType != CAEStreamInfo::STREAM_TYPE_NULL) { pCodec.reset(new CDVDAudioCodecPassthrough(processInfo, ptStreamType)); if (pCodec->Open(hint, options)) { return pCodec.release(); } } pCodec.reset(new CDVDAudioCodecFFmpeg(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; }
CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigned int surfaces, const std::vector<ERenderFormat>& formats) { CDVDVideoCodec* pCodec = NULL; CDVDCodecOptions options; if(formats.empty()) options.m_formats.push_back(RENDER_FMT_YUV420P); else options.m_formats = formats; //when support for a hardware decoder is not compiled in //only print it if it's actually available on the platform CStdString hwSupport; #if defined(TARGET_DARWIN_OSX) hwSupport += "VDADecoder:yes "; #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) && defined(TARGET_DARWIN) hwSupport += "VideoToolBoxDecoder:yes "; #elif defined(TARGET_DARWIN) hwSupport += "VideoToolBoxDecoder:no "; #endif #ifdef HAVE_LIBCRYSTALHD hwSupport += "CrystalHD:yes "; #else hwSupport += "CrystalHD:no "; #endif #if defined(HAS_LIBAMCODEC) hwSupport += "AMCodec:yes "; #else hwSupport += "AMCodec:no "; #endif #if defined(HAVE_LIBOPENMAX) && defined(TARGET_POSIX) hwSupport += "OpenMax:yes "; #elif defined(TARGET_POSIX) hwSupport += "OpenMax:no "; #endif #if defined(HAS_LIBSTAGEFRIGHT) hwSupport += "libstagefright:yes "; #elif defined(_LINUX) hwSupport += "libstagefright:no "; #endif #if defined(HAVE_LIBVDPAU) && defined(TARGET_POSIX) hwSupport += "VDPAU:yes "; #elif defined(TARGET_POSIX) && !defined(TARGET_DARWIN) hwSupport += "VDPAU:no "; #endif #if defined(TARGET_WINDOWS) && defined(HAS_DX) hwSupport += "DXVA:yes "; #elif defined(TARGET_WINDOWS) hwSupport += "DXVA:no "; #endif #if defined(HAVE_LIBVA) && defined(TARGET_POSIX) hwSupport += "VAAPI:yes "; #elif defined(TARGET_POSIX) && !defined(TARGET_DARWIN) hwSupport += "VAAPI:no "; #endif CLog::Log(LOGDEBUG, "CDVDFactoryCodec: compiled in hardware support: %s", hwSupport.c_str()); #if !defined(HAS_LIBAMCODEC) // dvd's have weird still-frames in it, which is not fully supported in ffmpeg if(hint.stills && (hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO)) { if( (pCodec = OpenCodec(new CDVDVideoCodecLibMpeg2(), hint, options)) ) return pCodec; } #endif #if defined(TARGET_DARWIN_OSX) if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda")) { if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid) { if ( (pCodec = OpenCodec(new CDVDVideoCodecVDA(), hint, options)) ) return pCodec; } } #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) if (!hint.software && CSettings::Get().GetBool("videoplayer.usevideotoolbox")) { if (g_sysinfo.HasVideoToolBoxDecoder()) { switch(hint.codec) { case AV_CODEC_ID_H264: if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid) break; if ( (pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(), hint, options)) ) return pCodec; break; default: break; } } } #endif #if defined(HAVE_LIBCRYSTALHD) if (!hint.software && CSettings::Get().GetBool("videoplayer.usechd")) { if (CCrystalHD::GetInstance()->DevicePresent()) { switch(hint.codec) { case AV_CODEC_ID_VC1: case AV_CODEC_ID_WMV3: case AV_CODEC_ID_H264: case AV_CODEC_ID_MPEG2VIDEO: if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid) break; if (hint.codec == AV_CODEC_ID_MPEG2VIDEO && hint.width <= 720) break; if ( (pCodec = OpenCodec(new CDVDVideoCodecCrystalHD(), hint, options)) ) return pCodec; break; default: break; } } } #endif #if defined(HAS_LIBAMCODEC) if (!hint.software) { CLog::Log(LOGINFO, "Amlogic Video Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; } #endif #if defined(HAVE_LIBOPENMAX) if (CSettings::Get().GetBool("videoplayer.useomx") && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VC1) { if ( (pCodec = OpenCodec(new CDVDVideoCodecOpenMax(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_LIBSTAGEFRIGHT) if (CSettings::Get().GetBool("videoplayer.usestagefright") && !hint.software ) { switch(hint.codec) { case CODEC_ID_H264: case CODEC_ID_MPEG4: case CODEC_ID_MPEG2VIDEO: case CODEC_ID_VC1: case CODEC_ID_WMV3: case CODEC_ID_VP3: case CODEC_ID_VP6: case CODEC_ID_VP6F: case CODEC_ID_VP8: if ( (pCodec = OpenCodec(new CDVDVideoCodecStageFright(), hint, options)) ) return pCodec; break; default: break; } } #endif // try to decide if we want to try halfres decoding #if !defined(TARGET_POSIX) && !defined(TARGET_WINDOWS) float pixelrate = (float)hint.width*hint.height*hint.fpsrate/hint.fpsscale; if( pixelrate > 1400.0f*720.0f*30.0f ) { CLog::Log(LOGINFO, "CDVDFactoryCodec - High video resolution detected %dx%d, trying half resolution decoding ", hint.width, hint.height); options.m_keys.push_back(CDVDCodecOption("lowres","1")); } #endif CStdString value; value.Format("%d", surfaces); options.m_keys.push_back(CDVDCodecOption("surfaces", value)); if( (pCodec = OpenCodec(new CDVDVideoCodecFFmpeg(), hint, options)) ) return pCodec; return NULL; }
CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, unsigned int surfaces) { CDVDVideoCodec* pCodec = NULL; CDVDCodecOptions options; //when support for a hardware decoder is not compiled in //only print it if it's actually available on the platform CStdString hwSupport; #if defined(HAVE_LIBVDADECODER) && defined(__APPLE__) hwSupport += "VDADecoder:yes "; #elif defined(__APPLE__) hwSupport += "VDADecoder:no "; #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) && defined(__APPLE__) hwSupport += "VideoToolBoxDecoder:yes "; #elif defined(__APPLE__) hwSupport += "VideoToolBoxDecoder:no "; #endif #ifdef HAVE_LIBCRYSTALHD hwSupport += "CrystalHD:yes "; #else hwSupport += "CrystalHD:no "; #endif #if defined(HAVE_LIBOPENMAX) && defined(_LINUX) hwSupport += "OpenMax:yes "; #elif defined(_LINUX) hwSupport += "OpenMax:no "; #endif #if defined(HAVE_LIBVDPAU) && defined(_LINUX) hwSupport += "VDPAU:yes "; #elif defined(_LINUX) && !defined(__APPLE__) hwSupport += "VDPAU:no "; #endif #if defined(_WIN32) && defined(HAS_DX) hwSupport += "DXVA:yes "; #elif defined(_WIN32) hwSupport += "DXVA:no "; #endif #if defined(HAVE_LIBVA) && defined(_LINUX) hwSupport += "VAAPI:yes "; #elif defined(_LINUX) && !defined(__APPLE__) hwSupport += "VAAPI:no "; #endif #if defined(HAVE_LIBGSTREAMER) hwSupport += "GStreamer:yes "; #else hwSupport += "GStreamer:no "; #endif CLog::Log(LOGDEBUG, "CDVDFactoryCodec: compiled in hardware support: %s", hwSupport.c_str()); #if defined(HAVE_LIBGSTREAMER) if (!hint.software) { CLog::Log(LOGINFO, "Trying GStreamer Video Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecGStreamer(), hint, options)) ) return pCodec; } #endif // dvd's have weird still-frames in it, which is not fully supported in ffmpeg if(hint.stills && (hint.codec == CODEC_ID_MPEG2VIDEO || hint.codec == CODEC_ID_MPEG1VIDEO)) { if( (pCodec = OpenCodec(new CDVDVideoCodecLibMpeg2(), hint, options)) ) return pCodec; } #if defined(HAVE_LIBVDADECODER) if (!hint.software && g_guiSettings.GetBool("videoplayer.usevda")) { if (g_sysinfo.HasVDADecoder()) { if (hint.codec == CODEC_ID_H264 && !hint.ptsinvalid) { CLog::Log(LOGINFO, "Trying Apple VDA Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecVDA(), hint, options)) ) return pCodec; } } } #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) if (!hint.software && g_guiSettings.GetBool("videoplayer.usevideotoolbox")) { if (g_sysinfo.HasVideoToolBoxDecoder()) { switch(hint.codec) { case CODEC_ID_H264: if (hint.codec == CODEC_ID_H264 && hint.ptsinvalid) break; CLog::Log(LOGINFO, "Apple VideoToolBox Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(), hint, options)) ) return pCodec; break; default: break; } } } #endif #if defined(HAVE_LIBCRYSTALHD) if (!hint.software && g_guiSettings.GetBool("videoplayer.usechd")) { if (CCrystalHD::GetInstance()->DevicePresent()) { switch(hint.codec) { case CODEC_ID_VC1: case CODEC_ID_WMV3: case CODEC_ID_H264: case CODEC_ID_MPEG2VIDEO: if (hint.codec == CODEC_ID_H264 && hint.ptsinvalid) break; if (hint.codec == CODEC_ID_MPEG2VIDEO && hint.width <= 720) break; CLog::Log(LOGINFO, "Trying Broadcom Crystal HD Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecCrystalHD(), hint, options)) ) return pCodec; break; default: break; } } } #endif #if defined(HAVE_LIBOPENMAX) if (g_guiSettings.GetBool("videoplayer.useomx") && !hint.software ) { if (hint.codec == CODEC_ID_H264 || hint.codec == CODEC_ID_MPEG2VIDEO || hint.codec == CODEC_ID_VC1) { CLog::Log(LOGINFO, "Trying OpenMax Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecOpenMax(), hint, options)) ) return pCodec; } } #endif // try to decide if we want to try halfres decoding #if !defined(_LINUX) && !defined(_WIN32) float pixelrate = (float)hint.width*hint.height*hint.fpsrate/hint.fpsscale; if( pixelrate > 1400.0f*720.0f*30.0f ) { CLog::Log(LOGINFO, "CDVDFactoryCodec - High video resolution detected %dx%d, trying half resolution decoding ", hint.width, hint.height); options.push_back(CDVDCodecOption("lowres","1")); } #endif CStdString value; value.Format("%d", surfaces); options.push_back(CDVDCodecOption("surfaces", value)); if( (pCodec = OpenCodec(new CDVDVideoCodecFFmpeg(), hint, options)) ) return pCodec; return NULL; }
CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const CRenderInfo &info) { CDVDVideoCodec* pCodec = NULL; 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; //when support for a hardware decoder is not compiled in //only print it if it's actually available on the platform std::string hwSupport; #if defined(TARGET_DARWIN_OSX) hwSupport += "VDADecoder:yes "; #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) && defined(TARGET_DARWIN) hwSupport += "VideoToolBoxDecoder:yes "; #elif defined(TARGET_DARWIN) hwSupport += "VideoToolBoxDecoder:no "; #endif #if defined(HAS_LIBAMCODEC) hwSupport += "AMCodec:yes "; #else hwSupport += "AMCodec:no "; #endif #if defined(TARGET_ANDROID) hwSupport += "MediaCodec:yes "; #else hwSupport += "MediaCodec:no "; #endif #if defined(HAVE_LIBOPENMAX) hwSupport += "OpenMax:yes "; #elif defined(TARGET_POSIX) hwSupport += "OpenMax:no "; #endif #if defined(HAS_LIBSTAGEFRIGHT) hwSupport += "libstagefright:yes "; #elif defined(_LINUX) hwSupport += "libstagefright:no "; #endif #if defined(HAVE_LIBVDPAU) && defined(TARGET_POSIX) hwSupport += "VDPAU:yes "; #elif defined(TARGET_POSIX) && !defined(TARGET_DARWIN) hwSupport += "VDPAU:no "; #endif #if defined(TARGET_WINDOWS) && defined(HAS_DX) hwSupport += "DXVA:yes "; #elif defined(TARGET_WINDOWS) hwSupport += "DXVA:no "; #endif #if defined(HAVE_LIBVA) && defined(TARGET_POSIX) hwSupport += "VAAPI:yes "; #elif defined(TARGET_POSIX) && !defined(TARGET_DARWIN) hwSupport += "VAAPI:no "; #endif #if defined(HAS_IMXVPU) hwSupport += "iMXVPU:yes "; #else hwSupport += "iMXVPU:no "; #endif #if defined(HAS_MMAL) hwSupport += "MMAL:yes "; #else hwSupport += "MMAL:no "; #endif CLog::Log(LOGDEBUG, "CDVDFactoryCodec: compiled in hardware support: %s", hwSupport.c_str()); if (hint.stills && (hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO)) { // If dvd is an mpeg2 and hint.stills if ( (pCodec = OpenCodec(new CDVDVideoCodecLibMpeg2(), hint, options)) ) return pCodec; } #if defined(HAS_LIBAMCODEC) // amcodec can handle dvd playback. if (!hint.software && CSettings::Get().GetBool("videoplayer.useamcodec")) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_IMXVPU) if (!hint.software) { if ( (pCodec = OpenCodec(new CDVDVideoCodecIMX(), hint, options)) ) return pCodec; } #endif #if defined(TARGET_DARWIN_OSX) if (!hint.software && CSettings::Get().GetBool("videoplayer.usevda") && !g_advancedSettings.m_useFfmpegVda) { if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid) { if ( (pCodec = OpenCodec(new CDVDVideoCodecVDA(), hint, options)) ) return pCodec; } } #endif #if defined(HAVE_VIDEOTOOLBOXDECODER) if (!hint.software && CSettings::Get().GetBool("videoplayer.usevideotoolbox")) { if (g_sysinfo.HasVideoToolBoxDecoder()) { switch(hint.codec) { case AV_CODEC_ID_H264: if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid) break; if ( (pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(), hint, options)) ) return pCodec; break; default: break; } } } #endif #if defined(TARGET_ANDROID) if (!hint.software && CSettings::Get().GetBool("videoplayer.usemediacodec")) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: CLog::Log(LOGINFO, "MediaCodec Video Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(), hint, options)) ) return pCodec; } } #endif #if defined(HAVE_LIBOPENMAX) if (CSettings::Get().GetBool("videoplayer.useomx") && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VC1) { if ( (pCodec = OpenCodec(new CDVDVideoCodecOpenMax(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_MMAL) if (CSettings::Get().GetBool("videoplayer.usemmal") && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_H263 || hint.codec == AV_CODEC_ID_MPEG4 || hint.codec == AV_CODEC_ID_MPEG1VIDEO || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VP6 || hint.codec == AV_CODEC_ID_VP6F || hint.codec == AV_CODEC_ID_VP6A || hint.codec == AV_CODEC_ID_VP8 || hint.codec == AV_CODEC_ID_THEORA || hint.codec == AV_CODEC_ID_MJPEG || hint.codec == AV_CODEC_ID_MJPEGB || hint.codec == AV_CODEC_ID_VC1 || hint.codec == AV_CODEC_ID_WMV3) { if ( (pCodec = OpenCodec(new CMMALVideo(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_LIBSTAGEFRIGHT) if (!hint.software && CSettings::Get().GetBool("videoplayer.usestagefright")) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: if ( (pCodec = OpenCodec(new CDVDVideoCodecStageFright(), hint, options)) ) return pCodec; } } #endif // try to decide if we want to try halfres decoding #if !defined(TARGET_POSIX) && !defined(TARGET_WINDOWS) float pixelrate = (float)hint.width*hint.height*hint.fpsrate/hint.fpsscale; if( pixelrate > 1400.0f*720.0f*30.0f ) { CLog::Log(LOGINFO, "CDVDFactoryCodec - High video resolution detected %dx%d, trying half resolution decoding ", hint.width, hint.height); options.m_keys.push_back(CDVDCodecOption("lowres","1")); } #endif std::string value = StringUtils::Format("%d", info.optimal_buffer_size); options.m_keys.push_back(CDVDCodecOption("surfaces", value)); if( (pCodec = OpenCodec(new CDVDVideoCodecFFmpeg(), hint, options)) ) return pCodec; return NULL; }
CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const CRenderInfo &info) { CDVDVideoCodec* pCodec = nullptr; 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; if ((hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_MPEG1VIDEO) && (hint.stills || hint.filename == "dvd")) { // If dvd is an mpeg2 and hint.stills if ( (pCodec = OpenCodec(new CDVDVideoCodecLibMpeg2(), hint, options)) ) return pCodec; } #if defined(HAS_LIBAMCODEC) // amcodec can handle dvd playback. if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC)) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG2VIDEO: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_IMXVPU) if (!hint.software) { if ( (pCodec = OpenCodec(new CDVDVideoCodecIMX(), hint, options)) ) return pCodec; } #endif #if defined(TARGET_DARWIN_OSX) if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDA)) { if (hint.codec == AV_CODEC_ID_H264 && !hint.ptsinvalid) { if ( (pCodec = OpenCodec(new CDVDVideoCodecVDA(), hint, options)) ) return pCodec; } } #endif #if defined(TARGET_DARWIN_IOS) if (!hint.software) { switch(hint.codec) { case AV_CODEC_ID_H264: case AV_CODEC_ID_MPEG4: if (hint.codec == AV_CODEC_ID_H264 && hint.ptsinvalid) break; if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX)) if ( (pCodec = OpenCodec(new CDVDVideoCodecVideoToolBox(), hint, options)) ) return pCodec; if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAVF)) if ( (pCodec = OpenCodec(new CDVDVideoCodecAVFoundation(), hint, options)) ) return pCodec; break; default: break; } } #endif #if defined(TARGET_ANDROID) if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE)) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: CLog::Log(LOGINFO, "MediaCodec (Surface) Video Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; } } if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC)) { switch(hint.codec) { case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: // Avoid h/w decoder for SD; Those files might use features // not supported and can easily be soft-decoded if (hint.width <= 800) break; default: CLog::Log(LOGINFO, "MediaCodec Video Decoder..."); if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; } } #endif #if defined(HAVE_LIBOPENMAX) if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEOMX) && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VC1) { if ( (pCodec = OpenCodec(new CDVDVideoCodecOpenMax(), hint, options)) ) return pCodec; } } #endif #if defined(HAS_MMAL) if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMMAL) && !hint.software ) { if (hint.codec == AV_CODEC_ID_H264 || hint.codec == AV_CODEC_ID_H263 || hint.codec == AV_CODEC_ID_MPEG4 || hint.codec == AV_CODEC_ID_MPEG1VIDEO || hint.codec == AV_CODEC_ID_MPEG2VIDEO || hint.codec == AV_CODEC_ID_VP6 || hint.codec == AV_CODEC_ID_VP6F || hint.codec == AV_CODEC_ID_VP6A || hint.codec == AV_CODEC_ID_VP8 || hint.codec == AV_CODEC_ID_THEORA || hint.codec == AV_CODEC_ID_MJPEG || hint.codec == AV_CODEC_ID_MJPEGB || hint.codec == AV_CODEC_ID_VC1 || hint.codec == AV_CODEC_ID_WMV3) { if ( (pCodec = OpenCodec(new CMMALVideo(), hint, options)) ) return pCodec; } } #endif std::string value = StringUtils::Format("%d", info.max_buffer_size); options.m_keys.push_back(CDVDCodecOption("surfaces", value)); pCodec = OpenCodec(new CDVDVideoCodecFFmpeg(), hint, options); if (pCodec) return pCodec; return nullptr; }