diff --git a/movie.c b/movie.c index 188675c4ad..062b490a33 100644 --- a/movie.c +++ b/movie.c @@ -96,7 +96,9 @@ struct bsv_movie bool playback; unsigned min_file_pos; + bool first_rewind; + bool did_rewind; }; #define BSV_MAGIC 0x42535631 @@ -269,24 +271,33 @@ error: void bsv_movie_set_frame_start(bsv_movie_t *handle) { - fprintf(stderr, "Starting frame: %u, Pos: %ld\n", (unsigned)handle->frame_ptr, ftell(handle->file)); + //fprintf(stderr, "Starting frame: %u, Pos: %ld\n", (unsigned)handle->frame_ptr, ftell(handle->file)); handle->frame_pos[handle->frame_ptr] = ftell(handle->file); + } void bsv_movie_set_frame_end(bsv_movie_t *handle) { - fprintf(stderr, "Frame++\n"); + //fprintf(stderr, "Frame++\n"); handle->frame_ptr = (handle->frame_ptr + 1) & handle->frame_mask; + + handle->first_rewind = !handle->did_rewind; + handle->did_rewind = false; } void bsv_movie_frame_rewind(bsv_movie_t *handle) { - fprintf(stderr, "Frame--\n"); + //fprintf(stderr, "Frame--\n"); + + handle->did_rewind = true; if (handle->frame_ptr <= 1) + { handle->frame_ptr = 0; + fseek(handle->file, handle->min_file_pos, SEEK_SET); + } else { - handle->frame_ptr = (handle->frame_ptr - 2) & handle->frame_mask; + handle->frame_ptr = (handle->frame_ptr - (handle->first_rewind ? 1 : 2)) & handle->frame_mask; fseek(handle->file, handle->frame_pos[handle->frame_ptr], SEEK_SET); } diff --git a/rewind.c b/rewind.c index 3f4c1743b8..0c23bbba54 100644 --- a/rewind.c +++ b/rewind.c @@ -78,11 +78,11 @@ void state_manager_free(state_manager_t *state) bool state_manager_pop(state_manager_t *state, void **data) { *data = state->tmp_state; - //if (state->first_pop) - //{ - // state->first_pop = false; - // return true; - //} + if (state->first_pop) + { + state->first_pop = false; + return true; + } if (state->top_ptr == 0) state->top_ptr = state->buf_size - 1;