Example #1
0
/* Shell decoder, operates on one shell code frame of 16 pulses */
void silk_shell_decoder(
    opus_int                    *pulses0,                       /* O    data: nonnegative pulse amplitudes          */
    ec_dec                      *psRangeDec,                    /* I/O  Compressor data structure                   */
    const opus_int              pulses4                         /* I    number of pulses per pulse-subframe         */
)
{
    opus_int pulses3[ 2 ], pulses2[ 4 ], pulses1[ 8 ];

    /* this function operates on one shell code frame of 16 pulses */
    silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 );

    decode_split( &pulses3[  0 ], &pulses3[  1 ], psRangeDec, pulses4,      silk_shell_code_table3 );

    decode_split( &pulses2[  0 ], &pulses2[  1 ], psRangeDec, pulses3[ 0 ], silk_shell_code_table2 );

    decode_split( &pulses1[  0 ], &pulses1[  1 ], psRangeDec, pulses2[ 0 ], silk_shell_code_table1 );
    decode_split( &pulses0[  0 ], &pulses0[  1 ], psRangeDec, pulses1[ 0 ], silk_shell_code_table0 );
    decode_split( &pulses0[  2 ], &pulses0[  3 ], psRangeDec, pulses1[ 1 ], silk_shell_code_table0 );

    decode_split( &pulses1[  2 ], &pulses1[  3 ], psRangeDec, pulses2[ 1 ], silk_shell_code_table1 );
    decode_split( &pulses0[  4 ], &pulses0[  5 ], psRangeDec, pulses1[ 2 ], silk_shell_code_table0 );
    decode_split( &pulses0[  6 ], &pulses0[  7 ], psRangeDec, pulses1[ 3 ], silk_shell_code_table0 );

    decode_split( &pulses2[  2 ], &pulses2[  3 ], psRangeDec, pulses3[ 1 ], silk_shell_code_table2 );

    decode_split( &pulses1[  4 ], &pulses1[  5 ], psRangeDec, pulses2[ 2 ], silk_shell_code_table1 );
    decode_split( &pulses0[  8 ], &pulses0[  9 ], psRangeDec, pulses1[ 4 ], silk_shell_code_table0 );
    decode_split( &pulses0[ 10 ], &pulses0[ 11 ], psRangeDec, pulses1[ 5 ], silk_shell_code_table0 );

    decode_split( &pulses1[  6 ], &pulses1[  7 ], psRangeDec, pulses2[ 3 ], silk_shell_code_table1 );
    decode_split( &pulses0[ 12 ], &pulses0[ 13 ], psRangeDec, pulses1[ 6 ], silk_shell_code_table0 );
    decode_split( &pulses0[ 14 ], &pulses0[ 15 ], psRangeDec, pulses1[ 7 ], silk_shell_code_table0 );
}
/* Shell decoder, operates on one shell code frame of 16 pulses */
void SKP_Silk_shell_decoder(int *pulses0,	/* O    data: nonnegative pulse amplitudes          */
			    SKP_Silk_range_coder_state * sRC,	/* I/O  compressor data structure                   */
			    const int pulses4	/* I    number of pulses per pulse-subframe         */
    )
{
	int pulses3[2], pulses2[4], pulses1[8];

	/* this function operates on one shell code frame of 16 pulses */
	assert(SHELL_CODEC_FRAME_LENGTH == 16);

	decode_split(&pulses3[0], &pulses3[1], sRC, pulses4,
		     SKP_Silk_shell_code_table3);

	decode_split(&pulses2[0], &pulses2[1], sRC, pulses3[0],
		     SKP_Silk_shell_code_table2);

	decode_split(&pulses1[0], &pulses1[1], sRC, pulses2[0],
		     SKP_Silk_shell_code_table1);
	decode_split(&pulses0[0], &pulses0[1], sRC, pulses1[0],
		     SKP_Silk_shell_code_table0);
	decode_split(&pulses0[2], &pulses0[3], sRC, pulses1[1],
		     SKP_Silk_shell_code_table0);

	decode_split(&pulses1[2], &pulses1[3], sRC, pulses2[1],
		     SKP_Silk_shell_code_table1);
	decode_split(&pulses0[4], &pulses0[5], sRC, pulses1[2],
		     SKP_Silk_shell_code_table0);
	decode_split(&pulses0[6], &pulses0[7], sRC, pulses1[3],
		     SKP_Silk_shell_code_table0);

	decode_split(&pulses2[2], &pulses2[3], sRC, pulses3[1],
		     SKP_Silk_shell_code_table2);

	decode_split(&pulses1[4], &pulses1[5], sRC, pulses2[2],
		     SKP_Silk_shell_code_table1);
	decode_split(&pulses0[8], &pulses0[9], sRC, pulses1[4],
		     SKP_Silk_shell_code_table0);
	decode_split(&pulses0[10], &pulses0[11], sRC, pulses1[5],
		     SKP_Silk_shell_code_table0);

	decode_split(&pulses1[6], &pulses1[7], sRC, pulses2[3],
		     SKP_Silk_shell_code_table1);
	decode_split(&pulses0[12], &pulses0[13], sRC, pulses1[6],
		     SKP_Silk_shell_code_table0);
	decode_split(&pulses0[14], &pulses0[15], sRC, pulses1[7],
		     SKP_Silk_shell_code_table0);
}