Decklink SDK & QtQuick - PullRequest
       52

Decklink SDK & QtQuick

0 голосов
/ 27 мая 2019

Я пытаюсь использовать BlackMagic Decklink SDK для отображения видео с карты Decklink в приложение QtQuick. Мне удалось сделать то же самое с помощью QWidgets, поэтому часть сбора видеопотока работает.

При использовании QWidgets (точнее, QOpenGLWidget), в основном, все, что нам нужно сделать, это создать подкласс QOpenGLWidget и переопределить initializeGL & paintGL следующим образом:

void DeckLinkOpenGLWidget::initializeGL()
{
    if (m_deckLinkScreenPreviewHelper != nullptr)
    {
        m_mutex.lock();
        m_deckLinkScreenPreviewHelper->InitializeGL();
        m_mutex.unlock();
    }
}

void DeckLinkOpenGLWidget::paintGL()
{
    m_mutex.lock();
    glLoadIdentity();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();
}

При выполнении того же в пользовательском рендерере с QtQuick ничего не происходит. Полагаю, мне нужно написать свою программу и шейдеры, но я понятия не имею, что для этого нужно. При использовании шейдера, окрашивающего каждый пиксель в цвет, квадрат этого цвета закрашивается, так что, думаю, я не слишком далеко (но могу ошибаться ...).

Вот код:

void VideoViewRenderer::initializeGL()
{
    QOpenGLFunctions::initializeOpenGLFunctions();

    const char* vertexShaderSource = "#version 330 core\n"
                                     "layout (location = 0) in vec3 aPos;\n"
                                     "void main()\n"
                                     "{\n"
                                     "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
                                     "}\n";

    const char* fragmentShaderSource = "#version 330 core\n"
                                       "out vec4 FragColor;\n"
                                       "void main()\n"
                                       "{\n"
                                       "   FragColor = vec4(0.6f, 0.0f, 0.0f, 1.0f);\n"
                                       "}\n";

    m_program = new QOpenGLShaderProgram();
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
    m_program->link();

    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->InitializeGL();
    m_mutex.unlock();
}

void VideoViewRenderer::paintGL()
{
    m_program->bind();

    glLoadIdentity();
    glClearColor(0.0f, 0.4f, 0.0f, 0.0f);
    glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
    glClear(GL_COLOR_BUFFER_BIT);

    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();

    m_program->release();
}

Как мне обновить мои шейдеры?

1 Ответ

0 голосов
/ 30 мая 2019

Самый простой способ решить эту проблему - визуализировать два треугольника, образующих квадрат на экране вместо точек. Установите для этих треугольников текстуру и динамически измените содержимое буфера текстур с помощью данных с карты Decklink.

Пожалуйста, посмотрите эту ветку для получения дополнительной информации об использовании видеокадров в opengl: Как ввести видео (кадры) в шейдер GLSL

...