From a985e771ecfb00f01c6405c7aa4fb958a780e558 Mon Sep 17 00:00:00 2001 From: Good Guy Date: Wed, 6 Sep 2017 15:52:30 -0600 Subject: [PATCH] yet another attempt to deal with ffmpeg seeks, fred name/color change --- cinelerra-5.1/cinelerra/appearanceprefs.C | 2 +- cinelerra-5.1/cinelerra/ffmpeg.C | 12 ++++++++++-- cinelerra-5.1/cinelerra/timebar.C | 5 ++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cinelerra-5.1/cinelerra/appearanceprefs.C b/cinelerra-5.1/cinelerra/appearanceprefs.C index 01779b4f..a865db1e 100644 --- a/cinelerra-5.1/cinelerra/appearanceprefs.C +++ b/cinelerra-5.1/cinelerra/appearanceprefs.C @@ -473,7 +473,7 @@ int DeactivateFocusPolicy::handle_event() ForwardRenderDisplacement::ForwardRenderDisplacement(PreferencesWindow *pwindow, int x, int y) : BC_CheckBox(x, y, pwindow->thread->preferences->forward_render_displacement, - _("Forward render enable displacement")) + _("Always show next frame")) { this->pwindow = pwindow; } diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C index b451c797..74b32cf1 100644 --- a/cinelerra-5.1/cinelerra/ffmpeg.C +++ b/cinelerra-5.1/cinelerra/ffmpeg.C @@ -511,7 +511,13 @@ int FFStream::seek(int64_t no, double rate) double secs = pos < 0 ? 0. : pos / rate; AVRational time_base = st->time_base; int64_t tstmp = time_base.num > 0 ? secs * time_base.den/time_base.num : 0; - if( nudge != AV_NOPTS_VALUE ) tstmp += nudge; + if( !tstmp ) { + if( st->nb_index_entries > 0 ) tstmp = st->index_entries[0].timestamp; + else if( st->start_time != AV_NOPTS_VALUE ) tstmp = st->start_time; + else if( st->first_dts != AV_NOPTS_VALUE ) tstmp = st->first_dts; + else tstmp = INT64_MIN+1; + } + else if( nudge != AV_NOPTS_VALUE ) tstmp += nudge; int idx = st->index; #if 0 // seek all streams using the default timebase. @@ -531,7 +537,9 @@ int FFStream::seek(int64_t no, double rate) } int ret = avformat_seek_file(fmt_ctx, st->index, -INT64_MAX, seek, INT64_MAX, flags); #else - int ret = av_seek_frame(fmt_ctx, idx, tstmp, AVSEEK_FLAG_ANY); +// finds the first index frame below the target time + int flags = AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY; + int ret = av_seek_frame(fmt_ctx, idx, tstmp, flags); #endif int retry = MAX_RETRY; while( ret >= 0 ) { diff --git a/cinelerra-5.1/cinelerra/timebar.C b/cinelerra-5.1/cinelerra/timebar.C index ed0011cd..5325a264 100644 --- a/cinelerra-5.1/cinelerra/timebar.C +++ b/cinelerra-5.1/cinelerra/timebar.C @@ -430,7 +430,10 @@ void TimeBar::update(int flush) double position = edl->local_session->get_selectionstart(1); int64_t pixel = position_to_pixel(position); // Draw insertion point position. - set_color(mwindow->theme->timebar_cursor_color); + int color = mwindow->theme->timebar_cursor_color; + if( mwindow->preferences->forward_render_displacement ) + color ^= 0x00ffff; + set_color(color); draw_line(pixel, 0, pixel, get_h()); } -- 2.26.2