@ -218,116 +218,145 @@ static const uint16_t qdm2_vlc_offs[] = {
static av_cold void qdm2_init_vlc ( void )
{
static int vlcs_initialized = 0 ;
static VLC_TYPE qdm2_table [ 3838 ] [ 2 ] ;
if ( ! vlcs_initialized ) {
vlc_tab_level . table = & qdm2_table [ qdm2_vlc_offs [ 0 ] ] ;
vlc_tab_level . table_allocated = qdm2_vlc_offs [ 1 ] - qdm2_vlc_offs [ 0 ] ;
init_vlc ( & vlc_tab_level , 8 , 24 ,
vlc_tab_level_huffbits , 1 , 1 ,
vlc_tab_level_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_diff . table = & qdm2_table [ qdm2_vlc_offs [ 1 ] ] ;
vlc_tab_diff . table_allocated = qdm2_vlc_offs [ 2 ] - qdm2_vlc_offs [ 1 ] ;
init_vlc ( & vlc_tab_diff , 8 , 37 ,
vlc_tab_diff_huffbits , 1 , 1 ,
vlc_tab_diff_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_run . table = & qdm2_table [ qdm2_vlc_offs [ 2 ] ] ;
vlc_tab_run . table_allocated = qdm2_vlc_offs [ 3 ] - qdm2_vlc_offs [ 2 ] ;
init_vlc ( & vlc_tab_run , 5 , 6 ,
vlc_tab_run_huffbits , 1 , 1 ,
vlc_tab_run_huffcodes , 1 , 1 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_level_exp_alt_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 3 ] ] ;
fft_level_exp_alt_vlc . table_allocated = qdm2_vlc_offs [ 4 ] - qdm2_vlc_offs [ 3 ] ;
init_vlc ( & fft_level_exp_alt_vlc , 8 , 28 ,
fft_level_exp_alt_huffbits , 1 , 1 ,
fft_level_exp_alt_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_level_exp_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 4 ] ] ;
fft_level_exp_vlc . table_allocated = qdm2_vlc_offs [ 5 ] - qdm2_vlc_offs [ 4 ] ;
init_vlc ( & fft_level_exp_vlc , 8 , 20 ,
fft_level_exp_huffbits , 1 , 1 ,
fft_level_exp_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_stereo_exp_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 5 ] ] ;
fft_stereo_exp_vlc . table_allocated = qdm2_vlc_offs [ 6 ] - qdm2_vlc_offs [ 5 ] ;
init_vlc ( & fft_stereo_exp_vlc , 6 , 7 ,
fft_stereo_exp_huffbits , 1 , 1 ,
fft_stereo_exp_huffcodes , 1 , 1 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_stereo_phase_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 6 ] ] ;
fft_stereo_phase_vlc . table_allocated = qdm2_vlc_offs [ 7 ] - qdm2_vlc_offs [ 6 ] ;
init_vlc ( & fft_stereo_phase_vlc , 6 , 9 ,
fft_stereo_phase_huffbits , 1 , 1 ,
fft_stereo_phase_huffcodes , 1 , 1 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_hi1 . table = & qdm2_table [ qdm2_vlc_offs [ 7 ] ] ;
vlc_tab_tone_level_idx_hi1 . table_allocated = qdm2_vlc_offs [ 8 ] - qdm2_vlc_offs [ 7 ] ;
init_vlc ( & vlc_tab_tone_level_idx_hi1 , 8 , 20 ,
vlc_tab_tone_level_idx_hi1_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_hi1_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_mid . table = & qdm2_table [ qdm2_vlc_offs [ 8 ] ] ;
vlc_tab_tone_level_idx_mid . table_allocated = qdm2_vlc_offs [ 9 ] - qdm2_vlc_offs [ 8 ] ;
init_vlc ( & vlc_tab_tone_level_idx_mid , 8 , 24 ,
vlc_tab_tone_level_idx_mid_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_mid_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_hi2 . table = & qdm2_table [ qdm2_vlc_offs [ 9 ] ] ;
vlc_tab_tone_level_idx_hi2 . table_allocated = qdm2_vlc_offs [ 10 ] - qdm2_vlc_offs [ 9 ] ;
init_vlc ( & vlc_tab_tone_level_idx_hi2 , 8 , 24 ,
vlc_tab_tone_level_idx_hi2_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_hi2_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_type30 . table = & qdm2_table [ qdm2_vlc_offs [ 10 ] ] ;
vlc_tab_type30 . table_allocated = qdm2_vlc_offs [ 11 ] - qdm2_vlc_offs [ 10 ] ;
init_vlc ( & vlc_tab_type30 , 6 , 9 ,
vlc_tab_type30_huffbits , 1 , 1 ,
vlc_tab_type30_huffcodes , 1 , 1 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_type34 . table = & qdm2_table [ qdm2_vlc_offs [ 11 ] ] ;
vlc_tab_type34 . table_allocated = qdm2_vlc_offs [ 12 ] - qdm2_vlc_offs [ 11 ] ;
init_vlc ( & vlc_tab_type34 , 5 , 10 ,
vlc_tab_type34_huffbits , 1 , 1 ,
vlc_tab_type34_huffcodes , 1 , 1 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 0 ] . table = & qdm2_table [ qdm2_vlc_offs [ 12 ] ] ;
vlc_tab_fft_tone_offset [ 0 ] . table_allocated = qdm2_vlc_offs [ 13 ] - qdm2_vlc_offs [ 12 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 0 ] , 8 , 23 ,
vlc_tab_fft_tone_offset_0_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_0_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 1 ] . table = & qdm2_table [ qdm2_vlc_offs [ 13 ] ] ;
vlc_tab_fft_tone_offset [ 1 ] . table_allocated = qdm2_vlc_offs [ 14 ] - qdm2_vlc_offs [ 13 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 1 ] , 8 , 28 ,
vlc_tab_fft_tone_offset_1_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_1_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 2 ] . table = & qdm2_table [ qdm2_vlc_offs [ 14 ] ] ;
vlc_tab_fft_tone_offset [ 2 ] . table_allocated = qdm2_vlc_offs [ 15 ] - qdm2_vlc_offs [ 14 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 2 ] , 8 , 32 ,
vlc_tab_fft_tone_offset_2_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_2_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 3 ] . table = & qdm2_table [ qdm2_vlc_offs [ 15 ] ] ;
vlc_tab_fft_tone_offset [ 3 ] . table_allocated = qdm2_vlc_offs [ 16 ] - qdm2_vlc_offs [ 15 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 3 ] , 8 , 35 ,
vlc_tab_fft_tone_offset_3_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_3_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 4 ] . table = & qdm2_table [ qdm2_vlc_offs [ 16 ] ] ;
vlc_tab_fft_tone_offset [ 4 ] . table_allocated = qdm2_vlc_offs [ 17 ] - qdm2_vlc_offs [ 16 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 4 ] , 8 , 38 ,
vlc_tab_fft_tone_offset_4_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_4_huffcodes , 2 , 2 , INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlcs_initialized = 1 ;
}
vlc_tab_level . table = & qdm2_table [ qdm2_vlc_offs [ 0 ] ] ;
vlc_tab_level . table_allocated = qdm2_vlc_offs [ 1 ] - qdm2_vlc_offs [ 0 ] ;
init_vlc ( & vlc_tab_level , 8 , 24 ,
vlc_tab_level_huffbits , 1 , 1 ,
vlc_tab_level_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_diff . table = & qdm2_table [ qdm2_vlc_offs [ 1 ] ] ;
vlc_tab_diff . table_allocated = qdm2_vlc_offs [ 2 ] - qdm2_vlc_offs [ 1 ] ;
init_vlc ( & vlc_tab_diff , 8 , 37 ,
vlc_tab_diff_huffbits , 1 , 1 ,
vlc_tab_diff_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_run . table = & qdm2_table [ qdm2_vlc_offs [ 2 ] ] ;
vlc_tab_run . table_allocated = qdm2_vlc_offs [ 3 ] - qdm2_vlc_offs [ 2 ] ;
init_vlc ( & vlc_tab_run , 5 , 6 ,
vlc_tab_run_huffbits , 1 , 1 ,
vlc_tab_run_huffcodes , 1 , 1 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_level_exp_alt_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 3 ] ] ;
fft_level_exp_alt_vlc . table_allocated = qdm2_vlc_offs [ 4 ] -
qdm2_vlc_offs [ 3 ] ;
init_vlc ( & fft_level_exp_alt_vlc , 8 , 28 ,
fft_level_exp_alt_huffbits , 1 , 1 ,
fft_level_exp_alt_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_level_exp_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 4 ] ] ;
fft_level_exp_vlc . table_allocated = qdm2_vlc_offs [ 5 ] - qdm2_vlc_offs [ 4 ] ;
init_vlc ( & fft_level_exp_vlc , 8 , 20 ,
fft_level_exp_huffbits , 1 , 1 ,
fft_level_exp_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_stereo_exp_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 5 ] ] ;
fft_stereo_exp_vlc . table_allocated = qdm2_vlc_offs [ 6 ] -
qdm2_vlc_offs [ 5 ] ;
init_vlc ( & fft_stereo_exp_vlc , 6 , 7 ,
fft_stereo_exp_huffbits , 1 , 1 ,
fft_stereo_exp_huffcodes , 1 , 1 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
fft_stereo_phase_vlc . table = & qdm2_table [ qdm2_vlc_offs [ 6 ] ] ;
fft_stereo_phase_vlc . table_allocated = qdm2_vlc_offs [ 7 ] -
qdm2_vlc_offs [ 6 ] ;
init_vlc ( & fft_stereo_phase_vlc , 6 , 9 ,
fft_stereo_phase_huffbits , 1 , 1 ,
fft_stereo_phase_huffcodes , 1 , 1 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_hi1 . table =
& qdm2_table [ qdm2_vlc_offs [ 7 ] ] ;
vlc_tab_tone_level_idx_hi1 . table_allocated = qdm2_vlc_offs [ 8 ] -
qdm2_vlc_offs [ 7 ] ;
init_vlc ( & vlc_tab_tone_level_idx_hi1 , 8 , 20 ,
vlc_tab_tone_level_idx_hi1_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_hi1_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_mid . table =
& qdm2_table [ qdm2_vlc_offs [ 8 ] ] ;
vlc_tab_tone_level_idx_mid . table_allocated = qdm2_vlc_offs [ 9 ] -
qdm2_vlc_offs [ 8 ] ;
init_vlc ( & vlc_tab_tone_level_idx_mid , 8 , 24 ,
vlc_tab_tone_level_idx_mid_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_mid_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_tone_level_idx_hi2 . table =
& qdm2_table [ qdm2_vlc_offs [ 9 ] ] ;
vlc_tab_tone_level_idx_hi2 . table_allocated = qdm2_vlc_offs [ 10 ] -
qdm2_vlc_offs [ 9 ] ;
init_vlc ( & vlc_tab_tone_level_idx_hi2 , 8 , 24 ,
vlc_tab_tone_level_idx_hi2_huffbits , 1 , 1 ,
vlc_tab_tone_level_idx_hi2_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_type30 . table = & qdm2_table [ qdm2_vlc_offs [ 10 ] ] ;
vlc_tab_type30 . table_allocated = qdm2_vlc_offs [ 11 ] - qdm2_vlc_offs [ 10 ] ;
init_vlc ( & vlc_tab_type30 , 6 , 9 ,
vlc_tab_type30_huffbits , 1 , 1 ,
vlc_tab_type30_huffcodes , 1 , 1 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_type34 . table = & qdm2_table [ qdm2_vlc_offs [ 11 ] ] ;
vlc_tab_type34 . table_allocated = qdm2_vlc_offs [ 12 ] - qdm2_vlc_offs [ 11 ] ;
init_vlc ( & vlc_tab_type34 , 5 , 10 ,
vlc_tab_type34_huffbits , 1 , 1 ,
vlc_tab_type34_huffcodes , 1 , 1 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 0 ] . table =
& qdm2_table [ qdm2_vlc_offs [ 12 ] ] ;
vlc_tab_fft_tone_offset [ 0 ] . table_allocated = qdm2_vlc_offs [ 13 ] -
qdm2_vlc_offs [ 12 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 0 ] , 8 , 23 ,
vlc_tab_fft_tone_offset_0_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_0_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 1 ] . table =
& qdm2_table [ qdm2_vlc_offs [ 13 ] ] ;
vlc_tab_fft_tone_offset [ 1 ] . table_allocated = qdm2_vlc_offs [ 14 ] -
qdm2_vlc_offs [ 13 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 1 ] , 8 , 28 ,
vlc_tab_fft_tone_offset_1_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_1_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 2 ] . table =
& qdm2_table [ qdm2_vlc_offs [ 14 ] ] ;
vlc_tab_fft_tone_offset [ 2 ] . table_allocated = qdm2_vlc_offs [ 15 ] -
qdm2_vlc_offs [ 14 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 2 ] , 8 , 32 ,
vlc_tab_fft_tone_offset_2_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_2_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 3 ] . table =
& qdm2_table [ qdm2_vlc_offs [ 15 ] ] ;
vlc_tab_fft_tone_offset [ 3 ] . table_allocated = qdm2_vlc_offs [ 16 ] -
qdm2_vlc_offs [ 15 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 3 ] , 8 , 35 ,
vlc_tab_fft_tone_offset_3_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_3_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
vlc_tab_fft_tone_offset [ 4 ] . table =
& qdm2_table [ qdm2_vlc_offs [ 16 ] ] ;
vlc_tab_fft_tone_offset [ 4 ] . table_allocated = qdm2_vlc_offs [ 17 ] -
qdm2_vlc_offs [ 16 ] ;
init_vlc ( & vlc_tab_fft_tone_offset [ 4 ] , 8 , 38 ,
vlc_tab_fft_tone_offset_4_huffbits , 1 , 1 ,
vlc_tab_fft_tone_offset_4_huffcodes , 2 , 2 ,
INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE ) ;
}
static int qdm2_get_vlc ( GetBitContext * gb , VLC * vlc , int flag , int depth )
@ -1694,20 +1723,12 @@ static void qdm2_synthesis_filter (QDM2Context *q, int index)
*
* @ param q context
*/
static av_cold void qdm2_init ( QDM2Context * q ) {
static int initialized = 0 ;
if ( initialized ! = 0 )
return ;
initialized = 1 ;
static av_cold void qdm2_init_static_data ( AVCodec * codec ) {
qdm2_init_vlc ( ) ;
ff_mpa_synth_init_float ( ff_mpa_synth_window_float ) ;
softclip_table_init ( ) ;
rnd_table_init ( ) ;
init_noise_samples ( ) ;
av_log ( NULL , AV_LOG_DEBUG , " init done \n " ) ;
}
@ -1882,8 +1903,6 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx)
ff_rdft_init ( & s - > rdft_ctx , s - > fft_order , IDFT_C2R ) ;
ff_mpadsp_init ( & s - > mpadsp ) ;
qdm2_init ( s ) ;
avctx - > sample_fmt = AV_SAMPLE_FMT_S16 ;
return 0 ;
@ -1997,13 +2016,14 @@ static int qdm2_decode_frame(AVCodecContext *avctx, void *data,
AVCodec ff_qdm2_decoder =
{
. name = " qdm2 " ,
. type = AVMEDIA_TYPE_AUDIO ,
. id = AV_CODEC_ID_QDM2 ,
. priv_data_size = sizeof ( QDM2Context ) ,
. init = qdm2_decode_init ,
. close = qdm2_decode_close ,
. decode = qdm2_decode_frame ,
. capabilities = CODEC_CAP_DR1 ,
. long_name = NULL_IF_CONFIG_SMALL ( " QDesign Music Codec 2 " ) ,
. name = " qdm2 " ,
. type = AVMEDIA_TYPE_AUDIO ,
. id = AV_CODEC_ID_QDM2 ,
. priv_data_size = sizeof ( QDM2Context ) ,
. init = qdm2_decode_init ,
. init_static_data = qdm2_init_static_data ,
. close = qdm2_decode_close ,
. decode = qdm2_decode_frame ,
. capabilities = CODEC_CAP_DR1 ,
. long_name = NULL_IF_CONFIG_SMALL ( " QDesign Music Codec 2 " ) ,
} ;