enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const PixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; if(!ctx->IsHardwareAllowed()) return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); const PixelFormat * cur = fmt; while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(CVDPAU::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.usevdpau")) { if(ctx->GetHardware()) return *cur; CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); CVDPAU* vdp = new CVDPAU(); if(vdp->Open(avctx, *cur)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && g_guiSettings.GetBool("videoplayer.usedxva2")) { DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && g_guiSettings.GetBool("videoplayer.usevaapi") && (avctx->codec_id != CODEC_ID_MPEG4 || g_advancedSettings.m_videoAllowMpeg4VAAPI)) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, *cur)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); }
enum AVPixelFormat CDVDVideoCodecFFmpeg::GetFormat(struct AVCodecContext * avctx, const AVPixelFormat * fmt) { ICallbackHWAccel *cb = static_cast<ICallbackHWAccel*>(avctx->opaque); CDVDVideoCodecFFmpeg* ctx = dynamic_cast<CDVDVideoCodecFFmpeg*>(cb); const char* pixFmtName = av_get_pix_fmt_name(*fmt); ctx->m_processInfo.SetVideoDimensions(avctx->coded_width, avctx->coded_height); // if frame threading is enabled hw accel is not allowed // 2nd condition: // fix an ffmpeg issue here, it calls us with an invalid profile // then a 2nd call with a valid one if(ctx->m_decoderState != STATE_HW_SINGLE || (avctx->codec_id == AV_CODEC_ID_VC1 && avctx->profile == FF_PROFILE_UNKNOWN)) { AVPixelFormat defaultFmt = avcodec_default_get_format(avctx, fmt); pixFmtName = av_get_pix_fmt_name(defaultFmt); ctx->m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : ""); ctx->m_processInfo.SetSwDeinterlacingMethods(); return defaultFmt; } // hardware decoder de-selected, restore standard ffmpeg if (ctx->HasHardware()) { ctx->SetHardware(nullptr); avctx->get_buffer2 = avcodec_default_get_buffer2; avctx->slice_flags = 0; av_buffer_unref(&avctx->hw_frames_ctx); } const AVPixelFormat * cur = fmt; while (*cur != AV_PIX_FMT_NONE) { pixFmtName = av_get_pix_fmt_name(*cur); auto hwaccels = CDVDFactoryCodec::GetHWAccels(); for (auto &hwaccel : hwaccels) { IHardwareDecoder *pDecoder(CDVDFactoryCodec::CreateVideoCodecHWAccel(hwaccel, ctx->m_hints, ctx->m_processInfo, *cur)); if (pDecoder) { if (pDecoder->Open(avctx, ctx->m_pCodecContext, *cur)) { ctx->m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : ""); ctx->SetHardware(pDecoder); return *cur; } } SAFE_RELEASE(pDecoder); } cur++; } ctx->m_processInfo.SetVideoPixelFormat(pixFmtName ? pixFmtName : ""); ctx->m_decoderState = STATE_HW_FAILED; return avcodec_default_get_format(avctx, fmt); }
enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const PixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; if(!ctx->IsHardwareAllowed()) return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); const PixelFormat * cur = fmt; while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(CVDPAU::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.hwaccel")) { if(ctx->GetHardware()) return *cur; CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); CVDPAU* vdp = new CVDPAU(); if(vdp->Open(avctx, *cur)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && g_guiSettings.GetBool("videoplayer.hwaccel")) { DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, *cur)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA if(*cur == PIX_FMT_VAAPI_VLD && g_guiSettings.GetBool("videoplayer.hwaccel")) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, *cur)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); }
enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const PixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; // if frame threading is enabled hw accel is not allowed if(ctx->m_decoderState != STATE_HW_SINGLE) { return avcodec_default_get_format(avctx, fmt); } const PixelFormat * cur = fmt; while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::Get().GetBool("videoplayer.usevdpau")) { CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); if(vdp->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && CSettings::Get().GetBool("videoplayer.usedxva2")) { CLog::Log(LOGNOTICE, "CDVDVideoCodecFFmpeg::GetFormat - Creating DXVA(%ix%i)", avctx->width, avctx->height); DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi")) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount) == true) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef TARGET_DARWIN_OSX if (*cur == AV_PIX_FMT_VDA && CSettings::Get().GetBool("videoplayer.usevda") && g_advancedSettings.m_useFfmpegVda) { VDA::CDecoder* dec = new VDA::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } // hardware decoder de-selected, restore standard ffmpeg if (ctx->GetHardware()) { ctx->SetHardware(NULL); avctx->get_buffer2 = avcodec_default_get_buffer2; avctx->slice_flags = 0; avctx->hwaccel_context = 0; } ctx->m_decoderState = STATE_HW_FAILED; return avcodec_default_get_format(avctx, fmt); }
enum AVPixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const AVPixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; // if frame threading is enabled hw accel is not allowed if(ctx->m_decoderState != STATE_HW_SINGLE) { return avcodec_default_get_format(avctx, fmt); } // fix an ffmpeg issue here, it calls us with an invalid profile // then a 2nd call with a valid one if (avctx->codec_id == AV_CODEC_ID_VC1 && avctx->profile == FF_PROFILE_UNKNOWN) { return avcodec_default_get_format(avctx, fmt); } // hardware decoder de-selected, restore standard ffmpeg if (ctx->GetHardware()) { ctx->SetHardware(NULL); avctx->get_buffer2 = avcodec_default_get_buffer2; avctx->slice_flags = 0; avctx->hwaccel_context = 0; } const AVPixelFormat * cur = fmt; while(*cur != AV_PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVDPAU)) { CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); if(vdp->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEDXVA2) && !ctx->m_hints.dvd && !ctx->m_hints.stills) { CLog::Log(LOGNOTICE, "CDVDVideoCodecFFmpeg::GetFormat - Creating DXVA(%ix%i)", avctx->width, avctx->height); DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == AV_PIX_FMT_VAAPI_VLD && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVAAPI)) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount) == true) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef TARGET_DARWIN if (*cur == AV_PIX_FMT_VIDEOTOOLBOX && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEVTB)) { VTB::CDecoder* dec = new VTB::CDecoder(); if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAS_MMAL if (*cur == AV_PIX_FMT_YUV420P) { MMAL::CDecoder* dec = new MMAL::CDecoder(); ctx->m_pCodecContext->hwaccel_context = (void *)ctx->m_options.m_opaque_pointer; if(dec->Open(avctx, ctx->m_pCodecContext, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } ctx->m_decoderState = STATE_HW_FAILED; return avcodec_default_get_format(avctx, fmt); }
enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const PixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; // if frame threading is enabled hw accel is not allowed if((EDECODEMETHOD) CSettings::Get().GetInt("videoplayer.decodingmethod") != VS_DECODEMETHOD_HARDWARE || !ctx->IsHardwareAllowed()) return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); const PixelFormat * cur = fmt; while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::Get().GetBool("videoplayer.usevdpau")) { CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); if(vdp->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && CSettings::Get().GetBool("videoplayer.usedxva2")) { DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi")) { VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef TARGET_DARWIN_OSX if (*cur == AV_PIX_FMT_VDA_VLD && CSettings::Get().GetBool("videoplayer.usevda")) { VDA::CDecoder* dec = new VDA::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); }
enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx , const PixelFormat * fmt ) { CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; if(!ctx->IsHardwareAllowed()) return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); /* there are many corrupt mpeg2 rips from dvd's which don't * * follow profile spec properly, they go corrupt on hw, so * * keep those running in software for the time being. */ if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && avctx->height <= 576 && avctx->width <= 720) return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); const PixelFormat * cur = fmt; while(*cur != PIX_FMT_NONE) { #ifdef HAVE_LIBVDPAU if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && CSettings::Get().GetBool("videoplayer.usevdpau")) { CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); if(vdp->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(vdp); return *cur; } else vdp->Release(); } #endif #ifdef HAS_DX if(DXVA::CDecoder::Supports(*cur) && CSettings::Get().GetBool("videoplayer.usedxva2")) { DXVA::CDecoder* dec = new DXVA::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && CSettings::Get().GetBool("videoplayer.usevaapi") && (avctx->codec_id != AV_CODEC_ID_MPEG4 || g_advancedSettings.m_videoAllowMpeg4VAAPI)) { if (ctx->GetHardware() != NULL) { ctx->SetHardware(NULL); } VAAPI::CDecoder* dec = new VAAPI::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif #ifdef TARGET_DARWIN_OSX if (*cur == AV_PIX_FMT_VDA_VLD && CSettings::Get().GetBool("videoplayer.usevda")) { VDA::CDecoder* dec = new VDA::CDecoder(); if(dec->Open(avctx, *cur, ctx->m_uSurfacesCount)) { ctx->SetHardware(dec); return *cur; } else dec->Release(); } #endif cur++; } return ctx->m_dllAvCodec.avcodec_default_get_format(avctx, fmt); }