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