From a14c24ad272b3b58bf596975485149c5317f01ee Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 19 Jul 2018 20:44:52 +0100 Subject: [PATCH] fixed crash with missing media --- io/previewgenerator.cpp | 17 ++++++++++++----- panels/project.cpp | 20 +++++++++++++------- panels/project.h | 1 + 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 7cd068b5a..9f9899e30 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -28,21 +28,28 @@ void PreviewGenerator::parse_media() { 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; + MediaStream* ms = media->get_stream_from_file_index(i); + bool append = false; + if (ms == NULL) { + ms = new MediaStream(); + ms->preview_done = false; + ms->file_index = i; + append = true; + } 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->video_frame_rate = (infinite_length) ? 0 : av_q2d(fmt_ctx->streams[i]->avg_frame_rate); ms->infinite_length = infinite_length; - media->video_tracks.append(ms); + if (append) 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; ms->audio_layout = fmt_ctx->streams[i]->codecpar->channel_layout; ms->audio_frequency = fmt_ctx->streams[i]->codecpar->sample_rate; - media->audio_tracks.append(ms); + if (append) media->audio_tracks.append(ms); + } else { + delete ms; } } } diff --git a/panels/project.cpp b/panels/project.cpp index 7aaa074a4..e184e48d6 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -122,6 +122,16 @@ void Project::new_sequence(TimelineAction *ta, Sequence *s, bool open, QTreeWidg project_changed = true; } +void Project::start_preview_generator(QTreeWidgetItem* item, Media* media) { + // set up throbber animation + MediaThrobber* throbber = new MediaThrobber(item); + + PreviewGenerator* pg = new PreviewGenerator(item, media); + connect(pg, SIGNAL(set_icon(int)), throbber, SLOT(stop(int))); + connect(pg, SIGNAL(finished()), pg, SLOT(deleteLater())); + pg->start(QThread::LowPriority); +} + QTreeWidgetItem* Project::import_file(QString file) { QTreeWidgetItem* item = new_item(); Media* m = new Media(); @@ -129,13 +139,8 @@ QTreeWidgetItem* Project::import_file(QString file) { m->name = file.mid(file.lastIndexOf('/')+1); set_media_of_tree(item, m); - // 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); + start_preview_generator(item, m); return item; } @@ -541,7 +546,8 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) { find_loaded_folder_by_id(folder)->addChild(item); } - m->ready = true; + // analyze media to see if it's the same + start_preview_generator(item, m); loaded_media.append(m); } diff --git a/panels/project.h b/panels/project.h index 8b7231d3f..7b4e86b0d 100644 --- a/panels/project.h +++ b/panels/project.h @@ -82,6 +82,7 @@ private: QTreeWidgetItem* find_loaded_folder_by_id(int id); void add_recent_project(QString url); void get_media_from_table(QList items, QList& list, int type); + void start_preview_generator(QTreeWidgetItem* item, Media* media); private slots: void rename_media(QTreeWidgetItem* item, int column); void clear_recent_projects();