Ejemplo n.º 1
0
void decode_audio_packet(void)
{
    double FDCT_time = 0, residue_time = 0;

    double initial_clock = get_us();

    int mode_number = read_unsigned_value_PF(ilog(mode_num - 1));

    vorbis_mode_t *mode = &mode_list[mode_number];

    int V_N_bits = B_N_bits[mode->blockflag] - 1;
    int V_N = 1 << V_N_bits;

    int previous_window_flag = 1, next_window_flag = 1;

    if(mode->blockflag) {
        previous_window_flag = read_bit_PF();
        next_window_flag = read_bit_PF();
    }

    mapping_header_t *mapping = &mapping_list[mode->mapping];
    channel_t *channel_list = setup_ref(mapping->channel_list);
    submap_t *submap_list = setup_ref(mapping->submap_list);

    uint16_t setup_origin = setup_get_head();

    for(int i = 0; i < audio_channels; i++) {
        int submap_number = 0;
        if(mapping->submaps > 1)
            submap_number = channel_list[i].mux;

        int floor_number = submap_list[submap_number].floor;

        decode_floor1(floor_number, i);

        vector_list[i].no_residue = !vector_list[i].nonzero;
    }

    coupling_step_t *step_list = setup_ref(mapping->coupling_step_list);
    for(int i = 0; i < mapping->coupling_steps; i++) {
        if(vector_list[step_list[i].magnitude].nonzero || !vector_list[step_list[i].angle].nonzero) {
            vector_list[step_list[i].magnitude].no_residue = 0;
            vector_list[step_list[i].angle].no_residue = 0;
        }
    }

    if(mapping->submaps == 1) {
        submap_t *submap = setup_ref(mapping->submap_list);
        int residue_number = submap->residue;

        for(int i = 0; i < audio_channels; i++) {
            vector_list[i].do_not_decode_flag = vector_list[i].no_residue;
        }

        double residue_entry = get_us();

        decode_residue(V_N_bits, residue_number, 0, audio_channels);

        residue_time += get_us() - residue_entry;
    } else {
        ERROR(ERROR_VORBIS, "Multiple submaps are not supported yet.\n");
    }

    for(int i = 0; i < mapping->coupling_steps; i++) {
        decouple_square_polar(V_N, step_list[i].magnitude, step_list[i].angle);
    }

    for(int i = 0; i < audio_channels; i++) {
        DATA_TYPE *v = setup_ref(vector_list[i].body);

        if(vector_list[i].nonzero) {
            synthesize_floor1(V_N, i);
        }

        /*for(int i = 0; i < V_N; i++) {
            printf("%.0f ", 100000.0f * v[i]);
        }
        printf("\n");*/

        double FDCT_entry = get_us();

        FDCT_IV(v, V_N_bits);

        FDCT_time += get_us() - FDCT_entry;

        for(int j = 0; j < V_N; j++) {
#ifndef FIXED_POINT
            v[j] *= 32768.0f;
#endif
            //printf("%.0f ", v[j]);
        }
        //printf("\n");

        overlap_add(V_N_bits, i, previous_window_flag);
    }

    /*if(previous_window_flag && vector_list[0].next_window_flag) {
        for(int i = 0; i < V_N / 2; i++) {
            audio[i + V_N / 2] = (int16_t)rh[i];
            audio[i] = (int16_t)v_out[i + V_N / 2];
        }
    } else {
        if(!previous_window_flag) {
            for(int i = 0; i < B_N[0] / 4; i++) {
                audio[i] = (int16_t)v_out[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 + i];
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                audio[B_N[0] / 4 + i] = (int16_t)rh[i];
            }
            for(int i = 0; i < (B_N[1] - B_N[0]) / 4; i++) {
                audio[B_N[0] / 2 + i] = (int16_t)(-v_out[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 - 1 - i]);
            }
        } else if(!vector_list[0].next_window_flag) {
            for(int i = 0; i < (B_N[1] - B_N[0]) / 4; i++) {
                audio[i] = (int16_t)(-rh[B_N[1] / 4 - 1 - i]);
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                audio[(B_N[1] - B_N[0]) / 4 + i] = (int16_t)v_out[i + B_N[0] / 4];
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                audio[B_N[1] / 4 + i] = (int16_t)rh[i];
            }
        }
    }*/

    DATA_TYPE *v_left = setup_ref(vector_list[0].body);
    DATA_TYPE *v_right = setup_ref(vector_list[1].body);
    DATA_TYPE *rh_left = setup_ref(vector_list[0].right_hand);
    DATA_TYPE *rh_right = setup_ref(vector_list[1].right_hand);
    if(previous_window_flag && vector_list[0].next_window_flag) {
        for(int i = 0; i < V_N / 2; i++) {
            feed_SRC(v_left[i + V_N / 2], v_right[i + V_N / 2]);
        }
        for(int i = 0; i < V_N / 2; i++) {
            feed_SRC(rh_left[i], rh_right[i]);
        }
    } else {
        if(!previous_window_flag) {
            for(int i = 0; i < B_N[0] / 4; i++) {
                feed_SRC(v_left[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 + i], v_right[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 + i]);
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                feed_SRC(rh_left[i], rh_right[i]);
            }
            for(int i = 0; i < (B_N[1] - B_N[0]) / 4; i++) {
                feed_SRC(-v_left[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 - 1 - i], -v_right[B_N[1] / 4 + (B_N[1] - B_N[0]) / 4 - 1 - i]);
            }
        } else if(!vector_list[0].next_window_flag) {
            for(int i = 0; i < (B_N[1] - B_N[0]) / 4; i++) {
                feed_SRC(-rh_left[B_N[1] / 4 - 1 - i], -rh_right[B_N[1] / 4 - 1 - i]);
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                feed_SRC(v_left[i + B_N[0] / 4], v_right[i + B_N[0] / 4]);
            }
            for(int i = 0; i < B_N[0] / 4; i++) {
                feed_SRC(rh_left[i], rh_right[i]);
            }
        }
    }

    //int this_window_flag = vector_list[0].next_window_flag;

    for(int i = 0; i < audio_channels; i++) {
        cache_righthand(V_N, i, next_window_flag);
    }
    setup_set_head(setup_origin);

    double packet_time = get_us() - initial_clock;
    printf("%lf %lf %lf\n", packet_time, FDCT_time, residue_time);

    /*if(previous_window_flag && this_window_flag) {
        fwrite(audio, sizeof(int16_t) * V_N, 1, sox);
    } else {
        fwrite(audio, sizeof(int16_t) * (B_N[0] + B_N[1]) / 4, 1, sox);
    }*/
}
Ejemplo n.º 2
0
SPAN_DECLARE(int) time_scale(time_scale_state_t *s, int16_t out[], int16_t in[], int len)
{
    double lcpf;
    int pitch;
    int out_len;
    int in_len;
    int k;

    out_len = 0;
    in_len = 0;

    /* Top up the buffer */
    if (s->fill + len < s->buf_len)
    {
        /* Cannot continue without more samples */
        memcpy(s->buf + s->fill, in, sizeof(int16_t)*len);
        s->fill += len;
        return out_len;
    }
    k = s->buf_len - s->fill;
    memcpy(s->buf + s->fill, in, sizeof(int16_t)*k);
    in_len += k;
    s->fill = s->buf_len;
    while (s->fill == s->buf_len)
    {
        while (s->lcp >= s->buf_len)
        {
            memcpy(out + out_len, s->buf, sizeof(int16_t)*s->buf_len);
            out_len += s->buf_len;
            if (len - in_len < s->buf_len)
            {
                /* Cannot continue without more samples */
                memcpy(s->buf, in + in_len, sizeof(int16_t)*(len - in_len));
                s->fill = len - in_len;
                s->lcp -= s->buf_len;
                return out_len;
            }
            memcpy(s->buf, in + in_len, sizeof(int16_t)*s->buf_len);
            in_len += s->buf_len;
            s->lcp -= s->buf_len;
        }
        if (s->lcp > 0)
        {
            memcpy(out + out_len, s->buf, sizeof(int16_t)*s->lcp);
            out_len += s->lcp;
            memcpy(s->buf, s->buf + s->lcp, sizeof(int16_t)*(s->buf_len - s->lcp));
            if (len - in_len < s->lcp)
            {
                /* Cannot continue without more samples */
                memcpy(s->buf + (s->buf_len - s->lcp), in + in_len, sizeof(int16_t)*(len - in_len));
                s->fill = s->buf_len - s->lcp + len - in_len;
                s->lcp = 0;
                return out_len;
            }
            memcpy(s->buf + (s->buf_len - s->lcp), in + in_len, sizeof(int16_t)*s->lcp);
            in_len += s->lcp;
            s->lcp = 0;
        }
        if (s->playout_rate == 1.0f)
        {
            s->lcp = 0x7FFFFFFF;
        }
        else
        {
            pitch = amdf_pitch(s->min_pitch, s->max_pitch, s->buf, s->min_pitch);
            lcpf = (double) pitch*s->rcomp;
            /* Nudge around to compensate for fractional samples */
            s->lcp = (int) lcpf;
            /* Note that s->lcp and lcpf are not the same, as lcpf has a fractional part, and s->lcp doesn't */
            s->rate_nudge += s->lcp - lcpf;
            if (s->rate_nudge >= 0.5f)
            {
                s->lcp--;
                s->rate_nudge -= 1.0f;
            }
            else if (s->rate_nudge <= -0.5f)
            {
                s->lcp++;
                s->rate_nudge += 1.0f;
            }
            if (s->playout_rate < 1.0f)
            {
                /* Speed up - drop a chunk of data */
                overlap_add(s->buf, s->buf + pitch, pitch);
                memcpy(&s->buf[pitch], &s->buf[2*pitch], sizeof(int16_t)*(s->buf_len - 2*pitch));
                if (len - in_len < pitch)
                {
                    /* Cannot continue without more samples */
                    memcpy(s->buf + s->buf_len - pitch, in + in_len, sizeof(int16_t)*(len - in_len));
                    s->fill += (len - in_len - pitch);
                    return out_len;
                }
                memcpy(s->buf + s->buf_len - pitch, in + in_len, sizeof(int16_t)*pitch);
                in_len += pitch;
            }
            else
            {
                /* Slow down - insert a chunk of data */
                memcpy(out + out_len, s->buf, sizeof(int16_t)*pitch);
                out_len += pitch;
                overlap_add(s->buf + pitch, s->buf, pitch);
            }
        }
    }
    return out_len;
}