[MPlayer-dev-eng] NUT (informal) proposal, based on discussions
Michael Niedermayer
michaelni at gmx.at
Fri Jan 20 15:51:09 CET 2006
Hi
On Fri, Jan 20, 2006 at 04:21:06PM +0200, Oded Shimon wrote:
> On Fri, Jan 20, 2006 at 03:13:15PM +0100, Michael Niedermayer wrote:
> > Hi
> >
> > On Fri, Jan 20, 2006 at 02:59:25PM +0100, Michael Niedermayer wrote:
> > [...]
> > > [...]
> > > > BTW, does anyone have a good idea for efficient but simple data structure
> > > > for decoded index?... The naive way requires
> > > > streams*syncpoints*sizeof(uint64_t) memory, which is too much. (5mb of
> > > > ram?..) Any other idea I can think of requires some complication for
> > > > just using the values or changing them... (I still want the ability to
> > > > dynamically build the index while playing)
> > >
> > > 5mb? i came up with 10mb for a 4gb 10stream file, and for thouse now shouting
> > > 10mb isnt an issue for 4gb files, it is a big issue as thats RAM and a DVD
> > > player shouldnt need 10mb RAM for the index
> > > ahh, one solution, drop the PTS and the index will need <200kb in RAM
> > > and yes every demuxer will do this IMHO, it doesnt even break optimal
> > > seeking:
> > > exact seeking: find the prevous syncpoint P for timestamp X then find the
> > > earliest syncpoint which has a keyframe prior P in every wanted stream
> > > optimal seeking: do the same but additionally check if syncpoint P itself
> > > already contains a keyframe for every stream we want (0 seeks) and if so
> > > check if they are before X (1 extra seek)
> > > now let the flamewars begin again about why 10mb memory, 64x larger RAM
> > > and 10x larger index in the file is worth saving 1 _rarely_needed_ seek
> > > for optimal seeking
> >
> > after thinking about it a little the RAM argument obviously is silly
> > just have an array of indexes/pointers (4*syncpoints bytes) and let
> > these point into a array which has stream_id+pts entries its not as
> > simply as a simple flat array but it needs just 4*syncpoints + 10*keyframes
> > bytes, instead of 8*streams*syncpoints
>
> I already did something similar and crazier:
>
> struct syncpoint_list {
> off_t * pos;
> uint64_t * pts;
> int len;
> } s;
> uint64_t * p = s->pts;
>
> for (i = 0; i < sl->len; i++) {
> int n = s->pos[i] % (nut->stream_count + 1);
> for (j = 0; j < n; j++) {
> stream = p[j] % nut->stream_count;
> pts = p[j] / nut->stream_count;
> ...
> }
> p += n;
> }
>
>
> But I evantually decided it is not worth it. BTW, without the pts, decoded
> index is still nowhere near <200kb, it is atleast 1mb to store just off_t
> of syncpoint positions.
if you do store them all, a player can always choose to keep as much or
as little in RAM as it wants, and i wouldnt be surprised if many just
extract the video key pos + pts and discard the rest ...
>
> > a player chould also choose to simplify the PTS based on the set of active
> > streams during index loading
>
> In libnut API active_streams is defined at nut_seek, not init.
sure, but not everyone will use libnut
[...]
--
Michael
More information about the MPlayer-dev-eng
mailing list