From e08b565a2bc4ebd569c5618906b0d4f8a30db096 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 3 Aug 2018 07:41:15 +1000 Subject: [PATCH 1/2] added more icons and fixed playback bug --- icons/icons.qrc | 6 + icons/magnet-disabled.png | Bin 0 -> 1804 bytes icons/magnet.png | Bin 0 -> 1676 bytes icons/zoomin-disabled.png | Bin 0 -> 2053 bytes icons/zoomin.png | Bin 0 -> 1813 bytes icons/zoomout-disabled.png | Bin 0 -> 2035 bytes icons/zoomout.png | Bin 0 -> 1805 bytes panels/timeline.cpp | 3 +- panels/timeline.ui | 250 +++++++++++++++++-------------------- playback/cacher.cpp | 11 +- playback/playback.cpp | 21 ++-- playback/playback.h | 6 +- project/clip.cpp | 2 +- ui/timelinewidget.cpp | 55 ++++---- ui/timelinewidget.h | 7 +- ui/viewerwidget.cpp | 6 +- 16 files changed, 181 insertions(+), 186 deletions(-) create mode 100644 icons/magnet-disabled.png create mode 100644 icons/magnet.png create mode 100644 icons/zoomin-disabled.png create mode 100644 icons/zoomin.png create mode 100644 icons/zoomout-disabled.png create mode 100644 icons/zoomout.png diff --git a/icons/icons.qrc b/icons/icons.qrc index 3fc0faaf0..3bbbc0ea9 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -30,5 +30,11 @@ slide.png slide-disabled.png throbber.png + magnet.png + magnet-disabled.png + zoomin.png + zoomin-disabled.png + zoomout.png + zoomout-disabled.png diff --git a/icons/magnet-disabled.png b/icons/magnet-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..4f19588b282a30bf98e5c84fb697a591f25727e3 GIT binary patch literal 1804 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 = true; - ui->splitter->setOpaqueResize(false); + ui->video_area->container = ui->videoScrollArea; + ui->audio_area->container = ui->audioScrollArea; tool_buttons.append(ui->toolArrowButton); tool_buttons.append(ui->toolEditButton); diff --git a/panels/timeline.ui b/panels/timeline.ui index f486cb108..9df286d0c 100644 --- a/panels/timeline.ui +++ b/panels/timeline.ui @@ -6,8 +6,8 @@ 0 0 - 523 - 376 + 901 + 592 @@ -62,18 +62,6 @@ - - - 0 - 0 - - - - - 40 - 16777215 - - Pointer Tool (V) @@ -85,12 +73,6 @@ :/icons/arrow.png :/icons/arrow-disabled.png:/icons/arrow.png - - - 20 - 20 - - true @@ -98,12 +80,6 @@ - - - 40 - 16777215 - - Edit Tool (X) @@ -115,12 +91,6 @@ :/icons/beam.png :/icons/beam-disabled.png:/icons/beam.png - - - 20 - 20 - - true @@ -128,12 +98,6 @@ - - - 40 - 16777215 - - Ripple Tool (B) @@ -145,12 +109,6 @@ :/icons/ripple.png :/icons/ripple-disabled.png:/icons/ripple.png - - - 20 - 20 - - true @@ -158,12 +116,6 @@ - - - 40 - 16777215 - - Rolling Tool (N) @@ -175,12 +127,6 @@ :/icons/rolling.png :/icons/rolling-disabled.png:/icons/rolling.png - - - 20 - 20 - - true @@ -188,12 +134,6 @@ - - - 40 - 16777215 - - Razor Tool (C) @@ -205,12 +145,6 @@ :/icons/razor.png :/icons/razor-disabled.png:/icons/razor.png - - - 20 - 20 - - true @@ -218,12 +152,6 @@ - - - 40 - 16777215 - - Slip Tool (Y) @@ -236,12 +164,6 @@ :/icons/slip-disabled.png - - - 20 - 20 - - true @@ -249,12 +171,6 @@ - - - 40 - 16777215 - - Slide Tool (U) @@ -267,12 +183,6 @@ :/icons/slide-disabled.png - - - 20 - 20 - - true @@ -280,14 +190,14 @@ - - - 40 - 16777215 - - - S + + + + + :/icons/magnet.png + :/icons/magnet-disabled.png + true @@ -299,33 +209,33 @@ - - - 40 - 16777215 - - Zoom In (=) - + + + + + + :/icons/zoomin.png + :/icons/zoomin-disabled.png + - - - 40 - 16777215 - - Zoom Out (-) - - + + + + + :/icons/zoomout.png + :/icons/zoomout-disabled.png + @@ -348,7 +258,7 @@ - Qt::ScrollBarAlwaysOn + Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOn @@ -361,11 +271,11 @@ 0 0 - 408 - 327 + 819 + 551 - + 0 @@ -399,27 +309,101 @@ Qt::Vertical - - - - 0 - 0 - + + + QFrame::NoFrame - - Qt::ClickFocus + + Qt::ScrollBarAlwaysOn + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 802 + 266 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::ClickFocus + + + + + - - - - 0 - 0 - + + + QFrame::NoFrame - - Qt::ClickFocus + + Qt::ScrollBarAlwaysOn + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 802 + 265 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::ClickFocus + + + + + diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 3995832f7..794778150 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -176,21 +176,22 @@ void reset_cache(Clip* c, long target_frame) { if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { // seeks to nearest keyframe (target_frame represents internal clip frame) - av_seek_frame(c->formatCtx, ms->file_index, clip_frame_to_seconds(c, target_frame) / timebase, AVSEEK_FLAG_BACKWARD); + + av_seek_frame(c->formatCtx, ms->file_index, (int64_t) qFloor(clip_frame_to_seconds(c, target_frame) / timebase), AVSEEK_FLAG_BACKWARD); + qDebug() << target_frame; // play up to the frame we actually want long retrieved_frame = 0; AVFrame* temp = av_frame_alloc(); - do { + do { retrieve_next_frame(c, temp); if (retrieved_frame == 0) { - if (target_frame != 0) { - retrieved_frame = floor(temp->pts * timebase * av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, temp))); - } + if (target_frame != 0) retrieved_frame = floor(temp->pts * timebase * av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, temp))); } else { retrieved_frame++; } } while (retrieved_frame < target_frame); + av_frame_free(&temp); } else if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { // seek (target_frame represents timeline timecode in frames, not clip timecode) diff --git a/playback/playback.cpp b/playback/playback.cpp index 7097deaf4..578e6099c 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -75,7 +75,7 @@ void cache_clip(Clip* clip, long playhead, bool write_A, bool write_B, bool rese void get_clip_frame(Clip* c, long playhead) { if (c->open) { - long clip_time = seconds_to_clip_frame(c, playhead_to_seconds(c, playhead)); + long clip_time = refactor_frame_number(playhead - c->timeline_in + c->clip_in, c->sequence->frame_rate, av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame))); // do we need to update the texture? MediaStream* ms = static_cast(c->media)->get_stream_from_file_index(c->media_stream); @@ -139,15 +139,8 @@ void get_clip_frame(Clip* c, long playhead) { bool write_A = (!using_cache_A && !c->cache_A.unread); bool write_B = (!using_cache_B && !c->cache_B.unread); if (write_A || write_B) { - long playhead; - if (cache_needs_reset) { - // if we have no cache and need to seek, start us at the current playhead... - playhead = clip_time; - } else { - // ...otherwise start at the end of the current cache - playhead = cache_offset + c->cache_size; - } - cache_clip(c, playhead, write_A, write_B, cache_needs_reset, NULL); + // if we have no cache and need to seek, start us at the current playhead, otherwise start at the end of the current cache + cache_clip(c, (cache_needs_reset) ? clip_time : cache_offset + c->cache_size, write_A, write_B, cache_needs_reset, NULL); } c->lock.unlock(); } @@ -175,12 +168,12 @@ void get_clip_frame(Clip* c, long playhead) { } } -float playhead_to_seconds(Clip* c, long playhead) { +double playhead_to_seconds(Clip* c, long playhead) { // returns time in seconds return (qMax((long) 0, playhead - c->timeline_in) + c->clip_in)/c->sequence->frame_rate; } -long seconds_to_clip_frame(Clip* c, float seconds) { +long seconds_to_clip_frame(Clip* c, double seconds) { // returns time as frame number (according to clip's frame rate) if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { return floor(seconds*av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame))); @@ -190,9 +183,9 @@ long seconds_to_clip_frame(Clip* c, float seconds) { } } -float clip_frame_to_seconds(Clip* c, long clip_frame) { +double clip_frame_to_seconds(Clip* c, long clip_frame) { // returns frame number in decimal seconds - return (float) clip_frame / c->sequence->frame_rate; + return (double) clip_frame / av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame)); } int retrieve_next_frame(Clip* c, AVFrame* f) { diff --git a/playback/playback.h b/playback/playback.h index 25aa87c37..5acc5f359 100644 --- a/playback/playback.h +++ b/playback/playback.h @@ -19,9 +19,9 @@ void cache_video_worker(Clip* c, long playhead, ClipCache* cache); void handle_media(Sequence* sequence, long playhead, bool multithreaded); void reset_cache(Clip* c, long target_frame); void get_clip_frame(Clip* c, long playhead); -float playhead_to_seconds(Clip* c, long playhead); -long seconds_to_clip_frame(Clip* c, float seconds); -float clip_frame_to_seconds(Clip* c, long clip_frame); +double playhead_to_seconds(Clip* c, long playhead); +long seconds_to_clip_frame(Clip* c, double seconds); +double clip_frame_to_seconds(Clip* c, long clip_frame); int retrieve_next_frame(Clip* c, AVFrame* f); void retrieve_next_frame_raw_data(Clip* c, AVFrame* output); bool is_clip_active(Clip* c, long playhead); diff --git a/project/clip.cpp b/project/clip.cpp index 261b4eb11..ebff39457 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -91,7 +91,7 @@ void Clip::reset_audio() { audio_reset = true; frame_sample_index = 0; audio_buffer_write = 0; - reached_end = false; + reached_end = false; break; case MEDIA_TYPE_SEQUENCE: { diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 616146789..8c4381b82 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1349,27 +1349,44 @@ int color_brightness(int r, int g, int b) { void TimelineWidget::redraw_clips() { // Draw clips if (sequence != NULL) { - int panel_width = panel_timeline->getScreenPointFromFrame(sequence->getEndFrame()) + 100; + // get widget width and height + int video_track_limit = 0; + int audio_track_limit = 0; + long end_frame = 0; + for (int i=0;iclip_count();i++) { + Clip* clip = sequence->get_clip(i); + if (clip != NULL) { + end_frame = qMax(end_frame, clip->timeline_out); + video_track_limit = qMin(video_track_limit, clip->track); + audio_track_limit = qMax(audio_track_limit, clip->track); + } + } + int panel_width = panel_timeline->getScreenPointFromFrame(end_frame) + 100; + int panel_height = 0; + if (bottom_align) { + for (int i=-1;i>=video_track_limit;i--) { + panel_height += panel_timeline->calculate_track_height(i, -1); + } + } else { + for (int i=0;i<=audio_track_limit;i++) { + panel_height += panel_timeline->calculate_track_height(i, -1); + } + } - if (minimumWidth() != panel_width || clip_pixmap.height() != height()) { + if (minimumWidth() != panel_width || /*clip_pixmap.height() != height() || */panel_height != minimumHeight()) { setMinimumWidth(panel_width); - clip_pixmap = QPixmap(qMax(width(), panel_width), height()); + container->setMinimumWidth(panel_width); + setMinimumHeight(panel_height); + clip_pixmap = QPixmap(qMax(width(), panel_width), qMax(height(), panel_height)); } clip_pixmap.fill(Qt::transparent); QPainter clip_painter(&clip_pixmap); - int video_track_limit = 0; - int audio_track_limit = 0; + QColor transition_color(255, 0, 0, 16); for (int i=0;iclip_count();i++) { Clip* clip = sequence->get_clip(i); - if (clip != NULL && is_track_visible(clip->track)) { - if (clip->track < 0 && clip->track < video_track_limit) { // video clip - video_track_limit = clip->track; - } else if (clip->track > audio_track_limit) { - audio_track_limit = clip->track; - } - + if (clip != NULL && is_track_visible(clip->track)) { QRect clip_rect(panel_timeline->getScreenPointFromFrame(clip->timeline_in), getScreenPointFromTrack(clip->track), clip->getLength() * panel_timeline->zoom, panel_timeline->calculate_track_height(clip->track, -1)); clip_painter.fillRect(clip_rect, QColor(clip->color_r, clip->color_g, clip->color_b)); @@ -1378,13 +1395,8 @@ void TimelineWidget::redraw_clips() { QRect text_rect(clip_rect.left() + CLIP_TEXT_PADDING, clip_rect.top() + CLIP_TEXT_PADDING, clip_rect.width() - CLIP_TEXT_PADDING - 1, clip_rect.height() - CLIP_TEXT_PADDING - 1); // draw clip transitions - for (char i=0;i<2;i++) { - Transition* t; - if (i == 0) { - t = clip->opening_transition; - } else { - t = clip->closing_transition; - } + for (int i=0;i<2;i++) { + Transition* t = (i == 0) ? clip->opening_transition : clip->closing_transition; if (t != NULL) { int transition_width = panel_timeline->getScreenPointFromFrame(t->length); int transition_height = clip_rect.height() * 0.6; @@ -1522,9 +1534,8 @@ void TimelineWidget::redraw_clips() { } } else { // only draw lines for audio tracks - for (int i=0;icalculate_track_height(i, -1); + for (int i=0;icalculate_track_height(i, -1); clip_painter.drawLine(0, line_y, rect().width(), line_y); } } diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index debc9506f..ed56c0faa 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -19,11 +19,13 @@ class TimelineAction; class TimelineWidget : public QWidget { Q_OBJECT public: - explicit TimelineWidget(QWidget *parent = 0); + explicit TimelineWidget(QWidget *parent = 0); bool bottom_align; void redraw_clips(); + + QWidget* container; protected: void paintEvent(QPaintEvent*); void resizeEvent(QResizeEvent*); @@ -60,8 +62,7 @@ private: int predicted_video_height; double predicted_new_frame_rate; int predicted_audio_freq; - int predicted_audio_layout; - + int predicted_audio_layout; signals: public slots: diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 3f6bc438e..157389d0f 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -89,12 +89,10 @@ void ViewerWidget::paintEvent(QPaintEvent *e) { void ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { Sequence* s = sequence; - long playhead = panel_timeline->playhead; + long playhead = panel_timeline->playhead; + if (nest != NULL) { s = static_cast(nest->media); - -// qDebug() << "nested sequence was null:" << (s == NULL); - playhead += nest->clip_in - nest->timeline_in; playhead = refactor_frame_number(playhead, sequence->frame_rate, s->frame_rate); } From 76b86ff3fd4370841970918aa1d3cc39cec08a70 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 3 Aug 2018 09:45:42 +1000 Subject: [PATCH 2/2] improved Mac support --- main.cpp | 2 +- mainwindow.cpp | 14 ++++- olive.pro | 3 +- panels/viewer.ui | 135 ----------------------------------------------- 4 files changed, 16 insertions(+), 138 deletions(-) diff --git a/main.cpp b/main.cpp index 61fc82cca..0634f98c9 100644 --- a/main.cpp +++ b/main.cpp @@ -12,7 +12,7 @@ int main(int argc, char *argv[]) // QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); - QApplication a(argc, argv); + QApplication a(argc, argv); MainWindow w; w.show(); diff --git a/mainwindow.cpp b/mainwindow.cpp index d243b2a4c..b9419688e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -323,7 +323,15 @@ bool MainWindow::save_project() { bool MainWindow::can_close_project() { if (project_changed) { - int r = QMessageBox::question(this, "Unsaved Project", "This project has changed since it was last saved. Would you like to save it before closing?", QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, QMessageBox::Yes); + QMessageBox* m = new QMessageBox( + QMessageBox::Question, + "Unsaved Project", + "This project has changed since it was last saved. Would you like to save it before closing?", + QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, + this + ); + m->setWindowModality(Qt::WindowModal); + int r = m->exec(); if (r == QMessageBox::Yes) { return save_project(); } else if (r == QMessageBox::Cancel) { @@ -426,6 +434,10 @@ void MainWindow::on_actionCrash_triggered() // intentionally tries to crash the program - mostly used for debugging Timeline* temp = NULL; temp->snapped = true; + int* kek; + kek[5] = 69; + kek[99999] = 420; + delete temp; } } diff --git a/olive.pro b/olive.pro index 5b70bd5c5..682d07435 100644 --- a/olive.pro +++ b/olive.pro @@ -8,7 +8,7 @@ QT += core gui multimedia opengl greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -TARGET = olive +TARGET = Olive TEMPLATE = app # The following define makes your compiler emit warnings if you use @@ -123,6 +123,7 @@ win32 { } mac { + LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lswscale -lswresample INCLUDEPATH = /usr/local/include } diff --git a/panels/viewer.ui b/panels/viewer.ui index 7a748347c..f850d20c7 100644 --- a/panels/viewer.ui +++ b/panels/viewer.ui @@ -104,183 +104,48 @@ true - - - 0 - 0 - - - - - 36 - 0 - - - - - 16777215 - 16777215 - - - - - :/icons/prev.png :/icons/prev-disabled.png:/icons/prev.png - - - 14 - 14 - - - - - 0 - 0 - - - - - 36 - 0 - - - - - 16777215 - 16777215 - - - - - :/icons/rew.png :/icons/rew-disabled.png:/icons/rew.png - - - 14 - 14 - - - - - 0 - 0 - - - - - 36 - 0 - - - - - 16777215 - 16777215 - - - - - :/icons/play.png :/icons/play-disabled.png:/icons/play.png - - - 14 - 14 - - - - - 0 - 0 - - - - - 36 - 0 - - - - - 16777215 - 16777215 - - - - - :/icons/ff.png :/icons/ff-disabled.png - - - 14 - 14 - - - - - 0 - 0 - - - - - 36 - 0 - - - - - 16777215 - 16777215 - - - - - :/icons/next.png :/icons/next-disabled.png:/icons/next.png - - - 14 - 14 - -