diff --git a/io/media.cpp b/io/media.cpp index d3080d911..4e0d17767 100644 --- a/io/media.cpp +++ b/io/media.cpp @@ -1,6 +1,7 @@ #include "media.h" #include +#include "io/previewgenerator.h" extern "C" { #include @@ -8,13 +9,17 @@ extern "C" { #include "project/clip.h" -Media::Media() : ready(false) {} +Media::Media() : ready(false), preview_gen(NULL) {} Media::~Media() { reset(); } void Media::reset() { + if (preview_gen != NULL) { + preview_gen->cancel(); + preview_gen->wait(); + } for (int i=0;iaudio_preview.append(min >> 8); s->audio_preview.append(max >> 8); + if (cancelled) break; } } swr_free(&swr_ctx); av_frame_unref(swr_frame); av_frame_free(&swr_frame); + + if (cancelled) { + end_of_file = true; + break; + } } } @@ -314,4 +321,9 @@ void PreviewGenerator::run() { item->setToolTip(0, QString()); } delete [] filename; + media->preview_gen = NULL; +} + +void PreviewGenerator::cancel() { + cancelled = true; } diff --git a/io/previewgenerator.h b/io/previewgenerator.h index 15b1e805f..f0439a828 100644 --- a/io/previewgenerator.h +++ b/io/previewgenerator.h @@ -18,6 +18,7 @@ class PreviewGenerator : public QThread public: PreviewGenerator(QTreeWidgetItem*, Media*, bool); void run(); + void cancel(); signals: void set_icon(int, bool); private: @@ -30,6 +31,7 @@ private: bool retrieve_duration; bool contains_still_image; bool replace; + bool cancelled; }; #endif // PREVIEWGENERATOR_H diff --git a/panels/project.cpp b/panels/project.cpp index 3def46d78..a2877a62c 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -163,8 +163,8 @@ void Project::start_preview_generator(QTreeWidgetItem* item, Media* media, bool MediaThrobber* throbber = new MediaThrobber(item); PreviewGenerator* pg = new PreviewGenerator(item, media, replacing); + media->preview_gen = pg; connect(pg, SIGNAL(set_icon(int, bool)), throbber, SLOT(stop(int, bool))); - connect(pg, SIGNAL(finished()), pg, SLOT(deleteLater())); pg->start(QThread::LowPriority); } @@ -1209,7 +1209,7 @@ void Project::save_recent_projects() { void Project::clear_recent_projects() { recent_projects.clear(); - save_recent_projects(); + save_recent_projects(); } void Project::add_recent_project(QString url) { diff --git a/panels/project.h b/panels/project.h index d52c089bd..efb2129ac 100644 --- a/panels/project.h +++ b/panels/project.h @@ -93,7 +93,7 @@ private: QString get_file_name_from_path(const QString &path); private slots: void rename_media(QTreeWidgetItem* item, int column); - void clear_recent_projects(); + void clear_recent_projects(); }; class MediaThrobber : public QObject {