mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-06-17 06:01:12 +00:00
Fix some codec selection bugs
This commit is contained in:
@@ -463,40 +463,46 @@ bool FFmpegVideoDecoder::initialize(PDECODER_PARAMETERS params)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for the first matching hwaccel
|
// Look for a hardware decoder first unless software-only
|
||||||
for (int i = 0;; i++) {
|
if (params->vds != StreamingPreferences::VDS_FORCE_SOFTWARE) {
|
||||||
const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);
|
// Look for the first matching hwaccel hardware decoder
|
||||||
if (!config || params->vds == StreamingPreferences::VDS_FORCE_SOFTWARE) {
|
for (int i = 0;; i++) {
|
||||||
// No remaing hwaccel options or software decoding requested
|
const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i);
|
||||||
break;
|
if (!config) {
|
||||||
|
// No remaing hwaccel options
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the hardware codec and submit a test frame if the renderer needs it
|
||||||
|
if (tryInitializeRenderer(decoder, params, config,
|
||||||
|
[config]() -> IFFmpegRenderer* { return createHwAccelRenderer(config); })) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the hardware codec and submit a test frame if the renderer needs it
|
// Continue with special non-hwaccel hardware decoders
|
||||||
if (tryInitializeRenderer(decoder, params, config,
|
|
||||||
[config]() -> IFFmpegRenderer* { return createHwAccelRenderer(config); })) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_MMAL
|
#ifdef HAVE_MMAL
|
||||||
// MMAL is a non-hwaccel hardware decoder for the Raspberry Pi
|
// MMAL is the decoder for the Raspberry Pi
|
||||||
if ((params->videoFormat & VIDEO_FORMAT_MASK_H264) &&
|
if (params->videoFormat & VIDEO_FORMAT_MASK_H264) {
|
||||||
(params->vds != StreamingPreferences::VDS_FORCE_SOFTWARE)) {
|
AVCodec* mmalDecoder = avcodec_find_decoder_by_name("h264_mmal");
|
||||||
AVCodec* mmalDecoder = avcodec_find_decoder_by_name("h264_mmal");
|
if (mmalDecoder != nullptr &&
|
||||||
if (mmalDecoder != nullptr &&
|
tryInitializeRenderer(mmalDecoder, params, nullptr,
|
||||||
tryInitializeRenderer(decoder, params, nullptr,
|
[]() -> IFFmpegRenderer* { return new MmalRenderer(); })) {
|
||||||
[]() -> IFFmpegRenderer* { return new MmalRenderer(); })) {
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to software if no matching hardware decoder was found
|
||||||
|
// and if software fallback is allowed
|
||||||
|
if (params->vds != StreamingPreferences::VDS_FORCE_HARDWARE) {
|
||||||
|
if (tryInitializeRenderer(decoder, params, nullptr,
|
||||||
|
[]() -> IFFmpegRenderer* { return new SdlRenderer(); })) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// We must fall back to a non-hardware accelerated decoder as
|
|
||||||
// all other possibilities have been exhausted.
|
|
||||||
if (tryInitializeRenderer(decoder, params, nullptr,
|
|
||||||
[]() -> IFFmpegRenderer* { return new SdlRenderer(); })) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No decoder worked
|
// No decoder worked
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user