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

📄 ac3enc.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 3 页
字号:
            break;        }	nb_groups = (s->nb_coefs[ch] + (group_size * 3) - 4) / (3 * group_size);        p = encoded_exp[ch];        /* first exponent */        exp1 = *p++;        put_bits(&s->pb, 4, exp1);        /* next ones are delta encoded */        for(i=0;i<nb_groups;i++) {            /* merge three delta in one code */            exp0 = exp1;            exp1 = p[0];            p += group_size;            delta0 = exp1 - exp0 + 2;            exp0 = exp1;            exp1 = p[0];            p += group_size;            delta1 = exp1 - exp0 + 2;            exp0 = exp1;            exp1 = p[0];            p += group_size;            delta2 = exp1 - exp0 + 2;            put_bits(&s->pb, 7, ((delta0 * 5 + delta1) * 5) + delta2);        }	if (ch != s->lfe_channel)	    put_bits(&s->pb, 2, 0); /* no gain range info */    }    /* bit allocation info */    baie = (block_num == 0);    put_bits(&s->pb, 1, baie);    if (baie) {        put_bits(&s->pb, 2, s->sdecaycod);        put_bits(&s->pb, 2, s->fdecaycod);        put_bits(&s->pb, 2, s->sgaincod);        put_bits(&s->pb, 2, s->dbkneecod);        put_bits(&s->pb, 3, s->floorcod);    }    /* snr offset */    put_bits(&s->pb, 1, baie); /* always present with bai */    if (baie) {        put_bits(&s->pb, 6, s->csnroffst);        for(ch=0;ch<s->nb_all_channels;ch++) {            put_bits(&s->pb, 4, s->fsnroffst[ch]);            put_bits(&s->pb, 3, s->fgaincod[ch]);        }    }        put_bits(&s->pb, 1, 0); /* no delta bit allocation */    put_bits(&s->pb, 1, 0); /* no data to skip */    /* mantissa encoding : we use two passes to handle the grouping. A       one pass method may be faster, but it would necessitate to       modify the output stream. */    /* first pass: quantize */    mant1_cnt = mant2_cnt = mant4_cnt = 0;    qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL;    for (ch = 0; ch < s->nb_all_channels; ch++) {        int b, c, e, v;        for(i=0;i<s->nb_coefs[ch];i++) {            c = mdct_coefs[ch][i];            e = encoded_exp[ch][i] - global_exp[ch];            b = bap[ch][i];            switch(b) {            case 0:                v = 0;                break;            case 1:                v = sym_quant(c, e, 3);                switch(mant1_cnt) {                case 0:                    qmant1_ptr = &qmant[ch][i];                    v = 9 * v;                    mant1_cnt = 1;                    break;                case 1:                    *qmant1_ptr += 3 * v;                    mant1_cnt = 2;                    v = 128;                    break;                default:                    *qmant1_ptr += v;                    mant1_cnt = 0;                    v = 128;                    break;                }                break;            case 2:                v = sym_quant(c, e, 5);                switch(mant2_cnt) {                case 0:                    qmant2_ptr = &qmant[ch][i];                    v = 25 * v;                    mant2_cnt = 1;                    break;                case 1:                    *qmant2_ptr += 5 * v;                    mant2_cnt = 2;                    v = 128;                    break;                default:                    *qmant2_ptr += v;                    mant2_cnt = 0;                    v = 128;                    break;                }                break;            case 3:                v = sym_quant(c, e, 7);                break;            case 4:                v = sym_quant(c, e, 11);                switch(mant4_cnt) {                case 0:                    qmant4_ptr = &qmant[ch][i];                    v = 11 * v;                    mant4_cnt = 1;                    break;                default:                    *qmant4_ptr += v;                    mant4_cnt = 0;                    v = 128;                    break;                }                break;            case 5:                v = sym_quant(c, e, 15);                break;            case 14:                v = asym_quant(c, e, 14);                break;            case 15:                v = asym_quant(c, e, 16);                break;            default:                v = asym_quant(c, e, b - 1);                break;            }            qmant[ch][i] = v;        }    }    /* second pass : output the values */    for (ch = 0; ch < s->nb_all_channels; ch++) {        int b, q;                for(i=0;i<s->nb_coefs[ch];i++) {            q = qmant[ch][i];            b = bap[ch][i];            switch(b) {            case 0:                break;            case 1:                if (q != 128)                     put_bits(&s->pb, 5, q);                break;            case 2:                if (q != 128)                     put_bits(&s->pb, 7, q);                break;            case 3:                put_bits(&s->pb, 3, q);                break;            case 4:                if (q != 128)                    put_bits(&s->pb, 7, q);                break;            case 14:                put_bits(&s->pb, 14, q);                break;            case 15:                put_bits(&s->pb, 16, q);                break;            default:                put_bits(&s->pb, b - 1, q);                break;            }        }    }}/* compute the ac3 crc */#define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16))static void ac3_crc_init(void){    unsigned int c, n, k;    for(n=0;n<256;n++) {        c = n << 8;        for (k = 0; k < 8; k++) {            if (c & (1 << 15))                 c = ((c << 1) & 0xffff) ^ (CRC16_POLY & 0xffff);            else                c = c << 1;        }        crc_table[n] = c;    }}static unsigned int ac3_crc(uint8_t *data, int n, unsigned int crc){    int i;    for(i=0;i<n;i++) {        crc = (crc_table[data[i] ^ (crc >> 8)] ^ (crc << 8)) & 0xffff;    }    return crc;}static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly){    unsigned int c;    c = 0;    while (a) {        if (a & 1)            c ^= b;        a = a >> 1;        b = b << 1;        if (b & (1 << 16))            b ^= poly;    }    return c;}static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly){    unsigned int r;    r = 1;    while (n) {        if (n & 1)            r = mul_poly(r, a, poly);        a = mul_poly(a, a, poly);        n >>= 1;    }    return r;}/* compute log2(max(abs(tab[]))) */static int log2_tab(int16_t *tab, int n){    int i, v;    v = 0;    for(i=0;i<n;i++) {        v |= abs(tab[i]);    }    return av_log2(v);}static void lshift_tab(int16_t *tab, int n, int lshift){    int i;    if (lshift > 0) {        for(i=0;i<n;i++) {            tab[i] <<= lshift;        }    } else if (lshift < 0) {        lshift = -lshift;        for(i=0;i<n;i++) {            tab[i] >>= lshift;        }    }}/* fill the end of the frame and compute the two crcs */static int output_frame_end(AC3EncodeContext *s){    int frame_size, frame_size_58, n, crc1, crc2, crc_inv;    uint8_t *frame;    frame_size = s->frame_size; /* frame size in words */    /* align to 8 bits */    flush_put_bits(&s->pb);    /* add zero bytes to reach the frame size */    frame = s->pb.buf;    n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2;    assert(n >= 0);    if(n>0)      memset(pbBufPtr(&s->pb), 0, n);        /* Now we must compute both crcs : this is not so easy for crc1       because it is at the beginning of the data... */    frame_size_58 = (frame_size >> 1) + (frame_size >> 3);    crc1 = ac3_crc(frame + 4, (2 * frame_size_58) - 4, 0);    /* XXX: could precompute crc_inv */    crc_inv = pow_poly((CRC16_POLY >> 1), (16 * frame_size_58) - 16, CRC16_POLY);    crc1 = mul_poly(crc_inv, crc1, CRC16_POLY);    frame[2] = crc1 >> 8;    frame[3] = crc1;        crc2 = ac3_crc(frame + 2 * frame_size_58, (frame_size - frame_size_58) * 2 - 2, 0);    frame[2*frame_size - 2] = crc2 >> 8;    frame[2*frame_size - 1] = crc2;    //    printf("n=%d frame_size=%d\n", n, frame_size);    return frame_size * 2;}static int AC3_encode_frame(AVCodecContext *avctx,                            unsigned char *frame, int buf_size, void *data){    AC3EncodeContext *s = avctx->priv_data;    short *samples = data;    int i, j, k, v, ch;    int16_t input_samples[N];    int32_t mdct_coef[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];    uint8_t exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];    uint8_t exp_strategy[NB_BLOCKS][AC3_MAX_CHANNELS];    uint8_t encoded_exp[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];    uint8_t bap[NB_BLOCKS][AC3_MAX_CHANNELS][N/2];    int8_t exp_samples[NB_BLOCKS][AC3_MAX_CHANNELS];    int frame_bits;    frame_bits = 0;    for(ch=0;ch<s->nb_all_channels;ch++) {        /* fixed mdct to the six sub blocks & exponent computation */        for(i=0;i<NB_BLOCKS;i++) {            int16_t *sptr;            int sinc;            /* compute input samples */            memcpy(input_samples, s->last_samples[ch], N/2 * sizeof(int16_t));            sinc = s->nb_all_channels;            sptr = samples + (sinc * (N/2) * i) + ch;            for(j=0;j<N/2;j++) {                v = *sptr;                input_samples[j + N/2] = v;                s->last_samples[ch][j] = v;                 sptr += sinc;            }            /* apply the MDCT window */            for(j=0;j<N/2;j++) {                input_samples[j] = MUL16(input_samples[j],                                          ac3_window[j]) >> 15;                input_samples[N-j-1] = MUL16(input_samples[N-j-1],                                              ac3_window[j]) >> 15;            }                    /* Normalize the samples to use the maximum available               precision */            v = 14 - log2_tab(input_samples, N);            if (v < 0)                v = 0;            exp_samples[i][ch] = v - 8;            lshift_tab(input_samples, N, v);            /* do the MDCT */            mdct512(mdct_coef[i][ch], input_samples);                        /* compute "exponents". We take into account the               normalization there */            for(j=0;j<N/2;j++) {                int e;                v = abs(mdct_coef[i][ch][j]);                if (v == 0)                    e = 24;                else {                    e = 23 - av_log2(v) + exp_samples[i][ch];                    if (e >= 24) {                        e = 24;                        mdct_coef[i][ch][j] = 0;                    }                }                exp[i][ch][j] = e;            }        }                compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_channel);        /* compute the exponents as the decoder will see them. The           EXP_REUSE case must be handled carefully : we select the           min of the exponents */        i = 0;        while (i < NB_BLOCKS) {            j = i + 1;            while (j < NB_BLOCKS && exp_strategy[j][ch] == EXP_REUSE) {                exponent_min(exp[i][ch], exp[j][ch], s->nb_coefs[ch]);                j++;            }            frame_bits += encode_exp(encoded_exp[i][ch],                                     exp[i][ch], s->nb_coefs[ch],                                      exp_strategy[i][ch]);            /* copy encoded exponents for reuse case */            for(k=i+1;k<j;k++) {                memcpy(encoded_exp[k][ch], encoded_exp[i][ch],                        s->nb_coefs[ch] * sizeof(uint8_t));            }            i = j;        }    }    compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits);    /* everything is known... let's output the frame */    output_frame_header(s, frame);            for(i=0;i<NB_BLOCKS;i++) {        output_audio_block(s, exp_strategy[i], encoded_exp[i],                            bap[i], mdct_coef[i], exp_samples[i], i);    }    return output_frame_end(s);}static int AC3_encode_close(AVCodecContext *avctx){    av_freep(&avctx->coded_frame);    return 0;}#if 0/*************************************************************************//* TEST */#define FN (N/4)void fft_test(void){    IComplex in[FN], in1[FN];    int k, n, i;    float sum_re, sum_im, a;    /* FFT test */    for(i=0;i<FN;i++) {        in[i].re = random() % 65535 - 32767;        in[i].im = random() % 65535 - 32767;        in1[i] = in[i];    }    fft(in, 7);    /* do it by hand */    for(k=0;k<FN;k++) {        sum_re = 0;        sum_im = 0;        for(n=0;n<FN;n++) {            a = -2 * M_PI * (n * k) / FN;            sum_re += in1[n].re * cos(a) - in1[n].im * sin(a);            sum_im += in1[n].re * sin(a) + in1[n].im * cos(a);        }        printf("%3d: %6d,%6d %6.0f,%6.0f\n",                k, in[k].re, in[k].im, sum_re / FN, sum_im / FN);     }}void mdct_test(void){    int16_t input[N];    int32_t output[N/2];    float input1[N];    float output1[N/2];    float s, a, err, e, emax;    int i, k, n;    for(i=0;i<N;i++) {        input[i] = (random() % 65535 - 32767) * 9 / 10;        input1[i] = input[i];    }    mdct512(output, input);        /* do it by hand */    for(k=0;k<N/2;k++) {        s = 0;        for(n=0;n<N;n++) {            a = (2*M_PI*(2*n+1+N/2)*(2*k+1) / (4 * N));            s += input1[n] * cos(a);        }        output1[k] = -2 * s / N;    }        err = 0;    emax = 0;    for(i=0;i<N/2;i++) {        printf("%3d: %7d %7.0f\n", i, output[i], output1[i]);        e = output[i] - output1[i];        if (e > emax)            emax = e;        err += e * e;    }    printf("err2=%f emax=%f\n", err / (N/2), emax);}void test_ac3(void){    AC3EncodeContext ctx;    unsigned char frame[AC3_MAX_CODED_FRAME_SIZE];    short samples[AC3_FRAME_SIZE];    int ret, i;        AC3_encode_init(&ctx, 44100, 64000, 1);    fft_test();    mdct_test();    for(i=0;i<AC3_FRAME_SIZE;i++)        samples[i] = (int)(sin(2*M_PI*i*1000.0/44100) * 10000);    ret = AC3_encode_frame(&ctx, frame, samples);    printf("ret=%d\n", ret);}#endifAVCodec ac3_encoder = {    "ac3",    CODEC_TYPE_AUDIO,    CODEC_ID_AC3,    sizeof(AC3EncodeContext),    AC3_encode_init,    AC3_encode_frame,    AC3_encode_close,    NULL,};

⌨️ 快捷键说明

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