MPEG-2音频解码

    技术2022-05-18  17

    MPEG-2音频的解码过程:

     

    1、检查4个字节的音频头,过程为:

    static inline int ff_mpa_check_header(uint32_t header){    /* header */    if ((header & 0xffe00000) != 0xffe00000) //即前11位为固定头信息,全为1        return -1;    /* layer check */    if ((header & (3<<17)) == 0)//即第14、15两位表示layer        return -1;    /* bit rate */    if ((header & (0xf<<12)) == 0xf<<12)//即第17、18、19、20四位不能全为1        return -1;    /* frequency */    if ((header & (3<<10)) == 3<<10)//即第21、22位不能全为1        return -1;    return 0;}

     

    2、根据header信息得到相应参数信息:

    s->layer = 4 - ((header >> 17) & 3);)//即第14、15两位与0x0011相与,再被4减

    sample_rate_index = (header >> 10) & 3;//获取的是采样率的索引,ff_mpa_freq_tab[3] = { 44100, 48000, 32000 };

    sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);//其中,if (header & (1<<20))

                                                                                                                           //{s->lsf =(header & (1<<19)) ? 0 : 1;                                                                                                                       // mpeg25 = 0;                                                                                                                       // } else {                                                                                                                       //s->lsf = 1;                                                                                                                       //mpeg25 = 1;                                                                                                                       // } 

    sample_rate_index += 3 * (s->lsf + mpeg25);s->sample_rate_index = sample_rate_index;

    s->sample_rate = sample_rate;

    bitrate_index = (header >> 12) & 0xf;

    s->mode = (header >> 6) & 3;

    padding = (header >> 9) & 1;

    if (s->mode == MPA_MONO)        s->nb_channels = 1;    else        s->nb_channels = 2;

    if (bitrate_index != 0) {        frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];        s->bit_rate = frame_size * 1000;        switch(s->layer) {        case 1:            frame_size = (frame_size * 12000) / sample_rate;            frame_size = (frame_size + padding) * 4;            break;        case 2:            frame_size = (frame_size * 144000) / sample_rate;            frame_size += padding;            break;        default:        case 3:            frame_size = (frame_size * 144000) / (sample_rate << s->lsf);            frame_size += padding;            break;        }        s->frame_size = frame_size;    } else {        /* if no frame size computed, signal it */        return 1;    }

    其中,

    const uint16_t ff_mpa_bitrate_tab[2][3][15] = {    { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 },      {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 },      {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } },    { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256},      {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160},      {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}    }};

     

    根据layer数,即可知道该音频的编码类型:

    layer = 1, 对应MPEG1

    layer = 2, 对应MPEG2,framesize = 1152 //1152与外面开辟的保存输出数据的缓冲大小有关,如果开辟空间大小<1152*avctx-                                                                //>channels*2时,则空间太小;

    layer = 3, 对应MPEG3(MP3)

    通过比较送入的数据buf_size和解析header获取的数据大小 s->frame_size相比,即可得知当前送入的数据是否有问题:

    如果s->frame_size > buf_size,则送入的帧不够;

    如果s->frame_size < buf_size,则该帧可能有问题;

     

    3、解码

    3.1  /*先根据参数(bitrate、channel、samplerate)等信息,选取码表*/

        table = ff_mpa_l2_select_table(s->bit_rate / 1000, s->nb_channels, s->sample_rate, s->lsf);

     

    3.2  /* parse bit allocation */

        j = 0;    for(i=0;i<bound;i++) {        bit_alloc_bits = alloc_table[j];        for(ch=0;ch<s->nb_channels;ch++) {            bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits);        }        j += 1 << bit_alloc_bits;    }    for(i=bound;i<sblimit;i++) {        bit_alloc_bits = alloc_table[j];        v = get_bits(&s->gb, bit_alloc_bits);        bit_alloc[0][i] = v;        bit_alloc[1][i] = v;        j += 1 << bit_alloc_bits;    }

     

    3.3 /* scale codes */

       for(i=0;i<sblimit;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            if (bit_alloc[ch][i])                scale_code[ch][i] = get_bits(&s->gb, 2);        }    }

     

    3.4 /* scale factors */

    for(i=0;i<sblimit;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            if (bit_alloc[ch][i]) {                sf = scale_factors[ch][i];                switch(scale_code[ch][i]) {                default:                case 0:                    sf[0] = get_bits(&s->gb, 6);                    sf[1] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    break;                case 2:                    sf[0] = get_bits(&s->gb, 6);                    sf[1] = sf[0];                    sf[2] = sf[0];                    break;                case 1:                    sf[0] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    sf[1] = sf[0];                    break;                case 3:                    sf[0] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    sf[1] = sf[2];                    break;                }            }        }    }

    3.5 /* samples */

        for(k=0;k<3;k++) {        for(l=0;l<12;l+=3) {            j = 0;            for(i=0;i<bound;i++) {                bit_alloc_bits = alloc_table[j];                for(ch=0;ch<s->nb_channels;ch++) {                    b = bit_alloc[ch][i];                    if (b) {                        scale = scale_factors[ch][i][k];                        qindex = alloc_table[j+b];                        bits = ff_mpa_quant_bits[qindex];                        if (bits < 0) {                            int v2;                            /* 3 values at the same time */                            v = get_bits(&s->gb, -bits);                            v2 = division_tabs[qindex][v];                            steps  = ff_mpa_quant_steps[qindex];

                                s->sb_samples[ch][k * 12 + l + 0][i] =                                l2_unscale_group(steps, v2        & 15, scale);                            s->sb_samples[ch][k * 12 + l + 1][i] =                                l2_unscale_group(steps, (v2 >> 4) & 15, scale);                            s->sb_samples[ch][k * 12 + l + 2][i] =                                l2_unscale_group(steps,  v2 >> 8      , scale);                        } else {                            for(m=0;m<3;m++) {                                v = get_bits(&s->gb, bits);                                v = l1_unscale(bits - 1, v, scale);                                s->sb_samples[ch][k * 12 + l + m][i] = v;                            }                        }                    } else {                        s->sb_samples[ch][k * 12 + l + 0][i] = 0;                        s->sb_samples[ch][k * 12 + l + 1][i] = 0;                        s->sb_samples[ch][k * 12 + l + 2][i] = 0;                    }                }                /* next subband in alloc table */                j += 1 << bit_alloc_bits;            }            /* XXX: find a way to avoid this duplication of code */            for(i=bound;i<sblimit;i++) {                bit_alloc_bits = alloc_table[j];                b = bit_alloc[0][i];                if (b) {                    int mant, scale0, scale1;                    scale0 = scale_factors[0][i][k];                    scale1 = scale_factors[1][i][k];                    qindex = alloc_table[j+b];                    bits = ff_mpa_quant_bits[qindex];                    if (bits < 0) {                        /* 3 values at the same time */                        v = get_bits(&s->gb, -bits);                        steps = ff_mpa_quant_steps[qindex];                        mant = v % steps;                        v = v / steps;                        s->sb_samples[0][k * 12 + l + 0][i] =                            l2_unscale_group(steps, mant, scale0);                        s->sb_samples[1][k * 12 + l + 0][i] =                            l2_unscale_group(steps, mant, scale1);                        mant = v % steps;                        v = v / steps;                        s->sb_samples[0][k * 12 + l + 1][i] =                            l2_unscale_group(steps, mant, scale0);                        s->sb_samples[1][k * 12 + l + 1][i] =                            l2_unscale_group(steps, mant, scale1);                        s->sb_samples[0][k * 12 + l + 2][i] =                            l2_unscale_group(steps, v, scale0);                        s->sb_samples[1][k * 12 + l + 2][i] =                            l2_unscale_group(steps, v, scale1);                    } else {                        for(m=0;m<3;m++) {                            mant = get_bits(&s->gb, bits);                            s->sb_samples[0][k * 12 + l + m][i] =                                l1_unscale(bits - 1, mant, scale0);                            s->sb_samples[1][k * 12 + l + m][i] =                                l1_unscale(bits - 1, mant, scale1);                        }                    }                } else {                    s->sb_samples[0][k * 12 + l + 0][i] = 0;                    s->sb_samples[0][k * 12 + l + 1][i] = 0;                    s->sb_samples[0][k * 12 + l + 2][i] = 0;                    s->sb_samples[1][k * 12 + l + 0][i] = 0;                    s->sb_samples[1][k * 12 + l + 1][i] = 0;                    s->sb_samples[1][k * 12 + l + 2][i] = 0;                }                /* next subband in alloc table */                j += 1 << bit_alloc_bits;            }            /* fill remaining samples to zero */            for(i=sblimit;i<SBLIMIT;i++) {                for(ch=0;ch<s->nb_channels;ch++) {                    s->sb_samples[ch][k * 12 + l + 0][i] = 0;                    s->sb_samples[ch][k * 12 + l + 1][i] = 0;                    s->sb_samples[ch][k * 12 + l + 2][i] = 0;                }            }        }    }

    nb->frames = 36;

     

    3.6 ff_mpa_synth_filter过程

    先进行逆dct变换,dct32(synth_buf, sb_samples);

    之后进行apply_window_mp3_c变换;

     

    4.0 最后输出的PCM数据的实际大小为:

    nb_frames * 32 * 2* s->nb_channels;

     


    最新回复(0)