@ -76,8 +76,9 @@ typedef struct FlashSVContext {
int last_key_frame ;
} FlashSVContext ;
static int copy_region_enc ( uint8_t * sptr , uint8_t * dptr ,
int dx , int dy , int h , int w , int stride , uint8_t * pfptr ) {
static int copy_region_enc ( uint8_t * sptr , uint8_t * dptr , int dx , int dy ,
int h , int w , int stride , uint8_t * pfptr )
{
int i , j ;
uint8_t * nsptr ;
uint8_t * npfptr ;
@ -105,7 +106,7 @@ static av_cold int flashsv_encode_init(AVCodecContext *avctx)
if ( ( avctx - > width > 4095 ) | | ( avctx - > height > 4095 ) ) {
av_log ( avctx , AV_LOG_ERROR , " Input dimensions too large, input must be max 4096x4096 ! \n " ) ;
return - 1 ;
return AVERROR_INVALIDDATA ;
}
// Needed if zlib unused or init aborted before deflateInit
@ -121,15 +122,17 @@ static av_cold int flashsv_encode_init(AVCodecContext *avctx)
if ( ! s - > tmpblock | | ! s - > encbuffer ) {
av_log ( avctx , AV_LOG_ERROR , " Memory allocation failed. \n " ) ;
return - 1 ;
return AVERROR ( ENOMEM ) ;
}
return 0 ;
}
static int encode_bitstream ( FlashSVContext * s , AVFrame * p , uint8_t * buf , int buf_size ,
int block_width , int block_height , uint8_t * previous_frame , int * I_frame ) {
static int encode_bitstream ( FlashSVContext * s , AVFrame * p , uint8_t * buf ,
int buf_size , int block_width , int block_height ,
uint8_t * previous_frame , int * I_frame )
{
PutBitContext pb ;
int h_blocks , v_blocks , h_part , v_part , i , j ;
@ -151,15 +154,13 @@ static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, int buf
v_part = s - > image_height % block_height ;
/* loop over all block columns */
for ( j = 0 ; j < v_blocks + ( v_part ? 1 : 0 ) ; j + + )
{
for ( j = 0 ; j < v_blocks + ( v_part ? 1 : 0 ) ; j + + ) {
int hp = j * block_height ; // horiz position in frame
int hs = ( j < v_blocks ) ? block_height : v_part ; // size of block
/* loop over all block rows */
for ( i = 0 ; i < h_blocks + ( h_part ? 1 : 0 ) ; i + + )
{
for ( i = 0 ; i < h_blocks + ( h_part ? 1 : 0 ) ; i + + ) {
int wp = i * block_width ; // vert position in frame
int ws = ( i < h_blocks ) ? block_width : h_part ; // size of block
int ret = Z_OK ;
@ -167,8 +168,11 @@ static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, int buf
ptr = buf + buf_pos ;
//copy the block to the temp buffer before compression (if it differs from the previous frame's block)
res = copy_region_enc ( p - > data [ 0 ] , s - > tmpblock , s - > image_height - ( hp + hs + 1 ) , wp , hs , ws , p - > linesize [ 0 ] , previous_frame ) ;
/* copy the block to the temp buffer before compression
* ( if it differs from the previous frame ' s block ) */
res = copy_region_enc ( p - > data [ 0 ] , s - > tmpblock ,
s - > image_height - ( hp + hs + 1 ) ,
wp , hs , ws , p - > linesize [ 0 ] , previous_frame ) ;
if ( res | | * I_frame ) {
unsigned long zsize ;
@ -200,7 +204,8 @@ static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, int buf
}
static int flashsv_encode_frame ( AVCodecContext * avctx , uint8_t * buf , int buf_size , void * data )
static int flashsv_encode_frame ( AVCodecContext * avctx , uint8_t * buf ,
int buf_size , void * data )
{
FlashSVContext * const s = avctx - > priv_data ;
AVFrame * pict = data ;
@ -217,7 +222,7 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz
s - > previous_frame = av_mallocz ( FFABS ( p - > linesize [ 0 ] ) * s - > image_height ) ;
if ( ! s - > previous_frame ) {
av_log ( avctx , AV_LOG_ERROR , " Memory allocation failed. \n " ) ;
return - 1 ;
return AVERROR ( ENOMEM ) ;
}
I_frame = 1 ;
}
@ -239,7 +244,8 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz
if ( buf_size < s - > image_width * s - > image_height * 3 ) {
//Conservative upper bound check for compressed data
av_log ( avctx , AV_LOG_ERROR , " buf_size %d < %d \n " , buf_size , s - > image_width * s - > image_height * 3 ) ;
av_log ( avctx , AV_LOG_ERROR , " buf_size %d < %d \n " ,
buf_size , s - > image_width * s - > image_height * 3 ) ;
return - 1 ;
}
@ -249,7 +255,8 @@ static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_siz
if ( p - > linesize [ 0 ] > 0 )
memcpy ( s - > previous_frame , p - > data [ 0 ] , s - > image_height * p - > linesize [ 0 ] ) ;
else
memcpy ( s - > previous_frame , p - > data [ 0 ] + p - > linesize [ 0 ] * ( s - > image_height - 1 ) , s - > image_height * FFABS ( p - > linesize [ 0 ] ) ) ;
memcpy ( s - > previous_frame , p - > data [ 0 ] + p - > linesize [ 0 ] * ( s - > image_height - 1 ) ,
s - > image_height * FFABS ( p - > linesize [ 0 ] ) ) ;
//mark the frame type so the muxer can mux it correctly
if ( I_frame ) {
@ -281,13 +288,13 @@ static av_cold int flashsv_encode_end(AVCodecContext *avctx)
}
AVCodec ff_flashsv_encoder = {
" flashsv " ,
AVMEDIA_TYPE_VIDEO ,
CODEC_ID_FLASHSV ,
sizeof ( FlashSVContext ) ,
flashsv_encode_init ,
flashsv_encode_frame ,
flashsv_encode_end ,
. name = " flashsv " ,
. type = AVMEDIA_TYPE_VIDEO ,
. id = CODEC_ID_FLASHSV ,
. priv_data_size = sizeof ( FlashSVContext ) ,
. init = flashsv_encode_init ,
. encode = flashsv_encode_frame ,
. close = flashsv_encode_end ,
. pix_fmts = ( const enum PixelFormat [ ] ) { PIX_FMT_BGR24 , PIX_FMT_NONE } ,
. long_name = NULL_IF_CONFIG_SMALL ( " Flash Screen Video " ) ,
} ;