From 735a53720b848043bbaf54ef942bfb825247c6ef Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Jul 2018 21:07:16 +0100 Subject: [PATCH] implemented multithreaded importing #85 --- icons/icons.qrc | 1 + icons/throbber.png | Bin 0 -> 25821 bytes io/previewgenerator.cpp | 88 ++++++++++++++++++++++++++++++----- io/previewgenerator.h | 14 +++++- mainwindow.cpp | 3 +- panels/project.cpp | 100 +++++++++++++++------------------------- panels/project.h | 16 +++++++ project/effect.cpp | 6 --- 8 files changed, 146 insertions(+), 82 deletions(-) create mode 100644 icons/throbber.png diff --git a/icons/icons.qrc b/icons/icons.qrc index facafcbdd..3fc0faaf0 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -29,5 +29,6 @@ slip-disabled.png slide.png slide-disabled.png + throbber.png diff --git a/icons/throbber.png b/icons/throbber.png new file mode 100644 index 0000000000000000000000000000000000000000..208c0aecc9b99158713fbdc517ba58833bcbfe83 GIT binary patch literal 25821 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 literal 0 HcmV?d00001 diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 5b808e8aa..2804adced 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -1,7 +1,3 @@ -// -// TODO: Fold this file into a multithreaded "file processor" -// - #include "previewgenerator.h" #include "media.h" @@ -10,6 +6,9 @@ #include #include #include +#include + +#define WAVEFORM_RESOLUTION 64 extern "C" { #include @@ -18,16 +17,46 @@ extern "C" { #include } -PreviewGenerator::PreviewGenerator(QObject* parent) : QThread(parent) { - media = NULL; - fmt_ctx = NULL; +PreviewGenerator::PreviewGenerator(QTreeWidgetItem* i, Media* m) : QThread(0), fmt_ctx(NULL), item(i), media(m) { + connect(this, SIGNAL(finished()), this, SLOT(deleteLater())); } -#define WAVEFORM_RESOLUTION 64 +void PreviewGenerator::parse_media() { + // detect video/audio streams in file + for (int i=0;i<(int)fmt_ctx->nb_streams;i++) { + // Find the decoder for the video stream + if (avcodec_find_decoder(fmt_ctx->streams[i]->codecpar->codec_id) == NULL) { + qDebug() << "[ERROR] Unsupported codec in stream %d.\n"; + } else { + MediaStream* ms = new MediaStream(); + ms->preview_done = false; + ms->file_index = i; + if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + bool infinite_length = (fmt_ctx->streams[i]->avg_frame_rate.den == 0); + ms->video_width = fmt_ctx->streams[i]->codecpar->width; + ms->video_height = fmt_ctx->streams[i]->codecpar->height; + ms->infinite_length = infinite_length; + media->video_tracks.append(ms); + } else if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + ms->audio_channels = fmt_ctx->streams[i]->codecpar->channels; + media->audio_tracks.append(ms); + } + } + } + media->length = fmt_ctx->duration; -void PreviewGenerator::run() { - Q_ASSERT(media != NULL); + media->ready = true; + if (media->video_tracks.size() == 0) { + emit set_icon(ICON_TYPE_AUDIO); + } else { + emit set_icon(ICON_TYPE_VIDEO); + } + + item->setText(1, QString::number(media->length)); +} + +void PreviewGenerator::generate_waveform() { SwsContext* sws_ctx; SwrContext* swr_ctx; AVFrame* temp_frame = av_frame_alloc(); @@ -99,7 +128,7 @@ void PreviewGenerator::run() { s->video_preview = QImage(data, dstW, dstH, linesize[0], QImage::Format_RGB888); - // delete [] data; +// delete [] data; s->preview_done = true; @@ -183,6 +212,41 @@ void PreviewGenerator::run() { } } delete [] codec_ctx; +} - avformat_close_input(&fmt_ctx); +void PreviewGenerator::run() { + Q_ASSERT(media != NULL); + Q_ASSERT(item != NULL); + + QByteArray ba = media->url.toLatin1(); + char* filename = new char[ba.size()+1]; + strcpy(filename, ba.data()); + + bool error = false; + int errCode = avformat_open_input(&fmt_ctx, filename, NULL, NULL); + if(errCode != 0) { + char err[1024]; + av_strerror(errCode, err, 1024); + item->setToolTip(0, "Could not open file - " + QString(err)); + error = true; + } else { + errCode = avformat_find_stream_info(fmt_ctx, NULL); + if (errCode < 0) { + char err[1024]; + av_strerror(errCode, err, 1024); + item->setToolTip(0, "Could not find stream information - " + QString(err)); + error = true; + } else { + av_dump_format(fmt_ctx, 0, filename, 0); + parse_media(); + generate_waveform(); + } + avformat_close_input(&fmt_ctx); + } + if (error) { + emit set_icon(ICON_TYPE_ERROR); + } else { + item->setToolTip(0, QString()); + } + delete [] filename; } diff --git a/io/previewgenerator.h b/io/previewgenerator.h index 35ffc3b5d..293c57614 100644 --- a/io/previewgenerator.h +++ b/io/previewgenerator.h @@ -3,15 +3,27 @@ #include +#define ICON_TYPE_VIDEO 0 +#define ICON_TYPE_AUDIO 1 +#define ICON_TYPE_ERROR 2 + struct Media; struct MediaStream; struct AVFormatContext; +class QTreeWidgetItem; class PreviewGenerator : public QThread { + Q_OBJECT public: - PreviewGenerator(QObject* parent = 0); + PreviewGenerator(QTreeWidgetItem*, Media*); void run(); +signals: + void set_icon(int); +private: + void parse_media(); + void generate_waveform(); + QTreeWidgetItem* item; Media* media; AVFormatContext* fmt_ctx; }; diff --git a/mainwindow.cpp b/mainwindow.cpp index 76bdbe5be..33f303884 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #define OLIVE_FILE_FILTER "Olive Project (*.ove)" @@ -58,7 +59,7 @@ MainWindow::MainWindow(QWidget *parent) : darkPalette.setColor(QPalette::WindowText, Qt::white); darkPalette.setColor(QPalette::Base, QColor(25,25,25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53,53,53)); - darkPalette.setColor(QPalette::ToolTipBase, Qt::white); + darkPalette.setColor(QPalette::ToolTipBase, QColor(25,25,25)); darkPalette.setColor(QPalette::ToolTipText, Qt::white); darkPalette.setColor(QPalette::Text, Qt::white); darkPalette.setColor(QPalette::Button, QColor(53,53,53)); diff --git a/panels/project.cpp b/panels/project.cpp index 6b0705edb..28fe01996 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -111,77 +111,22 @@ void Project::new_sequence(Sequence *s, bool open, QTreeWidgetItem* parent) { } QTreeWidgetItem* Project::import_file(QString file) { - QByteArray ba = file.toLatin1(); - char* filename = new char[ba.size()+1]; - strcpy(filename, ba.data()); - QTreeWidgetItem* item = new_item(); Media* m = new Media(); m->url = file; m->name = file.mid(file.lastIndexOf('/')+1); item->setText(0, m->name); - AVFormatContext* pFormatCtx = NULL; - int errCode = avformat_open_input(&pFormatCtx, filename, NULL, NULL); - if(errCode != 0) { - char err[1024]; - av_strerror(errCode, err, 1024); - qDebug() << "[ERROR] Could not open" << filename << "-" << err; - } else { - errCode = avformat_find_stream_info(pFormatCtx, NULL); - if (errCode < 0) { - char err[1024]; - av_strerror(errCode, err, 1024); - fprintf(stderr, "[ERROR] Could not find stream information. %s\n", err); - } else { - av_dump_format(pFormatCtx, 0, filename, 0); - - // detect video/audio streams in file - for (int i=0;i<(int)pFormatCtx->nb_streams;i++) { - // Find the decoder for the video stream - if (avcodec_find_decoder(pFormatCtx->streams[i]->codecpar->codec_id) == NULL) { - qDebug() << "[ERROR] Unsupported codec in stream %d.\n"; - } else { - MediaStream* ms = new MediaStream(); - ms->preview_done = false; - ms->file_index = i; - if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { - bool infinite_length = (pFormatCtx->streams[i]->avg_frame_rate.den == 0); - ms->video_width = pFormatCtx->streams[i]->codecpar->width; - ms->video_height = pFormatCtx->streams[i]->codecpar->height; - ms->infinite_length = infinite_length; - m->video_tracks.append(ms); - } else if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { - ms->audio_channels = pFormatCtx->streams[i]->codecpar->channels; - m->audio_tracks.append(ms); - } - } - } - m->length = pFormatCtx->duration; - - if (m->video_tracks.size() == 0) { - item->setIcon(0, QIcon(":/icons/audiosource.png")); - } else { - item->setIcon(0, QIcon(":/icons/videosource.png")); - } - item->setText(1, QString::number(m->length)); - - m->ready = true; - - // generate waveform/thumbnail in another thread - PreviewGenerator* pg = new PreviewGenerator(); - pg->fmt_ctx = pFormatCtx; // cleaned up in PG - pg->media = m; - connect(pg, SIGNAL(finished()), pg, SLOT(deleteLater())); - pg->start(QThread::LowPriority); - } - } - set_media_of_tree(item, m); - project_changed = true; + // set up throbber animation + MediaThrobber* throbber = new MediaThrobber(item); + + // generate waveform/thumbnail in another thread + PreviewGenerator* pg = new PreviewGenerator(item, m); + connect(pg, SIGNAL(set_icon(int)), throbber, SLOT(stop(int))); + pg->start(QThread::LowPriority); - delete [] filename; return item; } @@ -377,6 +322,7 @@ void Project::process_file_list(QStringList& files) { ta->add_media(import_file(file)); imported = true; + project_changed = true; } if (imported) { undo_stack.push(ta); @@ -935,3 +881,33 @@ void Project::add_recent_project(QString url) { } save_recent_projects(); } + +#define THROBBER_LIMIT 20 +#define THROBBER_SIZE 50 + +MediaThrobber::MediaThrobber(QTreeWidgetItem* i) : pixmap(":/icons/throbber.png"), item(i), animation(0) { + // set up throbber + animation_update(); + animator.setInterval(20); + connect(&animator, SIGNAL(timeout()), this, SLOT(animation_update())); + animator.start(); +} + +void MediaThrobber::animation_update() { + if (animation == THROBBER_LIMIT) { + animation = 0; + } + item->setIcon(0, QIcon(pixmap.copy(THROBBER_SIZE*animation, 0, THROBBER_SIZE, THROBBER_SIZE))); + animation++; +} + +void MediaThrobber::stop(int icon_type) { + animator.stop(); + switch (icon_type) { + case ICON_TYPE_VIDEO: item->setIcon(0, QIcon(":/icons/videosource.png")); break; + case ICON_TYPE_AUDIO: item->setIcon(0, QIcon(":/icons/audiosource.png")); break; + case ICON_TYPE_ERROR: item->setIcon(0, QIcon::fromTheme("dialog-error")); break; + } + panel_project->source_table->viewport()->update(); + deleteLater(); +} diff --git a/panels/project.h b/panels/project.h index 773f4d23b..07525755c 100644 --- a/panels/project.h +++ b/panels/project.h @@ -3,6 +3,7 @@ #include #include +#include struct Media; struct Sequence; @@ -84,4 +85,19 @@ private slots: void clear_recent_projects(); }; +class MediaThrobber : public QObject { + Q_OBJECT +public: + MediaThrobber(QTreeWidgetItem*); +public slots: + void stop(int); +private slots: + void animation_update(); +private: + QPixmap pixmap; + int animation; + QTreeWidgetItem* item; + QTimer animator; +}; + #endif // PROJECT_H diff --git a/project/effect.cpp b/project/effect.cpp index bec57d341..dd8575f8e 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -35,11 +35,5 @@ bool Effect::is_enabled() { Effect* Effect::copy(Clip*) {return NULL;} void Effect::load(QXmlStreamReader*) {} void Effect::save(QXmlStreamWriter*) {} -/*void Effect::import_values(float* val, int count) { - qDebug() << "[ERROR] import_values MUST be overridden"; -} -void Effect::export_values(float* val, int* count) { - qDebug() << "[ERROR] export_values MUST be overridden"; -}*/ void Effect::process_gl(int*, int*) {} void Effect::process_audio(uint8_t*, int) {}