⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alac.c

📁 alac decoder,内容详细
💻 C
📖 第 1 页 / 共 3 页
字号:
            int32_t value;            value = readbits(alac, readsamplesize);            /* mask value to readsamplesize size */            if (readsamplesize != 32)                value &= (0xffffffff >> (32 - readsamplesize));            x = value;        }        else        { /* standard rice encoding */            int extrabits;            int k; /* size of extra bits */            /* read k, that is bits as is */            k = 31 - rice_kmodifier - count_leading_zeros((history >> 9) + 3);            if (k < 0) k += rice_kmodifier;            else k = rice_kmodifier;            if (k != 1)            {                extrabits = readbits(alac, k);                /* multiply x by 2^k - 1, as part of their strange algorithm */                x = (x << k) - x;                if (extrabits > 1)                {                    x += extrabits - 1;                }                else unreadbits(alac, 1);            }        }        x_modified = sign_modifier + x;        final_val = (x_modified + 1) / 2;        if (x_modified & 1) final_val *= -1;        output_buffer[output_count] = final_val;        sign_modifier = 0;        /* now update the history */        history += (x_modified * rice_historymult)                 - ((history * rice_historymult) >> 9);        if (x_modified > 0xffff)            history = 0xffff;        /* special case: there may be compressed blocks of 0 */        if ((history < 128) && (output_count+1 < output_size))        {            int block_size;            sign_modifier = 1;            x = 0;            while (x <= 8 && readbit(alac))            {                x++;            }            if (x > 8)            {                block_size = readbits(alac, 16);                block_size &= 0xffff;            }            else            {                int k;                int extrabits;                k = count_leading_zeros(history) + ((history + 16) >> 6 /* / 64 */) - 24;                extrabits = readbits(alac, k);                block_size = (((1 << k) - 1) & rice_kmodifier_mask) * x                           + extrabits - 1;                if (extrabits < 2)                {                    x = 1 - extrabits;                    block_size += x;                    unreadbits(alac, 1);                }            }            if (block_size > 0)            {                memset(&output_buffer[output_count+1], 0, block_size * 4);                output_count += block_size;            }            if (block_size > 0xffff)                sign_modifier = 0;            history = 0;        }    }}#define SIGN_EXTENDED32(val, bits) ((val << (32 - bits)) >> (32 - bits))#define SIGN_ONLY(v) \                     ((v < 0) ? (-1) : \                                ((v > 0) ? (1) : \                                           (0)))static void predictor_decompress_fir_adapt(int32_t *error_buffer,                                           int32_t *buffer_out,                                           int output_size,                                           int readsamplesize,                                           int16_t *predictor_coef_table,                                           int predictor_coef_num,                                           int predictor_quantitization){    int i;    /* first sample always copies */    *buffer_out = *error_buffer;    if (!predictor_coef_num)    {        if (output_size <= 1) return;        memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4);        return;    }    if (predictor_coef_num == 0x1f) /* 11111 - max value of predictor_coef_num */    { /* second-best case scenario for fir decompression,       * error describes a small difference from the previous sample only       */        if (output_size <= 1) return;        for (i = 0; i < output_size - 1; i++)        {            int32_t prev_value;            int32_t error_value;            prev_value = buffer_out[i];            error_value = error_buffer[i+1];            buffer_out[i+1] = SIGN_EXTENDED32((prev_value + error_value), readsamplesize);        }        return;    }    /* read warm-up samples */    if (predictor_coef_num > 0)    {        int i;        for (i = 0; i < predictor_coef_num; i++)        {            int32_t val;            val = buffer_out[i] + error_buffer[i+1];            val = SIGN_EXTENDED32(val, readsamplesize);            buffer_out[i+1] = val;        }    }#if 0    /* 4 and 8 are very common cases (the only ones i've seen). these     * should be unrolled and optimised     */    if (predictor_coef_num == 4)    {        /* FIXME: optimised general case */        return;    }    if (predictor_coef_table == 8)    {        /* FIXME: optimised general case */        return;    }#endif    /* general case */    if (predictor_coef_num > 0)    {        for (i = predictor_coef_num + 1;             i < output_size;             i++)        {            int j;            int sum = 0;            int outval;            int error_val = error_buffer[i];            for (j = 0; j < predictor_coef_num; j++)            {                sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) *                       predictor_coef_table[j];            }            outval = (1 << (predictor_quantitization-1)) + sum;            outval = outval >> predictor_quantitization;            outval = outval + buffer_out[0] + error_val;            outval = SIGN_EXTENDED32(outval, readsamplesize);            buffer_out[predictor_coef_num+1] = outval;            if (error_val > 0)            {                int predictor_num = predictor_coef_num - 1;                while (predictor_num >= 0 && error_val > 0)                {                    int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];                    int sign = SIGN_ONLY(val);                    predictor_coef_table[predictor_num] -= sign;                    val *= sign; /* absolute value */                    error_val -= ((val >> predictor_quantitization) *                                  (predictor_coef_num - predictor_num));                    predictor_num--;                }            }            else if (error_val < 0)            {                int predictor_num = predictor_coef_num - 1;                while (predictor_num >= 0 && error_val < 0)                {                    int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];                    int sign = - SIGN_ONLY(val);                    predictor_coef_table[predictor_num] -= sign;                    val *= sign; /* neg value */                    error_val -= ((val >> predictor_quantitization) *                                  (predictor_coef_num - predictor_num));                    predictor_num--;                }            }            buffer_out++;        }    }}void deinterlace_16(int32_t *buffer_a, int32_t *buffer_b,                    int16_t *buffer_out,                    int numchannels, int numsamples,                    uint8_t interlacing_shift,                    uint8_t interlacing_leftweight){    int i;    if (numsamples <= 0) return;    /* weighted interlacing */    if (interlacing_leftweight)    {        for (i = 0; i < numsamples; i++)        {            int32_t difference, midright;            int16_t left;            int16_t right;            midright = buffer_a[i];            difference = buffer_b[i];            right = midright - ((difference * interlacing_leftweight) >> interlacing_shift);            left = right + difference;            /* output is always little endian */            if (host_bigendian)            {                _Swap16(left);                _Swap16(right);            }            buffer_out[i*numchannels] = left;            buffer_out[i*numchannels + 1] = right;        }        return;    }    /* otherwise basic interlacing took place */    for (i = 0; i < numsamples; i++)    {        int16_t left, right;        left = buffer_a[i];        right = buffer_b[i];        /* output is always little endian */        if (host_bigendian)        {            _Swap16(left);            _Swap16(right);        }        buffer_out[i*numchannels] = left;        buffer_out[i*numchannels + 1] = right;    }}void decode_frame(alac_file *alac,                  unsigned char *inbuffer,                  void *outbuffer, int *outputsize){    int channels;    int32_t outputsamples = alac->setinfo_max_samples_per_frame;    /* setup the stream */    alac->input_buffer = inbuffer;    alac->input_buffer_bitaccumulator = 0;    channels = readbits(alac, 3);    *outputsize = outputsamples * alac->bytespersample;    switch(channels)    {    case 0: /* 1 channel */    {        int hassize;        int isnotcompressed;        int readsamplesize;        int wasted_bytes;        int ricemodifier;        /* 2^result = something to do with output waiting.         * perhaps matters if we read > 1 frame in a pass?         */        readbits(alac, 4);        readbits(alac, 12); /* unknown, skip 12 bits */        hassize = readbits(alac, 1); /* the output sample size is stored soon */        wasted_bytes = readbits(alac, 2); /* unknown ? */        isnotcompressed = readbits(alac, 1); /* whether the frame is compressed */        if (hassize)        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -