1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * AAC encoder main-type prediction 3cabdff1aSopenharmony_ci * Copyright (C) 2015 Rostislav Pehlivanov 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * AAC encoder main-type prediction 25cabdff1aSopenharmony_ci * @author Rostislav Pehlivanov ( atomnuker gmail com ) 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "aactab.h" 29cabdff1aSopenharmony_ci#include "aacenc_pred.h" 30cabdff1aSopenharmony_ci#include "aacenc_utils.h" 31cabdff1aSopenharmony_ci#include "aacenc_is.h" /* <- Needed for common window distortions */ 32cabdff1aSopenharmony_ci#include "aacenc_quantization.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define RESTORE_PRED(sce, sfb) \ 35cabdff1aSopenharmony_ci if (sce->ics.prediction_used[sfb]) {\ 36cabdff1aSopenharmony_ci sce->ics.prediction_used[sfb] = 0;\ 37cabdff1aSopenharmony_ci sce->band_type[sfb] = sce->band_alt[sfb];\ 38cabdff1aSopenharmony_ci } 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_cistatic inline float flt16_round(float pf) 41cabdff1aSopenharmony_ci{ 42cabdff1aSopenharmony_ci union av_intfloat32 tmp; 43cabdff1aSopenharmony_ci tmp.f = pf; 44cabdff1aSopenharmony_ci tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U; 45cabdff1aSopenharmony_ci return tmp.f; 46cabdff1aSopenharmony_ci} 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_cistatic inline float flt16_even(float pf) 49cabdff1aSopenharmony_ci{ 50cabdff1aSopenharmony_ci union av_intfloat32 tmp; 51cabdff1aSopenharmony_ci tmp.f = pf; 52cabdff1aSopenharmony_ci tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U; 53cabdff1aSopenharmony_ci return tmp.f; 54cabdff1aSopenharmony_ci} 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_cistatic inline float flt16_trunc(float pf) 57cabdff1aSopenharmony_ci{ 58cabdff1aSopenharmony_ci union av_intfloat32 pun; 59cabdff1aSopenharmony_ci pun.f = pf; 60cabdff1aSopenharmony_ci pun.i &= 0xFFFF0000U; 61cabdff1aSopenharmony_ci return pun.f; 62cabdff1aSopenharmony_ci} 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_cistatic inline void predict(PredictorState *ps, float *coef, float *rcoef, int set) 65cabdff1aSopenharmony_ci{ 66cabdff1aSopenharmony_ci float k2; 67cabdff1aSopenharmony_ci const float a = 0.953125; // 61.0 / 64 68cabdff1aSopenharmony_ci const float alpha = 0.90625; // 29.0 / 32 69cabdff1aSopenharmony_ci const float k1 = ps->k1; 70cabdff1aSopenharmony_ci const float r0 = ps->r0, r1 = ps->r1; 71cabdff1aSopenharmony_ci const float cor0 = ps->cor0, cor1 = ps->cor1; 72cabdff1aSopenharmony_ci const float var0 = ps->var0, var1 = ps->var1; 73cabdff1aSopenharmony_ci const float e0 = *coef - ps->x_est; 74cabdff1aSopenharmony_ci const float e1 = e0 - k1 * r0; 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci if (set) 77cabdff1aSopenharmony_ci *coef = e0; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1); 80cabdff1aSopenharmony_ci ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1)); 81cabdff1aSopenharmony_ci ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0); 82cabdff1aSopenharmony_ci ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0)); 83cabdff1aSopenharmony_ci ps->r1 = flt16_trunc(a * (r0 - k1 * e0)); 84cabdff1aSopenharmony_ci ps->r0 = flt16_trunc(a * e0); 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci /* Prediction for next frame */ 87cabdff1aSopenharmony_ci ps->k1 = ps->var0 > 1 ? ps->cor0 * flt16_even(a / ps->var0) : 0; 88cabdff1aSopenharmony_ci k2 = ps->var1 > 1 ? ps->cor1 * flt16_even(a / ps->var1) : 0; 89cabdff1aSopenharmony_ci *rcoef = ps->x_est = flt16_round(ps->k1*ps->r0 + k2*ps->r1); 90cabdff1aSopenharmony_ci} 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_cistatic inline void reset_predict_state(PredictorState *ps) 93cabdff1aSopenharmony_ci{ 94cabdff1aSopenharmony_ci ps->r0 = 0.0f; 95cabdff1aSopenharmony_ci ps->r1 = 0.0f; 96cabdff1aSopenharmony_ci ps->k1 = 0.0f; 97cabdff1aSopenharmony_ci ps->cor0 = 0.0f; 98cabdff1aSopenharmony_ci ps->cor1 = 0.0f; 99cabdff1aSopenharmony_ci ps->var0 = 1.0f; 100cabdff1aSopenharmony_ci ps->var1 = 1.0f; 101cabdff1aSopenharmony_ci ps->x_est = 0.0f; 102cabdff1aSopenharmony_ci} 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_cistatic inline void reset_all_predictors(PredictorState *ps) 105cabdff1aSopenharmony_ci{ 106cabdff1aSopenharmony_ci int i; 107cabdff1aSopenharmony_ci for (i = 0; i < MAX_PREDICTORS; i++) 108cabdff1aSopenharmony_ci reset_predict_state(&ps[i]); 109cabdff1aSopenharmony_ci} 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_cistatic inline void reset_predictor_group(SingleChannelElement *sce, int group_num) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci int i; 114cabdff1aSopenharmony_ci PredictorState *ps = sce->predictor_state; 115cabdff1aSopenharmony_ci for (i = group_num - 1; i < MAX_PREDICTORS; i += 30) 116cabdff1aSopenharmony_ci reset_predict_state(&ps[i]); 117cabdff1aSopenharmony_ci} 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_civoid ff_aac_apply_main_pred(AACEncContext *s, SingleChannelElement *sce) 120cabdff1aSopenharmony_ci{ 121cabdff1aSopenharmony_ci int sfb, k; 122cabdff1aSopenharmony_ci const int pmax = FFMIN(sce->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]); 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) { 125cabdff1aSopenharmony_ci for (sfb = 0; sfb < pmax; sfb++) { 126cabdff1aSopenharmony_ci for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) { 127cabdff1aSopenharmony_ci predict(&sce->predictor_state[k], &sce->coeffs[k], &sce->prcoeffs[k], 128cabdff1aSopenharmony_ci sce->ics.predictor_present && sce->ics.prediction_used[sfb]); 129cabdff1aSopenharmony_ci } 130cabdff1aSopenharmony_ci } 131cabdff1aSopenharmony_ci if (sce->ics.predictor_reset_group) { 132cabdff1aSopenharmony_ci reset_predictor_group(sce, sce->ics.predictor_reset_group); 133cabdff1aSopenharmony_ci } 134cabdff1aSopenharmony_ci } else { 135cabdff1aSopenharmony_ci reset_all_predictors(sce->predictor_state); 136cabdff1aSopenharmony_ci } 137cabdff1aSopenharmony_ci} 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci/* If inc = 0 you can check if this returns 0 to see if you can reset freely */ 140cabdff1aSopenharmony_cistatic inline int update_counters(IndividualChannelStream *ics, int inc) 141cabdff1aSopenharmony_ci{ 142cabdff1aSopenharmony_ci int i; 143cabdff1aSopenharmony_ci for (i = 1; i < 31; i++) { 144cabdff1aSopenharmony_ci ics->predictor_reset_count[i] += inc; 145cabdff1aSopenharmony_ci if (ics->predictor_reset_count[i] > PRED_RESET_FRAME_MIN) 146cabdff1aSopenharmony_ci return i; /* Reset this immediately */ 147cabdff1aSopenharmony_ci } 148cabdff1aSopenharmony_ci return 0; 149cabdff1aSopenharmony_ci} 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_civoid ff_aac_adjust_common_pred(AACEncContext *s, ChannelElement *cpe) 152cabdff1aSopenharmony_ci{ 153cabdff1aSopenharmony_ci int start, w, w2, g, i, count = 0; 154cabdff1aSopenharmony_ci SingleChannelElement *sce0 = &cpe->ch[0]; 155cabdff1aSopenharmony_ci SingleChannelElement *sce1 = &cpe->ch[1]; 156cabdff1aSopenharmony_ci const int pmax0 = FFMIN(sce0->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]); 157cabdff1aSopenharmony_ci const int pmax1 = FFMIN(sce1->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]); 158cabdff1aSopenharmony_ci const int pmax = FFMIN(pmax0, pmax1); 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci if (!cpe->common_window || 161cabdff1aSopenharmony_ci sce0->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE || 162cabdff1aSopenharmony_ci sce1->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE) 163cabdff1aSopenharmony_ci return; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { 166cabdff1aSopenharmony_ci start = 0; 167cabdff1aSopenharmony_ci for (g = 0; g < sce0->ics.num_swb; g++) { 168cabdff1aSopenharmony_ci int sfb = w*16+g; 169cabdff1aSopenharmony_ci int sum = sce0->ics.prediction_used[sfb] + sce1->ics.prediction_used[sfb]; 170cabdff1aSopenharmony_ci float ener0 = 0.0f, ener1 = 0.0f, ener01 = 0.0f; 171cabdff1aSopenharmony_ci struct AACISError ph_err1, ph_err2, *erf; 172cabdff1aSopenharmony_ci if (sfb < PRED_SFB_START || sfb > pmax || sum != 2) { 173cabdff1aSopenharmony_ci RESTORE_PRED(sce0, sfb); 174cabdff1aSopenharmony_ci RESTORE_PRED(sce1, sfb); 175cabdff1aSopenharmony_ci start += sce0->ics.swb_sizes[g]; 176cabdff1aSopenharmony_ci continue; 177cabdff1aSopenharmony_ci } 178cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { 179cabdff1aSopenharmony_ci for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { 180cabdff1aSopenharmony_ci float coef0 = sce0->pcoeffs[start+(w+w2)*128+i]; 181cabdff1aSopenharmony_ci float coef1 = sce1->pcoeffs[start+(w+w2)*128+i]; 182cabdff1aSopenharmony_ci ener0 += coef0*coef0; 183cabdff1aSopenharmony_ci ener1 += coef1*coef1; 184cabdff1aSopenharmony_ci ener01 += (coef0 + coef1)*(coef0 + coef1); 185cabdff1aSopenharmony_ci } 186cabdff1aSopenharmony_ci } 187cabdff1aSopenharmony_ci ph_err1 = ff_aac_is_encoding_err(s, cpe, start, w, g, 188cabdff1aSopenharmony_ci ener0, ener1, ener01, 1, -1); 189cabdff1aSopenharmony_ci ph_err2 = ff_aac_is_encoding_err(s, cpe, start, w, g, 190cabdff1aSopenharmony_ci ener0, ener1, ener01, 1, +1); 191cabdff1aSopenharmony_ci erf = ph_err1.error < ph_err2.error ? &ph_err1 : &ph_err2; 192cabdff1aSopenharmony_ci if (erf->pass) { 193cabdff1aSopenharmony_ci sce0->ics.prediction_used[sfb] = 1; 194cabdff1aSopenharmony_ci sce1->ics.prediction_used[sfb] = 1; 195cabdff1aSopenharmony_ci count++; 196cabdff1aSopenharmony_ci } else { 197cabdff1aSopenharmony_ci RESTORE_PRED(sce0, sfb); 198cabdff1aSopenharmony_ci RESTORE_PRED(sce1, sfb); 199cabdff1aSopenharmony_ci } 200cabdff1aSopenharmony_ci start += sce0->ics.swb_sizes[g]; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci } 203cabdff1aSopenharmony_ci 204cabdff1aSopenharmony_ci sce1->ics.predictor_present = sce0->ics.predictor_present = !!count; 205cabdff1aSopenharmony_ci} 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_cistatic void update_pred_resets(SingleChannelElement *sce) 208cabdff1aSopenharmony_ci{ 209cabdff1aSopenharmony_ci int i, max_group_id_c, max_frame = 0; 210cabdff1aSopenharmony_ci float avg_frame = 0.0f; 211cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci /* Update the counters and immediately update any frame behind schedule */ 214cabdff1aSopenharmony_ci if ((ics->predictor_reset_group = update_counters(&sce->ics, 1))) 215cabdff1aSopenharmony_ci return; 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci for (i = 1; i < 31; i++) { 218cabdff1aSopenharmony_ci /* Count-based */ 219cabdff1aSopenharmony_ci if (ics->predictor_reset_count[i] > max_frame) { 220cabdff1aSopenharmony_ci max_group_id_c = i; 221cabdff1aSopenharmony_ci max_frame = ics->predictor_reset_count[i]; 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci avg_frame = (ics->predictor_reset_count[i] + avg_frame)/2; 224cabdff1aSopenharmony_ci } 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci if (max_frame > PRED_RESET_MIN) { 227cabdff1aSopenharmony_ci ics->predictor_reset_group = max_group_id_c; 228cabdff1aSopenharmony_ci } else { 229cabdff1aSopenharmony_ci ics->predictor_reset_group = 0; 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci} 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_civoid ff_aac_search_for_pred(AACEncContext *s, SingleChannelElement *sce) 234cabdff1aSopenharmony_ci{ 235cabdff1aSopenharmony_ci int sfb, i, count = 0, cost_coeffs = 0, cost_pred = 0; 236cabdff1aSopenharmony_ci const int pmax = FFMIN(sce->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]); 237cabdff1aSopenharmony_ci float *O34 = &s->scoefs[128*0], *P34 = &s->scoefs[128*1]; 238cabdff1aSopenharmony_ci float *SENT = &s->scoefs[128*2], *S34 = &s->scoefs[128*3]; 239cabdff1aSopenharmony_ci float *QERR = &s->scoefs[128*4]; 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci if (sce->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE) { 242cabdff1aSopenharmony_ci sce->ics.predictor_present = 0; 243cabdff1aSopenharmony_ci return; 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci if (!sce->ics.predictor_initialized) { 247cabdff1aSopenharmony_ci reset_all_predictors(sce->predictor_state); 248cabdff1aSopenharmony_ci sce->ics.predictor_initialized = 1; 249cabdff1aSopenharmony_ci memcpy(sce->prcoeffs, sce->coeffs, 1024*sizeof(float)); 250cabdff1aSopenharmony_ci for (i = 1; i < 31; i++) 251cabdff1aSopenharmony_ci sce->ics.predictor_reset_count[i] = i; 252cabdff1aSopenharmony_ci } 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci update_pred_resets(sce); 255cabdff1aSopenharmony_ci memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type)); 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci for (sfb = PRED_SFB_START; sfb < pmax; sfb++) { 258cabdff1aSopenharmony_ci int cost1, cost2, cb_p; 259cabdff1aSopenharmony_ci float dist1, dist2, dist_spec_err = 0.0f; 260cabdff1aSopenharmony_ci const int cb_n = sce->zeroes[sfb] ? 0 : sce->band_type[sfb]; 261cabdff1aSopenharmony_ci const int cb_min = sce->zeroes[sfb] ? 0 : 1; 262cabdff1aSopenharmony_ci const int cb_max = sce->zeroes[sfb] ? 0 : RESERVED_BT; 263cabdff1aSopenharmony_ci const int start_coef = sce->ics.swb_offset[sfb]; 264cabdff1aSopenharmony_ci const int num_coeffs = sce->ics.swb_offset[sfb + 1] - start_coef; 265cabdff1aSopenharmony_ci const FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[sfb]; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci if (start_coef + num_coeffs > MAX_PREDICTORS || 268cabdff1aSopenharmony_ci (s->cur_channel && sce->band_type[sfb] >= INTENSITY_BT2) || 269cabdff1aSopenharmony_ci sce->band_type[sfb] == NOISE_BT) 270cabdff1aSopenharmony_ci continue; 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci /* Normal coefficients */ 273cabdff1aSopenharmony_ci s->abs_pow34(O34, &sce->coeffs[start_coef], num_coeffs); 274cabdff1aSopenharmony_ci dist1 = quantize_and_encode_band_cost(s, NULL, &sce->coeffs[start_coef], NULL, 275cabdff1aSopenharmony_ci O34, num_coeffs, sce->sf_idx[sfb], 276cabdff1aSopenharmony_ci cb_n, s->lambda / band->threshold, INFINITY, &cost1, NULL, 0); 277cabdff1aSopenharmony_ci cost_coeffs += cost1; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci /* Encoded coefficients - needed for #bits, band type and quant. error */ 280cabdff1aSopenharmony_ci for (i = 0; i < num_coeffs; i++) 281cabdff1aSopenharmony_ci SENT[i] = sce->coeffs[start_coef + i] - sce->prcoeffs[start_coef + i]; 282cabdff1aSopenharmony_ci s->abs_pow34(S34, SENT, num_coeffs); 283cabdff1aSopenharmony_ci if (cb_n < RESERVED_BT) 284cabdff1aSopenharmony_ci cb_p = av_clip(find_min_book(find_max_val(1, num_coeffs, S34), sce->sf_idx[sfb]), cb_min, cb_max); 285cabdff1aSopenharmony_ci else 286cabdff1aSopenharmony_ci cb_p = cb_n; 287cabdff1aSopenharmony_ci quantize_and_encode_band_cost(s, NULL, SENT, QERR, S34, num_coeffs, 288cabdff1aSopenharmony_ci sce->sf_idx[sfb], cb_p, s->lambda / band->threshold, INFINITY, 289cabdff1aSopenharmony_ci &cost2, NULL, 0); 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci /* Reconstructed coefficients - needed for distortion measurements */ 292cabdff1aSopenharmony_ci for (i = 0; i < num_coeffs; i++) 293cabdff1aSopenharmony_ci sce->prcoeffs[start_coef + i] += QERR[i] != 0.0f ? (sce->prcoeffs[start_coef + i] - QERR[i]) : 0.0f; 294cabdff1aSopenharmony_ci s->abs_pow34(P34, &sce->prcoeffs[start_coef], num_coeffs); 295cabdff1aSopenharmony_ci if (cb_n < RESERVED_BT) 296cabdff1aSopenharmony_ci cb_p = av_clip(find_min_book(find_max_val(1, num_coeffs, P34), sce->sf_idx[sfb]), cb_min, cb_max); 297cabdff1aSopenharmony_ci else 298cabdff1aSopenharmony_ci cb_p = cb_n; 299cabdff1aSopenharmony_ci dist2 = quantize_and_encode_band_cost(s, NULL, &sce->prcoeffs[start_coef], NULL, 300cabdff1aSopenharmony_ci P34, num_coeffs, sce->sf_idx[sfb], 301cabdff1aSopenharmony_ci cb_p, s->lambda / band->threshold, INFINITY, NULL, NULL, 0); 302cabdff1aSopenharmony_ci for (i = 0; i < num_coeffs; i++) 303cabdff1aSopenharmony_ci dist_spec_err += (O34[i] - P34[i])*(O34[i] - P34[i]); 304cabdff1aSopenharmony_ci dist_spec_err *= s->lambda / band->threshold; 305cabdff1aSopenharmony_ci dist2 += dist_spec_err; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci if (dist2 <= dist1 && cb_p <= cb_n) { 308cabdff1aSopenharmony_ci cost_pred += cost2; 309cabdff1aSopenharmony_ci sce->ics.prediction_used[sfb] = 1; 310cabdff1aSopenharmony_ci sce->band_alt[sfb] = cb_n; 311cabdff1aSopenharmony_ci sce->band_type[sfb] = cb_p; 312cabdff1aSopenharmony_ci count++; 313cabdff1aSopenharmony_ci } else { 314cabdff1aSopenharmony_ci cost_pred += cost1; 315cabdff1aSopenharmony_ci sce->band_alt[sfb] = cb_p; 316cabdff1aSopenharmony_ci } 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (count && cost_coeffs < cost_pred) { 320cabdff1aSopenharmony_ci count = 0; 321cabdff1aSopenharmony_ci for (sfb = PRED_SFB_START; sfb < pmax; sfb++) 322cabdff1aSopenharmony_ci RESTORE_PRED(sce, sfb); 323cabdff1aSopenharmony_ci memset(&sce->ics.prediction_used, 0, sizeof(sce->ics.prediction_used)); 324cabdff1aSopenharmony_ci } 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci sce->ics.predictor_present = !!count; 327cabdff1aSopenharmony_ci} 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci/** 330cabdff1aSopenharmony_ci * Encoder predictors data. 331cabdff1aSopenharmony_ci */ 332cabdff1aSopenharmony_civoid ff_aac_encode_main_pred(AACEncContext *s, SingleChannelElement *sce) 333cabdff1aSopenharmony_ci{ 334cabdff1aSopenharmony_ci int sfb; 335cabdff1aSopenharmony_ci IndividualChannelStream *ics = &sce->ics; 336cabdff1aSopenharmony_ci const int pmax = FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]); 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci if (s->profile != FF_PROFILE_AAC_MAIN || 339cabdff1aSopenharmony_ci !ics->predictor_present) 340cabdff1aSopenharmony_ci return; 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci put_bits(&s->pb, 1, !!ics->predictor_reset_group); 343cabdff1aSopenharmony_ci if (ics->predictor_reset_group) 344cabdff1aSopenharmony_ci put_bits(&s->pb, 5, ics->predictor_reset_group); 345cabdff1aSopenharmony_ci for (sfb = 0; sfb < pmax; sfb++) 346cabdff1aSopenharmony_ci put_bits(&s->pb, 1, ics->prediction_used[sfb]); 347cabdff1aSopenharmony_ci} 348