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;
}
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.
}
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 ) {
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());
}