]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/aacdec.c
aacenc: cosmetics: Swap spreading_hi/low name to match the 3GPP spec.
[ffmpeg] / libavcodec / aacdec.c
index 31591960481fb6633db610101a3ac95b621a1a5a..6138dac05e79e1540cc4d89be6e89474d7e3025a 100644 (file)
@@ -113,28 +113,11 @@ static const char overread_err[] = "Input buffer exhausted before END element fo
 
 static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
 {
-    /* Some buggy encoders appear to set all elem_ids to zero and rely on
-    channels always occurring in the same order. This is expressly forbidden
-    by the spec but we will try to work around it.
-    */
-    int err_printed = 0;
-    while (ac->tags_seen_this_frame[type][elem_id] && elem_id < MAX_ELEM_ID) {
-        if (ac->output_configured < OC_LOCKED && !err_printed) {
-            av_log(ac->avctx, AV_LOG_WARNING, "Duplicate channel tag found, attempting to remap.\n");
-            err_printed = 1;
-        }
-        elem_id++;
-    }
-    if (elem_id == MAX_ELEM_ID)
-        return NULL;
-    ac->tags_seen_this_frame[type][elem_id] = 1;
-
-    if (ac->tag_che_map[type][elem_id]) {
+    // For PCE based channel configurations map the channels solely based on tags.
+    if (!ac->m4ac.chan_config) {
         return ac->tag_che_map[type][elem_id];
     }
-    if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) {
-        return NULL;
-    }
+    // For indexed channel configurations map the channels solely based on position.
     switch (ac->m4ac.chan_config) {
     case 7:
         if (ac->tags_mapped == 3 && type == TYPE_CPE) {
@@ -242,7 +225,6 @@ static av_cold int output_configure(AACContext *ac,
         }
 
         memset(ac->tag_che_map, 0,       4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
-        ac->tags_mapped = 0;
 
         avctx->channel_layout = aac_channel_layout[channel_config - 1];
     } else {
@@ -263,7 +245,6 @@ static av_cold int output_configure(AACContext *ac,
         }
 
         memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
-        ac->tags_mapped = 4 * MAX_ELEM_ID;
 
         avctx->channel_layout = 0;
     }
@@ -1231,7 +1212,8 @@ static av_always_inline float flt16_trunc(float pf)
     return pun.f;
 }
 
-static av_always_inline void predict(AACContext *ac, PredictorState *ps, float *coef,
+static av_always_inline void predict(PredictorState *ps, float *coef,
+                                     float sf_scale, float inv_sf_scale,
                     int output_enable)
 {
     const float a     = 0.953125; // 61.0 / 64
@@ -1239,23 +1221,26 @@ static av_always_inline void predict(AACContext *ac, PredictorState *ps, float *
     float e0, e1;
     float pv;
     float k1, k2;
+    float   r0 = ps->r0,     r1 = ps->r1;
+    float cor0 = ps->cor0, cor1 = ps->cor1;
+    float var0 = ps->var0, var1 = ps->var1;
 
-    k1 = ps->var0 > 1 ? ps->cor0 * flt16_even(a / ps->var0) : 0;
-    k2 = ps->var1 > 1 ? ps->cor1 * flt16_even(a / ps->var1) : 0;
+    k1 = var0 > 1 ? cor0 * flt16_even(a / var0) : 0;
+    k2 = var1 > 1 ? cor1 * flt16_even(a / var1) : 0;
 
-    pv = flt16_round(k1 * ps->r0 + k2 * ps->r1);
+    pv = flt16_round(k1 * r0 + k2 * r1);
     if (output_enable)
-        *coef += pv * ac->sf_scale;
+        *coef += pv * sf_scale;
 
-    e0 = *coef / ac->sf_scale;
-    e1 = e0 - k1 * ps->r0;
+    e0 = *coef * inv_sf_scale;
+    e1 = e0 - k1 * r0;
 
-    ps->cor1 = flt16_trunc(alpha * ps->cor1 + ps->r1 * e1);
-    ps->var1 = flt16_trunc(alpha * ps->var1 + 0.5 * (ps->r1 * ps->r1 + e1 * e1));
-    ps->cor0 = flt16_trunc(alpha * ps->cor0 + ps->r0 * e0);
-    ps->var0 = flt16_trunc(alpha * ps->var0 + 0.5 * (ps->r0 * ps->r0 + e0 * e0));
+    ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1);
+    ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1));
+    ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0);
+    ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0));
 
-    ps->r1 = flt16_trunc(a * (ps->r0 - k1 * e0));
+    ps->r1 = flt16_trunc(a * (r0 - k1 * e0));
     ps->r0 = flt16_trunc(a * e0);
 }
 
@@ -1265,6 +1250,7 @@ static av_always_inline void predict(AACContext *ac, PredictorState *ps, float *
 static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
 {
     int sfb, k;
+    float sf_scale = ac->sf_scale, inv_sf_scale = 1 / ac->sf_scale;
 
     if (!sce->ics.predictor_initialized) {
         reset_all_predictors(sce->predictor_state);
@@ -1274,7 +1260,8 @@ static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
     if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
         for (sfb = 0; sfb < ff_aac_pred_sfb_max[ac->m4ac.sampling_index]; sfb++) {
             for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) {
-                predict(ac, &sce->predictor_state[k], &sce->coeffs[k],
+                predict(&sce->predictor_state[k], &sce->coeffs[k],
+                        sf_scale, inv_sf_scale,
                         sce->ics.predictor_present && sce->ics.prediction_used[sfb]);
             }
         }
@@ -1958,7 +1945,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
         }
     }
 
-    memset(ac->tags_seen_this_frame, 0, sizeof(ac->tags_seen_this_frame));
+    ac->tags_mapped = 0;
     // parse
     while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
         elem_id = get_bits(&gb, 4);