Russian Qt Forum
Ноябрь 22, 2024, 05:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с отрисовкой видео  (Прочитано 3085 раз)
Arlekin
Гость
« : Март 25, 2015, 13:09 »

Добрый день.
Я новичок в 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);
    }
}

Подскажите пожалуйста, что может быть причиной рывков?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Март 25, 2015, 22:37 »

Первое что приходит на ум это может где то лочатся мутексы, второе - лочатся буферы. Я конечно дилетант в этой области, но мало ли...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 26, 2015, 07:04 »

А Вы не один и тот же файл читаете? В смысле - не приходится ли перезагружать кадр который Вы "забрали"? И еще: по меньшей мере QOpenGLWidget в 5.4 перерисовывается по очень многим причинам, не надейтесь что каждая перерисовка это "новый кадр". Пример: создайте QOpenGLWidget и QLineEdit в окне так чтобы эти 2 виджета не пересекались. Всякий раз когда каретка мигает - GL перерисовывается. Зачем - хз
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 22.