diff options
author | Ewald Snel <esnel@users.sourceforge.net> | 2002-12-18 20:32:20 +0000 |
---|---|---|
committer | Ewald Snel <esnel@users.sourceforge.net> | 2002-12-18 20:32:20 +0000 |
commit | cf2da035d40199a0916fc012310ef0a164122f2d (patch) | |
tree | b091e483035885543df1c4125efd8362d74a2fe3 /src | |
parent | 9879dfd3e4a1c0a617f802ed9195117c625c4307 (diff) | |
download | xine-lib-cf2da035d40199a0916fc012310ef0a164122f2d.tar.gz xine-lib-cf2da035d40199a0916fc012310ef0a164122f2d.tar.bz2 |
Fix seek using 'start_time'
CVS patchset: 3585
CVS date: 2002/12/18 20:32:20
Diffstat (limited to 'src')
-rw-r--r-- | src/demuxers/demux_qt.c | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c index ef7287e67..fc4af54d8 100644 --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -30,7 +30,7 @@ * build_frame_table * free_qt_info * - * $Id: demux_qt.c,v 1.128 2002/12/18 03:42:31 guenter Exp $ + * $Id: demux_qt.c,v 1.129 2002/12/18 20:32:20 esnel Exp $ * */ @@ -2141,30 +2141,54 @@ static int demux_qt_seek (demux_plugin_t *this_gen, /* perform a binary search on the sample table, testing the offset * boundaries first */ - if (start_pos <= this->qt->frames[0].offset) - best_index = 0; - else if (start_pos >= this->qt->frames[this->qt->frame_count - 1].offset) { - this->status = DEMUX_FINISHED; - return this->status; - } else { - left = 0; - right = this->qt->frame_count - 1; - found = 0; - - while (!found) { - middle = (left + right) / 2; - if ((start_pos >= this->qt->frames[middle].offset) && - (start_pos <= this->qt->frames[middle].offset + - this->qt->frames[middle].size)) { - found = 1; - } else if (start_pos < this->qt->frames[middle].offset) { - right = middle; - } else { - left = middle; + if (start_pos) { + if (start_pos <= this->qt->frames[0].offset) + best_index = 0; + else if (start_pos >= this->qt->frames[this->qt->frame_count - 1].offset) { + this->status = DEMUX_FINISHED; + return this->status; + } else { + left = 0; + right = this->qt->frame_count - 1; + found = 0; + + while (!found) { + middle = (left + right) / 2; + if ((start_pos >= this->qt->frames[middle].offset) && + (start_pos <= this->qt->frames[middle].offset + + this->qt->frames[middle].size)) { + found = 1; + } else if (start_pos < this->qt->frames[middle].offset) { + right = middle; + } else { + left = middle; + } } + + best_index = middle; } + } else { + int64_t pts = 90000 * start_time; - best_index = middle; + if (pts <= this->qt->frames[0].pts) + best_index = 0; + else if (pts >= this->qt->frames[this->qt->frame_count - 1].pts) { + this->status = DEMUX_FINISHED; + return this->status; + } else { + left = 0; + right = this->qt->frame_count - 1; + do { + middle = (left + right + 1) / 2; + if (pts < this->qt->frames[middle].pts) { + right = (middle - 1); + } else { + left = middle; + } + } while (left < right); + + best_index = middle; + } } /* search back in the table for the nearest keyframe */ |