fixed crash when deleting media while it's being processed
This commit is contained in:
+6
-1
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user