float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f; if (!cpe->is_mask[w*16+g]) cpe->ms_mask[w*16+g] = 0; if (!sce0->zeroes[w*16+g] && !sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g]) { float Mmax = 0.0f, Smax = 0.0f; /* Must compute mid/side SF and book for the whole window group */ for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { M[i] = (sce0->coeffs[start+(w+w2)*128+i] + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; S[i] = M[i] - sce1->coeffs[start+(w+w2)*128+i]; } s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) { Mmax = FFMAX(Mmax, M34[i]); Smax = FFMAX(Smax, S34[i]); } } for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) { float dist1 = 0.0f, dist2 = 0.0f; int B0 = 0, B1 = 0; int minidx; int mididx, sididx; int midcb, sidcb; minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]); mididx = av_clip(minidx, 0, SCALE_MAX_POS - SCALE_DIV_512); sididx = av_clip(minidx - sid_sf_boost * 3, 0, SCALE_MAX_POS - SCALE_DIV_512); if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT && ( !ff_sfdelta_can_replace(sce0, nextband0, prev_mid, mididx, w*16+g) || !ff_sfdelta_can_replace(sce1, nextband1, prev_side, sididx, w*16+g))) { /* scalefactor range violation, bad stuff, will decrease quality unacceptably */ continue; } midcb = find_min_book(Mmax, mididx); sidcb = find_min_book(Smax, sididx); /* No CB can be zero */ midcb = FFMAX(1,midcb); sidcb = FFMAX(1,sidcb); for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g]; FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g]; float minthr = FFMIN(band0->threshold, band1->threshold); int b1,b2,b3,b4; for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { M[i] = (sce0->coeffs[start+(w+w2)*128+i] + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; S[i] = M[i] - sce1->coeffs[start+(w+w2)*128+i]; } s->aacdsp.abs_pow34(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); dist1 += quantize_band_cost(s, &sce0->coeffs[start + (w+w2)*128], L34, sce0->ics.swb_sizes[g], sce0->sf_idx[w*16+g], sce0->band_type[w*16+g], lambda / (band0->threshold + FLT_MIN), INFINITY, &b1, NULL); dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128], R34, sce1->ics.swb_sizes[g], sce1->sf_idx[w*16+g], sce1->band_type[w*16+g], lambda / (band1->threshold + FLT_MIN), INFINITY, &b2, NULL); dist2 += quantize_band_cost(s, M, M34, sce0->ics.swb_sizes[g], mididx, midcb, lambda / (minthr + FLT_MIN), INFINITY, &b3, NULL); dist2 += quantize_band_cost(s, S, S34, sce1->ics.swb_sizes[g], sididx, sidcb, mslambda / (minthr * bmax + FLT_MIN), INFINITY, &b4, NULL); B0 += b1+b2; B1 += b3+b4; dist1 -= b1+b2; dist2 -= b3+b4; } cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0; if (cpe->ms_mask[w*16+g]) { if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) { sce0->sf_idx[w*16+g] = mididx; sce1->sf_idx[w*16+g] = sididx; sce0->band_type[w*16+g] = midcb; sce1->band_type[w*16+g] = sidcb; } else if ((sce0->band_type[w*16+g] != NOISE_BT) ^ (sce1->band_type[w*16+g] != NOISE_BT)) { /* ms_mask unneeded, and it confuses some decoders */ cpe->ms_mask[w*16+g] = 0; } break; } else if (B1 > B0) { /* More boost won't fix this */ break; } } } if (!sce0->zeroes[w*16+g] && sce0->band_type[w*16+g] < RESERVED_BT) prev_mid = sce0->sf_idx[w*16+g]; if (!sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT) prev_side = sce1->sf_idx[w*16+g]; start += sce0->ics.swb_sizes[g]; } }} const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = { [AAC_CODER_ANMR] = { search_for_quantizers_anmr, encode_window_bands_info, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, }, [AAC_CODER_TWOLOOP] = { search_for_quantizers_twoloop, codebook_trellis_rate, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, }, [AAC_CODER_FAST] = { search_for_quantizers_fast, codebook_trellis_rate, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, },};Lines 1001–1186 of 1186. Previous lines
float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f; if (!cpe->is_mask[w*16+g]) cpe->ms_mask[w*16+g] = 0; if (!sce0->zeroes[w*16+g] && !sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g]) { float Mmax = 0.0f, Smax = 0.0f; /* Must compute mid/side SF and book for the whole window group */ for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { M[i] = (sce0->coeffs[start+(w+w2)*128+i] + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; S[i] = M[i] - sce1->coeffs[start+(w+w2)*128+i]; } s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) { Mmax = FFMAX(Mmax, M34[i]); Smax = FFMAX(Smax, S34[i]); } } for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) { float dist1 = 0.0f, dist2 = 0.0f; int B0 = 0, B1 = 0; int minidx; int mididx, sididx; int midcb, sidcb; minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]); mididx = av_clip(minidx, 0, SCALE_MAX_POS - SCALE_DIV_512); sididx = av_clip(minidx - sid_sf_boost * 3, 0, SCALE_MAX_POS - SCALE_DIV_512); if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT && ( !ff_sfdelta_can_replace(sce0, nextband0, prev_mid, mididx, w*16+g) || !ff_sfdelta_can_replace(sce1, nextband1, prev_side, sididx, w*16+g))) { /* scalefactor range violation, bad stuff, will decrease quality unacceptably */ continue; } midcb = find_min_book(Mmax, mididx); sidcb = find_min_book(Smax, sididx); /* No CB can be zero */ midcb = FFMAX(1,midcb); sidcb = FFMAX(1,sidcb); for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g]; FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g]; float minthr = FFMIN(band0->threshold, band1->threshold); int b1,b2,b3,b4; for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { M[i] = (sce0->coeffs[start+(w+w2)*128+i] + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; S[i] = M[i] - sce1->coeffs[start+(w+w2)*128+i]; } s->aacdsp.abs_pow34(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); dist1 += quantize_band_cost(s, &sce0->coeffs[start + (w+w2)*128], L34, sce0->ics.swb_sizes[g], sce0->sf_idx[w*16+g], sce0->band_type[w*16+g], lambda / (band0->threshold + FLT_MIN), INFINITY, &b1, NULL); dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128], R34, sce1->ics.swb_sizes[g], sce1->sf_idx[w*16+g], sce1->band_type[w*16+g], lambda / (band1->threshold + FLT_MIN), INFINITY, &b2, NULL); dist2 += quantize_band_cost(s, M, M34, sce0->ics.swb_sizes[g], mididx, midcb, lambda / (minthr + FLT_MIN), INFINITY, &b3, NULL); dist2 += quantize_band_cost(s, S, S34, sce1->ics.swb_sizes[g], sididx, sidcb, mslambda / (minthr * bmax + FLT_MIN), INFINITY, &b4, NULL); B0 += b1+b2; B1 += b3+b4; dist1 -= b1+b2; dist2 -= b3+b4; } cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0; if (cpe->ms_mask[w*16+g]) { if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) { sce0->sf_idx[w*16+g] = mididx; sce1->sf_idx[w*16+g] = sididx; sce0->band_type[w*16+g] = midcb; sce1->band_type[w*16+g] = sidcb; } else if ((sce0->band_type[w*16+g] != NOISE_BT) ^ (sce1->band_type[w*16+g] != NOISE_BT)) { /* ms_mask unneeded, and it confuses some decoders */ cpe->ms_mask[w*16+g] = 0; } break; } else if (B1 > B0) { /* More boost won't fix this */ break; } } } if (!sce0->zeroes[w*16+g] && sce0->band_type[w*16+g] < RESERVED_BT) prev_mid = sce0->sf_idx[w*16+g]; if (!sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT) prev_side = sce1->sf_idx[w*16+g]; start += sce0->ics.swb_sizes[g]; } } } const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = { [AAC_CODER_ANMR] = { search_for_quantizers_anmr, encode_window_bands_info, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, }, [AAC_CODER_TWOLOOP] = { search_for_quantizers_twoloop, codebook_trellis_rate, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, }, [AAC_CODER_FAST] = { search_for_quantizers_fast, codebook_trellis_rate, quantize_and_encode_band, ff_aac_encode_tns_info, ff_aac_encode_ltp_info, ff_aac_encode_main_pred, ff_aac_adjust_common_pred, ff_aac_adjust_common_ltp, ff_aac_apply_main_pred, ff_aac_apply_tns, ff_aac_update_ltp, ff_aac_ltp_insert_new_frame, set_special_band_scalefactors, search_for_pns, mark_pns, ff_aac_search_for_tns, ff_aac_search_for_ltp, search_for_ms, ff_aac_search_for_is, ff_aac_search_for_pred, }, };