[NUT-devel] [nut]: r253 - trunk/libnut/demuxer.c
ods15
subversion at mplayerhq.hu
Sat Nov 18 20:46:25 CET 2006
Author: ods15
Date: Sat Nov 18 20:46:24 2006
New Revision: 253
Modified:
trunk/libnut/demuxer.c
Log:
add 'stop' capability to smart_find_syncpoint and migrate binary_search to from old find_syncpoint
Modified: trunk/libnut/demuxer.c
==============================================================================
--- trunk/libnut/demuxer.c (original)
+++ trunk/libnut/demuxer.c Sat Nov 18 20:46:24 2006
@@ -780,7 +780,7 @@
return err;
}
-static int find_syncpoint(nut_context_t * nut, int backwards, syncpoint_t * res, off_t stop) {
+static int find_syncpoint(nut_context_t * nut, syncpoint_t * res, int backwards, off_t stop) {
int read;
int err = 0;
uint64_t tmp;
@@ -839,7 +839,7 @@
return err;
}
-static int smart_find_syncpoint(nut_context_t * nut, syncpoint_t * sp, int backwards) {
+static int smart_find_syncpoint(nut_context_t * nut, syncpoint_t * sp, int backwards, off_t stop) {
struct find_syncpoint_state_s * fss = &nut->find_syncpoint_state;
syncpoint_list_t * sl = &nut->syncpoints;
int i = fss->i, err = 0;
@@ -847,17 +847,18 @@
ERROR(!(nut->dopts.cache_syncpoints & 1) || !sl->len, -1);
- if (!i) {
+ if (i) i--;
+ else {
for (i = 0; i < sl->len; i++) if (sl->s[i].pos+15 > pos) break;
ERROR(i == sl->len || (i && !sl->s[i-1].seen_next), -1);
- if (pos < sl->s[i].pos) // trust the caller if it gave more percise syncpoint location
- seek_buf(nut->i, sl->s[i].pos, SEEK_SET);
- } else i--;
+ // trust the caller if it gave more percise syncpoint location
+ if (pos < sl->s[i].pos) seek_buf(nut->i, sl->s[i].pos, SEEK_SET);
+ }
fss->i = i + 1;
fss->pos = pos;
- if (!fss->begin) CHECK(find_syncpoint(nut, 0, sp, sl->s[i].pos + 15 + 8));
+ if (!fss->begin) CHECK(find_syncpoint(nut, sp, 0, sl->s[i].pos + 15 + 8));
else sp->seen_next = 1;
if (sp->seen_next) { // failure
@@ -867,10 +868,10 @@
int o = backwards ? -1 : +1;
if (!fss->seeked) seek_buf(nut->i, sl->s[i+o].pos, SEEK_SET);
fss->seeked = 1;
- CHECK(find_syncpoint(nut, 0, sp, sl->s[i+o].pos + 15 + 8));
+ CHECK(find_syncpoint(nut, sp, 0, sl->s[i+o].pos + 15 + 8));
fss->seeked = 0;
fss->i = (i+=o) + 1;
- if (!sp->seen_next || !i) break;
+ if (!sp->seen_next || !i || (stop && sl->s[i+o].pos > stop)) break;
}
if (sp->seen_next) { // still nothing! let's linear search the whole area
if (!fss->seeked) {
@@ -878,7 +879,7 @@
else seek_buf(nut->i, begin > 0 ? sl->s[begin-1].pos+15 : 0, SEEK_SET);
}
fss->seeked = 1;
- CHECK(find_syncpoint(nut, backwards, sp, 0));
+ CHECK(find_syncpoint(nut, sp, backwards, stop));
fss->seeked = 0;
}
CHECK(add_syncpoint(nut, *sp, NULL, NULL, &i));
@@ -899,7 +900,7 @@
if (sp->pos < pos && !backwards) { // wow, how silly!
fss->pos = fss->i = fss->begin = fss->seeked = 0;
seek_buf(nut->i, pos, SEEK_SET);
- return smart_find_syncpoint(nut, sp, backwards);
+ return smart_find_syncpoint(nut, sp, backwards, stop);
}
}
fss->pos = fss->i = fss->begin = fss->seeked = 0;
@@ -907,12 +908,12 @@
err_out:
if (err == -1) {
if (backwards && !fss->seeked) {
- CHECK(find_syncpoint(nut, 0, sp, pos + 15 + 8));
+ CHECK(find_syncpoint(nut, sp, 0, pos + 15 + 8));
if (!sp->seen_next) return 0;
seek_buf(nut->i, -nut->max_distance, SEEK_CUR);
}
fss->seeked = 1;
- CHECK(find_syncpoint(nut, backwards, sp, 0));
+ CHECK(find_syncpoint(nut, sp, backwards, stop));
fss->seeked = 0;
err = 0;
}
@@ -923,7 +924,7 @@
int err = 0;
if (nut->seek_status) { // in error mode!
syncpoint_t s;
- CHECK(smart_find_syncpoint(nut, &s, 0));
+ CHECK(smart_find_syncpoint(nut, &s, 0, 0));
nut->i->buf_ptr = get_buf(nut->i, s.pos); // go back to begginning of syncpoint
flush_buf(nut->i);
clear_dts_cache(nut);
@@ -1038,7 +1039,7 @@
seek_buf(nut->i, 0, SEEK_SET);
nut->seek_status = 1;
}
- CHECK(smart_find_syncpoint(nut, &sp, 0));
+ CHECK(smart_find_syncpoint(nut, &sp, 0, 0));
CHECK(add_syncpoint(nut, sp, NULL, NULL, NULL));
nut->i->buf_ptr = get_buf(nut->i, sp.pos); // rewind to the syncpoint, this is where playback starts...
nut->seek_status = 0;
@@ -1100,7 +1101,7 @@
// searching bakwards from EOF
if (!nut->seek_status) seek_buf(nut->i, -nut->max_distance, SEEK_END);
nut->seek_status = 1;
- CHECK(find_syncpoint(nut, 1, &s, 0));
+ CHECK(find_syncpoint(nut, &s, 1, 0));
CHECK(add_syncpoint(nut, s, NULL, NULL, &i));
assert(i == sl->len-1);
sl->s[i].seen_next = 1;
@@ -1142,7 +1143,7 @@
if (!nut->seek_status) seek_buf(nut->i, guess, SEEK_SET);
nut->seek_status = fake_hi; // so we know where to continue off...
- CHECK(find_syncpoint(nut, 0, &s, fake_hi));
+ CHECK(smart_find_syncpoint(nut, &s, 0, fake_hi));
nut->seek_status = 0;
if (s.seen_next == 1 || s.pos >= fake_hi) { // we got back to 'HI'
@@ -1179,7 +1180,7 @@
if (!nut->seek_status) seek_buf(nut->i, start, SEEK_SET);
nut->seek_status = 1;
// find closest syncpoint by linear search, SHOULD be one pointed by back_ptr...
- CHECK(smart_find_syncpoint(nut, &s, !!end));
+ CHECK(smart_find_syncpoint(nut, &s, !!end, 0));
clear_dts_cache(nut);
nut->last_syncpoint = 0; // last_key is invalid
seek_buf(nut->i, s.pos, SEEK_SET); // go back to syncpoint. This will not need a seek.
More information about the NUT-devel
mailing list