@ -35,45 +35,38 @@ typedef struct NoiseContext {
unsigned int state ;
} NoiseContext ;
static int noise ( AVBSFContext * ctx , AVPacket * ou t)
static int noise ( AVBSFContext * ctx , AVPacket * pk t)
{
NoiseContext * s = ctx - > priv_data ;
AVPacket * in ;
int amount = s - > amount > 0 ? s - > amount : ( s - > state % 10001 + 1 ) ;
int i , ret = 0 ;
if ( amount < = 0 )
return AVERROR ( EINVAL ) ;
ret = ff_bsf_get_packet ( ctx , & in ) ;
ret = ff_bsf_get_packet_ref ( ctx , pkt ) ;
if ( ret < 0 )
return ret ;
if ( s - > dropamount > 0 & & s - > state % s - > dropamount = = 0 ) {
s - > state + + ;
av_packet_free ( & in ) ;
av_packet_unref ( pkt ) ;
return AVERROR ( EAGAIN ) ;
}
ret = av_new_packet ( out , in - > size ) ;
ret = av_packet_make_writable ( pkt ) ;
if ( ret < 0 )
goto fail ;
ret = av_packet_copy_props ( out , in ) ;
if ( ret < 0 )
goto fail ;
memcpy ( out - > data , in - > data , in - > size ) ;
for ( i = 0 ; i < out - > size ; i + + ) {
s - > state + = out - > data [ i ] + 1 ;
for ( i = 0 ; i < pkt - > size ; i + + ) {
s - > state + = pkt - > data [ i ] + 1 ;
if ( s - > state % amount = = 0 )
ou t- > data [ i ] = s - > state ;
pkt - > data [ i ] = s - > state ;
}
fail :
if ( ret < 0 )
av_packet_unref ( ou t) ;
av_packet_free ( & in ) ;
av_packet_unref ( pkt ) ;
return ret ;
}