[nut]: r203 - in trunk/libnut: demuxer.c libnut.h

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) %d\n", @@ -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 SEEK\n"); 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 {
participants (1)
-
ods15