diff --git a/playback/cacher.cpp b/playback/cacher.cpp index a2d2834e3..15e402702 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -453,6 +453,11 @@ void reset_cache(Clip* c, long target_frame) { qDebug() << "flushed?"; av_frame_unref(temp); }*/ + /*av_buffersrc_add_frame(c->buffersrc_ctx, NULL); + av_frame_unref(c->frame); + while (av_buffersink_get_frame(c->buffersink_ctx, c->frame) >= 0) { + av_frame_unref(c->frame); + }*/ double timebase = av_q2d(c->stream->time_base); @@ -462,7 +467,8 @@ void reset_cache(Clip* c, long target_frame) { // seeks to nearest keyframe (target_frame represents internal clip frame) int64_t seek_ts = qRound(clip_frame_to_seconds(c, target_frame) / timebase); - av_seek_frame(c->formatCtx, ms->file_index, seek_ts/* - (av_q2d(av_inv_q(c->stream->time_base)))*/, AVSEEK_FLAG_BACKWARD); + qDebug() << "requesting: " << seek_ts; + av_seek_frame(c->formatCtx, ms->file_index, seek_ts, AVSEEK_FLAG_BACKWARD); // play up to the frame we actually want int ret; @@ -476,7 +482,7 @@ void reset_cache(Clip* c, long target_frame) { av_frame_unref(temp); av_frame_free(&temp); } else { - av_seek_frame(c->formatCtx, ms->file_index, c->stream->start_time, AVSEEK_FLAG_BACKWARD); + av_seek_frame(c->formatCtx, ms->file_index, 0, AVSEEK_FLAG_BACKWARD); } } 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 9b6959e7a..491a93149 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -145,26 +145,20 @@ bool get_clip_frame(Clip* c, long playhead) { // TODO just removed a bunch of mutexes - is this safe???? if (c->cache_A.written && clip_time >= c->cache_A.offset && clip_time < c->cache_A.offset + c->cache_size) { if (clip_time < (c->cache_A.offset + c->cache_A.write_count)) { -// if (c->cache_A.mutex.tryLock()) { // lock in case cacher is still writing to it - using_cache_A = true; - c->cache_A.unread = false; - cache = c->cache_A.frames; - cache_offset = c->cache_A.offset; -// c->cache_A.mutex.unlock(); -// } + using_cache_A = true; + c->cache_A.unread = false; + cache = c->cache_A.frames; + cache_offset = c->cache_A.offset; } else { // frame is coming but isn't here yet, no need to reset cache no_frame = true; } } else if (c->cache_B.written && clip_time >= c->cache_B.offset && clip_time < c->cache_B.offset + c->cache_size) { if (clip_time < (c->cache_B.offset + c->cache_B.write_count)) { -// if (c->cache_B.mutex.tryLock()) { // lock in case cacher is still writing to it - using_cache_B = true; - c->cache_B.unread = false; - cache = c->cache_B.frames; - cache_offset = c->cache_B.offset; -// c->cache_B.mutex.unlock(); -// } + using_cache_B = true; + c->cache_B.unread = false; + cache = c->cache_B.frames; + cache_offset = c->cache_B.offset; } else { // frame is coming but isn't here yet, no need to reset cache no_frame = true; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 6471cc7c9..16c534a7d 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -97,144 +97,150 @@ void TimelineHeader::show_text(bool enable) { } void TimelineHeader::mousePressEvent(QMouseEvent* event) { - if (resizing_workarea) { - sequence_end = sequence->getEndFrame(); - } else { - bool shift = (event->modifiers() & Qt::ShiftModifier); - bool clicked_on_marker = false; - for (int i=0;imarkers.size();i++) { - int marker_pos = getHeaderScreenPointFromFrame(sequence->markers.at(i).frame); - if (event->pos().x() > marker_pos - MARKER_SIZE && event->pos().x() < marker_pos + MARKER_SIZE) { - bool found = false; - for (int j=0;jmarkers.at(selected_markers.at(i)).frame; - } - drag_start = event->pos().x(); - dragging_markers = true; - } else { - if (selected_markers.size() > 0) { - selected_markers.clear(); - update(); - } - set_playhead(event->pos().x()); - } - } - dragging = true; -} - -void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { - if (dragging) { + if (sequence != NULL) { if (resizing_workarea) { - long frame = getHeaderFrameFromScreenPoint(event->pos().x()); - if (snapping) panel_timeline->snap_to_timeline(&frame, true, true, false); - - if (resizing_workarea_in) { - temp_workarea_in = qMax(qMin(temp_workarea_out-1, frame), 0L); - } else { - temp_workarea_out = qMin(qMax(temp_workarea_in+1, frame), sequence_end); - } - - panel_timeline->repaint_timeline(false); - } else if (dragging_markers) { - long frame_movement = getHeaderFrameFromScreenPoint(event->pos().x()) - getHeaderFrameFromScreenPoint(drag_start); - - // snap markers - for (int i=0;isnap_to_timeline(&fm, true, false, true)) { - frame_movement = fm - selected_marker_original_times.at(i); + sequence_end = sequence->getEndFrame(); + } else { + bool shift = (event->modifiers() & Qt::ShiftModifier); + bool clicked_on_marker = false; + for (int i=0;imarkers.size();i++) { + int marker_pos = getHeaderScreenPointFromFrame(sequence->markers.at(i).frame); + if (event->pos().x() > marker_pos - MARKER_SIZE && event->pos().x() < marker_pos + MARKER_SIZE) { + bool found = false; + for (int j=0;jmarkers.at(selected_markers.at(i)).frame; + } + drag_start = event->pos().x(); + dragging_markers = true; + } else { + if (selected_markers.size() > 0) { + selected_markers.clear(); + update(); + } + set_playhead(event->pos().x()); + } + } + dragging = true; + } +} - // validate markers (ensure none go below 0) - long validator; - for (int i=0;ipos().x()); + if (snapping) panel_timeline->snap_to_timeline(&frame, true, true, false); + + if (resizing_workarea_in) { + temp_workarea_in = qMax(qMin(temp_workarea_out-1, frame), 0L); + } else { + temp_workarea_out = qMin(qMax(temp_workarea_in+1, frame), sequence_end); + } + + panel_timeline->repaint_timeline(false); + } else if (dragging_markers) { + long frame_movement = getHeaderFrameFromScreenPoint(event->pos().x()) - getHeaderFrameFromScreenPoint(drag_start); + + // snap markers + for (int i=0;isnap_to_timeline(&fm, true, false, true)) { + frame_movement = fm - selected_marker_original_times.at(i); + break; + } + } + + // validate markers (ensure none go below 0) + long validator; + for (int i=0;imarkers[selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; + } + + panel_timeline->repaint_timeline(false); + } else { + set_playhead(event->pos().x()); + } + } else { + resizing_workarea = false; + unsetCursor(); + if (sequence != NULL && sequence->using_workarea) { + long min_frame = getHeaderFrameFromScreenPoint(event->pos().x() - CLICK_RANGE) - 1; + long max_frame = getHeaderFrameFromScreenPoint(event->pos().x() + CLICK_RANGE) + 1; + if (sequence->workarea_in > min_frame && sequence->workarea_in < max_frame) { + resizing_workarea = true; + resizing_workarea_in = true; + } else if (sequence->workarea_out > min_frame && sequence->workarea_out < max_frame) { + resizing_workarea = true; + resizing_workarea_in = false; + } + if (resizing_workarea) { + temp_workarea_in = sequence->workarea_in; + temp_workarea_out = sequence->workarea_out; + setCursor(Qt::SizeHorCursor); } } - - // move markers - for (int i=0;imarkers[selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; - } - - panel_timeline->repaint_timeline(false); - } else { - set_playhead(event->pos().x()); - } - } else { - resizing_workarea = false; - unsetCursor(); - if (sequence != NULL && sequence->using_workarea) { - long min_frame = getHeaderFrameFromScreenPoint(event->pos().x() - CLICK_RANGE) - 1; - long max_frame = getHeaderFrameFromScreenPoint(event->pos().x() + CLICK_RANGE) + 1; - if (sequence->workarea_in > min_frame && sequence->workarea_in < max_frame) { - resizing_workarea = true; - resizing_workarea_in = true; - } else if (sequence->workarea_out > min_frame && sequence->workarea_out < max_frame) { - resizing_workarea = true; - resizing_workarea_in = false; - } - if (resizing_workarea) { - temp_workarea_in = sequence->workarea_in; - temp_workarea_out = sequence->workarea_out; - setCursor(Qt::SizeHorCursor); - } } } } void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { - dragging = false; - if (resizing_workarea) { - undo_stack.push(new SetTimelineInOutCommand(sequence, true, temp_workarea_in, temp_workarea_out)); - } else if (dragging_markers && selected_markers.size() > 0) { - bool moved = false; - ComboAction* ca = new ComboAction(); - for (int i=0;imarkers[selected_markers.at(i)]; - if (selected_marker_original_times.at(i) != m->frame) { - ca->append(new MoveMarkerAction(m, selected_marker_original_times.at(i), m->frame)); - moved = true; + if (sequence != NULL) { + dragging = false; + if (resizing_workarea) { + undo_stack.push(new SetTimelineInOutCommand(sequence, true, temp_workarea_in, temp_workarea_out)); + } else if (dragging_markers && selected_markers.size() > 0) { + bool moved = false; + ComboAction* ca = new ComboAction(); + for (int i=0;imarkers[selected_markers.at(i)]; + if (selected_marker_original_times.at(i) != m->frame) { + ca->append(new MoveMarkerAction(m, selected_marker_original_times.at(i), m->frame)); + moved = true; + } + } + if (moved) { + undo_stack.push(ca); + } else { + delete ca; } } - if (moved) { - undo_stack.push(ca); - } else { - delete ca; - } - } - resizing_workarea = false; - dragging = false; - dragging_markers = false; - panel_timeline->snapped = false; - panel_timeline->repaint_timeline(false); + resizing_workarea = false; + dragging = false; + dragging_markers = false; + panel_timeline->snapped = false; + panel_timeline->repaint_timeline(false); + } } void TimelineHeader::focusOutEvent(QFocusEvent*) { diff --git a/ui/timelineheader.h b/ui/timelineheader.h index 2540d8552..3ea910269 100644 --- a/ui/timelineheader.h +++ b/ui/timelineheader.h @@ -16,9 +16,7 @@ public: bool snapping; void show_text(bool enable); - void update_zoom(double z); - void delete_markers(); public slots: