diff options
author | Monty <xiphmont@xiph.org> | 2002-05-08 03:34:10 +0000 |
---|---|---|
committer | Monty <xiphmont@xiph.org> | 2002-05-08 03:34:10 +0000 |
commit | 7a5c1a2e198ac322810ab17fa754cb09d4e408b4 (patch) | |
tree | bf01f0361c59ed9beeaaf9b1a2d21453f9c4385c | |
parent | 7902656b7cc7b5e0e092702ad6be46e70dafeee7 (diff) | |
download | ogg-git-7a5c1a2e198ac322810ab17fa754cb09d4e408b4.tar.gz |
Tested changes needed for ongoing work on branches in vorbis/
Add bitpack copy and checkpoint functions
svn path=/trunk/ogg/; revision=3289
-rw-r--r-- | include/ogg/ogg.h | 11 | ||||
-rw-r--r-- | src/bitwise.c | 46 |
2 files changed, 55 insertions, 2 deletions
diff --git a/include/ogg/ogg.h b/include/ogg/ogg.h index 41ad86a..ab4f8d5 100644 --- a/include/ogg/ogg.h +++ b/include/ogg/ogg.h @@ -11,7 +11,7 @@ ******************************************************************** function: toplevel libogg include - last mod: $Id: ogg.h,v 1.14 2002/03/07 03:36:52 xiphmont Exp $ + last mod: $Id: ogg.h,v 1.15 2002/05/08 03:34:09 xiphmont Exp $ ********************************************************************/ #ifndef _OGG_H @@ -110,6 +110,9 @@ typedef struct { /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ extern void oggpack_writeinit(oggpack_buffer *b); +extern void oggpack_writetrunc(oggpack_buffer *b,long bits); +extern void oggpack_writealign(oggpack_buffer *b); +extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); extern void oggpack_reset(oggpack_buffer *b); extern void oggpack_writeclear(oggpack_buffer *b); extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); @@ -175,3 +178,9 @@ extern void ogg_packet_clear(ogg_packet *op); #endif #endif /* _OGG_H */ + + + + + + diff --git a/src/bitwise.c b/src/bitwise.c index e0bb58e..303dd84 100644 --- a/src/bitwise.c +++ b/src/bitwise.c @@ -11,7 +11,7 @@ ******************************************************************** function: packing variable sized words into an octet stream - last mod: $Id: bitwise.c,v 1.11 2002/01/19 04:06:53 xiphmont Exp $ + last mod: $Id: bitwise.c,v 1.12 2002/05/08 03:34:10 xiphmont Exp $ ********************************************************************/ @@ -40,6 +40,50 @@ void oggpack_writeinit(oggpack_buffer *b){ b->storage=BUFFER_INCREMENT; } +void oggpack_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr|=mask[bits]; +} + +void oggpack_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpack_write(b,0,bits); +} + +void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ + unsigned char *ptr=(unsigned char *)source; + + long bytes=bits/8; + bits-=bytes*8; + + if(b->endbit){ + int i; + /* unaligned copy. Do it the hard way. */ + for(i=0;i<bytes;i++) + oggpack_write(b,(long)(ptr[i]),8); + }else{ + /* aligned block copy */ + if(b->endbyte+bytes+1>=b->storage){ + b->storage=b->endbyte+bytes+BUFFER_INCREMENT; + b->buffer=_ogg_realloc(b->buffer,b->storage); + b->ptr=b->buffer+b->endbyte; + } + + memmove(b->ptr,source,bytes); + b->ptr+=bytes; + b->buffer+=bytes; + *b->ptr=0; + + } + if(bits) + oggpack_write(b,(long)(ptr[bytes]),bits); +} + void oggpack_reset(oggpack_buffer *b){ b->ptr=b->buffer; b->buffer[0]=0; |