[mythtv-commits] Ticket #12902: Cannot make QOpenGLContext current in a different thread (occurred while watching live tv)

MythTV noreply at mythtv.org
Wed Jan 11 18:48:36 UTC 2017


#12902: Cannot make QOpenGLContext current in a different thread (occurred while
watching live tv)
-------------------------------------------------+-------------------------
 Reporter:  William L. DeRieux IV                |          Owner:
  <WilliamDeRieux@…>                             |
     Type:  Bug Report - Crash                   |         Status:  new
 Priority:  critical                             |      Milestone:  0.28.1
Component:  Qt5 issues                           |        Version:  0.28.0
 Severity:  high                                 |     Resolution:
 Keywords:                                       |  Ticket locked:  0
-------------------------------------------------+-------------------------

Comment (by WilliamDeRieux@…):

 Replying to [comment:13 stuarta]:
 > Right, we definitely need to resolve this as it's a Qt5 specific issue.
 >
 > It looks like either the fallback de-interlacer or the change speed code
 > is doing the wrong thing. Based on comment#12 i suspect it's the
 fallback
 > de-interlacer code.

 You said it is related to #comment:12 -- that was actually a link
 #ticket:12 -- and that it is a problem with the fallback de-interlacer
 code.

 MythPlayer::ChangeSpeed() will call
 VideoOutput::FallbackDeint() which passes the fallback de-interlacer to
 VideoOutputOpenGL::SetupDeinterlace(bool, QString const&) this function
 then directly calls
 OpenGLLocker::OpenGLLocker(MythRenderOpenGL*) which causes the error
 'Cannot make QOpenGLContext current in a different thread'.

 From that, I guess, the issue occurs when the de-interlacer is setup on a
 thread that does not belong to the QOpenGLContext.

 The faulting line in SetupDeinterlace is this:
 {{{
 OpenGLLocker ctx_lock(gl_context);
 }}}

 which calls:
 {{{
 OpenGLLocker::OpenGLLocker(MythRenderOpenGL *render) : m_render(render)
 {
     if (m_render)
         m_render->makeCurrent();
 }
 }}}

 I suppose that there needs to be some sort of check in the OpenGLLocker
 constructor that

 1) checks if the the call is on the correct thread.

 or

 2) makes a call to m_render->moveToThread(QThread *targetThread)
 http://doc.qt.io/qt-5/qobject.html#moveToThread

 This is a quote from the QT 5 Documentation:

 http://doc.qt.io/qt-5/qopenglcontext.html#thread-affinity
 {{{

 Thread Affinity

 QOpenGLContext can be moved to a different thread with moveToThread(). Do
 not
 call makeCurrent() from a different thread than the one to which the
 QOpenGLContext object belongs. A context can only be current in one thread
 and against one surface at a time, and a thread only has one context
 current
 at a time.
 }}}

 Also, given the above, I suppose it is actually a problem with QT5 and
 that it has nothing to do with video decoding or anything else.

 Thanks.

--
Ticket URL: <https://code.mythtv.org/trac/ticket/12902#comment:14>
MythTV <http://www.mythtv.org>
MythTV Media Center


More information about the mythtv-commits mailing list