+@@ -184,9 +184,13 @@
+ dvdnav_status_t dvdnav_sector_search(dvdnav_t *this,
+ uint64_t offset, int32_t origin) {
+ uint32_t target = 0;
++ uint32_t current_pos;
++ uint32_t cur_sector;
++ uint32_t cur_cell_nr;
+ uint32_t length = 0;
+ uint32_t first_cell_nr, last_cell_nr, cell_nr;
+ int32_t found;
++ int forward = 0;
+ cell_playback_t *cell;
+ dvd_state_t *state;
+ dvdnav_status_t result;
+@@ -213,6 +217,10 @@
+ fprintf(MSG_OUT, "libdvdnav: Before cellN=%u blockN=%u\n", state->cellN, state->blockN);
+ #endif
+
++ current_pos = target;
++ cur_sector = this->vobu.vobu_start + this->vobu.blockN;
++ cur_cell_nr = state->cellN;
++
+ switch(origin) {
+ case SEEK_SET:
+ if(offset >= length) {
+@@ -244,6 +252,7 @@
+ pthread_mutex_unlock(&this->vm_lock);
+ return DVDNAV_STATUS_ERR;
+ }
++ forward = target > current_pos;
+
+ this->cur_cell_time = 0;
+ if (this->pgc_based) {
+@@ -270,6 +279,27 @@