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); }*/ }
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; }