summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2013-08-30 23:27:12 +0200
committerNils Wallménius <nils@rockbox.org>2013-08-31 17:14:58 +0200
commitb592a7a8a52bc2b61108570afff943b7e9afdc3d (patch)
tree1c9763e8201ce55c77fe08d8df02993ba771ee71
parenta602ea3d3dc2c3af28974fab0e0c026a5709fac7 (diff)
downloadrockbox-b592a7a8a52bc2b61108570afff943b7e9afdc3d.tar.gz
rockbox-b592a7a8a52bc2b61108570afff943b7e9afdc3d.zip
Put two hot silk arrays on real stack (iram)
Speeds up decoding of 16kbps test file by 16.7MHz on H300. Change-Id: I39c90e3b423ae8e2ee5c2b88c5dcec8d48807f77
-rw-r--r--lib/rbcodec/codecs/libopus/silk/decode_core.c5
-rw-r--r--lib/rbcodec/codecs/libopus/silk/resampler_private_IIR_FIR.c11
2 files changed, 10 insertions, 6 deletions
diff --git a/lib/rbcodec/codecs/libopus/silk/decode_core.c b/lib/rbcodec/codecs/libopus/silk/decode_core.c
index 693c9faacf..b298389f07 100644
--- a/lib/rbcodec/codecs/libopus/silk/decode_core.c
+++ b/lib/rbcodec/codecs/libopus/silk/decode_core.c
@@ -49,7 +49,7 @@ void silk_decode_core(
49 opus_int32 LTP_pred_Q13, LPC_pred_Q10, Gain_Q10, inv_gain_Q31, gain_adj_Q16, rand_seed, offset_Q10; 49 opus_int32 LTP_pred_Q13, LPC_pred_Q10, Gain_Q10, inv_gain_Q31, gain_adj_Q16, rand_seed, offset_Q10;
50 opus_int32 *pred_lag_ptr, *pexc_Q14, *pres_Q14; 50 opus_int32 *pred_lag_ptr, *pexc_Q14, *pres_Q14;
51 VARDECL( opus_int32, res_Q14 ); 51 VARDECL( opus_int32, res_Q14 );
52 VARDECL( opus_int32, sLPC_Q14 ); 52/* VARDECL( opus_int32, sLPC_Q14 ); */
53 SAVE_STACK; 53 SAVE_STACK;
54 54
55 silk_assert( psDec->prev_gain_Q16 != 0 ); 55 silk_assert( psDec->prev_gain_Q16 != 0 );
@@ -57,7 +57,8 @@ void silk_decode_core(
57 ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); 57 ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 );
58 ALLOC( sLTP_Q15, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); 58 ALLOC( sLTP_Q15, psDec->ltp_mem_length + psDec->frame_length, opus_int32 );
59 ALLOC( res_Q14, psDec->subfr_length, opus_int32 ); 59 ALLOC( res_Q14, psDec->subfr_length, opus_int32 );
60 ALLOC( sLPC_Q14, psDec->subfr_length + MAX_LPC_ORDER, opus_int32 ); 60/* ALLOC( sLPC_Q14, psDec->subfr_length + MAX_LPC_ORDER, opus_int32 ); */
61 opus_int32 sLPC_Q14[psDec->subfr_length + MAX_LPC_ORDER]; /* worst case is 80 + 16 */
61 62
62 offset_Q10 = silk_Quantization_Offsets_Q10[ psDec->indices.signalType >> 1 ][ psDec->indices.quantOffsetType ]; 63 offset_Q10 = silk_Quantization_Offsets_Q10[ psDec->indices.signalType >> 1 ][ psDec->indices.quantOffsetType ];
63 64
diff --git a/lib/rbcodec/codecs/libopus/silk/resampler_private_IIR_FIR.c b/lib/rbcodec/codecs/libopus/silk/resampler_private_IIR_FIR.c
index 04246257e7..ce9aff0907 100644
--- a/lib/rbcodec/codecs/libopus/silk/resampler_private_IIR_FIR.c
+++ b/lib/rbcodec/codecs/libopus/silk/resampler_private_IIR_FIR.c
@@ -72,10 +72,13 @@ void silk_resampler_private_IIR_FIR(
72 silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; 72 silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS;
73 opus_int32 nSamplesIn; 73 opus_int32 nSamplesIn;
74 opus_int32 max_index_Q16, index_increment_Q16; 74 opus_int32 max_index_Q16, index_increment_Q16;
75 VARDECL( opus_int16, buf ); 75/* VARDECL( opus_int16, buf );
76 SAVE_STACK; 76 SAVE_STACK; */
77 77
78 ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); 78/* ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); */
79
80 /* worst case = 2*16*10+8 = 328 * 2 = 656bytes */
81 opus_int16 buf[2 * S->batchSize + RESAMPLER_ORDER_FIR_12];
79 82
80 /* Copy buffered samples to start of buffer */ 83 /* Copy buffered samples to start of buffer */
81 silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); 84 silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) );
@@ -103,5 +106,5 @@ void silk_resampler_private_IIR_FIR(
103 106
104 /* Copy last part of filtered signal to the state for the next call */ 107 /* Copy last part of filtered signal to the state for the next call */
105 silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); 108 silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) );
106 RESTORE_STACK; 109/* RESTORE_STACK; */
107} 110}