fixed opengl context corruption when docking/undocking viewer

This commit is contained in:
itsmattkc
2018-08-31 15:11:32 +10:00
parent f12678aac4
commit 24c3ff647c
13 changed files with 104 additions and 90 deletions
+2 -4
View File
@@ -416,13 +416,11 @@ void cache_clip_worker(Clip* clip, long playhead, bool write_A, bool write_B, bo
void close_clip_worker(Clip* clip) {
// closes ffmpeg file handle and frees any memory used for caching
MediaStream* ms = static_cast<Media*>(clip->media)->get_stream_from_file_index(clip->track < 0, clip->media_stream);
if (clip->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
if (clip->track < 0) {
sws_freeContext(clip->sws_ctx);
delete [] clip->comp_frame;
delete clip->fbo;
clip->fbo = NULL;
} else if (clip->stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
} else {
swr_free(&clip->swr_ctx);
}
+52 -28
View File
@@ -22,27 +22,32 @@ extern "C" {
#include <QOpenGLTexture>
#include <QDebug>
#include <QOpenGLPixelTransferOptions>
#include <QOpenGLFramebufferObject>
bool texture_failed = false;
void open_clip(Clip* clip, bool multithreaded) {
if (multithreaded) {
if (clip->open_lock.tryLock()) {
clip->multithreaded = true;
if (clip->media_type == MEDIA_TYPE_FOOTAGE) {
if (multithreaded) {
if (clip->open_lock.tryLock()) {
clip->multithreaded = true;
// maybe keep cacher instance in memory while clip exists for performance?
clip->cacher = new Cacher(clip);
QObject::connect(clip->cacher, SIGNAL(finished()), clip->cacher, SLOT(deleteLater()));
// maybe keep cacher instance in memory while clip exists for performance?
clip->cacher = new Cacher(clip);
QObject::connect(clip->cacher, SIGNAL(finished()), clip->cacher, SLOT(deleteLater()));
clip->cacher->start(QThread::LowPriority);
}
} else {
clip->multithreaded = false;
clip->finished_opening = false;
clip->open = true;
clip->cacher->start(QThread::LowPriority);
}
} else {
clip->multithreaded = false;
clip->finished_opening = false;
clip->open = true;
open_clip_worker(clip);
}
open_clip_worker(clip);
}
} else if (clip->media_type == MEDIA_TYPE_SEQUENCE) {
clip->open = true;
}
}
void close_clip(Clip* clip) {
@@ -52,11 +57,21 @@ void close_clip(Clip* clip) {
clip->texture = NULL;
}
if (clip->multithreaded) {
clip->cacher->caching = false;
clip->can_cache.wakeAll();
} else {
close_clip_worker(clip);
if (clip->fbo != NULL) {
delete clip->fbo;
clip->fbo = NULL;
}
if (clip->media_type == MEDIA_TYPE_FOOTAGE) {
if (clip->multithreaded) {
clip->cacher->caching = false;
clip->can_cache.wakeAll();
} else {
close_clip_worker(clip);
}
} else if (clip->media_type == MEDIA_TYPE_SEQUENCE) {
closeActiveClips(static_cast<Sequence*>(clip->media), false);
clip->open = false;
}
}
@@ -270,17 +285,26 @@ bool is_clip_active(Clip* c, long playhead) {
}
void set_sequence(Sequence* s) {
if (sequence != NULL) {
// clean up - close all open clips
for (int i=0;i<sequence->clip_count();i++) {
Clip* c = sequence->get_clip(i);
if (c != NULL && c->open) {
close_clip(c);
}
}
}
closeActiveClips(sequence, true);
sequence = s;
panel_timeline->update_sequence();
panel_viewer->update_sequence();
panel_timeline->setFocus();
}
void closeActiveClips(Sequence *s, bool wait) {
if (s != NULL) {
for (int i=0;i<s->clip_count();i++) {
Clip* c = s->get_clip(i);
if (c != NULL) {
if (c->media_type == MEDIA_TYPE_SEQUENCE) {
closeActiveClips(static_cast<Sequence*>(c->media), wait);
close_clip(c);
} else if (c->media_type == MEDIA_TYPE_FOOTAGE && c->open) {
close_clip(c);
if (c->multithreaded && wait) c->cacher->wait();
}
}
}
}
}
+1
View File
@@ -27,6 +27,7 @@ void retrieve_next_frame_raw_data(Clip* c, AVFrame* output);
bool is_clip_active(Clip* c, long playhead);
void get_next_audio(Clip* c, bool mix);
void set_sequence(Sequence* s);
void closeActiveClips(Sequence* s, bool wait);
struct ClipCacheData {
Clip& clip;