Hello, I recently added discontinuous stream support to libogg1. The patch is attached. I also wrote Writ codec for libogg1 (based on original code by Arc), and sample Writ encoder (SubRip to Writ converter) and decoder. Is anybody interested? WBR, Roman. -------------- next part -------------- Index: include/ogg/ogg.h ==================================================================--- include/ogg/ogg.h (revision 12848) +++ include/ogg/ogg.h (working copy) @@ -80,6 +80,7 @@ (which is in a seperate abstraction layer) also knows about the gap */ ogg_int64_t granulepos; + int discont; /* 0 = continuous, 1 = discontinuous */ } ogg_stream_state; @@ -176,6 +177,7 @@ /* Ogg BITSTREAM PRIMITIVES: general ***************************/ extern int ogg_stream_init(ogg_stream_state *os,int serialno); +extern int ogg_stream_setdiscont(ogg_stream_state *os); extern int ogg_stream_clear(ogg_stream_state *os); extern int ogg_stream_reset(ogg_stream_state *os); extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); Index: src/framing.c ==================================================================--- src/framing.c (revision 12848) +++ src/framing.c (working copy) @@ -214,6 +214,15 @@ return(0); } +int ogg_stream_setdiscont(ogg_stream_state *os){ + /* Discont mode must be known and set before Page 1 is processed */ + if(os->pageno==0/*||(os->pageno==1&&os->packets==0)*/){ + os->discont=1; + return(0); + } + return(-1); +} + int ogg_stream_destroy(ogg_stream_state *os){ if(os){ ogg_stream_clear(os); @@ -304,7 +313,7 @@ /* Store lacing vals for this packet */ for(i=0;i<lacing_vals-1;i++){ os->lacing_vals[os->lacing_fill+i]=255; - os->granule_vals[os->lacing_fill+i]=os->granulepos; + os->granule_vals[os->lacing_fill+i]=granulepos; } os->lacing_vals[os->lacing_fill+i]=bytes%255; os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; @@ -367,11 +376,14 @@ } } }else{ + int cont=1; for(vals=0;vals<maxvals;vals++){ if(acc>4096)break; acc+=os->lacing_vals[vals]&0x0ff; - if((os->lacing_vals[vals]&0xff)<255) + if(os->discont?cont&&os->lacing_vals[vals]&0x100:os->lacing_vals[vals]&0xff<255){ granule_pos=os->granule_vals[vals]; + cont=0; + } } } @@ -783,7 +795,8 @@ bos=0; } - if(val<255)saved=os->lacing_fill; + if(os->discont?saved==-1&&!continued:val<255)saved=os->lacing_fill; + if(val<255)continued=0; os->lacing_fill++; segptr++; @@ -791,7 +804,9 @@ if(val<255)os->lacing_packet=os->lacing_fill; } - /* set the granulepos on the last granuleval of the last full packet */ + /* set the granulepos on the last granuleval of the last full packet + OR, for discontinuous stream, + set the granulepos on the first granuleval of the first packet */ if(saved!=-1){ os->granule_vals[saved]=granulepos; } @@ -834,6 +849,7 @@ os->pageno=-1; os->packetno=0; os->granulepos=0; + os->discont=0; return(0); } @@ -873,6 +889,7 @@ int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ + if(op&&os->discont)op->granulepos=os->granule_vals[ptr]; while(size==255){ int val=os->lacing_vals[++ptr]; size=val&0xff; @@ -885,7 +902,7 @@ op->b_o_s=bos; op->packet=os->body_data+os->body_returned; op->packetno=os->packetno; - op->granulepos=os->granule_vals[ptr]; + if(!os->discont)op->granulepos=os->granule_vals[ptr]; op->bytes=bytes; }