Fix random crash on stream start with renderers that require test frames

This commit is contained in:
Cameron Gutman 2022-01-18 18:19:28 -06:00
parent a649f2736f
commit f0659b4f3c
2 changed files with 15 additions and 6 deletions

View File

@ -819,6 +819,11 @@ private:
emit m_Session->sessionFinished(m_Session->m_PortTestResults);
}
// The video decoder must already be destroyed, since it could
// try to interact with APIs that can only be called between
// LiStartConnection() and LiStopConnection().
SDL_assert(m_Session->m_VideoDecoder == nullptr);
// Finish cleanup of the connection state
LiStopConnection();
@ -1717,6 +1722,8 @@ DispatchDeferredCleanup:
SDL_AtomicUnlock(&m_InputHandlerLock);
// Destroy the decoder, since this must be done on the main thread
// NB: This must happen before LiStopConnection() for pull-based
// decoders.
SDL_AtomicLock(&m_DecoderLock);
delete m_VideoDecoder;
m_VideoDecoder = nullptr;

View File

@ -424,13 +424,15 @@ bool FFmpegVideoDecoder::completeInitialization(const AVCodec* decoder, PDECODER
// Tell overlay manager to use this frontend renderer
Session::get()->getOverlayManager().setOverlayRenderer(m_FrontendRenderer);
}
m_DecoderThread = SDL_CreateThread(FFmpegVideoDecoder::decoderThreadProcThunk, "FFDecoder", (void*)this);
if (m_DecoderThread == nullptr) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to create decoder thread: %s", SDL_GetError());
return false;
// Only create the decoder thread when instantiating the decoder for real. It will use APIs from
// moonlight-common-c that can only be legally called with an established connection.
m_DecoderThread = SDL_CreateThread(FFmpegVideoDecoder::decoderThreadProcThunk, "FFDecoder", (void*)this);
if (m_DecoderThread == nullptr) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"Failed to create decoder thread: %s", SDL_GetError());
return false;
}
}
return true;