fixed crash with missing media
This commit is contained in:
+12
-5
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-7
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<QTreeWidgetItem*> items, QList<QTreeWidgetItem*>& list, int type);
|
||||
void start_preview_generator(QTreeWidgetItem* item, Media* media);
|
||||
private slots:
|
||||
void rename_media(QTreeWidgetItem* item, int column);
|
||||
void clear_recent_projects();
|
||||
|
||||
Reference in New Issue
Block a user