@ -24,6 +24,7 @@
# define AVCODEC_BYTESTREAM_H
# define AVCODEC_BYTESTREAM_H
# include <string.h>
# include <string.h>
# include "libavutil/common.h"
# include "libavutil/common.h"
# include "libavutil/intreadwrite.h"
# include "libavutil/intreadwrite.h"
@ -36,46 +37,52 @@ typedef struct {
int eof ;
int eof ;
} PutByteContext ;
} PutByteContext ;
# define DEF_T(type, name, bytes, read, write) \
# define DEF_T(type, name, bytes, read, write) \
static av_always_inline type bytestream_get_ # # name ( const uint8_t * * b ) { \
static av_always_inline type bytestream_get_ # # name ( const uint8_t * * b ) \
( * b ) + = bytes ; \
{ \
return read ( * b - bytes ) ; \
( * b ) + = bytes ; \
} \
return read ( * b - bytes ) ; \
static av_always_inline void bytestream_put_ # # name ( uint8_t * * b , const type value ) { \
} \
write ( * b , value ) ; \
static av_always_inline void bytestream_put_ # # name ( uint8_t * * b , \
( * b ) + = bytes ; \
const type value ) \
} \
{ \
static av_always_inline void bytestream2_put_ # # name # # u ( PutByteContext * p , const type value ) \
write ( * b , value ) ; \
{ \
( * b ) + = bytes ; \
bytestream_put_ # # name ( & p - > buffer , value ) ; \
} \
} \
static av_always_inline void bytestream2_put_ # # name # # u ( PutByteContext * p , \
static av_always_inline void bytestream2_put_ # # name ( PutByteContext * p , const type value ) { \
const type value ) \
if ( ! p - > eof & & ( p - > buffer_end - p - > buffer > = bytes ) ) { \
{ \
write ( p - > buffer , value ) ; \
bytestream_put_ # # name ( & p - > buffer , value ) ; \
p - > buffer + = bytes ; \
} \
} else \
static av_always_inline void bytestream2_put_ # # name ( PutByteContext * p , \
p - > eof = 1 ; \
const type value ) \
} \
{ \
static av_always_inline type bytestream2_get_ # # name # # u ( GetByteContext * g ) \
if ( ! p - > eof & & ( p - > buffer_end - p - > buffer > = bytes ) ) { \
{ \
write ( p - > buffer , value ) ; \
return bytestream_get_ # # name ( & g - > buffer ) ; \
p - > buffer + = bytes ; \
} \
} else \
static av_always_inline type bytestream2_get_ # # name ( GetByteContext * g ) \
p - > eof = 1 ; \
{ \
} \
if ( g - > buffer_end - g - > buffer < bytes ) \
static av_always_inline type bytestream2_get_ # # name # # u ( GetByteContext * g ) \
return 0 ; \
{ \
return bytestream2_get_ # # name # # u ( g ) ; \
return bytestream_get_ # # name ( & g - > buffer ) ; \
} \
} \
static av_always_inline type bytestream2_peek_ # # name ( GetByteContext * g ) \
static av_always_inline type bytestream2_get_ # # name ( GetByteContext * g ) \
{ \
{ \
if ( g - > buffer_end - g - > buffer < bytes ) \
if ( g - > buffer_end - g - > buffer < bytes ) \
return 0 ; \
return 0 ; \
return read ( g - > buffer ) ; \
return bytestream2_get_ # # name # # u ( g ) ; \
} \
static av_always_inline type bytestream2_peek_ # # name ( GetByteContext * g ) \
{ \
if ( g - > buffer_end - g - > buffer < bytes ) \
return 0 ; \
return read ( g - > buffer ) ; \
}
}
# define DEF(name, bytes, read, write) \
# define DEF(name, bytes, read, write) \
DEF_T ( unsigned int , name , bytes , read , write )
DEF_T ( unsigned int , name , bytes , read , write )
# define DEF64(name, bytes, read, write) \
# define DEF64(name, bytes, read, write) \
DEF_T ( uint64_t , name , bytes , read , write )
DEF_T ( uint64_t , name , bytes , read , write )
DEF64 ( le64 , 8 , AV_RL64 , AV_WL64 )
DEF64 ( le64 , 8 , AV_RL64 , AV_WL64 )
@ -129,15 +136,17 @@ DEF (byte, 1, AV_RB8 , AV_WB8 )
# endif
# endif
static av_always_inline void bytestream2_init ( GetByteContext * g ,
static av_always_inline void bytestream2_init ( GetByteContext * g ,
const uint8_t * buf , int buf_size )
const uint8_t * buf ,
int buf_size )
{
{
g - > buffer = buf ;
g - > buffer = buf ;
g - > buffer_start = buf ;
g - > buffer_start = buf ;
g - > buffer_end = buf + buf_size ;
g - > buffer_end = buf + buf_size ;
}
}
static av_always_inline void bytestream2_init_writer ( PutByteContext * p ,
static av_always_inline void bytestream2_init_writer ( PutByteContext * p ,
uint8_t * buf , int buf_size )
uint8_t * buf ,
int buf_size )
{
{
p - > buffer = buf ;
p - > buffer = buf ;
p - > buffer_start = buf ;
p - > buffer_start = buf ;
@ -183,21 +192,22 @@ static av_always_inline int bytestream2_tell_p(PutByteContext *p)
return ( int ) ( p - > buffer - p - > buffer_start ) ;
return ( int ) ( p - > buffer - p - > buffer_start ) ;
}
}
static av_always_inline int bytestream2_seek ( GetByteContext * g , int offset ,
static av_always_inline int bytestream2_seek ( GetByteContext * g ,
int offset ,
int whence )
int whence )
{
{
switch ( whence ) {
switch ( whence ) {
case SEEK_CUR :
case SEEK_CUR :
offset = av_clip ( offset , - ( g - > buffer - g - > buffer_start ) ,
offset = av_clip ( offset , - ( g - > buffer - g - > buffer_start ) ,
g - > buffer_end - g - > buffer ) ;
g - > buffer_end - g - > buffer ) ;
g - > buffer + = offset ;
g - > buffer + = offset ;
break ;
break ;
case SEEK_END :
case SEEK_END :
offset = av_clip ( offset , - ( g - > buffer_end - g - > buffer_start ) , 0 ) ;
offset = av_clip ( offset , - ( g - > buffer_end - g - > buffer_start ) , 0 ) ;
g - > buffer = g - > buffer_end + offset ;
g - > buffer = g - > buffer_end + offset ;
break ;
break ;
case SEEK_SET :
case SEEK_SET :
offset = av_clip ( offset , 0 , g - > buffer_end - g - > buffer_start ) ;
offset = av_clip ( offset , 0 , g - > buffer_end - g - > buffer_start ) ;
g - > buffer = g - > buffer_start + offset ;
g - > buffer = g - > buffer_start + offset ;
break ;
break ;
default :
default :
@ -206,7 +216,8 @@ static av_always_inline int bytestream2_seek(GetByteContext *g, int offset,
return bytestream2_tell ( g ) ;
return bytestream2_tell ( g ) ;
}
}
static av_always_inline int bytestream2_seek_p ( PutByteContext * p , int offset ,
static av_always_inline int bytestream2_seek_p ( PutByteContext * p ,
int offset ,
int whence )
int whence )
{
{
p - > eof = 0 ;
p - > eof = 0 ;
@ -214,20 +225,20 @@ static av_always_inline int bytestream2_seek_p(PutByteContext *p, int offset,
case SEEK_CUR :
case SEEK_CUR :
if ( p - > buffer_end - p - > buffer < offset )
if ( p - > buffer_end - p - > buffer < offset )
p - > eof = 1 ;
p - > eof = 1 ;
offset = av_clip ( offset , - ( p - > buffer - p - > buffer_start ) ,
offset = av_clip ( offset , - ( p - > buffer - p - > buffer_start ) ,
p - > buffer_end - p - > buffer ) ;
p - > buffer_end - p - > buffer ) ;
p - > buffer + = offset ;
p - > buffer + = offset ;
break ;
break ;
case SEEK_END :
case SEEK_END :
if ( offset > 0 )
if ( offset > 0 )
p - > eof = 1 ;
p - > eof = 1 ;
offset = av_clip ( offset , - ( p - > buffer_end - p - > buffer_start ) , 0 ) ;
offset = av_clip ( offset , - ( p - > buffer_end - p - > buffer_start ) , 0 ) ;
p - > buffer = p - > buffer_end + offset ;
p - > buffer = p - > buffer_end + offset ;
break ;
break ;
case SEEK_SET :
case SEEK_SET :
if ( p - > buffer_end - p - > buffer_start < offset )
if ( p - > buffer_end - p - > buffer_start < offset )
p - > eof = 1 ;
p - > eof = 1 ;
offset = av_clip ( offset , 0 , p - > buffer_end - p - > buffer_start ) ;
offset = av_clip ( offset , 0 , p - > buffer_end - p - > buffer_start ) ;
p - > buffer = p - > buffer_start + offset ;
p - > buffer = p - > buffer_start + offset ;
break ;
break ;
default :
default :
@ -280,14 +291,18 @@ static av_always_inline unsigned int bytestream2_get_eof(PutByteContext *p)
return p - > eof ;
return p - > eof ;
}
}
static av_always_inline unsigned int bytestream_get_buffer ( const uint8_t * * b , uint8_t * dst , unsigned int size )
static av_always_inline unsigned int bytestream_get_buffer ( const uint8_t * * b ,
uint8_t * dst ,
unsigned int size )
{
{
memcpy ( dst , * b , size ) ;
memcpy ( dst , * b , size ) ;
( * b ) + = size ;
( * b ) + = size ;
return size ;
return size ;
}
}
static av_always_inline void bytestream_put_buffer ( uint8_t * * b , const uint8_t * src , unsigned int size )
static av_always_inline void bytestream_put_buffer ( uint8_t * * b ,
const uint8_t * src ,
unsigned int size )
{
{
memcpy ( * b , src , size ) ;
memcpy ( * b , src , size ) ;
( * b ) + = size ;
( * b ) + = size ;