Добрый день.
Я новичок в Qt и столкнулся со следующей проблемой. Пытаюсь я написать проигрыватель видео файлов. Приложение содержит главное окно (наследник QWidget), в котором создан QGridLayout с несколькими GLWidget. При наличии только одного GLWidget все работает отлично, проигрывание видео плавное. Но если добавить еще хотя бы один, то начинаются рывки в видео. Выглядит это так, как будто видео фреймы переставляются местами.
Код довольно простой. Есть некий код обработки видео, который при наличии видео кадра дергает метод у GLWidget:
void GLWidget::setImage(AVFrame* frame)
{
{
std::lock_guard<std::mutex> lock(m_mutex);
m_frames.push_back(std::shared_ptr<AVFRame>(frame, av_free));
}
update();
}
И довольно простой код отрисовки (код инициализации openGL опущен):
void GLWidget::paintGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
std::shared_ptr<AVFRame> frame;
{
std::lock_guard<std::mutex> lock(m_mutex);
if (!m_frames.empty())
{
frame = m_frames.front();
frames.pop_front();
}
}
if (0 != frame.get())
{
glBindTexture(GL_TEXTURE_2D, ytex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width, frame->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[0]);
glBindTexture(GL_TEXTURE_2D, utex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width / 2, frame->height / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[1]);
glBindTexture(GL_TEXTURE_2D, vtex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width / 2, frame->height / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[2]);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
}
Подскажите пожалуйста, что может быть причиной рывков?