Author: ods15
Date: Tue Nov 14 17:59:24 2006
New Revision: 203
Modified:
trunk/libnut/demuxer.c
trunk/libnut/libnut.h
Log:
add cache_syncpoints option
document what different options imply in libnut.h
Modified: trunk/libnut/demuxer.c
============================================================
==================
--- trunk/libnut/demuxer.c (original)
+++ trunk/libnut/demuxer.c Tue Nov 14 17:59:24 2006
 -399,6
+399,7 
syncpoint_list_t * sl = &nut->syncpoints;
int i, j;
+ assert(nut->dopts.cache_syncpoints & 1 || !pts); //
pts information is never stored with no syncpoint cache
for (i = sl->len; i--; ) { // more often than not,
we're adding at end of list
if (sl->s[i].pos > sp.pos) continue;
if (sp.pos < sl->s[i].pos + 16) { // syncpoint
already in list
 -421,29
+422,36 
}
i++;
if (sl->len + 1 > sl->alloc_len) {
- void * a, * b, * c;
+ void * a;
sl->alloc_len += PREALLOC_SIZE/4;
if (SIZE_MAX/sl->alloc_len < sizeof(syncpoint_t) ||
SIZE_MAX/sl->alloc_len < sizeof(uint64_t) *
nut->stream_count)
return -ERR_OUT_OF_MEM;
a = nut->alloc->realloc(sl->s, sl->alloc_len
* sizeof(syncpoint_t));
- b = nut->alloc->realloc(sl->pts,
sl->alloc_len * nut->stream_count * sizeof(uint64_t));
- c = nut->alloc->realloc(sl->eor,
sl->alloc_len * nut->stream_count * sizeof(uint64_t));
- if (!a || !b || !c) return -ERR_OUT_OF_MEM;
+ if (!a) return -ERR_OUT_OF_MEM;
sl->s = a;
- sl->pts = b;
- sl->eor = c;
+ if (nut->dopts.cache_syncpoints & 1) {
+ a = nut->alloc->realloc(sl->pts,
sl->alloc_len * nut->stream_count * sizeof(uint64_t));
+ if (!a) return -ERR_OUT_OF_MEM;
+ sl->pts = a;
+ a = nut->alloc->realloc(sl->eor,
sl->alloc_len * nut->stream_count * sizeof(uint64_t));
+ if (!a) return -ERR_OUT_OF_MEM;
+ sl->eor = a;
+ }
}
memmove(sl->s + i + 1, sl->s + i, (sl->len - i) *
sizeof(syncpoint_t));
- memmove(sl->pts + (i + 1) * nut->stream_count,
sl->pts + i * nut->stream_count, (sl->len - i) *
nut->stream_count * sizeof(uint64_t));
- memmove(sl->eor + (i + 1) * nut->stream_count,
sl->eor + i * nut->stream_count, (sl->len - i) *
nut->stream_count * sizeof(uint64_t));
-
sl->s[i] = sp;
assert(sl->s[i].pts_valid == !!pts);
- for (j = 0; j < nut->stream_count; j++) {
- sl->pts[i * nut->stream_count + j] = pts ? pts[j] :
0;
- sl->eor[i * nut->stream_count + j] = eor ? eor[j] :
0;
+
+ if (nut->dopts.cache_syncpoints & 1) {
+ memmove(sl->pts + (i + 1) * nut->stream_count,
sl->pts + i * nut->stream_count, (sl->len - i) *
nut->stream_count * sizeof(uint64_t));
+ memmove(sl->eor + (i + 1) * nut->stream_count,
sl->eor + i * nut->stream_count, (sl->len - i) *
nut->stream_count * sizeof(uint64_t));
+ for (j = 0; j < nut->stream_count; j++) {
+ sl->pts[i * nut->stream_count + j] = pts ? pts[j]
: 0;
+ sl->eor[i * nut->stream_count + j] = eor ? eor[j]
: 0;
+ }
}
+
sl->len++;
if (out) *out = i;
return 0;
 -477,12
+485,12 
set_global_pts(nut, s.pts);
- if (/*nut->dopts.cache_syncpoints*/1) {
+ s.seen_next = 0;
+ s.pts_valid = 0;
+ if (nut->dopts.cache_syncpoints & 1) {
int i;
uint64_t pts[nut->stream_count];
uint64_t eor[nut->stream_count];
- s.seen_next = 0;
- s.pts_valid = 0;
for (i = 0; i < nut->stream_count; i++) {
pts[i] = nut->sc[i].last_key;
nut->sc[i].last_key = 0;
 -495,9
+503,11 
CHECK(add_syncpoint(nut, s, pts, eor, &i));
nut->syncpoints.s[i - 1].seen_next = 1;
}
- } /*else {
- if (!nut->syncpoints.len) add_syncpoint(nut, s);
- }*/
+ } else if (!nut->syncpoints.len ||
nut->dopts.cache_syncpoints) {
+ int i;
+ CHECK(add_syncpoint(nut, s, NULL, NULL, &i));
+ if (!after_seek) nut->syncpoints.s[i - 1].seen_next =
1;
+ }
err_out:
return err;
}
 -864,7
+874,7 
}
}
- if (nut->dopts.read_index &&
nut->i->isc.seek) {
+ if (nut->dopts.read_index) {
uint64_t idx_ptr;
if (nut->seek_status <= 1) {
if (nut->seek_status == 0) {
 -1005,14
+1015,6 
i--;
- /*if (!nut->dopts.cache_syncpoints &&
sl->len == 4 && (i == 0 || i == 2)) {
- if (i == 2) sl->s[1] = sl->s[2];
- else sl->s[1].back_ptr &= ~1;
- sl->s[2] = sl->s[3];
- i >>= 1;
- sl->len = 3;
- }*/
-
lo = sl->s[i].pos;
lop = sl->s[i].pts;
hi = sl->s[i+1].pos;
 -1022,7
+1024,7 
while (!sl->s[i].seen_next) {
// start binary search between sl->s[i].pos (lo) to
sl->s[i+1].pos (hi) ...
off_t guess;
- int res;
+ int res, tmp;
double hi_pd = TO_DOUBLE_PTS(hip);
double lo_pd = TO_DOUBLE_PTS(lop);
a++;
 -1056,22
+1058,8 
lo = s.pos;
lop = s.pts;
}
- if (1/*nut->dopts.cache_syncpoints || sl->len ==
2*/) {
- int tmp;
- CHECK(add_syncpoint(nut, s, NULL, NULL, &tmp));
- if (!res) i = tmp;
- }/* else if (sl->len == 3) {
- if (s.pts > pts) {
- if (sl->s[1].pts > pts) sl->s[1] = s;
- else add_syncpoint(nut, s);
- } else {
- if (sl->s[1].pts <= pts) sl->s[1] = s;
- else i = add_syncpoint(nut, s);
- }
- } else {
- if (s.pts > pts) sl->s[2] = s;
- else sl->s[1] = s;
- }*/
+ CHECK(add_syncpoint(nut, s, NULL, NULL, &tmp)); //
unconditionally even without syncpoint cache
+ if (!res) i = tmp;
}
fprintf(stderr, "n[ (%d,%d) .. %d .. (%d,%d) ] =>
%d (%d seeks) %dn",
 -1273,6
+1261,7 
for (i = 0; i < nut->stream_count; i++)
state[i].pts = (uint64_t)(time_pos / TO_TB(i).nom *
TO_TB(i).den);
nut->seek_time_pos = time_pos;
+ nut->dopts.cache_syncpoints |= 2;
} else {
memcpy(state, nut->seek_state, sizeof state);
time_pos = nut->seek_time_pos;
 -1333,10
+1322,17 
fprintf(stderr, "DONE SEEKn");
err_out:
if (err != 2) { // unless EAGAIN
+ syncpoint_list_t * sl = &nut->syncpoints;
flush_buf(nut->i);
nut->before_seek = 0;
nut->alloc->free(nut->seek_state);
nut->seek_state = NULL;
+ nut->dopts.cache_syncpoints &= ~2;
+ if (!nut->dopts.cache_syncpoints && sl->len
> 1) {
+ sl->s[1] = sl->s[sl->len - 1];
+ sl->len = 2;
+ sl->s[0].seen_next = 0;
+ }
} else {
if (!nut->seek_state) nut->seek_state =
nut->alloc->malloc(sizeof state);
if (!nut->seek_state) return -ERR_OUT_OF_MEM;
 -1386,6
+1382,15 
return NULL;
}
+ // use only lsb for options
+ nut->dopts.cache_syncpoints =
!!nut->dopts.cache_syncpoints;
+ nut->dopts.read_index = !!nut->dopts.read_index;
+ if (!nut->i->isc.seek) {
+ nut->dopts.cache_syncpoints = 0;
+ nut->dopts.read_index = 0;
+ }
+ if (nut->dopts.read_index)
nut->dopts.cache_syncpoints = 1;
+
return nut;
}
Modified: trunk/libnut/libnut.h
============================================================
==================
--- trunk/libnut/libnut.h (original)
+++ trunk/libnut/libnut.h Tue Nov 14 17:59:24 2006
 -17,8
+17,8 
typedef struct {
void * priv;
size_t (*read)(void * priv, size_t len, uint8_t * buf);
- off_t (*seek)(void * priv, long long pos, int whence);
- int (*eof)(void * priv);
+ off_t (*seek)(void * priv, long long pos, int whence); //
can be NULL, but implies no read_index and no
cache_syncpoints
+ int (*eof)(void * priv); // can be NULL, implies any read
error is caused by EOF
off_t file_pos;
} nut_input_stream_t;
 -83,8
+83,8 
typedef struct {
nut_input_stream_t input;
nut_alloc_t alloc;
- int read_index;
- //int cache_syncpoints;
+ int read_index; // implies cache_syncpoints
+ int cache_syncpoints;
} nut_demuxer_opts_t;
typedef struct {
_______________________________________________
NUT-devel mailing list
NUT-devel mplayerhq.hu
http://lists.mplayerhq.hu/mailman/listinfo/nut-devel
|