From 35f699e02e6c9aea7ddac23644ccd2017bca8a4f Mon Sep 17 00:00:00 2001 From: alcomposer Date: Sat, 24 Nov 2018 01:11:58 +1030 Subject: [PATCH 1/4] Add Timecode Display effect --- effects/internal/timecodeeffect.cpp | 108 ++++++++ effects/internal/timecodeeffect.h | 29 +++ olive.pro | 380 ++++++++++++++-------------- project/effect.cpp | 7 + project/effect.h | 5 +- 5 files changed, 339 insertions(+), 190 deletions(-) create mode 100644 effects/internal/timecodeeffect.cpp create mode 100644 effects/internal/timecodeeffect.h diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp new file mode 100644 index 000000000..97aaeb192 --- /dev/null +++ b/effects/internal/timecodeeffect.cpp @@ -0,0 +1,108 @@ +#include "timecodeeffect.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ui/labelslider.h" +#include "ui/collapsiblewidget.h" +#include "project/clip.h" +#include "project/sequence.h" +#include "panels/viewer.h" +#include "ui/comboboxex.h" +#include "ui/colorbutton.h" +#include "ui/fontcombobox.h" +#include "io/config.h" + +TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : + Effect(c, em) +{ + enable_always_update = true; + enable_superimpose = true; + + scale_val = add_row("Scale:")->add_field(EFFECT_FIELD_DOUBLE, 2); + scale_val->set_double_minimum_value(1); + scale_val->set_double_default_value(100); + scale_val->set_double_maximum_value(1000); + scale_val->id = "scale"; + + color_val = add_row("Color:")->add_field(EFFECT_FIELD_COLOR, 2); + color_val->set_color_value(Qt::white); + color_val->id = "color"; + + color_bg_val = add_row("Background Color:")->add_field(EFFECT_FIELD_COLOR, 2); + color_bg_val->set_color_value(Qt::black); + color_bg_val->id = "bgcolor"; + + bg_alpha = add_row("Background Opacity:")->add_field(EFFECT_FIELD_DOUBLE, 2); + bg_alpha->set_double_minimum_value(0); + bg_alpha->set_double_maximum_value(100); + bg_alpha->set_double_default_value(50); + + EffectRow* offset = add_row("Offset XY:"); + offset_x_val = offset->add_field(EFFECT_FIELD_DOUBLE); + offset_x_val->id = "offsetx"; + offset_y_val = offset->add_field(EFFECT_FIELD_DOUBLE); + offset_y_val->id = "offsety"; + + prepend_text = add_row("Prepend:")->add_field(EFFECT_FIELD_STRING, 2); + prepend_text->id = "prepend"; + + connect(scale_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(color_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(color_bg_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(bg_alpha, SIGNAL(changed()), this, SLOT(field_changed())); + connect(offset_x_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(offset_y_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(prepend_text, SIGNAL(changed()), this, SLOT(field_changed())); +} + + +void TimecodeEffect::redraw(double timecode) { + sequence_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate); + img.fill(Qt::transparent); + + QPainter p(&img); + p.setRenderHint(QPainter::Antialiasing); + int width = img.width(); + int height = img.height(); + + // set font + font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias); + font.setFamily("Helvetica"); + font.setPixelSize(int(scale_val->get_double_value(timecode)*.01*(height/10))); + p.setFont(font); + QFontMetrics fm(font); + + QPainterPath path; + + int text_x, text_y, rect_y, offset_x, offset_y; + int text_height = fm.height(); + int text_width = fm.width(sequence_timecode); + QColor background_color = color_bg_val->get_color_value(timecode); + int alpha_val = bg_alpha->get_double_value(timecode)*.01*255; + background_color.setAlpha(alpha_val); + + offset_x = int(offset_x_val->get_double_value(timecode)); + offset_y = int(offset_y_val->get_double_value(timecode)); + + text_x = offset_x + (width/2) - (text_width/2); + text_y = offset_y + height - height/10;//fm.descent(); + rect_y = text_y + fm.descent()/2 - text_height; + + path.addText(text_x, text_y, font, sequence_timecode); + + p.setPen(Qt::NoPen); + p.setBrush(background_color); + p.drawRect(QRect(text_x-fm.descent()/2, rect_y, text_width+fm.descent(), text_height)); + p.setBrush(color_val->get_color_value(timecode)); + p.drawPath(path); +} diff --git a/effects/internal/timecodeeffect.h b/effects/internal/timecodeeffect.h new file mode 100644 index 000000000..a7843d2f9 --- /dev/null +++ b/effects/internal/timecodeeffect.h @@ -0,0 +1,29 @@ +#ifndef TIMECODEEFFECT_H +#define TIMECODEEFFECT_H + +#include "project/effect.h" + +#include +#include +class QOpenGLTexture; + +class TimecodeEffect : public Effect { + Q_OBJECT +public: + TimecodeEffect(Clip* c, const EffectMeta *em); + void redraw(double timecode); + EffectField * scale_val; + EffectField * color_val; + EffectField * color_bg_val; + EffectField * bg_alpha; + EffectField * offset_x_val; + EffectField * offset_y_val; + EffectField * prepend_text; + + +private: + QFont font; + QString sequence_timecode; +}; + +#endif // TIMECODEEFFECT_H diff --git a/olive.pro b/olive.pro index 4e45e4ea8..647201d48 100644 --- a/olive.pro +++ b/olive.pro @@ -1,189 +1,191 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-05-11T10:31:59 -# -#------------------------------------------------- - -QT += core gui multimedia opengl - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -TARGET = Olive -TEMPLATE = app - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - panels/project.cpp \ - panels/effectcontrols.cpp \ - panels/viewer.cpp \ - panels/timeline.cpp \ - ui/sourcetable.cpp \ - dialogs/aboutdialog.cpp \ - ui/timelinewidget.cpp \ - io/media.cpp \ - project/sequence.cpp \ - project/clip.cpp \ - playback/playback.cpp \ - playback/audio.cpp \ - io/config.cpp \ - dialogs/newsequencedialog.cpp \ - ui/viewerwidget.cpp \ - ui/viewercontainer.cpp \ - dialogs/exportdialog.cpp \ - ui/collapsiblewidget.cpp \ - panels/panels.cpp \ - playback/cacher.cpp \ - io/exportthread.cpp \ - ui/timelineheader.cpp \ - io/previewgenerator.cpp \ - ui/labelslider.cpp \ - dialogs/preferencesdialog.cpp \ - ui/audiomonitor.cpp \ - project/undo.cpp \ - ui/scrollarea.cpp \ - ui/comboboxex.cpp \ - ui/colorbutton.cpp \ - dialogs/replaceclipmediadialog.cpp \ - ui/fontcombobox.cpp \ - ui/checkboxex.cpp \ - ui/keyframeview.cpp \ - ui/texteditex.cpp \ - dialogs/demonotice.cpp \ - project/marker.cpp \ - dialogs/speeddialog.cpp \ - dialogs/mediapropertiesdialog.cpp \ - io/crc32.cpp \ - dialogs/loaddialog.cpp \ - debug.cpp \ - io/path.cpp \ - effects/internal/linearfadetransition.cpp \ - effects/internal/transformeffect.cpp \ - effects/internal/solideffect.cpp \ - effects/internal/texteffect.cpp \ - effects/internal/audionoiseeffect.cpp \ - effects/internal/paneffect.cpp \ - effects/internal/toneeffect.cpp \ - effects/internal/volumeeffect.cpp \ - effects/internal/crossdissolvetransition.cpp \ - effects/internal/shakeeffect.cpp \ - effects/internal/exponentialfadetransition.cpp \ - effects/internal/logarithmicfadetransition.cpp \ - effects/internal/cornerpineffect.cpp \ - io/math.cpp \ - io/qpainterwrapper.cpp \ - project/effect.cpp \ - project/transition.cpp \ - project/effectrow.cpp \ - project/effectfield.cpp \ - effects/internal/cubetransition.cpp - -HEADERS += \ - mainwindow.h \ - panels/project.h \ - panels/effectcontrols.h \ - panels/viewer.h \ - panels/timeline.h \ - ui/sourcetable.h \ - dialogs/aboutdialog.h \ - ui/timelinewidget.h \ - io/media.h \ - project/sequence.h \ - project/clip.h \ - playback/playback.h \ - playback/audio.h \ - io/config.h \ - dialogs/newsequencedialog.h \ - ui/viewerwidget.h \ - ui/viewercontainer.h \ - dialogs/exportdialog.h \ - ui/collapsiblewidget.h \ - panels/panels.h \ - playback/cacher.h \ - io/exportthread.h \ - ui/timelinetools.h \ - ui/timelineheader.h \ - io/previewgenerator.h \ - ui/labelslider.h \ - dialogs/preferencesdialog.h \ - ui/audiomonitor.h \ - project/undo.h \ - ui/scrollarea.h \ - ui/comboboxex.h \ - ui/colorbutton.h \ - dialogs/replaceclipmediadialog.h \ - ui/fontcombobox.h \ - ui/checkboxex.h \ - ui/keyframeview.h \ - ui/texteditex.h \ - dialogs/demonotice.h \ - project/marker.h \ - project/selection.h \ - dialogs/speeddialog.h \ - dialogs/mediapropertiesdialog.h \ - io/crc32.h \ - dialogs/loaddialog.h \ - debug.h \ - io/path.h \ - effects/internal/transformeffect.h \ - effects/internal/solideffect.h \ - effects/internal/texteffect.h \ - effects/internal/audionoiseeffect.h \ - effects/internal/paneffect.h \ - effects/internal/toneeffect.h \ - effects/internal/volumeeffect.h \ - effects/internal/shakeeffect.h \ - effects/internal/linearfadetransition.h \ - effects/internal/crossdissolvetransition.h \ - effects/internal/exponentialfadetransition.h \ - effects/internal/logarithmicfadetransition.h \ - effects/internal/cornerpineffect.h \ - io/math.h \ - io/qpainterwrapper.h \ - project/effect.h \ - project/transition.h \ - project/effectrow.h \ - project/effectfield.h \ - effects/internal/cubetransition.h - -FORMS += \ - mainwindow.ui \ - panels/project.ui \ - panels/effectcontrols.ui \ - panels/viewer.ui \ - panels/timeline.ui \ - dialogs/aboutdialog.ui \ - dialogs/newsequencedialog.ui \ - dialogs/exportdialog.ui \ - dialogs/preferencesdialog.ui \ - dialogs/demonotice.ui - -win32 { - RC_FILE = icons/resources.rc - LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -} - -mac { - LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample - ICON = icons/olive.icns - INCLUDEPATH = /usr/local/include -} - -linux { - LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -} - -RESOURCES += \ - icons/icons.qrc +#------------------------------------------------- +# +# Project created by QtCreator 2018-05-11T10:31:59 +# +#------------------------------------------------- + +QT += core gui multimedia opengl + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = Olive +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + panels/project.cpp \ + panels/effectcontrols.cpp \ + panels/viewer.cpp \ + panels/timeline.cpp \ + ui/sourcetable.cpp \ + dialogs/aboutdialog.cpp \ + ui/timelinewidget.cpp \ + io/media.cpp \ + project/sequence.cpp \ + project/clip.cpp \ + playback/playback.cpp \ + playback/audio.cpp \ + io/config.cpp \ + dialogs/newsequencedialog.cpp \ + ui/viewerwidget.cpp \ + ui/viewercontainer.cpp \ + dialogs/exportdialog.cpp \ + ui/collapsiblewidget.cpp \ + panels/panels.cpp \ + playback/cacher.cpp \ + io/exportthread.cpp \ + ui/timelineheader.cpp \ + io/previewgenerator.cpp \ + ui/labelslider.cpp \ + dialogs/preferencesdialog.cpp \ + ui/audiomonitor.cpp \ + project/undo.cpp \ + ui/scrollarea.cpp \ + ui/comboboxex.cpp \ + ui/colorbutton.cpp \ + dialogs/replaceclipmediadialog.cpp \ + ui/fontcombobox.cpp \ + ui/checkboxex.cpp \ + ui/keyframeview.cpp \ + ui/texteditex.cpp \ + dialogs/demonotice.cpp \ + project/marker.cpp \ + dialogs/speeddialog.cpp \ + dialogs/mediapropertiesdialog.cpp \ + io/crc32.cpp \ + dialogs/loaddialog.cpp \ + debug.cpp \ + io/path.cpp \ + effects/internal/linearfadetransition.cpp \ + effects/internal/transformeffect.cpp \ + effects/internal/solideffect.cpp \ + effects/internal/texteffect.cpp \ + effects/internal/timecodeeffect.cpp \ + effects/internal/audionoiseeffect.cpp \ + effects/internal/paneffect.cpp \ + effects/internal/toneeffect.cpp \ + effects/internal/volumeeffect.cpp \ + effects/internal/crossdissolvetransition.cpp \ + effects/internal/shakeeffect.cpp \ + effects/internal/exponentialfadetransition.cpp \ + effects/internal/logarithmicfadetransition.cpp \ + effects/internal/cornerpineffect.cpp \ + io/math.cpp \ + io/qpainterwrapper.cpp \ + project/effect.cpp \ + project/transition.cpp \ + project/effectrow.cpp \ + project/effectfield.cpp \ + effects/internal/cubetransition.cpp + +HEADERS += \ + mainwindow.h \ + panels/project.h \ + panels/effectcontrols.h \ + panels/viewer.h \ + panels/timeline.h \ + ui/sourcetable.h \ + dialogs/aboutdialog.h \ + ui/timelinewidget.h \ + io/media.h \ + project/sequence.h \ + project/clip.h \ + playback/playback.h \ + playback/audio.h \ + io/config.h \ + dialogs/newsequencedialog.h \ + ui/viewerwidget.h \ + ui/viewercontainer.h \ + dialogs/exportdialog.h \ + ui/collapsiblewidget.h \ + panels/panels.h \ + playback/cacher.h \ + io/exportthread.h \ + ui/timelinetools.h \ + ui/timelineheader.h \ + io/previewgenerator.h \ + ui/labelslider.h \ + dialogs/preferencesdialog.h \ + ui/audiomonitor.h \ + project/undo.h \ + ui/scrollarea.h \ + ui/comboboxex.h \ + ui/colorbutton.h \ + dialogs/replaceclipmediadialog.h \ + ui/fontcombobox.h \ + ui/checkboxex.h \ + ui/keyframeview.h \ + ui/texteditex.h \ + dialogs/demonotice.h \ + project/marker.h \ + project/selection.h \ + dialogs/speeddialog.h \ + dialogs/mediapropertiesdialog.h \ + io/crc32.h \ + dialogs/loaddialog.h \ + debug.h \ + io/path.h \ + effects/internal/transformeffect.h \ + effects/internal/solideffect.h \ + effects/internal/texteffect.h \ + effects/internal/timecodeeffect.h \ + effects/internal/audionoiseeffect.h \ + effects/internal/paneffect.h \ + effects/internal/toneeffect.h \ + effects/internal/volumeeffect.h \ + effects/internal/shakeeffect.h \ + effects/internal/linearfadetransition.h \ + effects/internal/crossdissolvetransition.h \ + effects/internal/exponentialfadetransition.h \ + effects/internal/logarithmicfadetransition.h \ + effects/internal/cornerpineffect.h \ + io/math.h \ + io/qpainterwrapper.h \ + project/effect.h \ + project/transition.h \ + project/effectrow.h \ + project/effectfield.h \ + effects/internal/cubetransition.h + +FORMS += \ + mainwindow.ui \ + panels/project.ui \ + panels/effectcontrols.ui \ + panels/viewer.ui \ + panels/timeline.ui \ + dialogs/aboutdialog.ui \ + dialogs/newsequencedialog.ui \ + dialogs/exportdialog.ui \ + dialogs/preferencesdialog.ui \ + dialogs/demonotice.ui + +win32 { + RC_FILE = icons/resources.rc + LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 +} + +mac { + LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample + ICON = icons/olive.icns + INCLUDEPATH = /usr/local/include +} + +linux { + LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample +} + +RESOURCES += \ + icons/icons.qrc diff --git a/project/effect.cpp b/project/effect.cpp index 3df2ad44f..2dc9469c9 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -19,6 +19,7 @@ #include "effects/internal/transformeffect.h" #include "effects/internal/texteffect.h" +#include "effects/internal/timecodeeffect.h" #include "effects/internal/solideffect.h" #include "effects/internal/audionoiseeffect.h" #include "effects/internal/toneeffect.h" @@ -51,6 +52,7 @@ Effect* create_effect(Clip* c, const EffectMeta* em) { switch (em->internal) { case EFFECT_INTERNAL_TRANSFORM: return new TransformEffect(c, em); case EFFECT_INTERNAL_TEXT: return new TextEffect(c, em); + case EFFECT_INTERNAL_TIMECODE: return new TimecodeEffect(c, em); case EFFECT_INTERNAL_SOLID: return new SolidEffect(c, em); case EFFECT_INTERNAL_NOISE: return new AudioNoiseEffect(c, em); case EFFECT_INTERNAL_VOLUME: return new VolumeEffect(c, em); @@ -117,6 +119,11 @@ void load_internal_effects() { em.internal = EFFECT_INTERNAL_TEXT; video_effects.append(em); + em.name = "Timecode"; + em.category = "Render"; + em.internal = EFFECT_INTERNAL_TIMECODE; + video_effects.append(em); + em.name = "Solid"; em.category = "Render"; em.internal = EFFECT_INTERNAL_SOLID; diff --git a/project/effect.h b/project/effect.h index d91a1d24e..2d1d17a65 100644 --- a/project/effect.h +++ b/project/effect.h @@ -60,6 +60,7 @@ extern QMutex effects_loaded; #define EFFECT_INTERNAL_PAN 5 #define EFFECT_INTERNAL_TONE 6 #define EFFECT_INTERNAL_SHAKE 7 +#define EFFECT_INTERNAL_TIMECODE 8 @@ -160,6 +161,9 @@ protected: // superimpose effect QImage img; QOpenGLTexture* texture; + + // enable effect to update constantly + bool enable_always_update; private: // superimpose effect QString script; @@ -169,7 +173,6 @@ private: QGridLayout* ui_layout; QWidget* ui; bool bound; - bool enable_always_update; // superimpose functions virtual void redraw(double timecode); From ba43adad80ee0808ee1a2931d23e22e2a641d1ac Mon Sep 17 00:00:00 2001 From: alcomposer Date: Thu, 29 Nov 2018 21:29:47 +1030 Subject: [PATCH 2/4] Added slector for sequence or media timecode display --- effects/internal/timecodeeffect.cpp | 31 +++++++++++++++++++++-------- effects/internal/timecodeeffect.h | 5 +++-- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index 97aaeb192..e6e9fd5e2 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -21,13 +21,22 @@ #include "ui/colorbutton.h" #include "ui/fontcombobox.h" #include "io/config.h" +#include "playback/playback.h" TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : - Effect(c, em) + Effect(c, em), + c(c) { enable_always_update = true; enable_superimpose = true; + EffectRow* tc_row = add_row("Timecode:"); + tc_select = tc_row->add_field(EFFECT_FIELD_COMBO); + tc_select->add_combo_item("Sequence", true); + tc_select->add_combo_item("Media", false); + tc_select->set_combo_index(0); + tc_select->id = "tc_selector"; + scale_val = add_row("Scale:")->add_field(EFFECT_FIELD_DOUBLE, 2); scale_val->set_double_minimum_value(1); scale_val->set_double_default_value(100); @@ -56,6 +65,7 @@ TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : prepend_text = add_row("Prepend:")->add_field(EFFECT_FIELD_STRING, 2); prepend_text->id = "prepend"; + connect(tc_select, SIGNAL(changed()), this, SLOT(field_changed())); connect(scale_val, SIGNAL(changed()), this, SLOT(field_changed())); connect(color_val, SIGNAL(changed()), this, SLOT(field_changed())); connect(color_bg_val, SIGNAL(changed()), this, SLOT(field_changed())); @@ -67,18 +77,23 @@ TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : void TimecodeEffect::redraw(double timecode) { - sequence_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate); + + if(qvariant_cast(tc_select->get_combo_data(timecode))){ + display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate);} + else { + display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(playhead_to_clip_frame(c, sequence->playhead), config.timecode_view, sequence->frame_rate);} + img.fill(Qt::transparent); QPainter p(&img); - p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::Antialiasing); int width = img.width(); int height = img.height(); // set font font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias); font.setFamily("Helvetica"); - font.setPixelSize(int(scale_val->get_double_value(timecode)*.01*(height/10))); + font.setPixelSize(qCeil(scale_val->get_double_value(timecode)*.01*(height/10))); p.setFont(font); QFontMetrics fm(font); @@ -86,19 +101,19 @@ void TimecodeEffect::redraw(double timecode) { int text_x, text_y, rect_y, offset_x, offset_y; int text_height = fm.height(); - int text_width = fm.width(sequence_timecode); + int text_width = fm.width(display_timecode); QColor background_color = color_bg_val->get_color_value(timecode); - int alpha_val = bg_alpha->get_double_value(timecode)*.01*255; + int alpha_val = bg_alpha->get_double_value(timecode)*2.55; background_color.setAlpha(alpha_val); offset_x = int(offset_x_val->get_double_value(timecode)); offset_y = int(offset_y_val->get_double_value(timecode)); text_x = offset_x + (width/2) - (text_width/2); - text_y = offset_y + height - height/10;//fm.descent(); + text_y = offset_y + height - height/10; rect_y = text_y + fm.descent()/2 - text_height; - path.addText(text_x, text_y, font, sequence_timecode); + path.addText(text_x, text_y, font, display_timecode); p.setPen(Qt::NoPen); p.setBrush(background_color); diff --git a/effects/internal/timecodeeffect.h b/effects/internal/timecodeeffect.h index a7843d2f9..19415819c 100644 --- a/effects/internal/timecodeeffect.h +++ b/effects/internal/timecodeeffect.h @@ -19,11 +19,12 @@ public: EffectField * offset_x_val; EffectField * offset_y_val; EffectField * prepend_text; - + EffectField * tc_select; private: QFont font; - QString sequence_timecode; + QString display_timecode; + Clip * c; }; #endif // TIMECODEEFFECT_H From f0902971a317fa0934fa5cf01a84a1a0ea664113 Mon Sep 17 00:00:00 2001 From: alcomposer Date: Thu, 29 Nov 2018 22:21:26 +1030 Subject: [PATCH 3/4] Media timecode is now calucated using playhead_to_clip_seconds --- effects/internal/timecodeeffect.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index e6e9fd5e2..7f560dfb0 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -81,8 +81,7 @@ void TimecodeEffect::redraw(double timecode) { if(qvariant_cast(tc_select->get_combo_data(timecode))){ display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate);} else { - display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(playhead_to_clip_frame(c, sequence->playhead), config.timecode_view, sequence->frame_rate);} - + display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(qlonglong(playhead_to_clip_seconds(c, sequence->playhead)*c->getMediaFrameRate()), config.timecode_view, c->getMediaFrameRate());} img.fill(Qt::transparent); QPainter p(&img); From bb0a94ce3432c2aefab3b4ebf5f3d1411fca92b4 Mon Sep 17 00:00:00 2001 From: alcomposer Date: Thu, 29 Nov 2018 22:33:10 +1030 Subject: [PATCH 4/4] Use parent_clip instead of duplicating clip * c --- effects/internal/timecodeeffect.cpp | 6 +++--- effects/internal/timecodeeffect.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index 7f560dfb0..e95106dae 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -24,8 +24,7 @@ #include "playback/playback.h" TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : - Effect(c, em), - c(c) + Effect(c, em) { enable_always_update = true; enable_superimpose = true; @@ -81,7 +80,8 @@ void TimecodeEffect::redraw(double timecode) { if(qvariant_cast(tc_select->get_combo_data(timecode))){ display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate);} else { - display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(qlonglong(playhead_to_clip_seconds(c, sequence->playhead)*c->getMediaFrameRate()), config.timecode_view, c->getMediaFrameRate());} + double media_rate = parent_clip->getMediaFrameRate(); + display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(timecode * media_rate, config.timecode_view, media_rate);} img.fill(Qt::transparent); QPainter p(&img); diff --git a/effects/internal/timecodeeffect.h b/effects/internal/timecodeeffect.h index 19415819c..60f6260dd 100644 --- a/effects/internal/timecodeeffect.h +++ b/effects/internal/timecodeeffect.h @@ -24,7 +24,6 @@ public: private: QFont font; QString display_timecode; - Clip * c; }; #endif // TIMECODEEFFECT_H