diff --git a/io/media.cpp b/io/media.cpp index 5cf47ffd0..f9cc4d8bc 100644 --- a/io/media.cpp +++ b/io/media.cpp @@ -10,7 +10,7 @@ extern "C" { #include "project/clip.h" -Media::Media() : ready(false), preview_gen(NULL) { +Media::Media() : ready(false), preview_gen(NULL), invalid(false) { ready_lock.lock(); } diff --git a/io/media.h b/io/media.h index c746bc217..9d1312f06 100644 --- a/io/media.h +++ b/io/media.h @@ -52,6 +52,7 @@ struct Media { QVector audio_tracks; int save_id; bool ready; + bool invalid; PreviewGenerator* preview_gen; QMutex ready_lock; diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index c0838ac10..7b8934fdd 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -400,7 +400,7 @@ QString PreviewGenerator::get_waveform_path(const QString& hash, MediaStream* ms void PreviewGenerator::run() { Q_ASSERT(media != NULL); - Q_ASSERT(item != NULL); + Q_ASSERT(item != NULL); QByteArray ba = media->url.toLatin1(); char* filename = new char[ba.size()+1]; @@ -457,6 +457,7 @@ void PreviewGenerator::run() { if (error) { update_footage_tooltip(item, media, errorStr); emit set_icon(ICON_TYPE_ERROR, replace); + media->invalid = true; media->ready_lock.unlock(); } else { update_footage_tooltip(item, media); diff --git a/project/effect.cpp b/project/effect.cpp index 166b8575e..73c661167 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -482,7 +482,7 @@ int Effect::gizmo_count(){ void Effect::refresh() {} void Effect::field_changed() { - panel_sequence_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->update(); } void Effect::show_context_menu(const QPoint& pos) { @@ -557,24 +557,24 @@ void Effect::set_enabled(bool b) { QVariant load_data_from_string(int type, const QString& string) { switch (type) { - case EFFECT_FIELD_DOUBLE: return string.toDouble(); break; - case EFFECT_FIELD_COLOR: return QColor(string); break; - case EFFECT_FIELD_STRING: return string; break; - case EFFECT_FIELD_BOOL: return (string == "1"); break; - case EFFECT_FIELD_COMBO: return string.toInt(); break; - case EFFECT_FIELD_FONT: return string; break; + case EFFECT_FIELD_DOUBLE: return string.toDouble(); + case EFFECT_FIELD_COLOR: return QColor(string); + case EFFECT_FIELD_STRING: return string; + case EFFECT_FIELD_BOOL: return (string == "1"); + case EFFECT_FIELD_COMBO: return string.toInt(); + case EFFECT_FIELD_FONT: return string; } return QVariant(); } QString save_data_to_string(int type, const QVariant& data) { switch (type) { - case EFFECT_FIELD_DOUBLE: return QString::number(data.toDouble()); break; - case EFFECT_FIELD_COLOR: return data.value().name(); break; - case EFFECT_FIELD_STRING: return data.toString(); break; - case EFFECT_FIELD_BOOL: return QString::number(data.toBool()); break; - case EFFECT_FIELD_COMBO: return QString::number(data.toInt()); break; - case EFFECT_FIELD_FONT: return data.toString(); break; + case EFFECT_FIELD_DOUBLE: return QString::number(data.toDouble()); + case EFFECT_FIELD_COLOR: return data.value().name(); + case EFFECT_FIELD_STRING: return data.toString(); + case EFFECT_FIELD_BOOL: return QString::number(data.toBool()); + case EFFECT_FIELD_COMBO: return QString::number(data.toInt()); + case EFFECT_FIELD_FONT: return data.toString(); } return QString(); } diff --git a/project/effectfield.cpp b/project/effectfield.cpp index 18ba9fd61..d2166a835 100644 --- a/project/effectfield.cpp +++ b/project/effectfield.cpp @@ -72,12 +72,12 @@ EffectField::EffectField(EffectRow *parent, int t, const QString &i) : QVariant EffectField::get_previous_data() { switch (type) { - case EFFECT_FIELD_DOUBLE: return static_cast(ui_element)->getPreviousValue(); break; - case EFFECT_FIELD_COLOR: return static_cast(ui_element)->getPreviousValue(); break; - case EFFECT_FIELD_STRING: return static_cast(ui_element)->getPreviousValue(); break; - case EFFECT_FIELD_BOOL: return !static_cast(ui_element)->isChecked(); break; - case EFFECT_FIELD_COMBO: return static_cast(ui_element)->getPreviousIndex(); break; - case EFFECT_FIELD_FONT: return static_cast(ui_element)->getPreviousValue(); break; + case EFFECT_FIELD_DOUBLE: return static_cast(ui_element)->getPreviousValue(); + case EFFECT_FIELD_COLOR: return static_cast(ui_element)->getPreviousValue(); + case EFFECT_FIELD_STRING: return static_cast(ui_element)->getPreviousValue(); + case EFFECT_FIELD_BOOL: return !static_cast(ui_element)->isChecked(); + case EFFECT_FIELD_COMBO: return static_cast(ui_element)->getPreviousIndex(); + case EFFECT_FIELD_FONT: return static_cast(ui_element)->getPreviousValue(); } return QVariant(); } @@ -141,8 +141,6 @@ void EffectField::get_keyframe_data(double timecode, int &before, int &after, do after = after_keyframe_index; progress = (timecode-frameToTimecode(before_keyframe_time))/(frameToTimecode(after_keyframe_time)-frameToTimecode(before_keyframe_time)); - - // TODO routines for bezier - currently this is purely linear } else if (before_keyframe_index > -1) { before = before_keyframe_index; after = before_keyframe_index; @@ -165,8 +163,7 @@ QVariant EffectField::validate_keyframe_data(double timecode, bool async) { int kf_type = (progress < 0.5) ? parent_row->keyframe_types.at(before_keyframe) : parent_row->keyframe_types.at(after_keyframe); if (kf_type == KEYFRAME_TYPE_SMOOTH) { - double steepness = 8.0; - double x = (steepness * progress) - (steepness * 0.5); + double x = (8.0 * progress) - 4.0; progress = 1.0 / (1.0 + qPow(M_E, -x)); progress *= 1.0373; progress -= 0.01865; @@ -241,6 +238,7 @@ void EffectField::ui_element_change() { if (!dragging_double) ca = new ComboAction(); make_key_from_change(ca); if (!dragging_double) undo_stack.push(ca); + emit changed(); } void EffectField::make_key_from_change(ComboAction* ca) { diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index 5ba470fbe..ab0158f74 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -135,7 +135,7 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent*) { if (drag_proc) { drag_proc = false; previous_value = drag_start_value; - emit valueChanged(); + emit valueChanged(); } else { double d = internal_value; if (display_type == LABELSLIDER_FRAMENUMBER) { diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 241318f3f..bd97c86f9 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -1,4 +1,4 @@ -#include "viewerwidget.h" +#include "viewerwidget.h" #include "panels/panels.h" #include "panels/viewer.h" @@ -351,6 +351,7 @@ void ViewerWidget::process_effect(Clip* c, Effect* e, double timecode, GLTexture if (e->enable_superimpose) { GLuint superimpose_texture = e->process_superimpose(timecode); if (superimpose_texture == 0) { + dout << "[WARNING] Superimpose texture was NULL, retrying..."; texture_failed = true; } else { composite_texture = draw_clip(c->fbo[!fbo_switcher], superimpose_texture, false); @@ -398,22 +399,25 @@ GLuint ViewerWidget::compose_sequence(QVector& nests, bool render_audio) case MEDIA_TYPE_FOOTAGE: { Media* m = static_cast(c->media); - if (m->ready) { - MediaStream* ms = m->get_stream_from_file_index(c->track < 0, c->media_stream); - if (ms != NULL && is_clip_active(c, playhead)) { - // if thread is already working, we don't want to touch this, - // but we also don't want to hang the UI thread - if (!c->open) { - open_clip(c, !rendering); - } - clip_is_active = true; - if (c->track >= 0) audio_track_count++; - } else if (c->open) { - close_clip(c); - } - } else { - texture_failed = true; - } + if (!m->invalid) { + if (m->ready) { + MediaStream* ms = m->get_stream_from_file_index(c->track < 0, c->media_stream); + if (ms != NULL && is_clip_active(c, playhead)) { + // if thread is already working, we don't want to touch this, + // but we also don't want to hang the UI thread + if (!c->open) { + open_clip(c, !rendering); + } + clip_is_active = true; + if (c->track >= 0) audio_track_count++; + } else if (c->open) { + close_clip(c); + } + } else { + dout << "[WARNING] Media was not ready, retrying..."; + texture_failed = true; + } + } } break; case MEDIA_TYPE_SEQUENCE: