[NUT] (ods15): r109 - in /trunk/libnut: demuxer.c priv.h

Author: ods15 Date: Thu Mar 16 19:40:12 2006 New Revision: 109 Log: switch to struct bit flag instead of hacks with lsb in syncpoint cache Modified: trunk/libnut/demuxer.c trunk/libnut/priv.h Modified: trunk/libnut/demuxer.c ============================================================================== --- trunk/libnut/demuxer.c (original) +++ trunk/libnut/demuxer.c Thu Mar 16 19:40:12 2006 @@ -324,18 +324,17 @@ int i, j; for (i = sl->len; i--; ) { // more often than not, we're adding at end of list - off_t pos = sl->s[i].pos >> 1; - if (pos > sp.pos) continue; - if (sp.pos < pos + 16) { // syncpoint already in list - sl->s[i].pos = (sp.pos << 1) | (sl->s[i].pos & 1); // refine accuracy of syncpoint position + if (sl->s[i].pos > sp.pos) continue; + if (sp.pos < sl->s[i].pos + 16) { // syncpoint already in list + sl->s[i].pos = sp.pos; if (pts) { - sl->s[i].pos |= 1; for (j = 0; j < nut->stream_count; j++) { - assert(!sl->pts[i * nut->stream_count + j] || sl->pts[i * nut->stream_count + j] == pts[j]); + assert(!sl->s[i].pts_valid || sl->pts[i * nut->stream_count + j] == pts[j]); sl->pts[i * nut->stream_count + j] = pts[j]; - assert(!sl->eor[i * nut->stream_count + j] || sl->eor[i * nut->stream_count + j] == eor[j]); + assert(!sl->s[i].pts_valid || sl->eor[i * nut->stream_count + j] == eor[j]); sl->eor[i * nut->stream_count + j] = eor[j]; } + sl->s[i].pts_valid = 1; } return i; } @@ -353,8 +352,7 @@ 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; - sl->s[i].pos <<= 1; // flag - if (pts) sl->s[i].pos |= 1; + 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; @@ -384,7 +382,7 @@ GET_V(tmp, s.pts); GET_V(tmp, s.back_ptr); - s.back_ptr = (s.back_ptr * 16 + 15)<<1; + s.back_ptr = s.back_ptr * 16 + 15; set_global_pts(nut, s.pts); @@ -392,6 +390,8 @@ 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; @@ -400,8 +400,9 @@ } if (after_seek) add_syncpoint(nut, s, NULL, NULL); else { + s.pts_valid = 1; i = add_syncpoint(nut, s, pts, eor); - nut->syncpoints.s[i - 1].back_ptr |= 1; + nut->syncpoints.s[i - 1].seen_next = 1; } } /*else { if (!nut->syncpoints.len) add_syncpoint(nut, s); @@ -435,11 +436,13 @@ sl->eor = realloc(sl->eor, sl->alloc_len * sizeof(uint64_t) * nut->stream_count); for (i = 0; i < sl->len; i++) { - GET_V(tmp, x); - x *= 16; - sl->s[i].pos = (x << 1) + (i ? sl->s[i-1].pos : 1); - sl->s[i].back_ptr = 1; + GET_V(tmp, sl->s[i].pos); + sl->s[i].pos *= 16; + if (i) sl->s[i].pos += sl->s[i-1].pos; + sl->s[i].back_ptr = 0; sl->s[i].pts = 0; + sl->s[i].seen_next = 1; + sl->s[i].pts_valid = 1; } for (i = 0; i < nut->stream_count; i++) { int j; @@ -614,7 +617,9 @@ GET_V(tmp, res->pts); GET_V(tmp, res->back_ptr); - res->back_ptr = (res->back_ptr * 16 + 15) << 1; + res->back_ptr = res->back_ptr * 16 + 15; + res->seen_next = 0; + res->pts_valid = 0; } if (!backwards) return 0; else ptr = bctello(nut->i); @@ -626,7 +631,7 @@ } if (stop && bctello(nut->i) >= stop) { - if (res) res->back_ptr = 1; + if (res) res->seen_next = 1; return 0; } @@ -839,14 +844,14 @@ } // find last syncpoint if it's not already found - if (!(sl->s[sl->len-1].back_ptr & 1)) { + if (!sl->s[sl->len-1].seen_next) { // searching bakwards from EOF if (!nut->seek_status) seek_buf(nut->i, 0, SEEK_END); nut->seek_status = 1; CHECK(find_syncpoint(nut, 1, &s, 0)); i = add_syncpoint(nut, s, NULL, NULL); assert(i == sl->len-1); - sl->s[i].back_ptr |= 1; + sl->s[i].seen_next = 1; nut->seek_status = 0; } err_out: @@ -880,7 +885,7 @@ } if (i == 0) { // there isn't any syncpoint smaller than requested int FIXME; // pos might not be accurate - seek_buf(nut->i, (sl->s[0].pos >> 1), SEEK_SET); // seeking to first syncpoint + seek_buf(nut->i, sl->s[0].pos, SEEK_SET); // seeking to first syncpoint clear_dts_cache(nut); nut->last_syncpoint = 0; goto err_out; @@ -896,13 +901,13 @@ sl->len = 3; }*/ - lo = sl->s[i].pos >> 1; + lo = sl->s[i].pos; lop = sl->s[i].pts; - hi = sl->s[i+1].pos >> 1; + hi = sl->s[i+1].pos; hip = sl->s[i+1].pts; if (nut->seek_status) hi = nut->seek_status; - while (!(sl->s[i].back_ptr & 1)) { + 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; @@ -924,9 +929,9 @@ CHECK(find_syncpoint(nut, 0, &s, hi)); nut->seek_status = 0; - if (s.back_ptr == 1 || s.pos >= hi) { // we got back to 'hi' + if (s.seen_next == 1 || s.pos >= hi) { // we got back to 'hi' // either we scanned everything from lo to hi, or we keep trying - if (guess <= lo + 16) sl->s[i].back_ptr |= 1; // we are done! + if (guess <= lo + 16) sl->s[i].seen_next = 1; // we are done! else hi = guess; continue; } @@ -957,11 +962,11 @@ } fprintf(stderr, "\n[ (%d,%d) .. %d .. (%d,%d) ] => %d (%d seeks) %d\n", - (int)lo, (int)lop, (int)timebases[0], (int)hi, (int)hip, (int)(lo - (sl->s[i].back_ptr>>1)), a, sl->s[i].back_ptr); + (int)lo, (int)lop, (int)timebases[0], (int)hi, (int)hip, (int)(lo - sl->s[i].back_ptr), a, sl->s[i].back_ptr); // at this point, s[i].pts < P < s[i+1].pts, and s[i].flag is set // meaning, there are no more syncpoints between s[i] to s[i+1] - *start = (sl->s[i].pos >> 1) - (sl->s[i].back_ptr>>1); - *end = sl->s[i+1].pos >> 1; + *start = sl->s[i].pos - sl->s[i].back_ptr; + *end = sl->s[i+1].pos; *stopper = sl->s[i+1]; err_out: return err; @@ -995,10 +1000,10 @@ } if (stopper) { - off_t back_ptr = (stopper->pos >> 1) - (stopper->back_ptr>>1); + off_t back_ptr = stopper->pos - stopper->back_ptr; for (i = 1; i < sl->len; i++) { - if ((sl->s[i].pos >> 1) > back_ptr + 15) { - if (sl->s[i-1].back_ptr & 1) stopper_syncpoint = sl->s[i].pos >> 1; + if (sl->s[i].pos > back_ptr + 15) { + if (sl->s[i-1].seen_next) stopper_syncpoint = sl->s[i].pos; break; } } @@ -1015,7 +1020,7 @@ int dont_flush = 0; int header_size = bctello(nut->i) - buf_before; if (stopper) { - if ((!stopper_syncpoint && buf_before > (stopper->pos >> 1) - (stopper->back_ptr>>1) + 15) || stopper_syncpoint == buf_before) { + if ((!stopper_syncpoint && buf_before > stopper->pos - stopper->back_ptr + 15) || stopper_syncpoint == buf_before) { int n = 1; stopper_syncpoint = buf_before; for (i = 0; i < nut->stream_count; i++) { @@ -1089,9 +1094,9 @@ ERROR(!backwards && min_pos < nut->before_seek, -ERR_NOT_SEEKABLE); // FIXME we're counting on syncpoint cache dopts.cache_syncpoints - for (i = 1; i < sl->len; i++) if ((sl->s[i].pos >> 1) > min_pos) break; + for (i = 1; i < sl->len; i++) if (sl->s[i].pos > min_pos) break; i--; - if (!(nut->seek_status & 1)) seek_buf(nut->i, (sl->s[i].pos >> 1), SEEK_SET); + if (!(nut->seek_status & 1)) seek_buf(nut->i, sl->s[i].pos, SEEK_SET); nut->seek_status |= 1; nut->last_syncpoint = 0; // last_key is invalid @@ -1168,7 +1173,7 @@ off_t start = 0, end = 0; uint64_t pts[nut->stream_count]; int backwards = flags & 1 ? time_pos < 0 : 1; - syncpoint_t stopper = { 0, 0, 0 }; + syncpoint_t stopper = { 0, 0, 0, 0, 0 }; if (!nut->i->isc.seek) return -ERR_NOT_SEEKABLE; @@ -1187,7 +1192,7 @@ for (i = 1; i < sl->len; i++) { int j; - if (!(sl->s[i].pos & 1)) continue; + if (!sl->s[i].pts_valid) continue; for (j = 0; j < nut->stream_count; j++) { uint64_t tmp; if (!(pts[j]&1)) continue; @@ -1207,14 +1212,14 @@ } if (good_sync == -2) good_sync = backup; // all active streams are eor, just pick a random point, sort of. - if ((sl->s[sl->len-1].back_ptr & 1) && last_sync && good_sync >= 0) { - for (i = good_sync; i <= last_sync; i++) if (!(sl->s[i].pos & 1)) break; + if (sl->s[sl->len-1].seen_next && last_sync && good_sync >= 0) { + for (i = good_sync; i <= last_sync; i++) if (!sl->s[i].pts_valid) break; if (i != last_sync+1 && good_sync <= last_sync) good_sync = -1; } else good_sync = -1; if (good_sync >= 0) { - start = sl->s[good_sync].pos >> 1; - end = sl->s[++good_sync].pos >> 1; - if (flags & 2) end = sl->s[last_sync - 1].pos >> 1; // for forward seek + start = sl->s[good_sync].pos; + end = sl->s[++good_sync].pos; + if (flags & 2) end = sl->s[last_sync - 1].pos; // for forward seek } } Modified: trunk/libnut/priv.h ============================================================================== --- trunk/libnut/priv.h (original) +++ trunk/libnut/priv.h Thu Mar 16 19:40:12 2006 @@ -80,9 +80,11 @@ } frame_table_t; typedef struct { - off_t pos; // << 1, flag is "is pts correct" (in cache) + off_t pos; uint64_t pts; // coded in '% stream_count' - int back_ptr; // << 1, flag says if there is another syncpoint between this and next + int back_ptr:30; + unsigned int seen_next:1; + unsigned int pts_valid:1; } syncpoint_t; typedef struct {
participants (1)
-
syncmail@mplayerhq.hu