diff --git a/mythtv/libs/libmythtv/mythplayer.h b/mythtv/libs/libmythtv/mythplayer.h
index 7fe3bb3..93870e7 100644
--- a/mythtv/libs/libmythtv/mythplayer.h
+++ b/mythtv/libs/libmythtv/mythplayer.h
@@ -348,7 +348,7 @@ class MTV_PUBLIC MythPlayer
                        frm_pos_map_t &durMap);
 
     // OSD locking for TV class
-    bool TryLockOSD(void) { return osdLock.tryLock(50); }
+    bool TryLockOSD(int n) { return osdLock.tryLock(n); }
     void LockOSD(void)    { osdLock.lock();   }
     void UnlockOSD(void)  { osdLock.unlock(); }
 
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 5460cfa..5132d9c 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -3518,14 +3518,25 @@ void TV::HandleEndOfRecordingExitPromptTimerEvent(void)
     }
 
     PlayerContext *mctx = GetPlayerReadLock(0, __FILE__, __LINE__);
+    MythPlayer *player = mctx->player;
+    // Potential deadlock if this is called while VideoOut
+    // is being initialized.
+    if (!player->TryLockOSD(50))
+    {
+        ReturnPlayerLock(mctx);
+        return;
+    }
+
     OSD *osd = GetOSDLock(mctx);
     if (osd && osd->DialogVisible())
     {
         ReturnOSDLock(mctx, osd);
+        player->UnlockOSD();
         ReturnPlayerLock(mctx);
         return;
     }
     ReturnOSDLock(mctx, osd);
+    player->UnlockOSD();
 
     bool do_prompt;
     mctx->LockDeletePlayer(__FILE__, __LINE__);
