OLD | NEW |
1 /* Copyright (c) 2007-2008 CSIRO | 1 /* Copyright (c) 2007-2008 CSIRO |
2 Copyright (c) 2007-2010 Xiph.Org Foundation | 2 Copyright (c) 2007-2010 Xiph.Org Foundation |
3 Copyright (c) 2008 Gregory Maxwell | 3 Copyright (c) 2008 Gregory Maxwell |
4 Written by Jean-Marc Valin and Gregory Maxwell */ | 4 Written by Jean-Marc Valin and Gregory Maxwell */ |
5 /* | 5 /* |
6 Redistribution and use in source and binary forms, with or without | 6 Redistribution and use in source and binary forms, with or without |
7 modification, are permitted provided that the following conditions | 7 modification, are permitted provided that the following conditions |
8 are met: | 8 are met: |
9 | 9 |
10 - Redistributions of source code must retain the above copyright | 10 - Redistributions of source code must retain the above copyright |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 opus_int32 vbr_reservoir; | 186 opus_int32 vbr_reservoir; |
187 opus_int32 vbr_drift; | 187 opus_int32 vbr_drift; |
188 opus_int32 vbr_offset; | 188 opus_int32 vbr_offset; |
189 opus_int32 vbr_count; | 189 opus_int32 vbr_count; |
190 | 190 |
191 #ifdef RESYNTH | 191 #ifdef RESYNTH |
192 celt_sig syn_mem[2][2*MAX_PERIOD]; | 192 celt_sig syn_mem[2][2*MAX_PERIOD]; |
193 #endif | 193 #endif |
194 | 194 |
195 celt_sig in_mem[1]; /* Size = channels*mode->overlap */ | 195 celt_sig in_mem[1]; /* Size = channels*mode->overlap */ |
196 /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_PERIOD */ | 196 /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */ |
197 /* celt_sig overlap_mem[], Size = channels*mode->overlap */ | 197 /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ |
198 /* opus_val16 oldEBands[], Size = 2*channels*mode->nbEBands */ | 198 /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ |
| 199 /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ |
| 200 #ifdef RESYNTH |
| 201 /* opus_val16 overlap_mem[], Size = channels*overlap */ |
| 202 #endif |
199 }; | 203 }; |
200 | 204 |
201 int celt_encoder_get_size(int channels) | 205 int celt_encoder_get_size(int channels) |
202 { | 206 { |
203 CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); | 207 CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); |
204 return opus_custom_encoder_get_size(mode, channels); | 208 return opus_custom_encoder_get_size(mode, channels); |
205 } | 209 } |
206 | 210 |
207 OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int
channels) | 211 OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int
channels) |
208 { | 212 { |
209 int size = sizeof(struct CELTEncoder) | 213 int size = sizeof(struct CELTEncoder) |
210 + (2*channels*mode->overlap-1)*sizeof(celt_sig) | 214 + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[cha
nnels*mode->overlap]; */ |
211 + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) | 215 + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_
mem[channels*COMBFILTER_MAXPERIOD]; */ |
212 + 3*channels*mode->nbEBands*sizeof(opus_val16); | 216 + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE
[channels*mode->nbEBands]; */ |
| 217 /* opus_val16 oldLogE[
channels*mode->nbEBands]; */ |
| 218 /* opus_val16 oldLogE2
[channels*mode->nbEBands]; */ |
| 219 #ifdef RESYNTH |
| 220 size += channels*mode->overlap*sizeof(celt_sig); /* celt_sig overlap_me
m[channels*mode->nbEBands]; */ |
| 221 #endif |
213 return size; | 222 return size; |
214 } | 223 } |
215 | 224 |
216 #ifdef CUSTOM_MODES | 225 #ifdef CUSTOM_MODES |
217 CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int
*error) | 226 CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int
*error) |
218 { | 227 { |
219 int ret; | 228 int ret; |
220 CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode
, channels)); | 229 CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode
, channels)); |
221 /* init will handle the NULL case */ | 230 /* init will handle the NULL case */ |
222 ret = opus_custom_encoder_init(st, mode, channels); | 231 ret = opus_custom_encoder_init(st, mode, channels); |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 else if (width==2) | 565 else if (width==2) |
557 bias = QCONST16(.05f,15)*LM; | 566 bias = QCONST16(.05f,15)*LM; |
558 else | 567 else |
559 bias = QCONST16(.02f,15)*LM; | 568 bias = QCONST16(.02f,15)*LM; |
560 L1 = MAC16_32_Q15(L1, bias, L1); | 569 L1 = MAC16_32_Q15(L1, bias, L1); |
561 return L1; | 570 return L1; |
562 } | 571 } |
563 | 572 |
564 static int tf_analysis(const CELTMode *m, int len, int C, int isTransient, | 573 static int tf_analysis(const CELTMode *m, int len, int C, int isTransient, |
565 int *tf_res, int nbCompressedBytes, celt_norm *X, int N0, int LM, | 574 int *tf_res, int nbCompressedBytes, celt_norm *X, int N0, int LM, |
566 int *tf_sum) | 575 int start, int *tf_sum) |
567 { | 576 { |
568 int i; | 577 int i; |
569 VARDECL(int, metric); | 578 VARDECL(int, metric); |
570 int cost0; | 579 int cost0; |
571 int cost1; | 580 int cost1; |
572 VARDECL(int, path0); | 581 VARDECL(int, path0); |
573 VARDECL(int, path1); | 582 VARDECL(int, path1); |
574 VARDECL(celt_norm, tmp); | 583 VARDECL(celt_norm, tmp); |
575 int lambda; | 584 int lambda; |
576 int tf_select=0; | 585 int tf_select=0; |
577 SAVE_STACK; | 586 SAVE_STACK; |
578 | 587 |
579 if (nbCompressedBytes<15*C) | 588 if (nbCompressedBytes<15*C || start!=0) |
580 { | 589 { |
581 *tf_sum = 0; | 590 *tf_sum = 0; |
582 for (i=0;i<len;i++) | 591 for (i=0;i<len;i++) |
583 tf_res[i] = isTransient; | 592 tf_res[i] = isTransient; |
584 return 0; | 593 return 0; |
585 } | 594 } |
586 if (nbCompressedBytes<40) | 595 if (nbCompressedBytes<40) |
587 lambda = 12; | 596 lambda = 12; |
588 else if (nbCompressedBytes<60) | 597 else if (nbCompressedBytes<60) |
589 lambda = 6; | 598 lambda = 6; |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 frame_size *= st->upsample; | 946 frame_size *= st->upsample; |
938 for (LM=0;LM<=st->mode->maxLM;LM++) | 947 for (LM=0;LM<=st->mode->maxLM;LM++) |
939 if (st->mode->shortMdctSize<<LM==frame_size) | 948 if (st->mode->shortMdctSize<<LM==frame_size) |
940 break; | 949 break; |
941 if (LM>st->mode->maxLM) | 950 if (LM>st->mode->maxLM) |
942 return OPUS_BAD_ARG; | 951 return OPUS_BAD_ARG; |
943 M=1<<LM; | 952 M=1<<LM; |
944 N = M*st->mode->shortMdctSize; | 953 N = M*st->mode->shortMdctSize; |
945 | 954 |
946 prefilter_mem = st->in_mem+CC*(st->overlap); | 955 prefilter_mem = st->in_mem+CC*(st->overlap); |
947 oldBandE = (opus_val16*)(st->in_mem+CC*(2*st->overlap+COMBFILTER_MAXPERIOD)); | 956 oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD)); |
948 oldLogE = oldBandE + CC*st->mode->nbEBands; | 957 oldLogE = oldBandE + CC*st->mode->nbEBands; |
949 oldLogE2 = oldLogE + CC*st->mode->nbEBands; | 958 oldLogE2 = oldLogE + CC*st->mode->nbEBands; |
950 | 959 |
951 if (enc==NULL) | 960 if (enc==NULL) |
952 { | 961 { |
953 tell=1; | 962 tell=1; |
954 nbFilledBytes=0; | 963 nbFilledBytes=0; |
955 } else { | 964 } else { |
956 tell=ec_tell(enc); | 965 tell=ec_tell(enc); |
957 nbFilledBytes=(tell+4)>>3; | 966 nbFilledBytes=(tell+4)>>3; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ | 1268 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ |
1260 | 1269 |
1261 compute_band_energies(st->mode, freq, bandE, effEnd, C, M); | 1270 compute_band_energies(st->mode, freq, bandE, effEnd, C, M); |
1262 | 1271 |
1263 amp2Log2(st->mode, effEnd, st->end, bandE, bandLogE, C); | 1272 amp2Log2(st->mode, effEnd, st->end, bandE, bandLogE, C); |
1264 | 1273 |
1265 /* Band normalisation */ | 1274 /* Band normalisation */ |
1266 normalise_bands(st->mode, freq, X, bandE, effEnd, C, M); | 1275 normalise_bands(st->mode, freq, X, bandE, effEnd, C, M); |
1267 | 1276 |
1268 ALLOC(tf_res, st->mode->nbEBands, int); | 1277 ALLOC(tf_res, st->mode->nbEBands, int); |
1269 tf_select = tf_analysis(st->mode, effEnd, C, isTransient, tf_res, effectiveBy
tes, X, N, LM, &tf_sum); | 1278 tf_select = tf_analysis(st->mode, effEnd, C, isTransient, tf_res, effectiveBy
tes, X, N, LM, st->start, &tf_sum); |
1270 for (i=effEnd;i<st->end;i++) | 1279 for (i=effEnd;i<st->end;i++) |
1271 tf_res[i] = tf_res[effEnd-1]; | 1280 tf_res[i] = tf_res[effEnd-1]; |
1272 | 1281 |
1273 ALLOC(error, C*st->mode->nbEBands, opus_val16); | 1282 ALLOC(error, C*st->mode->nbEBands, opus_val16); |
1274 quant_coarse_energy(st->mode, st->start, st->end, effEnd, bandLogE, | 1283 quant_coarse_energy(st->mode, st->start, st->end, effEnd, bandLogE, |
1275 oldBandE, total_bits, error, enc, | 1284 oldBandE, total_bits, error, enc, |
1276 C, LM, nbAvailableBytes, st->force_intra, | 1285 C, LM, nbAvailableBytes, st->force_intra, |
1277 &st->delayedIntra, st->complexity >= 4, st->loss_rate); | 1286 &st->delayedIntra, st->complexity >= 4, st->loss_rate); |
1278 | 1287 |
1279 tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc); | 1288 tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc); |
1280 | 1289 |
1281 st->spread_decision = SPREAD_NORMAL; | |
1282 if (ec_tell(enc)+4<=total_bits) | 1290 if (ec_tell(enc)+4<=total_bits) |
1283 { | 1291 { |
1284 if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C) | 1292 if (shortBlocks || st->complexity < 3 |
| 1293 || nbAvailableBytes < 10*C || st->start!=0) |
1285 { | 1294 { |
1286 if (st->complexity == 0) | 1295 if (st->complexity == 0) |
1287 st->spread_decision = SPREAD_NONE; | 1296 st->spread_decision = SPREAD_NONE; |
| 1297 else |
| 1298 st->spread_decision = SPREAD_NORMAL; |
1288 } else { | 1299 } else { |
1289 st->spread_decision = spreading_decision(st->mode, X, | 1300 st->spread_decision = spreading_decision(st->mode, X, |
1290 &st->tonal_average, st->spread_decision, &st->hf_average, | 1301 &st->tonal_average, st->spread_decision, &st->hf_average, |
1291 &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); | 1302 &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); |
1292 } | 1303 } |
1293 ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); | 1304 ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); |
1294 } | 1305 } |
1295 | 1306 |
1296 ALLOC(cap, st->mode->nbEBands, int); | 1307 ALLOC(cap, st->mode->nbEBands, int); |
1297 ALLOC(offsets, st->mode->nbEBands, int); | 1308 ALLOC(offsets, st->mode->nbEBands, int); |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 if (CC==2&&C==1) | 1592 if (CC==2&&C==1) |
1582 { | 1593 { |
1583 for (i=0;i<N;i++) | 1594 for (i=0;i<N;i++) |
1584 freq[N+i] = freq[i]; | 1595 freq[N+i] = freq[i]; |
1585 } | 1596 } |
1586 | 1597 |
1587 out_mem[0] = st->syn_mem[0]+MAX_PERIOD; | 1598 out_mem[0] = st->syn_mem[0]+MAX_PERIOD; |
1588 if (CC==2) | 1599 if (CC==2) |
1589 out_mem[1] = st->syn_mem[1]+MAX_PERIOD; | 1600 out_mem[1] = st->syn_mem[1]+MAX_PERIOD; |
1590 | 1601 |
1591 overlap_mem[0] = prefilter_mem+CC*COMBFILTER_MAXPERIOD; | 1602 overlap_mem[0] = (celt_sig*)(oldLogE2 + CC*st->mode->nbEBands); |
1592 if (CC==2) | 1603 if (CC==2) |
1593 overlap_mem[1] = overlap_mem[0] + st->overlap; | 1604 overlap_mem[1] = overlap_mem[0] + st->overlap; |
1594 | 1605 |
1595 compute_inv_mdcts(st->mode, shortBlocks, freq, out_mem, overlap_mem, CC, L
M); | 1606 compute_inv_mdcts(st->mode, shortBlocks, freq, out_mem, overlap_mem, CC, L
M); |
1596 | 1607 |
1597 c=0; do { | 1608 c=0; do { |
1598 st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); | 1609 st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); |
1599 st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINP
ERIOD); | 1610 st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINP
ERIOD); |
1600 comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefi
lter_period, st->mode->shortMdctSize, | 1611 comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefi
lter_period, st->mode->shortMdctSize, |
1601 st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_
old, st->prefilter_tapset, | 1612 st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_
old, st->prefilter_tapset, |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1836 case OPUS_GET_LSB_DEPTH_REQUEST: | 1847 case OPUS_GET_LSB_DEPTH_REQUEST: |
1837 { | 1848 { |
1838 opus_int32 *value = va_arg(ap, opus_int32*); | 1849 opus_int32 *value = va_arg(ap, opus_int32*); |
1839 *value=st->lsb_depth; | 1850 *value=st->lsb_depth; |
1840 } | 1851 } |
1841 break; | 1852 break; |
1842 case OPUS_RESET_STATE: | 1853 case OPUS_RESET_STATE: |
1843 { | 1854 { |
1844 int i; | 1855 int i; |
1845 opus_val16 *oldBandE, *oldLogE, *oldLogE2; | 1856 opus_val16 *oldBandE, *oldLogE, *oldLogE2; |
1846 oldBandE = (opus_val16*)(st->in_mem+st->channels*(2*st->overlap+COMBFIL
TER_MAXPERIOD)); | 1857 oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTE
R_MAXPERIOD)); |
1847 oldLogE = oldBandE + st->channels*st->mode->nbEBands; | 1858 oldLogE = oldBandE + st->channels*st->mode->nbEBands; |
1848 oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; | 1859 oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; |
1849 OPUS_CLEAR((char*)&st->ENCODER_RESET_START, | 1860 OPUS_CLEAR((char*)&st->ENCODER_RESET_START, |
1850 opus_custom_encoder_get_size(st->mode, st->channels)- | 1861 opus_custom_encoder_get_size(st->mode, st->channels)- |
1851 ((char*)&st->ENCODER_RESET_START - (char*)st)); | 1862 ((char*)&st->ENCODER_RESET_START - (char*)st)); |
1852 for (i=0;i<st->channels*st->mode->nbEBands;i++) | 1863 for (i=0;i<st->channels*st->mode->nbEBands;i++) |
1853 oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); | 1864 oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); |
1854 st->vbr_offset = 0; | 1865 st->vbr_offset = 0; |
1855 st->delayedIntra = 1; | 1866 st->delayedIntra = 1; |
1856 st->spread_decision = SPREAD_NORMAL; | 1867 st->spread_decision = SPREAD_NORMAL; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2021 void opus_custom_decoder_destroy(CELTDecoder *st) | 2032 void opus_custom_decoder_destroy(CELTDecoder *st) |
2022 { | 2033 { |
2023 opus_free(st); | 2034 opus_free(st); |
2024 } | 2035 } |
2025 #endif /* CUSTOM_MODES */ | 2036 #endif /* CUSTOM_MODES */ |
2026 | 2037 |
2027 static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_R
ESTRICT pcm, int N, int LM) | 2038 static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_R
ESTRICT pcm, int N, int LM) |
2028 { | 2039 { |
2029 int c; | 2040 int c; |
2030 int pitch_index; | 2041 int pitch_index; |
2031 int overlap = st->mode->overlap; | |
2032 opus_val16 fade = Q15ONE; | 2042 opus_val16 fade = Q15ONE; |
2033 int i, len; | 2043 int i, len; |
2034 const int C = st->channels; | 2044 const int C = st->channels; |
2035 int offset; | 2045 int offset; |
2036 celt_sig *out_mem[2]; | 2046 celt_sig *out_mem[2]; |
2037 celt_sig *decode_mem[2]; | 2047 celt_sig *decode_mem[2]; |
2038 celt_sig *overlap_mem[2]; | 2048 celt_sig *overlap_mem[2]; |
2039 opus_val16 *lpc; | 2049 opus_val16 *lpc; |
2040 opus_val32 *out_syn[2]; | 2050 opus_val32 *out_syn[2]; |
2041 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; | 2051 opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE; |
| 2052 const OpusCustomMode *mode; |
| 2053 int nbEBands; |
| 2054 int overlap; |
| 2055 const opus_int16 *eBands; |
2042 SAVE_STACK; | 2056 SAVE_STACK; |
2043 | 2057 |
| 2058 mode = st->mode; |
| 2059 nbEBands = mode->nbEBands; |
| 2060 overlap = mode->overlap; |
| 2061 eBands = mode->eBands; |
| 2062 |
2044 c=0; do { | 2063 c=0; do { |
2045 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); | 2064 decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap); |
2046 out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; | 2065 out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD; |
2047 overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; | 2066 overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE; |
2048 } while (++c<C); | 2067 } while (++c<C); |
2049 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C); | 2068 lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C); |
2050 oldBandE = lpc+C*LPC_ORDER; | 2069 oldBandE = lpc+C*LPC_ORDER; |
2051 oldLogE = oldBandE + 2*st->mode->nbEBands; | 2070 oldLogE = oldBandE + 2*nbEBands; |
2052 oldLogE2 = oldLogE + 2*st->mode->nbEBands; | 2071 oldLogE2 = oldLogE + 2*nbEBands; |
2053 backgroundLogE = oldLogE2 + 2*st->mode->nbEBands; | 2072 backgroundLogE = oldLogE2 + 2*nbEBands; |
2054 | 2073 |
2055 out_syn[0] = out_mem[0]+MAX_PERIOD-N; | 2074 c=0; do { |
2056 if (C==2) | 2075 out_syn[c] = out_mem[c]+MAX_PERIOD-N; |
2057 out_syn[1] = out_mem[1]+MAX_PERIOD-N; | 2076 } while (++c<C); |
2058 | 2077 |
2059 len = N+st->mode->overlap; | 2078 len = N+overlap; |
2060 | 2079 |
2061 if (st->loss_count >= 5 || st->start!=0) | 2080 if (st->loss_count >= 5 || st->start!=0) |
2062 { | 2081 { |
2063 /* Noise-based PLC/CNG */ | 2082 /* Noise-based PLC/CNG */ |
2064 VARDECL(celt_sig, freq); | 2083 VARDECL(celt_sig, freq); |
2065 VARDECL(celt_norm, X); | 2084 VARDECL(celt_norm, X); |
2066 VARDECL(celt_ener, bandE); | 2085 VARDECL(celt_ener, bandE); |
2067 opus_uint32 seed; | 2086 opus_uint32 seed; |
2068 int effEnd; | 2087 int effEnd; |
2069 | 2088 |
2070 effEnd = st->end; | 2089 effEnd = st->end; |
2071 if (effEnd > st->mode->effEBands) | 2090 if (effEnd > mode->effEBands) |
2072 effEnd = st->mode->effEBands; | 2091 effEnd = mode->effEBands; |
2073 | 2092 |
2074 ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ | 2093 ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */ |
2075 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ | 2094 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ |
2076 ALLOC(bandE, st->mode->nbEBands*C, celt_ener); | 2095 ALLOC(bandE, nbEBands*C, celt_ener); |
2077 | 2096 |
2078 if (st->loss_count >= 5) | 2097 if (st->loss_count >= 5) |
2079 log2Amp(st->mode, st->start, st->end, bandE, backgroundLogE, C); | 2098 log2Amp(mode, st->start, st->end, bandE, backgroundLogE, C); |
2080 else { | 2099 else { |
2081 /* Energy decay */ | 2100 /* Energy decay */ |
2082 opus_val16 decay = st->loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONS
T16(.5f, DB_SHIFT); | 2101 opus_val16 decay = st->loss_count==0 ? QCONST16(1.5f, DB_SHIFT) : QCONS
T16(.5f, DB_SHIFT); |
2083 c=0; do | 2102 c=0; do |
2084 { | 2103 { |
2085 for (i=st->start;i<st->end;i++) | 2104 for (i=st->start;i<st->end;i++) |
2086 oldBandE[c*st->mode->nbEBands+i] -= decay; | 2105 oldBandE[c*nbEBands+i] -= decay; |
2087 } while (++c<C); | 2106 } while (++c<C); |
2088 log2Amp(st->mode, st->start, st->end, bandE, oldBandE, C); | 2107 log2Amp(mode, st->start, st->end, bandE, oldBandE, C); |
2089 } | 2108 } |
2090 seed = st->rng; | 2109 seed = st->rng; |
2091 for (c=0;c<C;c++) | 2110 for (c=0;c<C;c++) |
2092 { | 2111 { |
2093 for (i=0;i<(st->mode->eBands[st->start]<<LM);i++) | 2112 for (i=0;i<(st->mode->eBands[st->start]<<LM);i++) |
2094 X[c*N+i] = 0; | 2113 X[c*N+i] = 0; |
2095 for (i=st->start;i<st->mode->effEBands;i++) | 2114 for (i=st->start;i<mode->effEBands;i++) |
2096 { | 2115 { |
2097 int j; | 2116 int j; |
2098 int boffs; | 2117 int boffs; |
2099 int blen; | 2118 int blen; |
2100 boffs = N*c+(st->mode->eBands[i]<<LM); | 2119 boffs = N*c+(eBands[i]<<LM); |
2101 blen = (st->mode->eBands[i+1]-st->mode->eBands[i])<<LM; | 2120 blen = (eBands[i+1]-eBands[i])<<LM; |
2102 for (j=0;j<blen;j++) | 2121 for (j=0;j<blen;j++) |
2103 { | 2122 { |
2104 seed = celt_lcg_rand(seed); | 2123 seed = celt_lcg_rand(seed); |
2105 X[boffs+j] = (celt_norm)((opus_int32)seed>>20); | 2124 X[boffs+j] = (celt_norm)((opus_int32)seed>>20); |
2106 } | 2125 } |
2107 renormalise_vector(X+boffs, blen, Q15ONE); | 2126 renormalise_vector(X+boffs, blen, Q15ONE); |
2108 } | 2127 } |
2109 for (i=(st->mode->eBands[st->end]<<LM);i<N;i++) | 2128 for (i=(st->mode->eBands[st->end]<<LM);i<N;i++) |
2110 X[c*N+i] = 0; | 2129 X[c*N+i] = 0; |
2111 } | 2130 } |
2112 st->rng = seed; | 2131 st->rng = seed; |
2113 | 2132 |
2114 denormalise_bands(st->mode, X, freq, bandE, st->mode->effEBands, C, 1<<LM)
; | 2133 denormalise_bands(mode, X, freq, bandE, mode->effEBands, C, 1<<LM); |
2115 | 2134 |
2116 c=0; do | 2135 c=0; do |
2117 for (i=0;i<st->mode->eBands[st->start]<<LM;i++) | 2136 for (i=0;i<st->mode->eBands[st->start]<<LM;i++) |
2118 freq[c*N+i] = 0; | 2137 freq[c*N+i] = 0; |
2119 while (++c<C); | 2138 while (++c<C); |
2120 c=0; do { | 2139 c=0; do { |
2121 int bound = st->mode->eBands[effEnd]<<LM; | 2140 int bound = eBands[effEnd]<<LM; |
2122 if (st->downsample!=1) | 2141 if (st->downsample!=1) |
2123 bound = IMIN(bound, N/st->downsample); | 2142 bound = IMIN(bound, N/st->downsample); |
2124 for (i=bound;i<N;i++) | 2143 for (i=bound;i<N;i++) |
2125 freq[c*N+i] = 0; | 2144 freq[c*N+i] = 0; |
2126 } while (++c<C); | 2145 } while (++c<C); |
2127 compute_inv_mdcts(st->mode, 0, freq, out_syn, overlap_mem, C, LM); | 2146 c=0; do { |
| 2147 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap)
; |
| 2148 } while (++c<C); |
| 2149 compute_inv_mdcts(mode, 0, freq, out_syn, overlap_mem, C, LM); |
2128 } else { | 2150 } else { |
2129 /* Pitch-based PLC */ | 2151 /* Pitch-based PLC */ |
| 2152 VARDECL(opus_val32, etmp); |
| 2153 |
2130 if (st->loss_count == 0) | 2154 if (st->loss_count == 0) |
2131 { | 2155 { |
2132 opus_val16 pitch_buf[DECODE_BUFFER_SIZE>>1]; | 2156 opus_val16 pitch_buf[DECODE_BUFFER_SIZE>>1]; |
2133 /* Corresponds to a min pitch of 67 Hz. It's possible to save CPU in th
is | 2157 /* Corresponds to a min pitch of 67 Hz. It's possible to save CPU in th
is |
2134 search by using only part of the decode buffer */ | 2158 search by using only part of the decode buffer */ |
2135 int poffset = 720; | 2159 int poffset = 720; |
2136 pitch_downsample(decode_mem, pitch_buf, DECODE_BUFFER_SIZE, C); | 2160 pitch_downsample(decode_mem, pitch_buf, DECODE_BUFFER_SIZE, C); |
2137 /* Max pitch is 100 samples (480 Hz) */ | 2161 /* Max pitch is 100 samples (480 Hz) */ |
2138 pitch_search(pitch_buf+((poffset)>>1), pitch_buf, DECODE_BUFFER_SIZE-po
ffset, | 2162 pitch_search(pitch_buf+((poffset)>>1), pitch_buf, DECODE_BUFFER_SIZE-po
ffset, |
2139 poffset-100, &pitch_index); | 2163 poffset-100, &pitch_index); |
2140 pitch_index = poffset-pitch_index; | 2164 pitch_index = poffset-pitch_index; |
2141 st->last_pitch_index = pitch_index; | 2165 st->last_pitch_index = pitch_index; |
2142 } else { | 2166 } else { |
2143 pitch_index = st->last_pitch_index; | 2167 pitch_index = st->last_pitch_index; |
2144 fade = QCONST16(.8f,15); | 2168 fade = QCONST16(.8f,15); |
2145 } | 2169 } |
2146 | 2170 |
| 2171 ALLOC(etmp, overlap, opus_val32); |
2147 c=0; do { | 2172 c=0; do { |
2148 VARDECL(opus_val32, e); | |
2149 opus_val16 exc[MAX_PERIOD]; | 2173 opus_val16 exc[MAX_PERIOD]; |
2150 opus_val32 ac[LPC_ORDER+1]; | 2174 opus_val32 ac[LPC_ORDER+1]; |
2151 opus_val16 decay = 1; | 2175 opus_val16 decay; |
| 2176 opus_val16 attenuation; |
2152 opus_val32 S1=0; | 2177 opus_val32 S1=0; |
2153 opus_val16 mem[LPC_ORDER]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0}; | 2178 opus_val16 mem[LPC_ORDER]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0}; |
| 2179 opus_val32 *e = out_syn[c]; |
2154 | 2180 |
2155 ALLOC(e, MAX_PERIOD+2*st->mode->overlap, opus_val32); | |
2156 | 2181 |
2157 offset = MAX_PERIOD-pitch_index; | 2182 offset = MAX_PERIOD-pitch_index; |
2158 for (i=0;i<MAX_PERIOD;i++) | 2183 for (i=0;i<MAX_PERIOD;i++) |
2159 exc[i] = ROUND16(out_mem[c][i], SIG_SHIFT); | 2184 exc[i] = ROUND16(out_mem[c][i], SIG_SHIFT); |
2160 | 2185 |
| 2186 /* Compute LPC coefficients for the last MAX_PERIOD samples before the
loss so we can |
| 2187 work in the excitation-filter domain */ |
2161 if (st->loss_count == 0) | 2188 if (st->loss_count == 0) |
2162 { | 2189 { |
2163 _celt_autocorr(exc, ac, st->mode->window, st->mode->overlap, | 2190 _celt_autocorr(exc, ac, mode->window, overlap, |
2164 LPC_ORDER, MAX_PERIOD); | 2191 LPC_ORDER, MAX_PERIOD); |
2165 | 2192 |
2166 /* Noise floor -40 dB */ | 2193 /* Noise floor -40 dB */ |
2167 #ifdef FIXED_POINT | 2194 #ifdef FIXED_POINT |
2168 ac[0] += SHR32(ac[0],13); | 2195 ac[0] += SHR32(ac[0],13); |
2169 #else | 2196 #else |
2170 ac[0] *= 1.0001f; | 2197 ac[0] *= 1.0001f; |
2171 #endif | 2198 #endif |
2172 /* Lag windowing */ | 2199 /* Lag windowing */ |
2173 for (i=1;i<=LPC_ORDER;i++) | 2200 for (i=1;i<=LPC_ORDER;i++) |
2174 { | 2201 { |
2175 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ | 2202 /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/ |
2176 #ifdef FIXED_POINT | 2203 #ifdef FIXED_POINT |
2177 ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); | 2204 ac[i] -= MULT16_32_Q15(2*i*i, ac[i]); |
2178 #else | 2205 #else |
2179 ac[i] -= ac[i]*(.008f*i)*(.008f*i); | 2206 ac[i] -= ac[i]*(.008f*i)*(.008f*i); |
2180 #endif | 2207 #endif |
2181 } | 2208 } |
2182 | 2209 |
2183 _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); | 2210 _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER); |
2184 } | 2211 } |
| 2212 /* Samples just before the beginning of exc */ |
2185 for (i=0;i<LPC_ORDER;i++) | 2213 for (i=0;i<LPC_ORDER;i++) |
2186 mem[i] = ROUND16(out_mem[c][MAX_PERIOD-1-i], SIG_SHIFT); | 2214 mem[i] = ROUND16(out_mem[c][-1-i], SIG_SHIFT); |
| 2215 /* Compute the excitation for MAX_PERIOD samples before the loss */ |
2187 celt_fir(exc, lpc+c*LPC_ORDER, exc, MAX_PERIOD, LPC_ORDER, mem); | 2216 celt_fir(exc, lpc+c*LPC_ORDER, exc, MAX_PERIOD, LPC_ORDER, mem); |
2188 /*for (i=0;i<MAX_PERIOD;i++)printf("%d ", exc[i]); printf("\n");*/ | 2217 |
2189 /* Check if the waveform is decaying (and if so how fast) */ | 2218 /* Check if the waveform is decaying (and if so how fast) |
| 2219 We do this to avoid adding energy when concealing in a segment |
| 2220 with decaying energy */ |
2190 { | 2221 { |
2191 opus_val32 E1=1, E2=1; | 2222 opus_val32 E1=1, E2=1; |
2192 int period; | 2223 int period; |
2193 if (pitch_index <= MAX_PERIOD/2) | 2224 if (pitch_index <= MAX_PERIOD/2) |
2194 period = pitch_index; | 2225 period = pitch_index; |
2195 else | 2226 else |
2196 period = MAX_PERIOD/2; | 2227 period = MAX_PERIOD/2; |
2197 for (i=0;i<period;i++) | 2228 for (i=0;i<period;i++) |
2198 { | 2229 { |
2199 E1 += SHR32(MULT16_16(exc[MAX_PERIOD-period+i],exc[MAX_PERIOD-per
iod+i]),8); | 2230 E1 += SHR32(MULT16_16(exc[MAX_PERIOD-period+i],exc[MAX_PERIOD-per
iod+i]),8); |
2200 E2 += SHR32(MULT16_16(exc[MAX_PERIOD-2*period+i],exc[MAX_PERIOD-2
*period+i]),8); | 2231 E2 += SHR32(MULT16_16(exc[MAX_PERIOD-2*period+i],exc[MAX_PERIOD-2
*period+i]),8); |
2201 } | 2232 } |
2202 if (E1 > E2) | 2233 if (E1 > E2) |
2203 E1 = E2; | 2234 E1 = E2; |
2204 decay = celt_sqrt(frac_div32(SHR32(E1,1),E2)); | 2235 decay = celt_sqrt(frac_div32(SHR32(E1,1),E2)); |
| 2236 attenuation = decay; |
2205 } | 2237 } |
2206 | 2238 |
2207 /* Copy excitation, taking decay into account */ | 2239 /* Move memory one frame to the left */ |
2208 for (i=0;i<len+st->mode->overlap;i++) | 2240 OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap)
; |
| 2241 |
| 2242 /* Extrapolate excitation with the right period, taking decay into acco
unt */ |
| 2243 for (i=0;i<len;i++) |
2209 { | 2244 { |
2210 opus_val16 tmp; | 2245 opus_val16 tmp; |
2211 if (offset+i >= MAX_PERIOD) | 2246 if (offset+i >= MAX_PERIOD) |
2212 { | 2247 { |
2213 offset -= pitch_index; | 2248 offset -= pitch_index; |
2214 decay = MULT16_16_Q15(decay, decay); | 2249 attenuation = MULT16_16_Q15(attenuation, decay); |
2215 } | 2250 } |
2216 e[i] = SHL32(EXTEND32(MULT16_16_Q15(decay, exc[offset+i])), SIG_SHIF
T); | 2251 e[i] = SHL32(EXTEND32(MULT16_16_Q15(attenuation, exc[offset+i])), SI
G_SHIFT); |
2217 tmp = ROUND16(out_mem[c][offset+i],SIG_SHIFT); | 2252 /* Compute the energy of the previously decoded signal whose |
| 2253 excitation we're copying */ |
| 2254 tmp = ROUND16(out_mem[c][-N+offset+i],SIG_SHIFT); |
2218 S1 += SHR32(MULT16_16(tmp,tmp),8); | 2255 S1 += SHR32(MULT16_16(tmp,tmp),8); |
2219 } | 2256 } |
| 2257 |
| 2258 /* Copy the last decoded samples (prior to the overlap region) to |
| 2259 synthesis filter memory so we can have a continuous signal. */ |
2220 for (i=0;i<LPC_ORDER;i++) | 2260 for (i=0;i<LPC_ORDER;i++) |
2221 mem[i] = ROUND16(out_mem[c][MAX_PERIOD-1-i], SIG_SHIFT); | 2261 mem[i] = ROUND16(out_mem[c][MAX_PERIOD-N-1-i], SIG_SHIFT); |
2222 for (i=0;i<len+st->mode->overlap;i++) | 2262 /* Apply the fading if not the first loss */ |
| 2263 for (i=0;i<len;i++) |
2223 e[i] = MULT16_32_Q15(fade, e[i]); | 2264 e[i] = MULT16_32_Q15(fade, e[i]); |
2224 celt_iir(e, lpc+c*LPC_ORDER, e, len+st->mode->overlap, LPC_ORDER, mem); | 2265 /* Synthesis filter -- back in the signal domain */ |
| 2266 celt_iir(e, lpc+c*LPC_ORDER, e, len, LPC_ORDER, mem); |
2225 | 2267 |
| 2268 /* Check if the synthesis energy is higher than expected, which can |
| 2269 happen with the signal changes during our window. If so, attenuate.
*/ |
2226 { | 2270 { |
2227 opus_val32 S2=0; | 2271 opus_val32 S2=0; |
2228 for (i=0;i<len+overlap;i++) | 2272 for (i=0;i<len;i++) |
2229 { | 2273 { |
2230 opus_val16 tmp = ROUND16(e[i],SIG_SHIFT); | 2274 opus_val16 tmp = ROUND16(e[i],SIG_SHIFT); |
2231 S2 += SHR32(MULT16_16(tmp,tmp),8); | 2275 S2 += SHR32(MULT16_16(tmp,tmp),8); |
2232 } | 2276 } |
2233 /* This checks for an "explosion" in the synthesis */ | 2277 /* This checks for an "explosion" in the synthesis */ |
2234 #ifdef FIXED_POINT | 2278 #ifdef FIXED_POINT |
2235 if (!(S1 > SHR32(S2,2))) | 2279 if (!(S1 > SHR32(S2,2))) |
2236 #else | 2280 #else |
2237 /* Float test is written this way to catch NaNs at the same time
*/ | 2281 /* Float test is written this way to catch NaNs at the same time */ |
2238 if (!(S1 > 0.2f*S2)) | 2282 if (!(S1 > 0.2f*S2)) |
2239 #endif | 2283 #endif |
| 2284 { |
| 2285 for (i=0;i<len;i++) |
| 2286 e[i] = 0; |
| 2287 } else if (S1 < S2) |
| 2288 { |
| 2289 opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1)); |
| 2290 for (i=0;i<overlap;i++) |
2240 { | 2291 { |
2241 for (i=0;i<len+overlap;i++) | 2292 opus_val16 tmp_g = Q15ONE - MULT16_16_Q15(mode->window[i], Q15
ONE-ratio); |
2242 e[i] = 0; | 2293 e[i] = MULT16_32_Q15(tmp_g, e[i]); |
2243 } else if (S1 < S2) | |
2244 { | |
2245 opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1)); | |
2246 for (i=0;i<len+overlap;i++) | |
2247 e[i] = MULT16_32_Q15(ratio, e[i]); | |
2248 } | 2294 } |
| 2295 for (i=overlap;i<len;i++) |
| 2296 e[i] = MULT16_32_Q15(ratio, e[i]); |
| 2297 } |
2249 } | 2298 } |
2250 | 2299 |
2251 /* Apply post-filter to the MDCT overlap of the previous frame */ | 2300 /* Apply pre-filter to the MDCT overlap for the next frame because the |
2252 comb_filter(out_mem[c]+MAX_PERIOD, out_mem[c]+MAX_PERIOD, st->postfilte
r_period, st->postfilter_period, st->overlap, | 2301 post-filter will be re-applied in the decoder after the MDCT overlap
*/ |
2253 st->postfilter_gain, st->postfilter_gain, st->postfilter_tapset,
st->postfilter_tapset, | 2302 comb_filter(etmp, out_mem[c]+MAX_PERIOD, st->postfilter_period, st->pos
tfilter_period, st->overlap, |
| 2303 -st->postfilter_gain, -st->postfilter_gain, st->postfilter_tapset
, st->postfilter_tapset, |
2254 NULL, 0); | 2304 NULL, 0); |
2255 | 2305 |
2256 for (i=0;i<MAX_PERIOD+st->mode->overlap-N;i++) | 2306 /* Simulate TDAC on the concealed audio so that it blends with the |
2257 out_mem[c][i] = out_mem[c][N+i]; | 2307 MDCT of next frames. */ |
2258 | |
2259 /* Apply TDAC to the concealed audio so that it blends with the | |
2260 previous and next frames */ | |
2261 for (i=0;i<overlap/2;i++) | 2308 for (i=0;i<overlap/2;i++) |
2262 { | 2309 { |
2263 opus_val32 tmp; | 2310 opus_val32 tmp; |
2264 tmp = MULT16_32_Q15(st->mode->window[i], e[N+overlap-1-i])
+ | 2311 tmp = MULT16_32_Q15(mode->window[i], etmp[overlap-1-i]) + |
2265 MULT16_32_Q15(st->mode->window[overlap-i-1], e[N+i ])
; | 2312 MULT16_32_Q15(mode->window[overlap-i-1], etmp[i ]); |
2266 out_mem[c][MAX_PERIOD+i] = MULT16_32_Q15(st->mode->window[overlap-i-
1], tmp); | 2313 out_mem[c][MAX_PERIOD+i] = MULT16_32_Q15(mode->window[overlap-i-1],
tmp); |
2267 out_mem[c][MAX_PERIOD+overlap-i-1] = MULT16_32_Q15(st->mode->window[
i], tmp); | 2314 out_mem[c][MAX_PERIOD+overlap-i-1] = MULT16_32_Q15(mode->window[i],
tmp); |
2268 } | 2315 } |
2269 for (i=0;i<N;i++) | |
2270 out_mem[c][MAX_PERIOD-N+i] = e[i]; | |
2271 | |
2272 /* Apply pre-filter to the MDCT overlap for the next frame (post-filter
will be applied then) */ | |
2273 comb_filter(e, out_mem[c]+MAX_PERIOD, st->postfilter_period, st->postfi
lter_period, st->overlap, | |
2274 -st->postfilter_gain, -st->postfilter_gain, st->postfilter_tapset
, st->postfilter_tapset, | |
2275 NULL, 0); | |
2276 for (i=0;i<overlap;i++) | |
2277 out_mem[c][MAX_PERIOD+i] = e[i]; | |
2278 } while (++c<C); | 2316 } while (++c<C); |
2279 } | 2317 } |
2280 | 2318 |
2281 deemphasis(out_syn, pcm, N, C, st->downsample, st->mode->preemph, st->preemph
_memD); | 2319 deemphasis(out_syn, pcm, N, C, st->downsample, mode->preemph, st->preemph_mem
D); |
2282 | 2320 |
2283 st->loss_count++; | 2321 st->loss_count++; |
2284 | 2322 |
2285 RESTORE_STACK; | 2323 RESTORE_STACK; |
2286 } | 2324 } |
2287 | 2325 |
2288 int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
a, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec) | 2326 int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
a, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec) |
2289 { | 2327 { |
2290 int c, i, N; | 2328 int c, i, N; |
2291 int spread_decision; | 2329 int spread_decision; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2380 | 2418 |
2381 if (len<0 || len>1275 || pcm==NULL) | 2419 if (len<0 || len>1275 || pcm==NULL) |
2382 return OPUS_BAD_ARG; | 2420 return OPUS_BAD_ARG; |
2383 | 2421 |
2384 N = M*st->mode->shortMdctSize; | 2422 N = M*st->mode->shortMdctSize; |
2385 | 2423 |
2386 effEnd = st->end; | 2424 effEnd = st->end; |
2387 if (effEnd > st->mode->effEBands) | 2425 if (effEnd > st->mode->effEBands) |
2388 effEnd = st->mode->effEBands; | 2426 effEnd = st->mode->effEBands; |
2389 | 2427 |
| 2428 if (data == NULL || len<=1) |
| 2429 { |
| 2430 celt_decode_lost(st, pcm, N, LM); |
| 2431 RESTORE_STACK; |
| 2432 return frame_size/st->downsample; |
| 2433 } |
| 2434 |
2390 ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ | 2435 ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ |
2391 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ | 2436 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ |
2392 ALLOC(bandE, st->mode->nbEBands*C, celt_ener); | 2437 ALLOC(bandE, st->mode->nbEBands*C, celt_ener); |
2393 c=0; do | 2438 c=0; do |
2394 for (i=0;i<M*st->mode->eBands[st->start];i++) | 2439 for (i=0;i<M*st->mode->eBands[st->start];i++) |
2395 X[c*N+i] = 0; | 2440 X[c*N+i] = 0; |
2396 while (++c<C); | 2441 while (++c<C); |
2397 c=0; do | 2442 c=0; do |
2398 for (i=M*st->mode->eBands[effEnd];i<N;i++) | 2443 for (i=M*st->mode->eBands[effEnd];i<N;i++) |
2399 X[c*N+i] = 0; | 2444 X[c*N+i] = 0; |
2400 while (++c<C); | 2445 while (++c<C); |
2401 | 2446 |
2402 if (data == NULL || len<=1) | |
2403 { | |
2404 celt_decode_lost(st, pcm, N, LM); | |
2405 RESTORE_STACK; | |
2406 return frame_size/st->downsample; | |
2407 } | |
2408 | |
2409 if (dec == NULL) | 2447 if (dec == NULL) |
2410 { | 2448 { |
2411 ec_dec_init(&_dec,(unsigned char*)data,len); | 2449 ec_dec_init(&_dec,(unsigned char*)data,len); |
2412 dec = &_dec; | 2450 dec = &_dec; |
2413 } | 2451 } |
2414 | 2452 |
2415 if (C==1) | 2453 if (C==1) |
2416 { | 2454 { |
2417 for (i=0;i<st->mode->nbEBands;i++) | 2455 for (i=0;i<st->mode->nbEBands;i++) |
2418 oldBandE[i]=MAX16(oldBandE[i],oldBandE[st->mode->nbEBands+i]); | 2456 oldBandE[i]=MAX16(oldBandE[i],oldBandE[st->mode->nbEBands+i]); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2793 } | 2831 } |
2794 break; | 2832 break; |
2795 case OPUS_GET_PITCH_REQUEST: | 2833 case OPUS_GET_PITCH_REQUEST: |
2796 { | 2834 { |
2797 opus_int32 *value = va_arg(ap, opus_int32*); | 2835 opus_int32 *value = va_arg(ap, opus_int32*); |
2798 if (value==NULL) | 2836 if (value==NULL) |
2799 goto bad_arg; | 2837 goto bad_arg; |
2800 *value = st->postfilter_period; | 2838 *value = st->postfilter_period; |
2801 } | 2839 } |
2802 break; | 2840 break; |
2803 #ifdef OPUS_BUILD | |
2804 case CELT_GET_MODE_REQUEST: | 2841 case CELT_GET_MODE_REQUEST: |
2805 { | 2842 { |
2806 const CELTMode ** value = va_arg(ap, const CELTMode**); | 2843 const CELTMode ** value = va_arg(ap, const CELTMode**); |
2807 if (value==0) | 2844 if (value==0) |
2808 goto bad_arg; | 2845 goto bad_arg; |
2809 *value=st->mode; | 2846 *value=st->mode; |
2810 } | 2847 } |
2811 break; | 2848 break; |
2812 case CELT_SET_SIGNALLING_REQUEST: | 2849 case CELT_SET_SIGNALLING_REQUEST: |
2813 { | 2850 { |
2814 opus_int32 value = va_arg(ap, opus_int32); | 2851 opus_int32 value = va_arg(ap, opus_int32); |
2815 st->signalling = value; | 2852 st->signalling = value; |
2816 } | 2853 } |
2817 break; | 2854 break; |
2818 case OPUS_GET_FINAL_RANGE_REQUEST: | 2855 case OPUS_GET_FINAL_RANGE_REQUEST: |
2819 { | 2856 { |
2820 opus_uint32 * value = va_arg(ap, opus_uint32 *); | 2857 opus_uint32 * value = va_arg(ap, opus_uint32 *); |
2821 if (value==0) | 2858 if (value==0) |
2822 goto bad_arg; | 2859 goto bad_arg; |
2823 *value=st->rng; | 2860 *value=st->rng; |
2824 } | 2861 } |
2825 break; | 2862 break; |
2826 #endif | |
2827 default: | 2863 default: |
2828 goto bad_request; | 2864 goto bad_request; |
2829 } | 2865 } |
2830 va_end(ap); | 2866 va_end(ap); |
2831 return OPUS_OK; | 2867 return OPUS_OK; |
2832 bad_arg: | 2868 bad_arg: |
2833 va_end(ap); | 2869 va_end(ap); |
2834 return OPUS_BAD_ARG; | 2870 return OPUS_BAD_ARG; |
2835 bad_request: | 2871 bad_request: |
2836 va_end(ap); | 2872 va_end(ap); |
(...skipping 24 matching lines...) Expand all Loading... |
2861 { | 2897 { |
2862 return "libopus " OPUS_VERSION | 2898 return "libopus " OPUS_VERSION |
2863 #ifdef FIXED_POINT | 2899 #ifdef FIXED_POINT |
2864 "-fixed" | 2900 "-fixed" |
2865 #endif | 2901 #endif |
2866 #ifdef FUZZING | 2902 #ifdef FUZZING |
2867 "-fuzzing" | 2903 "-fuzzing" |
2868 #endif | 2904 #endif |
2869 ; | 2905 ; |
2870 } | 2906 } |
OLD | NEW |