亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? encoder.cpp

?? 音頻編碼
?? CPP
字號:
/* *  LAME MP3 encoder for DirectShow *  LAME encoder wrapper * *  Copyright (c) 2000-2005 Marie Orlova, Peter Gubanov, Vitaly Ivanov, Elecard Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include <streams.h>#include "Encoder.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CEncoder::CEncoder() :    m_bInpuTypeSet(FALSE),    m_bOutpuTypeSet(FALSE),    m_bFinished(FALSE),    m_outOffset(0),    m_outReadOffset(0),    m_frameCount(0),    pgf(NULL){    m_outFrameBuf = new unsigned char[OUT_BUFFER_SIZE];}CEncoder::~CEncoder(){    Close();    if (m_outFrameBuf)        delete [] m_outFrameBuf;}//////////////////////////////////////////////////////////////////////// SetInputType - check if given input type is supported//////////////////////////////////////////////////////////////////////HRESULT CEncoder::SetInputType(LPWAVEFORMATEX lpwfex, bool bJustCheck){    CAutoLock l(&m_lock);    if (lpwfex->wFormatTag == WAVE_FORMAT_PCM)    {        if (lpwfex->nChannels == 1 || lpwfex->nChannels == 2)        {            if (lpwfex->nSamplesPerSec  == 48000 ||                lpwfex->nSamplesPerSec  == 44100 ||                lpwfex->nSamplesPerSec  == 32000 ||                lpwfex->nSamplesPerSec  == 24000 ||                lpwfex->nSamplesPerSec  == 22050 ||                lpwfex->nSamplesPerSec  == 16000 ||                lpwfex->nSamplesPerSec  == 12000 ||                lpwfex->nSamplesPerSec  == 11025 ||                lpwfex->nSamplesPerSec  ==  8000)            {                if (lpwfex->wBitsPerSample == 16)                {                    if (!bJustCheck)                    {                        memcpy(&m_wfex, lpwfex, sizeof(WAVEFORMATEX));                        m_bInpuTypeSet = true;                    }                    return S_OK;                }            }        }    }    if (!bJustCheck)        m_bInpuTypeSet = false;    return E_INVALIDARG;}//////////////////////////////////////////////////////////////////////// SetOutputType - try to initialize encoder with given output type//////////////////////////////////////////////////////////////////////HRESULT CEncoder::SetOutputType(MPEG_ENCODER_CONFIG &mabsi){    CAutoLock l(&m_lock);    m_mabsi = mabsi;    m_bOutpuTypeSet = true;    return S_OK;}//////////////////////////////////////////////////////////////////////// SetDefaultOutputType - sets default MPEG audio properties according// to input type//////////////////////////////////////////////////////////////////////HRESULT CEncoder::SetDefaultOutputType(LPWAVEFORMATEX lpwfex){    CAutoLock l(&m_lock);    if(lpwfex->nChannels == 1 || m_mabsi.bForceMono)        m_mabsi.ChMode = MONO;    if((lpwfex->nSamplesPerSec < m_mabsi.dwSampleRate) || (lpwfex->nSamplesPerSec % m_mabsi.dwSampleRate != 0))        m_mabsi.dwSampleRate = lpwfex->nSamplesPerSec;    return S_OK;}//////////////////////////////////////////////////////////////////////// Init - initialized or reiniyialized encoder SDK with given input // and output settings//////////////////////////////////////////////////////////////////////HRESULT CEncoder::Init(){    CAutoLock l(&m_lock);    m_outOffset     = 0;    m_outReadOffset = 0;    m_bFinished     = FALSE;    m_frameCount    = 0;    if (!pgf)    {        if (!m_bInpuTypeSet || !m_bOutpuTypeSet)            return E_UNEXPECTED;        // Init Lame library        // note: newer, safer interface which doesn't         // allow or require direct access to 'gf' struct is being written        // see the file 'API' included with LAME.        if (pgf = lame_init())        {            pgf->num_channels = m_wfex.nChannels;            pgf->in_samplerate = m_wfex.nSamplesPerSec;            pgf->out_samplerate = m_mabsi.dwSampleRate;            if ((pgf->out_samplerate >= 32000) && (m_mabsi.dwBitrate < 32))                pgf->brate = 32;            else                pgf->brate = m_mabsi.dwBitrate;            pgf->VBR = m_mabsi.vmVariable;            pgf->VBR_min_bitrate_kbps = m_mabsi.dwVariableMin;            pgf->VBR_max_bitrate_kbps = m_mabsi.dwVariableMax;            pgf->copyright = m_mabsi.bCopyright;            pgf->original = m_mabsi.bOriginal;            pgf->error_protection = m_mabsi.bCRCProtect;            pgf->bWriteVbrTag = m_mabsi.dwXingTag;            pgf->strict_ISO = m_mabsi.dwStrictISO;            pgf->VBR_hard_min = m_mabsi.dwEnforceVBRmin;            if (pgf->num_channels == 2 && !m_mabsi.bForceMono)            {                int act_br = pgf->VBR ? pgf->VBR_min_bitrate_kbps + pgf->VBR_max_bitrate_kbps / 2 : pgf->brate;                // Disabled. It's for user's consideration now                //int rel = pgf->out_samplerate / (act_br + 1);                //pgf->mode = rel < 200 ? m_mabsi.ChMode : JOINT_STEREO;                pgf->mode = m_mabsi.ChMode;            }            else                pgf->mode = MONO;            if (pgf->mode == JOINT_STEREO)                pgf->force_ms = m_mabsi.dwForceMS;            else                pgf->force_ms = 0;            pgf->mode_fixed = m_mabsi.dwModeFixed;            if (m_mabsi.dwVoiceMode != 0)            {                pgf->lowpassfreq = 12000;                pgf->VBR_max_bitrate_kbps = 160;            }            if (m_mabsi.dwKeepAllFreq != 0)            {                pgf->lowpassfreq = -1;                pgf->highpassfreq = -1;            }            pgf->quality = m_mabsi.dwQuality;            pgf->VBR_q = m_mabsi.dwVBRq;            lame_init_params(pgf);            // encoder delay compensation            {                short * start_padd = (short *)calloc(48, pgf->num_channels * sizeof(short));                if (pgf->num_channels == 2)                    lame_encode_buffer_interleaved(pgf, start_padd, 48, m_outFrameBuf, OUT_BUFFER_SIZE);                else                    lame_encode_buffer(pgf, start_padd, start_padd, 48, m_outFrameBuf, OUT_BUFFER_SIZE);                free(start_padd);            }            return S_OK;        }        return E_FAIL;    }    return S_OK;}//////////////////////////////////////////////////////////////////////// Close - closes encoder//////////////////////////////////////////////////////////////////////HRESULT CEncoder::Close(){    CAutoLock l(&m_lock);    if (pgf)    {        lame_close(pgf);        pgf = NULL;    }    return S_OK;}//////////////////////////////////////////////////////////////////////// Encode - encodes data placed on pdata and returns// the number of processed bytes//////////////////////////////////////////////////////////////////////int CEncoder::Encode(const short * pdata, int data_size){    CAutoLock l(&m_lock);    if (!pgf || !m_outFrameBuf || !pdata || data_size < 0 || (data_size & (sizeof(short) - 1)))        return -1;    // some data left in the buffer, shift to start    if (m_outReadOffset > 0)    {        if (m_outOffset > m_outReadOffset)            memmove(m_outFrameBuf, m_outFrameBuf + m_outReadOffset, m_outOffset - m_outReadOffset);        m_outOffset -= m_outReadOffset;    }    m_outReadOffset = 0;    m_bFinished = FALSE;    int bytes_processed = 0;    while (1)    {        int nsamples = (data_size - bytes_processed) / (sizeof(short) * pgf->num_channels);        if (nsamples <= 0)            break;        if (nsamples > 1152)            nsamples = 1152;        if (m_outOffset >= OUT_BUFFER_MAX)            break;        int out_bytes = 0;        if (pgf->num_channels == 2)            out_bytes = lame_encode_buffer_interleaved(                                            pgf,                                            (short *)(pdata + (bytes_processed / sizeof(short))),                                            nsamples,                                            m_outFrameBuf + m_outOffset,                                            OUT_BUFFER_SIZE - m_outOffset);        else            out_bytes = lame_encode_buffer(                                            pgf,                                            pdata + (bytes_processed / sizeof(short)),                                            pdata + (bytes_processed / sizeof(short)),                                            nsamples,                                            m_outFrameBuf + m_outOffset,                                            OUT_BUFFER_SIZE - m_outOffset);        if (out_bytes < 0)            return -1;        m_outOffset     += out_bytes;        bytes_processed += nsamples * pgf->num_channels * sizeof(short);    }    return bytes_processed;}//// Finsh - flush the buffered samples//HRESULT CEncoder::Finish(){    CAutoLock l(&m_lock);    if (!pgf || !m_outFrameBuf || (m_outOffset >= OUT_BUFFER_MAX))        return E_FAIL;    m_outOffset += lame_encode_flush(pgf, m_outFrameBuf + m_outOffset, OUT_BUFFER_SIZE - m_outOffset);    m_bFinished = TRUE;    return S_OK;}int getFrameLength(const unsigned char * pdata){    if (!pdata || pdata[0] != 0xff || (pdata[1] & 0xe0) != 0xe0)        return -1;    const int sample_rate_tab[4][4] =    {        {11025,12000,8000,1},        {1,1,1,1},        {22050,24000,16000,1},        {44100,48000,32000,1}    };#define MPEG_VERSION_RESERVED   1#define MPEG_VERSION_1          3#define LAYER_III               1#define BITRATE_FREE            0#define BITRATE_RESERVED        15#define SRATE_RESERVED          3#define EMPHASIS_RESERVED       2    int version_id      = (pdata[1] & 0x18) >> 3;    int layer           = (pdata[1] & 0x06) >> 1;    int bitrate_id      = (pdata[2] & 0xF0) >> 4;    int sample_rate_id  = (pdata[2] & 0x0C) >> 2;    int padding         = (pdata[2] & 0x02) >> 1;    int emphasis        =  pdata[3] & 0x03;    if (version_id      != MPEG_VERSION_RESERVED &&        layer           == LAYER_III &&        bitrate_id      != BITRATE_FREE &&        bitrate_id      != BITRATE_RESERVED &&        sample_rate_id  != SRATE_RESERVED &&        emphasis        != EMPHASIS_RESERVED)    {        int spf         = (version_id == MPEG_VERSION_1) ? 1152 : 576;        int sample_rate = sample_rate_tab[version_id][sample_rate_id];        int bitrate     = dwBitRateValue[version_id != MPEG_VERSION_1][bitrate_id - 1] * 1000;        return (bitrate * spf) / (8 * sample_rate) + padding;    }    return -1;}int CEncoder::GetFrame(const unsigned char ** pframe){    if (!pgf || !m_outFrameBuf || !pframe)        return -1;    while ((m_outOffset - m_outReadOffset) > 4)    {        int frame_length = getFrameLength(m_outFrameBuf + m_outReadOffset);        if (frame_length < 0)        {            m_outReadOffset++;        }        else if (frame_length <= (m_outOffset - m_outReadOffset))        {            *pframe = m_outFrameBuf + m_outReadOffset;            m_outReadOffset += frame_length;            m_frameCount++;            // don't deliver the first and the last frames            if (m_frameCount != 1 && !(m_bFinished && (m_outOffset - m_outReadOffset) < 5))                return frame_length;        }        else            break;    }    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产大片| 精品裸体舞一区二区三区| 色八戒一区二区三区| 欧美午夜理伦三级在线观看| 日韩欧美国产精品| 亚洲国产成人在线| 亚洲一区二区在线观看视频 | 2021久久国产精品不只是精品| 欧美v亚洲v综合ⅴ国产v| 亚洲色图欧美偷拍| 麻豆传媒一区二区三区| 91亚洲精品一区二区乱码| 欧美一区二区视频在线观看2020| 久久久国产精品麻豆 | 91天堂素人约啪| 欧美影院一区二区| 欧美激情一区不卡| 蜜臀av性久久久久蜜臀aⅴ| 国产乱理伦片在线观看夜一区| 欧洲精品在线观看| 久久久高清一区二区三区| 亚洲第一会所有码转帖| 成人app下载| 精品粉嫩超白一线天av| 亚洲国产精品欧美一二99| av一区二区久久| 欧美日韩视频不卡| 日本一区二区三区高清不卡| 日本亚洲三级在线| 欧美日韩日日夜夜| 亚洲精品水蜜桃| 国产91精品在线观看| 日韩精品自拍偷拍| 日韩精品一级中文字幕精品视频免费观看| 不卡视频一二三| 国产喷白浆一区二区三区| 久久精品国产秦先生| 欧美男女性生活在线直播观看| 18成人在线视频| 成人免费三级在线| 国产欧美一区二区精品秋霞影院| 亚洲狠狠爱一区二区三区| 欧洲在线/亚洲| 亚洲激情图片qvod| 96av麻豆蜜桃一区二区| 亚洲欧美综合网| 不卡的电视剧免费网站有什么| 久久综合色之久久综合| 奇米色777欧美一区二区| 欧美日韩国产高清一区| 亚洲午夜日本在线观看| 色综合久久久久久久久久久| 亚洲男人的天堂在线观看| 国产高清在线观看免费不卡| 久久先锋资源网| 国产精品亚洲人在线观看| 中文字幕av资源一区| 成人v精品蜜桃久久一区| 国产精品日韩成人| 不卡的av电影| 久久成人精品无人区| 日韩免费看的电影| 国产在线播放一区| 欧美激情一区不卡| 91麻豆免费看片| 偷拍一区二区三区四区| 日韩一级免费观看| 国产成人av福利| 综合分类小说区另类春色亚洲小说欧美| 国产精品资源站在线| 国产欧美久久久精品影院| 成人免费视频一区二区| 一区二区三区在线视频播放| 欧美日本视频在线| 久久99国内精品| 中文字幕高清一区| 欧美日韩国产高清一区二区| 久久aⅴ国产欧美74aaa| 国产精品色噜噜| 欧美日韩综合在线| 国产在线播放一区三区四| 中文字幕亚洲一区二区av在线| 91国偷自产一区二区开放时间| 天涯成人国产亚洲精品一区av| 欧美xxxx老人做受| 91欧美激情一区二区三区成人| 午夜亚洲福利老司机| 在线观看亚洲专区| 秋霞午夜鲁丝一区二区老狼| 国产日韩欧美综合在线| 91麻豆国产福利在线观看| 日本vs亚洲vs韩国一区三区二区| 欧美国产丝袜视频| 在线91免费看| 91玉足脚交白嫩脚丫在线播放| 亚洲午夜国产一区99re久久| 久久久影院官网| 欧美日本一区二区三区四区| 天天色综合成人网| 久久久99久久精品欧美| 欧美性猛交xxxxxx富婆| 大白屁股一区二区视频| 日韩极品在线观看| 亚洲人成7777| 欧美videossexotv100| 欧美日韩一区国产| 精品影视av免费| 日韩高清中文字幕一区| 亚洲国产成人午夜在线一区| 久久aⅴ国产欧美74aaa| 丝袜a∨在线一区二区三区不卡| 中文字幕在线不卡一区| 91超碰这里只有精品国产| 91论坛在线播放| gogogo免费视频观看亚洲一| 麻豆成人久久精品二区三区小说| 国产精品黄色在线观看 | 五月激情综合色| 最近日韩中文字幕| 久久网这里都是精品| 日韩一区和二区| 欧美日韩国产美| 91久久精品一区二区三| 91麻豆123| 99精品国产一区二区三区不卡| 国产激情偷乱视频一区二区三区| 午夜精品久久久久| 亚洲成人动漫一区| 亚洲精品久久久蜜桃| 亚洲欧美一区二区三区孕妇| 日韩午夜电影在线观看| 欧美在线观看视频一区二区三区| 久久久影院官网| 日韩欧美高清一区| 日韩美一区二区三区| 日韩一区二区中文字幕| 精品国产sm最大网站| 久久伊99综合婷婷久久伊| 久久精品人人做人人爽人人| 欧美一二三区精品| 日本久久一区二区三区| 欧美午夜电影一区| 6080午夜不卡| 精品久久久久久综合日本欧美 | 色综合天天综合网天天狠天天 | 91行情网站电视在线观看高清版| 黄色日韩三级电影| 免费在线一区观看| 久久成人av少妇免费| 久久99热99| 最新国产精品久久精品| 欧美国产一区视频在线观看| 亚洲人精品一区| 亚洲福利视频导航| 国产一区二区在线观看免费| 狠狠色丁香久久婷婷综合丁香| www.在线欧美| 欧美日韩免费一区二区三区视频| 91精品国产黑色紧身裤美女| 欧美精品一区二区三区一线天视频| 久久精品这里都是精品| 亚洲欧美韩国综合色| 国产九九视频一区二区三区| a4yy欧美一区二区三区| 欧美性极品少妇| 欧美精品123区| 宅男噜噜噜66一区二区66| 欧美精品一区二区在线播放| 日韩伦理免费电影| 视频在线在亚洲| 国产99一区视频免费| 欧美自拍丝袜亚洲| 欧美精品一区二区高清在线观看 | 日韩免费观看高清完整版在线观看| 国产欧美日韩不卡免费| 亚洲国产cao| 狠狠色丁香九九婷婷综合五月| 在线免费观看日本一区| 精品国产三级a在线观看| 亚洲色图都市小说| 精品在线一区二区三区| 亚洲精品日日夜夜| 久久av中文字幕片| 99久久精品免费看国产免费软件| 亚洲精品在线免费播放| 亚洲国产精品久久人人爱蜜臀| 国产九九视频一区二区三区| 在线不卡一区二区| 亚洲男人天堂av| 国产伦精品一区二区三区免费| 欧美性猛交xxxx乱大交退制版| 久久久精品综合| 免费欧美在线视频| 欧美日韩精品久久久| 欧美国产欧美亚州国产日韩mv天天看完整 | 在线观看一区不卡| 日本一区二区电影| 国产激情一区二区三区四区| 欧美一区二区久久| 亚洲国产日韩a在线播放 |