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

📄 atrac3.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    }    /* number of coded QMF bands */    pSnd->bandsCoded = get_bits(gb,2);    result = decodeGainControl (gb, &(pSnd->gainBlock[pSnd->gcBlkSwitch]), pSnd->bandsCoded);    if (result) return result;    pSnd->numComponents = decodeTonalComponents (gb, pSnd->components, pSnd->bandsCoded);    if (pSnd->numComponents == -1) return -1;    numSubbands = decodeSpectrum (gb, pSnd->spectrum);    /* Merge the decoded spectrum and tonal components. */    lastTonal = addTonalComponents (pSnd->spectrum, pSnd->numComponents, pSnd->components);    /* calculate number of used MLT/QMF bands according to the amount of coded spectral lines */    numBands = (subbandTab[numSubbands] - 1) >> 8;    if (lastTonal >= 0)        numBands = FFMAX((lastTonal + 256) >> 8, numBands);    /* Reconstruct time domain samples. */    for (band=0; band<4; band++) {        /* Perform the IMDCT step without overlapping. */        if (band <= numBands) {            IMLT(&(pSnd->spectrum[band*256]), pSnd->IMDCT_buf, band&1,q->mdct_tmp);        } else            memset(pSnd->IMDCT_buf, 0, 512 * sizeof(float));        /* gain compensation and overlapping */        gainCompensateAndOverlap (pSnd->IMDCT_buf, &(pSnd->prevFrame[band*256]), &(pOut[band*256]),                                    &((pSnd->gainBlock[1 - (pSnd->gcBlkSwitch)]).gBlock[band]),                                    &((pSnd->gainBlock[pSnd->gcBlkSwitch]).gBlock[band]));    }    /* Swap the gain control buffers for the next frame. */    pSnd->gcBlkSwitch ^= 1;    return 0;}/** * Frame handling * * @param q             Atrac3 private context * @param databuf       the input data */static int decodeFrame(ATRAC3Context *q, uint8_t* databuf){    int   result, i;    float   *p1, *p2, *p3, *p4;    uint8_t    *ptr1, *ptr2;    if (q->codingMode == JOINT_STEREO) {        /* channel coupling mode */        /* decode Sound Unit 1 */        init_get_bits(&q->gb,databuf,q->bits_per_frame);        result = decodeChannelSoundUnit(q,&q->gb, q->pUnits, q->outSamples, 0, JOINT_STEREO);        if (result != 0)            return (result);        /* Framedata of the su2 in the joint-stereo mode is encoded in         * reverse byte order so we need to swap it first. */        ptr1 = databuf;        ptr2 = databuf+q->bytes_per_frame-1;        for (i = 0; i < (q->bytes_per_frame/2); i++, ptr1++, ptr2--) {            FFSWAP(uint8_t,*ptr1,*ptr2);        }        /* Skip the sync codes (0xF8). */        ptr1 = databuf;        for (i = 4; *ptr1 == 0xF8; i++, ptr1++) {            if (i >= q->bytes_per_frame)                return -1;        }        /* set the bitstream reader at the start of the second Sound Unit*/        init_get_bits(&q->gb,ptr1,q->bits_per_frame);        /* Fill the Weighting coeffs delay buffer */        memmove(q->weighting_delay,&(q->weighting_delay[2]),4*sizeof(int));        q->weighting_delay[4] = get_bits1(&q->gb);        q->weighting_delay[5] = get_bits(&q->gb,3);        for (i = 0; i < 4; i++) {            q->matrix_coeff_index_prev[i] = q->matrix_coeff_index_now[i];            q->matrix_coeff_index_now[i] = q->matrix_coeff_index_next[i];            q->matrix_coeff_index_next[i] = get_bits(&q->gb,2);        }        /* Decode Sound Unit 2. */        result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[1], &q->outSamples[1024], 1, JOINT_STEREO);        if (result != 0)            return (result);        /* Reconstruct the channel coefficients. */        reverseMatrixing(q->outSamples, &q->outSamples[1024], q->matrix_coeff_index_prev, q->matrix_coeff_index_now);        channelWeighting(q->outSamples, &q->outSamples[1024], q->weighting_delay);    } else {        /* normal stereo mode or mono */        /* Decode the channel sound units. */        for (i=0 ; i<q->channels ; i++) {            /* Set the bitstream reader at the start of a channel sound unit. */            init_get_bits(&q->gb, databuf+((i*q->bytes_per_frame)/q->channels), (q->bits_per_frame)/q->channels);            result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[i], &q->outSamples[i*1024], i, q->codingMode);            if (result != 0)                return (result);        }    }    /* Apply the iQMF synthesis filter. */    p1= q->outSamples;    for (i=0 ; i<q->channels ; i++) {        p2= p1+256;        p3= p2+256;        p4= p3+256;        iqmf (p1, p2, 256, p1, q->pUnits[i].delayBuf1, q->tempBuf);        iqmf (p4, p3, 256, p3, q->pUnits[i].delayBuf2, q->tempBuf);        iqmf (p1, p3, 512, p1, q->pUnits[i].delayBuf3, q->tempBuf);        p1 +=1024;    }    return 0;}/** * Atrac frame decoding * * @param avctx     pointer to the AVCodecContext */static int atrac3_decode_frame(AVCodecContext *avctx,            void *data, int *data_size,            const uint8_t *buf, int buf_size) {    ATRAC3Context *q = avctx->priv_data;    int result = 0, i;    uint8_t* databuf;    int16_t* samples = data;    if (buf_size < avctx->block_align)        return buf_size;    /* Check if we need to descramble and what buffer to pass on. */    if (q->scrambled_stream) {        decode_bytes(buf, q->decoded_bytes_buffer, avctx->block_align);        databuf = q->decoded_bytes_buffer;    } else {#ifndef __CW32__        databuf = buf;#else        databuf = (uint8_t*)buf;#endif    }    result = decodeFrame(q, databuf);    if (result != 0) {        av_log(NULL,AV_LOG_ERROR,"Frame decoding error!\n");        return -1;    }    if (q->channels == 1) {        /* mono */        for (i = 0; i<1024; i++)            samples[i] = av_clip_int16(round(q->outSamples[i]));        *data_size = 1024 * sizeof(int16_t);    } else {        /* stereo */        for (i = 0; i < 1024; i++) {            samples[i*2] = av_clip_int16(round(q->outSamples[i]));            samples[i*2+1] = av_clip_int16(round(q->outSamples[1024+i]));        }        *data_size = 2048 * sizeof(int16_t);    }    return avctx->block_align;}/** * Atrac3 initialization * * @param avctx     pointer to the AVCodecContext */static int atrac3_decode_init(AVCodecContext *avctx){    int i;    const uint8_t *edata_ptr = avctx->extradata;    ATRAC3Context *q = avctx->priv_data;    /* Take data from the AVCodecContext (RM container). */    q->sample_rate = avctx->sample_rate;    q->channels = avctx->channels;    q->bit_rate = avctx->bit_rate;    q->bits_per_frame = avctx->block_align * 8;    q->bytes_per_frame = avctx->block_align;    /* Take care of the codec-specific extradata. */    if (avctx->extradata_size == 14) {        /* Parse the extradata, WAV format */        av_log(avctx,AV_LOG_DEBUG,"[0-1] %d\n",bytestream_get_le16(&edata_ptr));  //Unknown value always 1        q->samples_per_channel = bytestream_get_le32(&edata_ptr);        q->codingMode = bytestream_get_le16(&edata_ptr);        av_log(avctx,AV_LOG_DEBUG,"[8-9] %d\n",bytestream_get_le16(&edata_ptr));  //Dupe of coding mode        q->frame_factor = bytestream_get_le16(&edata_ptr);  //Unknown always 1        av_log(avctx,AV_LOG_DEBUG,"[12-13] %d\n",bytestream_get_le16(&edata_ptr));  //Unknown always 0        /* setup */        q->samples_per_frame = 1024 * q->channels;        q->atrac3version = 4;        q->delay = 0x88E;        if (q->codingMode)            q->codingMode = JOINT_STEREO;        else            q->codingMode = STEREO;        q->scrambled_stream = 0;        if ((q->bytes_per_frame == 96*q->channels*q->frame_factor) || (q->bytes_per_frame == 152*q->channels*q->frame_factor) || (q->bytes_per_frame == 192*q->channels*q->frame_factor)) {        } else {            av_log(avctx,AV_LOG_ERROR,"Unknown frame/channel/frame_factor configuration %d/%d/%d\n", q->bytes_per_frame, q->channels, q->frame_factor);            return -1;        }    } else if (avctx->extradata_size == 10) {        /* Parse the extradata, RM format. */        q->atrac3version = bytestream_get_be32(&edata_ptr);        q->samples_per_frame = bytestream_get_be16(&edata_ptr);        q->delay = bytestream_get_be16(&edata_ptr);        q->codingMode = bytestream_get_be16(&edata_ptr);        q->samples_per_channel = q->samples_per_frame / q->channels;        q->scrambled_stream = 1;    } else {        av_log(NULL,AV_LOG_ERROR,"Unknown extradata size %d.\n",avctx->extradata_size);    }    /* Check the extradata. */    if (q->atrac3version != 4) {        av_log(avctx,AV_LOG_ERROR,"Version %d != 4.\n",q->atrac3version);        return -1;    }    if (q->samples_per_frame != 1024 && q->samples_per_frame != 2048) {        av_log(avctx,AV_LOG_ERROR,"Unknown amount of samples per frame %d.\n",q->samples_per_frame);        return -1;    }    if (q->delay != 0x88E) {        av_log(avctx,AV_LOG_ERROR,"Unknown amount of delay %x != 0x88E.\n",q->delay);        return -1;    }    if (q->codingMode == STEREO) {        av_log(avctx,AV_LOG_DEBUG,"Normal stereo detected.\n");    } else if (q->codingMode == JOINT_STEREO) {        av_log(avctx,AV_LOG_DEBUG,"Joint stereo detected.\n");    } else {        av_log(avctx,AV_LOG_ERROR,"Unknown channel coding mode %x!\n",q->codingMode);        return -1;    }    if (avctx->channels <= 0 || avctx->channels > 2 /*|| ((avctx->channels * 1024) != q->samples_per_frame)*/) {        av_log(avctx,AV_LOG_ERROR,"Channel configuration error!\n");        return -1;    }    if(avctx->block_align >= UINT_MAX/2)        return -1;    /* Pad the data buffer with FF_INPUT_BUFFER_PADDING_SIZE,     * this is for the bitstream reader. */    if ((q->decoded_bytes_buffer = av_mallocz((avctx->block_align+(4-avctx->block_align%4) + FF_INPUT_BUFFER_PADDING_SIZE)))  == NULL)        return AVERROR(ENOMEM);    /* Initialize the VLC tables. */    for (i=0 ; i<7 ; i++) {        init_vlc (&spectral_coeff_tab[i], 9, huff_tab_sizes[i],            huff_bits[i], 1, 1,            huff_codes[i], 1, 1, INIT_VLC_USE_STATIC);    }    init_atrac3_transforms(q);    /* Generate the scale factors. */    for (i=0 ; i<64 ; i++)        SFTable[i] = pow(2.0, (i - 15) / 3.0);    /* Generate gain tables. */    for (i=0 ; i<16 ; i++)        gain_tab1[i] = powf (2.0, (4 - i));    for (i=-15 ; i<16 ; i++)        gain_tab2[i+15] = powf (2.0, i * -0.125);    /* init the joint-stereo decoding data */    q->weighting_delay[0] = 0;    q->weighting_delay[1] = 7;    q->weighting_delay[2] = 0;    q->weighting_delay[3] = 7;    q->weighting_delay[4] = 0;    q->weighting_delay[5] = 7;    for (i=0; i<4; i++) {        q->matrix_coeff_index_prev[i] = 3;        q->matrix_coeff_index_now[i] = 3;        q->matrix_coeff_index_next[i] = 3;    }    dsputil_init(&dsp, avctx);    q->pUnits = av_mallocz(sizeof(channel_unit)*q->channels);    if (!q->pUnits) {        av_free(q->decoded_bytes_buffer);        return AVERROR(ENOMEM);    }    return 0;}AVCodec atrac3_decoder ={#ifdef __CW32__	    "atrac3",	    CODEC_TYPE_AUDIO,	    CODEC_ID_ATRAC3,	    sizeof(ATRAC3Context),	    atrac3_decode_init,	    0,	    atrac3_decode_close,	    atrac3_decode_frame,	    0,	    0,	    0,	    0,	    0,	    NULL_IF_CONFIG_SMALL("Atrac 3 (Adaptive TRansform Acoustic Coding 3)"),#else	    .name = "atrac3",	    .type = CODEC_TYPE_AUDIO,	    .id = CODEC_ID_ATRAC3,	    .priv_data_size = sizeof(ATRAC3Context),	    .init = atrac3_decode_init,	    .close = atrac3_decode_close,	    .decode = atrac3_decode_frame,	    .long_name = NULL_IF_CONFIG_SMALL("Atrac 3 (Adaptive TRansform Acoustic Coding 3)"),#endif};

⌨️ 快捷键说明

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