fixed crash when deleting media while it's being processed

This commit is contained in:
itsmattkc
2018-10-11 09:48:40 +11:00
parent 275cf5e92b
commit 7612a7646e
6 changed files with 28 additions and 6 deletions
+6 -1
View File
@@ -1,6 +1,7 @@
#include "media.h"
#include <QDebug>
#include "io/previewgenerator.h"
extern "C" {
#include <libavformat/avformat.h>
@@ -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;i<video_tracks.size();i++) {
delete video_tracks.at(i);
}
+3
View File
@@ -20,6 +20,7 @@
struct Sequence;
struct Clip;
class PreviewGenerator;
struct MediaStream {
int file_index;
@@ -50,6 +51,8 @@ struct Media {
int save_id;
bool ready;
PreviewGenerator* preview_gen;
long get_length_in_frames(double frame_rate);
MediaStream* get_stream_from_file_index(bool video, int index);
void reset();
+14 -2
View File
@@ -26,9 +26,10 @@ PreviewGenerator::PreviewGenerator(QTreeWidgetItem* i, Media* m, bool r) :
media(m),
retrieve_duration(false),
contains_still_image(false),
replace(r)
replace(r),
cancelled(false)
{
connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
}
void PreviewGenerator::parse_media() {
@@ -227,12 +228,18 @@ void PreviewGenerator::generate_waveform() {
}
s->audio_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;
}
+2
View File
@@ -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
+2 -2
View File
@@ -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) {
+1 -1
View File
@@ -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 {