static void write_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd) { int tcount = wps->num_terms, wcount = 1, temp; struct decorr_pass *dpp; uchar *byteptr; byteptr = wpmd->data = wpmd->temp_data; wpmd->id = ID_DECORR_SAMPLES; for (dpp = wps->decorr_passes; tcount--; ++dpp) if (wcount) { if (dpp->term > MAX_TERM) { dpp->samples_A [0] = exp2s (temp = log2s (dpp->samples_A [0])); *byteptr++ = temp; *byteptr++ = temp >> 8; dpp->samples_A [1] = exp2s (temp = log2s (dpp->samples_A [1])); *byteptr++ = temp; *byteptr++ = temp >> 8; if (!(wps->wphdr.flags & MONO_FLAG)) { dpp->samples_B [0] = exp2s (temp = log2s (dpp->samples_B [0])); *byteptr++ = temp; *byteptr++ = temp >> 8; dpp->samples_B [1] = exp2s (temp = log2s (dpp->samples_B [1])); *byteptr++ = temp; *byteptr++ = temp >> 8; } }
int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd) { uchar *byteptr = wpmd->data; uchar *endptr = byteptr + wpmd->byte_length; if (wps->wphdr.flags & HYBRID_BITRATE) { wps->w.slow_level [0] = exp2s (byteptr [0] + (byteptr [1] << 8)); byteptr += 2; if (!(wps->wphdr.flags & MONO_FLAG)) { wps->w.slow_level [1] = exp2s (byteptr [0] + (byteptr [1] << 8)); byteptr += 2; } } wps->w.bitrate_acc [0] = (long)(byteptr [0] + (byteptr [1] << 8)) << 16; byteptr += 2; if (!(wps->wphdr.flags & MONO_FLAG)) { wps->w.bitrate_acc [1] = (long)(byteptr [0] + (byteptr [1] << 8)) << 16; byteptr += 2; } if (byteptr < endptr) { wps->w.bitrate_delta [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); byteptr += 2; if (!(wps->wphdr.flags & MONO_FLAG)) { wps->w.bitrate_delta [1] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); byteptr += 2; } if (byteptr < endptr) return FALSE; } else wps->w.bitrate_delta [0] = wps->w.bitrate_delta [1] = 0; return TRUE; }
static void update_error_limit (WavpackStream *wps) { int bitrate_0 = (wps->w.bitrate_acc [0] += wps->w.bitrate_delta [0]) >> 16; if (wps->wphdr.flags & MONO_FLAG) { if (wps->wphdr.flags & HYBRID_BITRATE) { int slow_log_0 = (wps->w.slow_level [0] + SLO) >> SLS; if (slow_log_0 - bitrate_0 > -0x100) wps->w.error_limit [0] = exp2s (slow_log_0 - bitrate_0 + 0x100); else wps->w.error_limit [0] = 0; } else
void update_error_limit (struct words_data *w, uint32_t flags) { int bitrate_0 = (w->bitrate_acc [0] += w->bitrate_delta [0]) >> 16; if (flags & MONO_DATA) { if (flags & HYBRID_BITRATE) { int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; if (slow_log_0 - bitrate_0 > -0x100) w->c [0].error_limit = exp2s (slow_log_0 - bitrate_0 + 0x100); else w->c [0].error_limit = 0; } else
static void decorr_mono_pass (int32_t *in_samples, int32_t *out_samples, uint32_t num_samples, struct decorr_pass *dpp, int dir) { int32_t cont_samples = 0; int m = 0, i; #ifdef PACK_DECORR_MONO_PASS_CONT if (num_samples > 16 && dir > 0) { int32_t pre_samples = (dpp->term > MAX_TERM) ? 2 : dpp->term; cont_samples = num_samples - pre_samples; num_samples = pre_samples; } #endif dpp->sum_A = 0; if (dir < 0) { out_samples += (num_samples + cont_samples - 1); in_samples += (num_samples + cont_samples - 1); dir = -1; } else dir = 1; dpp->weight_A = restore_weight (store_weight (dpp->weight_A)); for (i = 0; i < 8; ++i) dpp->samples_A [i] = exp2s (log2s (dpp->samples_A [i])); if (dpp->term > MAX_TERM) { while (num_samples--) { int32_t left, sam_A; if (dpp->term & 1) sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; else sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; dpp->samples_A [1] = dpp->samples_A [0]; dpp->samples_A [0] = left = in_samples [0]; left -= apply_weight (dpp->weight_A, sam_A); update_weight (dpp->weight_A, dpp->delta, sam_A, left); dpp->sum_A += dpp->weight_A; out_samples [0] = left; in_samples += dir; out_samples += dir; } } else if (dpp->term > 0) {
static void decorr_mono_pass (int32_t *in_samples, int32_t *out_samples, uint32_t num_samples, struct decorr_pass *dpp, int dir) { int m = 0, i; dpp->sum_A = 0; if (dir < 0) { out_samples += (num_samples - 1); in_samples += (num_samples - 1); dir = -1; } else dir = 1; dpp->weight_A = restore_weight (store_weight (dpp->weight_A)); for (i = 0; i < 8; ++i) dpp->samples_A [i] = exp2s (log2s (dpp->samples_A [i])); if (dpp->term > MAX_TERM) { while (num_samples--) { int32_t left, sam_A; if (dpp->term & 1) sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; else sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; dpp->samples_A [1] = dpp->samples_A [0]; dpp->samples_A [0] = left = in_samples [0]; left -= apply_weight (dpp->weight_A, sam_A); update_weight (dpp->weight_A, dpp->delta, sam_A, left); dpp->sum_A += dpp->weight_A; out_samples [0] = left; in_samples += dir; out_samples += dir; } } else if (dpp->term > 0) {
int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd) { uchar *byteptr = wpmd->data; if (wpmd->byte_length != ((wps->wphdr.flags & MONO_FLAG) ? 6 : 12)) return FALSE; wps->w.median [0] [0] = exp2s (byteptr [0] + (byteptr [1] << 8)); wps->w.median [1] [0] = exp2s (byteptr [2] + (byteptr [3] << 8)); wps->w.median [2] [0] = exp2s (byteptr [4] + (byteptr [5] << 8)); if (!(wps->wphdr.flags & MONO_FLAG)) { wps->w.median [0] [1] = exp2s (byteptr [6] + (byteptr [7] << 8)); wps->w.median [1] [1] = exp2s (byteptr [8] + (byteptr [9] << 8)); wps->w.median [2] [1] = exp2s (byteptr [10] + (byteptr [11] << 8)); } return TRUE; }
static void update_error_limit (WavpackStream *wps) { int bitrate_0 = (wps->w.bitrate_acc [0] += wps->w.bitrate_delta [0]) >> 16; if (wps->wphdr.flags & MONO_FLAG) { if (wps->wphdr.flags & HYBRID_BITRATE) { int slow_log_0 = (wps->w.slow_level [0] + SLO) >> SLS; if (slow_log_0 - bitrate_0 > -0x100) wps->w.error_limit [0] = exp2s (slow_log_0 - bitrate_0 + 0x100); else wps->w.error_limit [0] = 0; } else wps->w.error_limit [0] = exp2s (bitrate_0); } else { int bitrate_1 = (wps->w.bitrate_acc [1] += wps->w.bitrate_delta [1]) >> 16; if (wps->wphdr.flags & HYBRID_BITRATE) { int slow_log_0 = (wps->w.slow_level [0] + SLO) >> SLS; int slow_log_1 = (wps->w.slow_level [1] + SLO) >> SLS; if (wps->wphdr.flags & HYBRID_BALANCE) { int balance = (slow_log_1 - slow_log_0 + bitrate_1 + 1) >> 1; if (balance > bitrate_0) { bitrate_1 = bitrate_0 * 2; bitrate_0 = 0; }
byteptr = (uchar *) wpmd->temp_data; wpmd->data = wpmd->temp_data; wpmd->id = ID_DECORR_SAMPLES; for (dpp = wps->decorr_passes; tcount--; ++dpp) if (wcount) { if (dpp->term > MAX_TERM) { dpp->samples_A [0] = exp2s (temp = log2s (dpp->samples_A [0])); *byteptr++ = temp; *byteptr++ = temp >> 8; dpp->samples_A [1] = exp2s (temp = log2s (dpp->samples_A [1])); *byteptr++ = temp; *byteptr++ = temp >> 8; } else if (dpp->term < 0) { dpp->samples_A [0] = exp2s (temp = log2s (dpp->samples_A [0])); *byteptr++ = temp; *byteptr++ = temp >> 8; dpp->samples_B [0] = exp2s (temp = log2s (dpp->samples_B [0])); *byteptr++ = temp; *byteptr++ = temp >> 8; } else { int m = 0, cnt = dpp->term; while (cnt--) { dpp->samples_A [m] = exp2s (temp = log2s (dpp->samples_A [m])); *byteptr++ = temp; *byteptr++ = temp >> 8; m++; }
void update_error_limit (struct words_data *w, uint32_t flags) { int bitrate_0 = (w->bitrate_acc [0] += w->bitrate_delta [0]) >> 16; if (flags & MONO_DATA) { if (flags & HYBRID_BITRATE) { int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; if (slow_log_0 - bitrate_0 > -0x100) w->c [0].error_limit = exp2s (slow_log_0 - bitrate_0 + 0x100); else w->c [0].error_limit = 0; } else w->c [0].error_limit = exp2s (bitrate_0); } else { int bitrate_1 = (w->bitrate_acc [1] += w->bitrate_delta [1]) >> 16; if (flags & HYBRID_BITRATE) { int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; int slow_log_1 = (w->c [1].slow_level + SLO) >> SLS; if (flags & HYBRID_BALANCE) { int balance = (slow_log_1 - slow_log_0 + bitrate_1 + 1) >> 1; if (balance > bitrate_0) { bitrate_1 = bitrate_0 * 2; bitrate_0 = 0; }