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

📄 decoder_amr_wb.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
字号:
/* ------------------------------------------------------------------ * Copyright (C) 2008 PacketVideo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- *//****************************************************************************************Portions of this file are derived from the following 3GPP standard:    3GPP TS 26.173    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec    Available from http://www.3gpp.org(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)Permission to distribute, modify and use this file under the standard licenseterms listed above has been obtained from the copyright holder.****************************************************************************************///                                                                              ////  File: decoder_amr_wb.cpp                                                   ////                                                                              ////////////////////////////////////////////////////////////////////////////////////#include "decoder_amr_wb.h"#include "pvamrwbdecoder_api.h"#include "pvamrwbdecoder.h"#include "pvamrwbdecoder_cnst.h"#include "dtx.h"// Use default DLL entry point for Symbian#include "oscl_dll.h"#include "oscl_error_codes.h"#include "oscl_exception.h"#include "oscl_mem.h"#define KCAI_CODEC_INIT_FAILURE -1OSCL_DLL_ENTRY_POINT_DEFAULT()OSCL_EXPORT_REF CDecoder_AMR_WB *CDecoder_AMR_WB::NewL(){    CDecoder_AMR_WB *dec = new CDecoder_AMR_WB;    if (dec == NULL)        OSCL_LEAVE(OsclErrNoMemory);    else        dec->ConstructL();    return dec;}OSCL_EXPORT_REF void CDecoder_AMR_WB::ConstructL(){    st = NULL;    pt_st = NULL;    ScratchMem = NULL;    iInputBuf = NULL;    iOutputBuf = NULL;}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    ~CDecoder_AMR_WB    Empty decoder destructor.    Parameters:     none    Return Values:  none-----------------------------------------------------------------------------*/OSCL_EXPORT_REF CDecoder_AMR_WB::~CDecoder_AMR_WB(){    st = NULL;    ScratchMem = NULL;    if (pt_st != NULL)    {        OSCL_ARRAY_DELETE((uint8*)pt_st);        pt_st = NULL;    }    if (iInputBuf)    {        OSCL_ARRAY_DELETE(iInputBuf);        iInputBuf = NULL;    }    if (iOutputBuf)    {        OSCL_ARRAY_DELETE(iOutputBuf);        iOutputBuf = NULL;    }}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    StartL    Start decoder object. Initialize codec status.    Parameters:     none    Return Values:  status-----------------------------------------------------------------------------*/OSCL_EXPORT_REF int32 CDecoder_AMR_WB::StartL(tPVAmrDecoderExternal * pExt,        bool aAllocateInputBuffer,        bool aAllocateOutputBuffer){    /*     *  Allocate Input bitstream buffer     */    if (aAllocateInputBuffer)    {        iInputBuf = OSCL_ARRAY_NEW(uint8, KAMRWB_NB_BYTES_MAX);        if (iInputBuf == NULL)        {            return KCAI_CODEC_INIT_FAILURE;        }    }    else    {        iInputBuf = NULL;    }    pExt->pInputBuffer = iInputBuf;    iInputSampleBuf = OSCL_ARRAY_NEW(int16, KAMRWB_NB_BITS_MAX);    if (iInputSampleBuf == NULL)    {        return KCAI_CODEC_INIT_FAILURE;    }    pExt->pInputSampleBuffer = iInputSampleBuf;    /*     *  Allocate Output PCM buffer     */    if (aAllocateOutputBuffer)    {        iOutputBuf = OSCL_ARRAY_NEW(int16, AMR_WB_PCM_FRAME);        if (iOutputBuf == NULL)        {            return KCAI_CODEC_INIT_FAILURE;        }    }    else    {        iOutputBuf = NULL;    }    pExt->pOutputBuffer = iOutputBuf;    pExt->samplingRate = 16000;    pExt->desiredChannels = 1;    pExt->reset_flag = 0;    pExt->reset_flag_old = 1;    pExt->mode_old = 0;    pExt->rx_state.prev_ft = RX_SPEECH_GOOD;    pExt->rx_state.prev_mode = 0;    int32 memreq = pvDecoder_AmrWbMemRequirements();    pt_st = OSCL_ARRAY_NEW(uint8, memreq);    if (pt_st == 0)    {        return(KCAI_CODEC_INIT_FAILURE);    }    pvDecoder_AmrWb_Init(&st, pt_st, &ScratchMem);    return 0;}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    ExecuteL    Execute decoder object. Read one encoded speech frame from the input    stream,  decode it and write the decoded frame to output stream.    Parameters:    Return Values:  status-----------------------------------------------------------------------------*/OSCL_EXPORT_REF int32 CDecoder_AMR_WB::ExecuteL(tPVAmrDecoderExternal * pExt){    if (pExt->input_format == MIME_IETF)  /* MIME/storage file format */    {        mime_unsorting(pExt->pInputBuffer,                       pExt->pInputSampleBuffer,                       &pExt->frame_type,                       &pExt->mode,                       pExt->quality,                       &pExt->rx_state);    }    if ((pExt->frame_type == RX_NO_DATA) | (pExt->frame_type == RX_SPEECH_LOST))    {        pExt->mode = pExt->mode_old;        pExt->reset_flag = 0;    }    else    {        pExt->mode_old = pExt->mode;        /* if homed: check if this frame is another homing frame */        if (pExt->reset_flag_old == 1)        {            /* only check until end of first subframe */            pExt->reset_flag = pvDecoder_AmrWb_homing_frame_test_first(pExt->pInputSampleBuffer,                               pExt->mode);        }    }    /* produce encoder homing frame if homed & input=decoder homing frame */    if ((pExt->reset_flag != 0) && (pExt->reset_flag_old != 0))    {        /* set homing sequence ( no need to decode anything */        for (int16 i = 0; i < AMR_WB_PCM_FRAME; i++)        {            pExt->pOutputBuffer[i] = EHF_MASK;        }    }    else    {        pExt->status = pvDecoder_AmrWb(pExt->mode,                                       pExt->pInputSampleBuffer,                                       pExt->pOutputBuffer,                                       &pExt->frameLength,                                       st,                                       pExt->frame_type,                                       ScratchMem);    }    for (int16 i = 0; i < AMR_WB_PCM_FRAME; i++)   /* Delete the 2 LSBs (14-bit output) */    {        pExt->pOutputBuffer[i] &= 0xfffC;    }    /* if not homed: check whether current frame is a homing frame */    if (pExt->reset_flag_old == 0)    {        /* check whole frame */        pExt->reset_flag = pvDecoder_AmrWb_homing_frame_test(pExt->pInputSampleBuffer,                           pExt->mode);    }    /* reset decoder if current frame is a homing frame */    if (pExt->reset_flag != 0)    {        pvDecoder_AmrWb_Reset(st, 1);;    }    pExt->reset_flag_old = pExt->reset_flag;    return pExt->status;}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    StopL    Stop decoder object.    Parameters:     none    Return Values:  none-----------------------------------------------------------------------------*/OSCL_EXPORT_REF void CDecoder_AMR_WB::StopL(){}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    ResetDecoderL    Stop decoder object. Reset decoder.    Parameters:     none    Return Values:  status-----------------------------------------------------------------------------*/OSCL_EXPORT_REF int32 CDecoder_AMR_WB::ResetDecoderL(){    pvDecoder_AmrWb_Reset(st, 1);    return 0;}/*-----------------------------------------------------------------------------    CDecoder_AMR_WB    TerminateDecoderL    Stop decoder object. close decoder.    Parameters:     none    Return Values:  none-----------------------------------------------------------------------------*/OSCL_EXPORT_REF void CDecoder_AMR_WB::TerminateDecoderL(){    st = NULL;    ScratchMem = NULL;    if (pt_st != NULL)    {        OSCL_ARRAY_DELETE((uint8*)pt_st);        pt_st = NULL;    }    if (iInputBuf)    {        OSCL_ARRAY_DELETE(iInputBuf);        iInputBuf = NULL;    }    if (iOutputBuf)    {        OSCL_ARRAY_DELETE(iOutputBuf);        iOutputBuf = NULL;    }    if (iInputSampleBuf != NULL)    {        OSCL_ARRAY_DELETE(iInputSampleBuf);        iInputSampleBuf = NULL;    }}

⌨️ 快捷键说明

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