Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Showing video in GUI does not work (black screen)
Qt 6.11 is out! See what's new in the release blog

Showing video in GUI does not work (black screen)

Scheduled Pinned Locked Moved Solved General and Desktop
28 Posts 4 Posters 5.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SGaistS SGaist

    What kind of memory problem ?

    M Offline
    M Offline
    makopo
    wrote on last edited by makopo
    #11

    @SGaist

    It is difficult for me to retrace that, because actually the event-loop runs. I tried to work with raw pointers (just out of desperation), and with that I got a read access violation error with code 0xC0000005. The event loop runs for a short inconstant time and than the programm exits with this error. Between that, the debugger detects an c0000374 error. I think it was a buffer overflow because I didn't implement the deletetion of the raw-pointers.

    But actually there is no problem with pointers I think. As I can see in the console the program with the event loop runs (only the screen is black).

    VideoScreen: GetScreenPeviewCallback was called. TEST
    ControlVideo: ScreenPreviewCallback works.
    ControlVideo: SetCallback works.
    ControlVideo: Video input is enabled.
    ControlVideo: Stream has started.
    VideoScreen: GetScreenPeviewCallback was called. TEST
    QVideoMeter: VALUE PREVIEWCALLBACK  0x20ee0b32d00
    QVideoMeter: StartButton clicked. Stream is running.
    VideoScreenHelper: DrawFrame is called. Thread-ID is  0x3338
    VideoScreen: HandleFrame method is called. Thread-ID:  0x1628
    VideoScreenHelper: DrawFrame is called. Thread-ID is  0x3338
    VideoScreen: HandleFrame method is called. Thread-ID:  0x1628
    //and so on
    

    What strange is, I think, is that GetScreenPreviewCallback is called twice.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      makopo
      wrote on last edited by makopo
      #12

      It looks like that there is a problem with the initialized object of the IDeckLinkGLScreenPreviewHelper, I create with CoCreateInstance() and the functions of the QOpenGLWidget class. I use QOpenGLWidget::initializeGL() and QOpenGLWidget()::paintGL to call equal named functions of IDeckLinkGLScreenPreviewHelper.

      //looks like "m_previewHelper" is null
      void VideoScreen::initializeGL() {
          if (m_previewHelper)  m_previewHelper->InitializeGL();
      }
      

      But when I debug the program I get the error message: 0xC0000005: Read access violation at position 0x0000000000000000. Looks like m_previewHelper points to null.
      Strangely enough, Handleframe (the slot function), which also uses the previewHelper object, is executed.

      //looks like m_previewHelper is not null
      void VideoScreen::HandleFrame(CComPtr<IDeckLinkVideoFrame> theFrame) {
          if (m_previewHelper) m_previewHelper->SetFrame(&(*theFrame));
      }
      

      I had written a function that that calls CoCreateInstance and create with this the previewHelper object. In the constructor I assign this function to the member variable. The variable has the same datatype than the function.

      //call in constructor
      m_previewHelper = ScreenPreviewHelperInstance();
      

      When I print the value of m_previewHelper I get something like 0x29e3d3a78d0 and so on. m_previewHelper seams to be not null.
      I did not understand that problem. Did someone of you have an idea whats going wrong?

      jsulmJ 1 Reply Last reply
      0
      • M makopo

        It looks like that there is a problem with the initialized object of the IDeckLinkGLScreenPreviewHelper, I create with CoCreateInstance() and the functions of the QOpenGLWidget class. I use QOpenGLWidget::initializeGL() and QOpenGLWidget()::paintGL to call equal named functions of IDeckLinkGLScreenPreviewHelper.

        //looks like "m_previewHelper" is null
        void VideoScreen::initializeGL() {
            if (m_previewHelper)  m_previewHelper->InitializeGL();
        }
        

        But when I debug the program I get the error message: 0xC0000005: Read access violation at position 0x0000000000000000. Looks like m_previewHelper points to null.
        Strangely enough, Handleframe (the slot function), which also uses the previewHelper object, is executed.

        //looks like m_previewHelper is not null
        void VideoScreen::HandleFrame(CComPtr<IDeckLinkVideoFrame> theFrame) {
            if (m_previewHelper) m_previewHelper->SetFrame(&(*theFrame));
        }
        

        I had written a function that that calls CoCreateInstance and create with this the previewHelper object. In the constructor I assign this function to the member variable. The variable has the same datatype than the function.

        //call in constructor
        m_previewHelper = ScreenPreviewHelperInstance();
        

        When I print the value of m_previewHelper I get something like 0x29e3d3a78d0 and so on. m_previewHelper seams to be not null.
        I did not understand that problem. Did someone of you have an idea whats going wrong?

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by jsulm
        #13

        @makopo said in Showing video in GUI does not work (black screen):

        Did someone of you have an idea whats going wrong?

        A pointer != nullptr does not mean that it is valid. It can be that the memory it is pointing to was already released. Did you release m_previewHelper somewhere?

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        M 1 Reply Last reply
        0
        • jsulmJ jsulm

          @makopo said in Showing video in GUI does not work (black screen):

          Did someone of you have an idea whats going wrong?

          A pointer != nullptr does not mean that it is valid. It can be that the memory it is pointing to was already released. Did you release m_previewHelper somewhere?

          M Offline
          M Offline
          makopo
          wrote on last edited by
          #14

          @jsulm
          I use CComPtrs and with that functions of the IUnknown interface. Also IUnknown::Release.

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #15

            Did you consider implementing my suggestion rather than moving theses pointers around ?

            I don't think there's a guarantee that the buffer they are pointing to will be valid when the callback method is done.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            M 1 Reply Last reply
            0
            • SGaistS SGaist

              Did you consider implementing my suggestion rather than moving theses pointers around ?

              I don't think there's a guarantee that the buffer they are pointing to will be valid when the callback method is done.

              M Offline
              M Offline
              makopo
              wrote on last edited by
              #16

              @SGaist

              Did you mean building a QImage in an own method instead of using the DrawFrame method from the callback interface?

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #17

                Build the QImage in the callback and send it further using invokeMethod.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                M 1 Reply Last reply
                0
                • SGaistS SGaist

                  Build the QImage in the callback and send it further using invokeMethod.

                  M Offline
                  M Offline
                  makopo
                  wrote on last edited by makopo
                  #18

                  @SGaist

                  I found by accident that my program renders a single frame of the camera input, after I start the loop and minimize the GUI of the program. When I reopen the GUI a new frame is rendered and also, as I can see in the console, the paintGL() method of the QOpenGLWidget interface is called. I think the paintGL()method is not implemented well. I will take look to the OpenGL part.

                  Do you agree that there is a problem with OpenGL? Or do you think the cause of this is the event loop?
                  Sorry for all this silly questions. I'am not very experienced in programming and this is a studyproject from university. Some thinks sounds new to me.

                  1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #19

                    That QOpenGLWidget is new to me, there's no reference to it in your code.

                    I would recommend minimizing your application so that you can concentrate on the Decklink integration part.

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    M 1 Reply Last reply
                    0
                    • SGaistS SGaist

                      That QOpenGLWidget is new to me, there's no reference to it in your code.

                      I would recommend minimizing your application so that you can concentrate on the Decklink integration part.

                      M Offline
                      M Offline
                      makopo
                      wrote on last edited by
                      #20

                      I checked the DeckLink intergration and I think there is no problem. I come bck to the OpenGl part and tried to draw a triangle with OpenGL in QOpenGLWidget::paintGL(). The function is called, but the graphic isn't rendered.

                      void VideoScreen::paintGL() {
                      	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                      	glBegin(GL_TRIANGLES);
                      		glColor3f(1, 0, 0);
                      		glVertex3f(-0.5, -0.5, 0);
                      		glColor3f(0, 1, 0);
                      		glVertex3f(0.5, -0.5, 0);
                      		glColor3f(1, 0, 0);
                      		glVertex3f(0.0, -0.5, 0);
                      	glEnd();
                      	qDebug() << "VideoScreen: paintGL works";
                      }
                      

                      I also checked QOpenGLWidget::initializeGL() and the call of glClearColor works.

                      void VideoScreen::initializeGL() {
                      	initializeOpenGLFunctions();
                      	glClearColor(1, 1, 0, 1); //after calling this the widget is yellow
                      	m_previewHelper->InitializeGL();
                      	qDebug() << "VideoScreen: initalizeGL works.";
                      }
                      

                      The OpenGL context is created in the main-method.

                      QSurfaceFormat format;
                      format.setDepthBufferSize(24);
                      format.setStencilBufferSize(8);
                      format.setVersion(3, 2);
                      format.setProfile(QSurfaceFormat::CoreProfile);
                      QSurfaceFormat::setDefaultFormat(format);
                      

                      The QOpenGLWidget part is implemented in a own class.

                      class OpenGLScreen : public QOpenGLWidget, protected QOpenGLFunctions {};
                      

                      I create a instance of the class which inherits from QMainWindow. Then the OpenGLScreen Widget is added to a layout:

                      QScreen::QScreen(QWidget* parent)
                          : QMainWindow(parent), 
                          m_ui(new Ui::MainWindow)
                      {
                          m_screen = new OpenGLScreen(parent);
                          m_horizontalScreen->addWidget(m_screen);
                      
                      QWidget::show();
                      

                      Thanks for a little hint whats going wrong here.

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #21

                        I don't see any projection matrix initialization.

                        In your code are you sure you are properly setting up the texture to be painted if using a texture for the video image ?

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        M 1 Reply Last reply
                        0
                        • SGaistS SGaist

                          I don't see any projection matrix initialization.

                          In your code are you sure you are properly setting up the texture to be painted if using a texture for the video image ?

                          M Offline
                          M Offline
                          makopo
                          wrote on last edited by makopo
                          #22

                          @SGaist

                          Thanks for advice. I tried to initialize the projection matrix in QOpenGLWidget::resizeGL(int w, int h), but I also get an empty widget.

                          void VideoScreen::resizeGL(int w, int h) {
                              glViewport(0, 0, w, h);
                              glMatrixMode(GL_PROJECTION);
                              glLoadIdentity();
                              glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
                              glMatrixMode(GL_MODELVIEW);
                              qDebug() << "VideoScreen: resizeGl works";
                          }
                          

                          According to the decklink documention the texture should be generated with a special interface, called IDeckLinkScreenPreviewHelper.
                          So in VideoScreen::paintGL() a call of m_screenPreviewHelper->PaintGL() should render Texture and Shader. But it is not deeply descripted in the documentation. Also in concerning sample code Shaders and Textures are not used.
                          When I include m_screenPreviewHelper->PaintGL() I get a black widget. After minimizing the main window paintGL is called and after reopening the window too. With this I get a single (freezed) frame rendered.

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by
                            #23

                            Can you provide a link to the actual Decklink example you are using as reference ?

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            M 1 Reply Last reply
                            0
                            • SGaistS SGaist

                              Can you provide a link to the actual Decklink example you are using as reference ?

                              M Offline
                              M Offline
                              makopo
                              wrote on last edited by
                              #24

                              @SGaist

                              You can finde the sample code here: QuadPreview. The SDK is not shared with github e.g. , so I uploaded it to private cloud.

                              In this Qt example the matrix identity and the perspective are set with the QMatrix4x4 class. Is this modern way for initializing a matrix? Or is there no difference between

                              glViewport(0, 0, w, h);
                              glMatrixMode(GL_PROJECTION);
                              glLoadIdentity();
                              glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
                              glMatrixMode(GL_MODELVIEW);
                              

                              and

                              m_proj.setToIdentity();
                              m_proj.perspective(45.0f, GLfloat(w) / h, 0.01f, 100.0f);
                              
                              M 1 Reply Last reply
                              0
                              • M makopo

                                @SGaist

                                You can finde the sample code here: QuadPreview. The SDK is not shared with github e.g. , so I uploaded it to private cloud.

                                In this Qt example the matrix identity and the perspective are set with the QMatrix4x4 class. Is this modern way for initializing a matrix? Or is there no difference between

                                glViewport(0, 0, w, h);
                                glMatrixMode(GL_PROJECTION);
                                glLoadIdentity();
                                glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
                                glMatrixMode(GL_MODELVIEW);
                                

                                and

                                m_proj.setToIdentity();
                                m_proj.perspective(45.0f, GLfloat(w) / h, 0.01f, 100.0f);
                                
                                M Offline
                                M Offline
                                makopo
                                wrote on last edited by
                                #25

                                I fixed the issue with calling QWidget::update() in QOpenGLWidget::paintGL(). Now the videostream works.

                                1 Reply Last reply
                                0
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #26

                                  Glad you found a solution and thanks for sharing !

                                  Note that this is a rather unexpected solution has you should not need to do that.

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  M 1 Reply Last reply
                                  0
                                  • SGaistS SGaist

                                    Glad you found a solution and thanks for sharing !

                                    Note that this is a rather unexpected solution has you should not need to do that.

                                    M Offline
                                    M Offline
                                    makopo
                                    wrote on last edited by
                                    #27

                                    @SGaist said in Showing video in GUI does not work (black screen):

                                    Note that this is a rather unexpected solution has you should not need to do that.

                                    That sounds unsatisfactory. In fact signal an slot runs in the same thread.
                                    In another source I found that signal and connect should run in the same thread. In my code these are different.

                                    1 Reply Last reply
                                    0
                                    • SGaistS Offline
                                      SGaistS Offline
                                      SGaist
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #28

                                      Signals and slots are not required to be handled in objects belonging to the same thread.

                                      Interested in AI ? www.idiap.ch
                                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                      1 Reply Last reply
                                      1

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved