OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 return 0; | 170 return 0; |
171 } | 171 } |
172 | 172 |
173 | 173 |
174 void WebRtcIsac_ResetBitstream(Bitstr* bit_stream) { | 174 void WebRtcIsac_ResetBitstream(Bitstr* bit_stream) { |
175 bit_stream->W_upper = 0xFFFFFFFF; | 175 bit_stream->W_upper = 0xFFFFFFFF; |
176 bit_stream->stream_index = 0; | 176 bit_stream->stream_index = 0; |
177 bit_stream->streamval = 0; | 177 bit_stream->streamval = 0; |
178 } | 178 } |
179 | 179 |
180 int WebRtcIsac_EncodeLb(float* in, ISACLBEncStruct* ISACencLB_obj, | 180 int WebRtcIsac_EncodeLb(const TransformTables* transform_tables, |
| 181 float* in, ISACLBEncStruct* ISACencLB_obj, |
181 int16_t codingMode, | 182 int16_t codingMode, |
182 int16_t bottleneckIndex) { | 183 int16_t bottleneckIndex) { |
183 int stream_length = 0; | 184 int stream_length = 0; |
184 int err; | 185 int err; |
185 int k; | 186 int k; |
186 int iterCntr; | 187 int iterCntr; |
187 | 188 |
188 double lofilt_coef[(ORDERLO + 1)*SUBFRAMES]; | 189 double lofilt_coef[(ORDERLO + 1)*SUBFRAMES]; |
189 double hifilt_coef[(ORDERHI + 1)*SUBFRAMES]; | 190 double hifilt_coef[(ORDERHI + 1)*SUBFRAMES]; |
190 float LP[FRAMESAMPLES_HALF]; | 191 float LP[FRAMESAMPLES_HALF]; |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 LP, lofilt_coef, LPw); | 376 LP, lofilt_coef, LPw); |
376 /* High-band filtering. */ | 377 /* High-band filtering. */ |
377 WebRtcIsac_NormLatticeFilterMa(ORDERHI, | 378 WebRtcIsac_NormLatticeFilterMa(ORDERHI, |
378 ISACencLB_obj->maskfiltstr_obj.PreStateHiF, | 379 ISACencLB_obj->maskfiltstr_obj.PreStateHiF, |
379 ISACencLB_obj->maskfiltstr_obj.PreStateHiG, | 380 ISACencLB_obj->maskfiltstr_obj.PreStateHiG, |
380 HP, hifilt_coef, HPw); | 381 HP, hifilt_coef, HPw); |
381 /* Pitch filter. */ | 382 /* Pitch filter. */ |
382 WebRtcIsac_PitchfilterPre(LPw, LPw_pf, &ISACencLB_obj->pitchfiltstr_obj, | 383 WebRtcIsac_PitchfilterPre(LPw, LPw_pf, &ISACencLB_obj->pitchfiltstr_obj, |
383 PitchLags, PitchGains); | 384 PitchLags, PitchGains); |
384 /* Transform */ | 385 /* Transform */ |
385 WebRtcIsac_Time2Spec(LPw_pf, HPw, fre, fim, &ISACencLB_obj->fftstr_obj); | 386 WebRtcIsac_Time2Spec(transform_tables, |
| 387 LPw_pf, HPw, fre, fim, &ISACencLB_obj->fftstr_obj); |
386 | 388 |
387 /* Save data for multiple packets memory. */ | 389 /* Save data for multiple packets memory. */ |
388 my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF; | 390 my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF; |
389 memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre)); | 391 memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre)); |
390 memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim)); | 392 memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim)); |
391 | 393 |
392 ISACencLB_obj->SaveEnc_obj.AvgPitchGain[ISACencLB_obj->SaveEnc_obj.startIdx] = | 394 ISACencLB_obj->SaveEnc_obj.AvgPitchGain[ISACencLB_obj->SaveEnc_obj.startIdx] = |
393 AvgPitchGain_Q12; | 395 AvgPitchGain_Q12; |
394 | 396 |
395 /* Quantization and loss-less coding. */ | 397 /* Quantization and loss-less coding. */ |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 /* There has been an error but it was not too large payload | 636 /* There has been an error but it was not too large payload |
635 (we can cure too large payload). */ | 637 (we can cure too large payload). */ |
636 return status; | 638 return status; |
637 } | 639 } |
638 iterCntr++; | 640 iterCntr++; |
639 } while ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) || | 641 } while ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) || |
640 (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH)); | 642 (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH)); |
641 return 0; | 643 return 0; |
642 } | 644 } |
643 | 645 |
644 int WebRtcIsac_EncodeUb16(float* in, ISACUBEncStruct* ISACencUB_obj, | 646 int WebRtcIsac_EncodeUb16(const TransformTables* transform_tables, |
| 647 float* in, ISACUBEncStruct* ISACencUB_obj, |
645 int32_t jitterInfo) { | 648 int32_t jitterInfo) { |
646 int err; | 649 int err; |
647 int k; | 650 int k; |
648 | 651 |
649 double lpcVecs[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; | 652 double lpcVecs[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME]; |
650 double percepFilterParams[(1 + UB_LPC_ORDER) * (SUBFRAMES << 1) + | 653 double percepFilterParams[(1 + UB_LPC_ORDER) * (SUBFRAMES << 1) + |
651 (1 + UB_LPC_ORDER)]; | 654 (1 + UB_LPC_ORDER)]; |
652 | 655 |
653 double LP_lookahead[FRAMESAMPLES]; | 656 double LP_lookahead[FRAMESAMPLES]; |
654 int16_t fre[FRAMESAMPLES_HALF]; /* Q7 */ | 657 int16_t fre[FRAMESAMPLES_HALF]; /* Q7 */ |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 &LP_lookahead[0]); | 778 &LP_lookahead[0]); |
776 | 779 |
777 /* Second half-frame filtering. */ | 780 /* Second half-frame filtering. */ |
778 WebRtcIsac_NormLatticeFilterMa( | 781 WebRtcIsac_NormLatticeFilterMa( |
779 UB_LPC_ORDER, ISACencUB_obj->maskfiltstr_obj.PreStateLoF, | 782 UB_LPC_ORDER, ISACencUB_obj->maskfiltstr_obj.PreStateLoF, |
780 ISACencUB_obj->maskfiltstr_obj.PreStateLoG, | 783 ISACencUB_obj->maskfiltstr_obj.PreStateLoG, |
781 &ISACencUB_obj->data_buffer_float[FRAMESAMPLES_HALF], | 784 &ISACencUB_obj->data_buffer_float[FRAMESAMPLES_HALF], |
782 &percepFilterParams[(UB_LPC_ORDER + 1) + SUBFRAMES * (UB_LPC_ORDER + 1)], | 785 &percepFilterParams[(UB_LPC_ORDER + 1) + SUBFRAMES * (UB_LPC_ORDER + 1)], |
783 &LP_lookahead[FRAMESAMPLES_HALF]); | 786 &LP_lookahead[FRAMESAMPLES_HALF]); |
784 | 787 |
785 WebRtcIsac_Time2Spec(&LP_lookahead[0], &LP_lookahead[FRAMESAMPLES_HALF], | 788 WebRtcIsac_Time2Spec(transform_tables, |
| 789 &LP_lookahead[0], &LP_lookahead[FRAMESAMPLES_HALF], |
786 fre, fim, &ISACencUB_obj->fftstr_obj); | 790 fre, fim, &ISACencUB_obj->fftstr_obj); |
787 | 791 |
788 /* Store FFT coefficients for multiple encoding. */ | 792 /* Store FFT coefficients for multiple encoding. */ |
789 memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, sizeof(fre)); | 793 memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, sizeof(fre)); |
790 memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, sizeof(fim)); | 794 memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, sizeof(fim)); |
791 | 795 |
792 /* Prepare the audio buffer for the next packet | 796 /* Prepare the audio buffer for the next packet |
793 * move the last 3 ms to the beginning of the buffer. */ | 797 * move the last 3 ms to the beginning of the buffer. */ |
794 memcpy(ISACencUB_obj->data_buffer_float, | 798 memcpy(ISACencUB_obj->data_buffer_float, |
795 &ISACencUB_obj->data_buffer_float[FRAMESAMPLES], | 799 &ISACencUB_obj->data_buffer_float[FRAMESAMPLES], |
(...skipping 23 matching lines...) Expand all Loading... |
819 kIsacUpperBand16, err); | 823 kIsacUpperBand16, err); |
820 } | 824 } |
821 if (err < 0) { | 825 if (err < 0) { |
822 return err; | 826 return err; |
823 } | 827 } |
824 /* Complete arithmetic coding. */ | 828 /* Complete arithmetic coding. */ |
825 return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj); | 829 return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj); |
826 } | 830 } |
827 | 831 |
828 | 832 |
829 int WebRtcIsac_EncodeUb12(float* in, ISACUBEncStruct* ISACencUB_obj, | 833 int WebRtcIsac_EncodeUb12(const TransformTables* transform_tables, |
| 834 float* in, ISACUBEncStruct* ISACencUB_obj, |
830 int32_t jitterInfo) { | 835 int32_t jitterInfo) { |
831 int err; | 836 int err; |
832 int k; | 837 int k; |
833 | 838 |
834 double lpcVecs[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME]; | 839 double lpcVecs[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME]; |
835 | 840 |
836 double percepFilterParams[(1 + UB_LPC_ORDER) * SUBFRAMES]; | 841 double percepFilterParams[(1 + UB_LPC_ORDER) * SUBFRAMES]; |
837 float LP[FRAMESAMPLES_HALF]; | 842 float LP[FRAMESAMPLES_HALF]; |
838 float HP[FRAMESAMPLES_HALF]; | 843 float HP[FRAMESAMPLES_HALF]; |
839 | 844 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 of bytes left for coding the spectrum. It is a 30ms frame Subract 3 | 955 of bytes left for coding the spectrum. It is a 30ms frame Subract 3 |
951 because termination process may add 3 bytes */ | 956 because termination process may add 3 bytes */ |
952 payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes - | 957 payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes - |
953 ISACencUB_obj->numBytesUsed - 3; | 958 ISACencUB_obj->numBytesUsed - 3; |
954 bytesLeftSpecCoding = payloadLimitBytes - | 959 bytesLeftSpecCoding = payloadLimitBytes - |
955 ISACencUB_obj->bitstr_obj.stream_index; | 960 ISACencUB_obj->bitstr_obj.stream_index; |
956 | 961 |
957 memset(HPw, 0, sizeof(HPw)); | 962 memset(HPw, 0, sizeof(HPw)); |
958 | 963 |
959 /* Transform */ | 964 /* Transform */ |
960 WebRtcIsac_Time2Spec(LPw, HPw, fre, fim, &ISACencUB_obj->fftstr_obj); | 965 WebRtcIsac_Time2Spec(transform_tables, |
| 966 LPw, HPw, fre, fim, &ISACencUB_obj->fftstr_obj); |
961 | 967 |
962 /* Store FFT coefficients for multiple encoding. */ | 968 /* Store FFT coefficients for multiple encoding. */ |
963 memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, | 969 memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, |
964 sizeof(ISACencUB_obj->SaveEnc_obj.realFFT)); | 970 sizeof(ISACencUB_obj->SaveEnc_obj.realFFT)); |
965 memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, | 971 memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, |
966 sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT)); | 972 sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT)); |
967 | 973 |
968 /* Save the bit-stream object at this point for FEC. */ | 974 /* Save the bit-stream object at this point for FEC. */ |
969 memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, | 975 memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, |
970 &ISACencUB_obj->bitstr_obj, sizeof(Bitstr)); | 976 &ISACencUB_obj->bitstr_obj, sizeof(Bitstr)); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 band = (bandwidth == isac12kHz) ? kIsacUpperBand12 : kIsacUpperBand16; | 1249 band = (bandwidth == isac12kHz) ? kIsacUpperBand12 : kIsacUpperBand16; |
1244 status = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain, band, | 1250 status = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain, band, |
1245 bitStreamObj); | 1251 bitStreamObj); |
1246 if (status < 0) { | 1252 if (status < 0) { |
1247 return status; | 1253 return status; |
1248 } else { | 1254 } else { |
1249 /* Terminate entropy coding */ | 1255 /* Terminate entropy coding */ |
1250 return WebRtcIsac_EncTerminate(bitStreamObj); | 1256 return WebRtcIsac_EncTerminate(bitStreamObj); |
1251 } | 1257 } |
1252 } | 1258 } |
OLD | NEW |