@ -24,6 +24,7 @@
# include "avcodec.h"
# include "dsputil.h"
# include "binkdata.h"
# include "binkdsp.h"
# include "mathops.h"
# define ALT_BITSTREAM_READER_LE
@ -60,8 +61,8 @@ static const int binkb_bundle_signed[BINKB_NB_SRC] = {
0 , 0 , 0 , 1 , 1 , 0 , 1 , 0 , 0 , 0
} ;
static u int32_t binkb_intra_quant [ 16 ] [ 64 ] ;
static u int32_t binkb_inter_quant [ 16 ] [ 64 ] ;
static int32_t binkb_intra_quant [ 16 ] [ 64 ] ;
static int32_t binkb_inter_quant [ 16 ] [ 64 ] ;
/**
* IDs for different data types used in Bink video codec
@ -109,11 +110,11 @@ typedef struct Bundle {
typedef struct BinkContext {
AVCodecContext * avctx ;
DSPContext dsp ;
BinkDSPContext bdsp ;
AVFrame pic , last ;
int version ; ///< internal Bink file version
int has_alpha ;
int swap_planes ;
ScanTable scantable ; ///< permutated scantable for DCT coeffs decoding
Bundle bundle [ BINKB_NB_SRC ] ; ///< bundles for decoding all data types
Tree col_high [ 16 ] ; ///< trees for decoding high nibble in "colours" data type
@ -580,8 +581,8 @@ static inline int binkb_get_value(BinkContext *c, int bundle_num)
* @ param quant_matrices quantization matrices
* @ return 0 for success , negative value in other cases
*/
static int read_dct_coeffs ( GetBitContext * gb , DCTELEM block [ 64 ] , const uint8_t * scan ,
const u int32_t quant_matrices [ 16 ] [ 64 ] , int q )
static int read_dct_coeffs ( GetBitContext * gb , int32_t block [ 64 ] , const uint8_t * scan ,
const int32_t quant_matrices [ 16 ] [ 64 ] , int q )
{
int coef_list [ 128 ] ;
int mode_list [ 128 ] ;
@ -590,7 +591,7 @@ static int read_dct_coeffs(GetBitContext *gb, DCTELEM block[64], const uint8_t *
int coef_count = 0 ;
int coef_idx [ 64 ] ;
int quant_idx ;
const u int32_t * quant ;
const int32_t * quant ;
coef_list [ list_end ] = 4 ; mode_list [ list_end + + ] = 0 ;
coef_list [ list_end ] = 24 ; mode_list [ list_end + + ] = 0 ;
@ -791,6 +792,7 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
const uint8_t * scan ;
int xoff , yoff ;
LOCAL_ALIGNED_16 ( DCTELEM , block , [ 64 ] ) ;
LOCAL_ALIGNED_16 ( int32_t , dctblock , [ 64 ] ) ;
int coordmap [ 64 ] ;
int ybias = is_key ? - 15 : 0 ;
int qp ;
@ -845,11 +847,11 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
dst [ coordmap [ * scan + + ] ] = binkb_get_value ( c , BINKB_SRC_COLORS ) ;
break ;
case 2 :
c - > dsp . clear_block ( block ) ;
block [ 0 ] = binkb_get_value ( c , BINKB_SRC_INTRA_DC ) ;
memset ( dctblock , 0 , sizeof ( * dctblock ) * 64 ) ;
dct block[ 0 ] = binkb_get_value ( c , BINKB_SRC_INTRA_DC ) ;
qp = binkb_get_value ( c , BINKB_SRC_INTRA_Q ) ;
read_dct_coeffs ( gb , block , c - > scantable . permutated , binkb_intra_quant , qp ) ;
c - > dsp . idct_put ( dst , stride , block ) ;
read_dct_coeffs ( gb , dct block, bink_scan , binkb_intra_quant , qp ) ;
c - > b dsp. idct_put ( dst , stride , dct block) ;
break ;
case 3 :
xoff = binkb_get_value ( c , BINKB_SRC_X_OFF ) ;
@ -878,11 +880,11 @@ static int binkb_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
} else {
put_pixels8x8_overlapped ( dst , ref , stride ) ;
}
c - > dsp . clear_block ( block ) ;
block [ 0 ] = binkb_get_value ( c , BINKB_SRC_INTER_DC ) ;
memset ( dctblock , 0 , sizeof ( * dctblock ) * 64 ) ;
dct block[ 0 ] = binkb_get_value ( c , BINKB_SRC_INTER_DC ) ;
qp = binkb_get_value ( c , BINKB_SRC_INTER_Q ) ;
read_dct_coeffs ( gb , block , c - > scantable . permutated , binkb_inter_quant , qp ) ;
c - > dsp . idct_add ( dst , stride , block ) ;
read_dct_coeffs ( gb , dct block, bink_scan , binkb_inter_quant , qp ) ;
c - > b dsp. idct_add ( dst , stride , dct block) ;
break ;
case 5 :
v = binkb_get_value ( c , BINKB_SRC_COLORS ) ;
@ -937,6 +939,7 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
int xoff , yoff ;
LOCAL_ALIGNED_16 ( DCTELEM , block , [ 64 ] ) ;
LOCAL_ALIGNED_16 ( uint8_t , ublock , [ 64 ] ) ;
LOCAL_ALIGNED_16 ( int32_t , dctblock , [ 64 ] ) ;
int coordmap [ 64 ] ;
const int stride = c - > pic . linesize [ plane_idx ] ;
@ -1019,11 +1022,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
ublock [ * scan + + ] = get_value ( c , BINK_SRC_COLORS ) ;
break ;
case INTRA_BLOCK :
c - > dsp . clear_block ( block ) ;
block [ 0 ] = get_value ( c , BINK_SRC_INTRA_DC ) ;
read_dct_coeffs ( gb , block , c - > scantable . permutated , bink_intra_quant , - 1 ) ;
c - > dsp . idct ( block ) ;
c - > dsp . put_pixels_nonclamped ( block , ublock , 8 ) ;
memset ( dctblock , 0 , sizeof ( * dctblock ) * 64 ) ;
dctblock [ 0 ] = get_value ( c , BINK_SRC_INTRA_DC ) ;
read_dct_coeffs ( gb , dctblock , bink_scan , bink_intra_quant , - 1 ) ;
c - > bdsp . idct_put ( ublock , 8 , dctblock ) ;
break ;
case FILL_BLOCK :
v = get_value ( c , BINK_SRC_COLORS ) ;
@ -1103,10 +1105,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
c - > dsp . add_pixels8 ( dst , block , stride ) ;
break ;
case INTRA_BLOCK :
c - > dsp . clear_block ( block ) ;
block [ 0 ] = get_value ( c , BINK_SRC_INTRA_DC ) ;
read_dct_coeffs ( gb , block , c - > scantable . permutated , bink_intra_quant , - 1 ) ;
c - > dsp . idct_put ( dst , stride , block ) ;
memset ( dctblock , 0 , sizeof ( * dctblock ) * 64 ) ;
dct block[ 0 ] = get_value ( c , BINK_SRC_INTRA_DC ) ;
read_dct_coeffs ( gb , dct block, bink_scan , bink_intra_quant , - 1 ) ;
c - > b dsp. idct_put ( dst , stride , dct block) ;
break ;
case FILL_BLOCK :
v = get_value ( c , BINK_SRC_COLORS ) ;
@ -1117,10 +1119,10 @@ static int bink_decode_plane(BinkContext *c, GetBitContext *gb, int plane_idx,
yoff = get_value ( c , BINK_SRC_Y_OFF ) ;
ref = prev + xoff + yoff * stride ;
c - > dsp . put_pixels_tab [ 1 ] [ 0 ] ( dst , ref , stride , 8 ) ;
c - > dsp . clear_block ( block ) ;
block [ 0 ] = get_value ( c , BINK_SRC_INTER_DC ) ;
read_dct_coeffs ( gb , block , c - > scantable . permutated , bink_inter_quant , - 1 ) ;
c - > dsp . idct_add ( dst , stride , block ) ;
memset ( dctblock , 0 , sizeof ( * dctblock ) * 64 ) ;
dct block[ 0 ] = get_value ( c , BINK_SRC_INTER_DC ) ;
read_dct_coeffs ( gb , dct block, bink_scan , bink_inter_quant , - 1 ) ;
c - > b dsp. idct_add ( dst , stride , dct block) ;
break ;
case PATTERN_BLOCK :
for ( i = 0 ; i < 2 ; i + + )
@ -1288,7 +1290,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
avctx - > idct_algo = FF_IDCT_BINK ;
dsputil_init ( & c - > dsp , avctx ) ;
ff_init_scantable ( c - > dsp . idct_permutation , & c - > scantable , bink_scan ) ;
ff_binkdsp_init ( & c - > bdsp ) ;
init_bundles ( c ) ;