Qt: отображение JPEG средствами QPixmap (течёт память)

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Qt: отображение JPEG средствами QPixmap

Сообщение IMB »

Доброго дня!
Приложение отображение JPEG с ip-камеры в Qlabel с помощью Qpixmap. Параметры потока: разрешение 800х600, размер кадра 30000 байт, 18 fps.
Наблюдая за потреблением памяти во время работы приложения создаётся впечатление, что QPixmap запоминает все полученные кадры, так как по завершению приложения потребление памяти нормализуется. При длительной работе приложение завершается с сообщением Killed, valgrind ничего не выявил.
Функция отображения кадра:

Код: Выделить всё

QByteArray jpg;
QPixmap pixmap;

jpg.truncate(0);
jpg.reserve(frame_size);
//заполнение jpg данными

void Image::view_image()
{
    if (pixmap.loadFromData(jpg)) {
        setFixedSize(frame_width + 10, frame_height + 10);
        ui->image->resize(frame_width, frame_height);
        ui->image->setPixmap(pixmap);
    } else
        setWindowTitle(QString(tr("can't load image")));
    show();
    if (cur_status != IMAGE_STOP_DATA) {
        cur_status = IMAGE_WAIT_HEADER;
        emit next_frame(true); //запрос следующего кадра
    }
}

Отсюда возникает несколько вопросов:
- QPixmap запоминает все предыдущие кадры, как то это сомнительно
- если действительно запоминает, то как лучше его очищать, так как в документации нашёл только scaled возвращающий копию?
- возможно QPixmap не лучший выбор для этой задачи, что посоветуете?
Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: отображение JPEG средствами QPixmap

Сообщение NickLion »

Хм. Сделал рафинированный вариант без изысков: на всю форму одна QLabel label. Код:
MainWindow.h

Код: Выделить всё

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_tmr_timeout();

private:
    Ui::MainWindow *ui;
    QTimer* tmr;

    QByteArray ba;
    QPixmap pixmap;
};

#endif // MAINWINDOW_H


MainWindow.cpp

Код: Выделить всё

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <stdint.h>

#include <QTimer>
#include <QPixmap>
#include <QImage>
#include <QBuffer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tmr = new QTimer();
    tmr->setInterval( 1000 / 18 );
    connect( tmr, SIGNAL(timeout()), SLOT(on_tmr_timeout()) );
    tmr->start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_tmr_timeout()
{
    const int w = 800;
    const int h = 600;
    QImage tmp( w, h, QImage::Format_ARGB32 );
    uint32_t* data = (uint32_t*)tmp.bits();
    for( int i = 0; i < w * h; i++ ) {
        data[i] = rand() | 0xff000000;
    }
    ba.truncate(0);
    QBuffer buf( &ba );
    buf.open( QBuffer::ReadWrite );
    tmp.save( &buf, "JPEG", 70 );
    //buf.close();
    pixmap.loadFromData( ba );
    ui->label->setPixmap( pixmap );
}

приложение не жрёт - память пляшет 7.4 - 10.5 Мб. А вот Xorg процесс через непродолжительное время отожрал больше 3Г (услышал, что свопиться начало). Закрыл приложение - Xorg через время отдал ресурсы. Какая-то бредятина :)
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Qt: отображение JPEG средствами QPixmap

Сообщение eddy »

А почему не пользуетесь openGL? Это же и проще, и шустрее.

Или у вас только малюсенькие картинки?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: отображение JPEG средствами QPixmap

Сообщение IMB »

NickLion писал(а):
15.07.2011 23:55
приложение не жрёт - память пляшет 7.4 - 10.5 Мб.

А Вы как следили за памятью? Я проверял два варианта - top и free. По top всё хорошо, потребление памяти не превышает 1.5%, если запускаю free, через watch для динамического наблюдения, виден очень быстрый расход. При моём 1GB RAM я могу просмотреть только 1500-1550 кадров.
eddy писал(а):
15.07.2011 23:57
А почему не пользуетесь openGL? Это же и проще, и шустрее.

Или у вас только малюсенькие картинки?

Это тестовое приложение, да и мой дебют, так что пока идёт небольшая картинка. Но предполагается просмотр с 5 мегапиксельных матриц, можно ли назвать это маленькими картинками?
А OpenGL посмотрю.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: отображение JPEG средствами QPixmap

Сообщение NickLion »

IMB писал(а):
16.07.2011 11:37
NickLion писал(а):
15.07.2011 23:55
приложение не жрёт - память пляшет 7.4 - 10.5 Мб.

А Вы как следили за памятью? Я проверял два варианта - top и free. По top всё хорошо, потребление памяти не превышает 1.5%, если запускаю free, через watch для динамического наблюдения, виден очень быстрый расход. При моём 1GB RAM я могу просмотреть только 1500-1550 кадров.

KDE'шный монитор ;) Может не труЪшно, но работает. Похоже у Вас та же ситуация. Посмотрите в top на процесс Xorg (да просто отсортируйте по памяти). Похоже, что жрёт память именно он, а не приложение.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Qt: отображение JPEG средствами QPixmap

Сообщение eddy »

IMB писал(а):
16.07.2011 11:37
Но предполагается просмотр с 5 мегапиксельных матриц, можно ли назвать это маленькими картинками?

Тогда лучше сразу openGL используйте, если тормозов не хотите.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt: отображение JPEG средствами QPixmap

Сообщение NickLion »

eddy писал(а):
17.07.2011 11:38
IMB писал(а):
16.07.2011 11:37
Но предполагается просмотр с 5 мегапиксельных матриц, можно ли назвать это маленькими картинками?

Тогда лучше сразу openGL используйте, если тормозов не хотите.

Ну да, это лучше будет. Но вопрос - почему течёт память в Xorg? Вот этому пока объяснения не вижу.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Qt: отображение JPEG средствами QPixmap

Сообщение eddy »

NickLion писал(а):
17.07.2011 11:57
почему течёт память в Xorg?

А с чего вы взяли, что это в иксах память течет, а не в дырявых кутях?

Хотя, кстати, насколько я помню, самые свежие иксы находятся еще в разработке, но если пользоваться арчем и установить их, то такие течи проявляются постоянно.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: отображение JPEG средствами QPixmap

Сообщение IMB »

NickLion писал(а):
16.07.2011 23:42
Посмотрите в top на процесс Xorg (да просто отсортируйте по памяти). Похоже, что жрёт память именно он, а не приложение.

В понедельник проверю, но скорее всего Вы правы, так как наткнулся на информацию http://www.prog.org.ru/index.php?topic=188...26807#msg126807
QPixmap хранится на стороне сервера, а QImage на стороне клиента
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Qt: отображение JPEG средствами QPixmap

Сообщение IMB »

Да. память потребляет Xorg 7.3, попробую перейти на OpenGL.
Спасибо сказали: