summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEwald Snel <esnel@users.sourceforge.net>2002-12-18 20:32:20 +0000
committerEwald Snel <esnel@users.sourceforge.net>2002-12-18 20:32:20 +0000
commitcf2da035d40199a0916fc012310ef0a164122f2d (patch)
treeb091e483035885543df1c4125efd8362d74a2fe3 /src
parent9879dfd3e4a1c0a617f802ed9195117c625c4307 (diff)
downloadxine-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.c68
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 */