diff --git a/alvr/server/cpp/alvr_server/OvrHMD.cpp b/alvr/server/cpp/alvr_server/OvrHMD.cpp index f3f4d2b61d..ba331f3e9b 100644 --- a/alvr/server/cpp/alvr_server/OvrHMD.cpp +++ b/alvr/server/cpp/alvr_server/OvrHMD.cpp @@ -114,7 +114,6 @@ OvrHmd::~OvrHmd() { if (m_encoder) { Debug("OvrHmd::~OvrHmd(): Stopping encoder...\n"); - m_encoder->Stop(); m_encoder.reset(); } @@ -382,6 +381,15 @@ void OvrHmd::StartStreaming() { void OvrHmd::StopStreaming() { vr::VRDriverInput()->UpdateBooleanComponent(m_proximity, false, 0.0); +#ifdef _WIN32 + if (m_directModeComponent) { + m_directModeComponent->ResetEncoder(); + } +#endif + if (m_encoder) { + m_encoder.reset(); + } + m_streamComponentsInitialized = false; } void OvrHmd::SetViewsConfig(FfiViewsConfig config) { diff --git a/alvr/server/cpp/platform/win32/CEncoder.cpp b/alvr/server/cpp/platform/win32/CEncoder.cpp index 6bb269cec6..8c66b0eadb 100644 --- a/alvr/server/cpp/platform/win32/CEncoder.cpp +++ b/alvr/server/cpp/platform/win32/CEncoder.cpp @@ -11,6 +11,7 @@ CEncoder::~CEncoder() { + Stop(); if (m_videoEncoder) { m_videoEncoder->Shutdown(); @@ -31,7 +32,7 @@ if (Settings::Instance().m_force_sw_encoding) { try { Debug("Try to use VideoEncoderSW.\n"); - m_videoEncoder = std::make_shared(d3dRender, encoderWidth, encoderHeight); + m_videoEncoder = std::make_unique(d3dRender, encoderWidth, encoderHeight); m_videoEncoder->Initialize(); return; } @@ -43,7 +44,7 @@ try { Debug("Try to use VideoEncoderVCE.\n"); - m_videoEncoder = std::make_shared(d3dRender, encoderWidth, encoderHeight); + m_videoEncoder = std::make_unique(d3dRender, encoderWidth, encoderHeight); m_videoEncoder->Initialize(); return; } @@ -52,7 +53,7 @@ } try { Debug("Try to use VideoEncoderNVENC.\n"); - m_videoEncoder = std::make_shared(d3dRender, encoderWidth, encoderHeight); + m_videoEncoder = std::make_unique(d3dRender, encoderWidth, encoderHeight); m_videoEncoder->Initialize(); return; } @@ -62,7 +63,7 @@ #ifdef ALVR_GPL try { Debug("Try to use VideoEncoderSW.\n"); - m_videoEncoder = std::make_shared(d3dRender, encoderWidth, encoderHeight); + m_videoEncoder = std::make_unique(d3dRender, encoderWidth, encoderHeight); m_videoEncoder->Initialize(); return; } @@ -80,8 +81,6 @@ { m_presentationTime = presentationTime; m_targetTimestampNs = targetTimestampNs; - m_FrameRender->Startup(); - m_FrameRender->RenderFrame(pTexture, bounds, layerCount, recentering, message, debugText); return true; } diff --git a/alvr/server/cpp/platform/win32/CEncoder.h b/alvr/server/cpp/platform/win32/CEncoder.h index 7a83498f5e..c2969d1816 100644 --- a/alvr/server/cpp/platform/win32/CEncoder.h +++ b/alvr/server/cpp/platform/win32/CEncoder.h @@ -56,7 +56,7 @@ private: CThreadEvent m_newFrameReady, m_encodeFinished; - std::shared_ptr m_videoEncoder; + std::unique_ptr m_videoEncoder; bool m_bExiting; uint64_t m_presentationTime; uint64_t m_targetTimestampNs; diff --git a/alvr/server/cpp/platform/win32/OvrDirectModeComponent.cpp b/alvr/server/cpp/platform/win32/OvrDirectModeComponent.cpp index 20ed92e547..72adee4018 100644 --- a/alvr/server/cpp/platform/win32/OvrDirectModeComponent.cpp +++ b/alvr/server/cpp/platform/win32/OvrDirectModeComponent.cpp @@ -11,6 +11,10 @@ void OvrDirectModeComponent::SetEncoder(std::shared_ptr pEncoder) { m_pEncoder = pEncoder; } +void OvrDirectModeComponent::ResetEncoder() { + m_pEncoder.reset(); +} + /** Specific to Oculus compositor support, textures supplied must be created using this method. */ void OvrDirectModeComponent::CreateSwapTextureSet(uint32_t unPid, const SwapTextureSetDesc_t *pSwapTextureSetDesc, SwapTextureSet_t *pOutSwapTextureSet) { diff --git a/alvr/server/cpp/platform/win32/OvrDirectModeComponent.h b/alvr/server/cpp/platform/win32/OvrDirectModeComponent.h index bfe67553ec..c3aa7a2d40 100644 --- a/alvr/server/cpp/platform/win32/OvrDirectModeComponent.h +++ b/alvr/server/cpp/platform/win32/OvrDirectModeComponent.h @@ -13,6 +13,7 @@ class OvrDirectModeComponent : public vr::IVRDriverDirectModeComponent OvrDirectModeComponent(std::shared_ptr pD3DRender, std::shared_ptr poseHistory); void SetEncoder(std::shared_ptr pEncoder); + void ResetEncoder(); /** Specific to Oculus compositor support, textures supplied must be created using this method. */ virtual void CreateSwapTextureSet( uint32_t unPid, const SwapTextureSetDesc_t *pSwapTextureSetDesc, SwapTextureSet_t *pOutSwapTextureSet ); diff --git a/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp b/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp index b7baa6e02d..9922a24828 100644 --- a/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp +++ b/alvr/server/cpp/platform/win32/VideoEncoderVCE.cpp @@ -14,11 +14,7 @@ AMFPipe::AMFPipe(amf::AMFComponentPtr src, AMFDataReceiver receiver) , m_receiver(receiver) {} -AMFPipe::~AMFPipe() -{ - Debug("AMFPipe::~AMFPipe() m_amfComponentSrc->Drain\n"); - m_amfComponentSrc->Drain(); -} +AMFPipe::~AMFPipe() {} void AMFPipe::doPassthrough(bool hasQueryTimeout, uint32_t timerResolution) { @@ -366,8 +362,7 @@ void VideoEncoderVCE::Shutdown() delete m_pipeline; for (auto &component : m_amfComponents) { - component->Release(); - delete component; + component->Terminate(); } m_amfContext->Terminate();