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

📄 mpegac.cpp

📁 音频编码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if(FAILED(hr))        return hr;    if (Actual.cbBuffer < pProperties->cbBuffer ||        Actual.cBuffers < pProperties->cBuffers)     {// can't use this allocator        return E_INVALIDARG;    }    return S_OK;}////////////////////////////////////////////////////////////////////////////// GetMediaType - overrideble for suggesting outpu pin media types////////////////////////////////////////////////////////////////////////////HRESULT CMpegAudEnc::GetMediaType(int iPosition, CMediaType *pMediaType){    DbgLog((LOG_TRACE,1,TEXT("CMpegAudEnc::GetMediaType()")));    if (iPosition < 0)        return E_INVALIDARG;    switch (iPosition)    {    case 0:        {// We can support two output streams - PES or AES	            if(m_Encoder.IsPES())            {                pMediaType->SetType(&MEDIATYPE_MPEG2_PES);                pMediaType->SetSubtype(&MEDIASUBTYPE_MPEG2_AUDIO);            }            else            {                pMediaType->SetType(&MEDIATYPE_Audio);                pMediaType->SetSubtype(&MEDIASUBTYPE_MP3);            }            break;        }    default:        return VFW_S_NO_MORE_ITEMS;    }    if (m_pInput->IsConnected() == FALSE)    {        pMediaType->SetFormatType(&FORMAT_None);        return NOERROR;    }    SetOutMediaType();    pMediaType->SetSampleSize(OUT_BUFFER_SIZE);    pMediaType->SetTemporalCompression(FALSE);    pMediaType->AllocFormatBuffer(sizeof(MPEGLAYER3WAVEFORMAT));    pMediaType->SetFormat((LPBYTE)&m_mwf, sizeof(MPEGLAYER3WAVEFORMAT));    pMediaType->SetFormatType(&FORMAT_WaveFormatEx);    return S_OK;}//////////////////////////////////////////////////////////////////////////////	SetOutMediaType - sets filter output media type according to //  current encoder out MPEG audio properties ////////////////////////////////////////////////////////////////////////////void CMpegAudEnc::SetOutMediaType(){	MPEG_ENCODER_CONFIG mec;	if(FAILED(m_Encoder.GetOutputType(&mec)))		return ;	WAVEFORMATEX wf;	if(FAILED(m_Encoder.GetInputType(&wf)))		return ;//	BOOL bDirty = FALSE;	if ((wf.nSamplesPerSec % mec.dwSampleRate) != 0)	{		mec.dwSampleRate = wf.nSamplesPerSec;		m_Encoder.SetOutputType(mec);//		bDirty = TRUE;	}	if (wf.nChannels == 1 && mec.ChMode != MONO)	{		mec.ChMode = MONO;		m_Encoder.SetOutputType(mec);//		bDirty = TRUE;	}	if (wf.nChannels == 2 && !mec.bForceMono && mec.ChMode == MONO)	{		mec.ChMode = STEREO;		m_Encoder.SetOutputType(mec);//		bDirty = TRUE;	}	if (wf.nChannels == 2 && mec.bForceMono)	{		mec.ChMode = MONO;		m_Encoder.SetOutputType(mec);//		bDirty = TRUE;	}/*    if (bDirty)	{		// we are tied to the registry, especially our configuration		// so when we change the incorrect sample rate, we need		// to change the value in registry too. Same to channel mode		SaveAudioEncoderPropertiesToRegistry();		DbgLog((LOG_TRACE, 1, TEXT("Changed sampling rate internally")));	}*/	// Fill MPEG1WAVEFORMAT DirectShow SDK structure	m_mwf.wfx.wFormatTag		= WAVE_FORMAT_MPEGLAYER3;	m_mwf.wfx.cbSize			= sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX);	if(mec.ChMode == MONO)		m_mwf.wfx.nChannels = 1;	else		m_mwf.wfx.nChannels = 2;	m_mwf.wfx.nSamplesPerSec	= mec.dwSampleRate;	m_mwf.wfx.nBlockAlign		= 1;	m_mwf.wfx.wBitsPerSample	= 0;	m_mwf.wfx.nAvgBytesPerSec	= mec.dwBitrate * 1000 / 8;	m_mwf.wID = MPEGLAYER3_ID_MPEG;	m_mwf.fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO;	m_mwf.nBlockSize = 1;	m_mwf.nFramesPerBlock = 1;	m_mwf.nCodecDelay = 0;}HRESULT CMpegAudEnc::Reconnect(){    HRESULT hr = S_FALSE;    if (m_pOutput && m_pOutput->IsConnected() && m_State == State_Stopped)    {        MPEG_ENCODER_CONFIG mec;        hr = m_Encoder.GetOutputType(&mec);        if ((hr = m_Encoder.SetOutputType(mec)) == S_OK)        {            CMediaType cmt;            cmt.InitMediaType();            GetMediaType(0, &cmt);            if (S_OK == (hr = m_pOutput->GetConnected()->QueryAccept(&cmt)))                hr = m_pGraph->Reconnect(m_pOutput);            else                hr = m_pOutput->SetMediaType(&cmt);        }    }    return hr;}//// Read persistent configuration from Registry//void CMpegAudEnc::ReadPresetSettings(MPEG_ENCODER_CONFIG * pmec){    DbgLog((LOG_TRACE,1,TEXT("CMpegAudEnc::ReadPresetSettings()")));    CRegKey rk(HKEY_CURRENT_USER, KEY_LAME_ENCODER);    pmec->dwBitrate         = rk.getDWORD(VALUE_BITRATE,DEFAULT_BITRATE);    pmec->dwVariableMin     = rk.getDWORD(VALUE_VARIABLEMIN,DEFAULT_VARIABLEMIN);    pmec->dwVariableMax     = rk.getDWORD(VALUE_VARIABLEMAX,DEFAULT_VARIABLEMAX);    pmec->vmVariable        = rk.getDWORD(VALUE_VARIABLE, DEFAULT_VARIABLE) ? vbr_rh : vbr_off;    pmec->dwQuality         = rk.getDWORD(VALUE_QUALITY,DEFAULT_ENCODING_QUALITY);    pmec->dwVBRq            = rk.getDWORD(VALUE_VBR_QUALITY,DEFAULT_VBR_QUALITY);    pmec->lLayer            = rk.getDWORD(VALUE_LAYER, DEFAULT_LAYER);    pmec->bCRCProtect       = rk.getDWORD(VALUE_CRC, DEFAULT_CRC);    pmec->bForceMono        = rk.getDWORD(VALUE_FORCE_MONO, DEFAULT_FORCE_MONO);    pmec->bSetDuration      = rk.getDWORD(VALUE_SET_DURATION, DEFAULT_SET_DURATION);    pmec->bCopyright        = rk.getDWORD(VALUE_COPYRIGHT, DEFAULT_COPYRIGHT);    pmec->bOriginal         = rk.getDWORD(VALUE_ORIGINAL, DEFAULT_ORIGINAL);    pmec->dwSampleRate      = rk.getDWORD(VALUE_SAMPLE_RATE, DEFAULT_SAMPLE_RATE);    pmec->dwPES             = rk.getDWORD(VALUE_PES, DEFAULT_PES);    pmec->ChMode            = (MPEG_mode)rk.getDWORD(VALUE_STEREO_MODE, DEFAULT_STEREO_MODE);    pmec->dwForceMS         = rk.getDWORD(VALUE_FORCE_MS, DEFAULT_FORCE_MS);    pmec->dwEnforceVBRmin   = rk.getDWORD(VALUE_ENFORCE_MIN, DEFAULT_ENFORCE_MIN);    pmec->dwVoiceMode       = rk.getDWORD(VALUE_VOICE, DEFAULT_VOICE);    pmec->dwKeepAllFreq     = rk.getDWORD(VALUE_KEEP_ALL_FREQ, DEFAULT_KEEP_ALL_FREQ);    pmec->dwStrictISO       = rk.getDWORD(VALUE_STRICT_ISO, DEFAULT_STRICT_ISO);    pmec->dwNoShortBlock    = rk.getDWORD(VALUE_DISABLE_SHORT_BLOCK, DEFAULT_DISABLE_SHORT_BLOCK);    pmec->dwXingTag         = rk.getDWORD(VALUE_XING_TAG, DEFAULT_XING_TAG);    pmec->dwModeFixed       = rk.getDWORD(VALUE_MODE_FIXED, DEFAULT_MODE_FIXED);    rk.Close();}//////////////////////////////////////////////////////////////////  Property page handling ////////////////////////////////////////////////////////////////HRESULT CMpegAudEnc::GetPages(CAUUID *pcauuid) {    GUID *pguid;    pcauuid->cElems = 3;    pcauuid->pElems = pguid = (GUID *) CoTaskMemAlloc(sizeof(GUID) * pcauuid->cElems);    if (pcauuid->pElems == NULL)        return E_OUTOFMEMORY;    pguid[0] = CLSID_LAMEDShow_PropertyPage;    pguid[1] = CLSID_LAMEDShow_PropertyPageAdv;    pguid[2] = CLSID_LAMEDShow_About;    return S_OK;}STDMETHODIMP CMpegAudEnc::NonDelegatingQueryInterface(REFIID riid, void ** ppv) {    if (riid == IID_ISpecifyPropertyPages)        return GetInterface((ISpecifyPropertyPages *) this, ppv);	else if(riid == IID_IPersistStream)        return GetInterface((IPersistStream *)this, ppv);//    else if (riid == IID_IVAudioEncSettings)//        return GetInterface((IVAudioEncSettings*) this, ppv);    else if (riid == IID_IAudioEncoderProperties)        return GetInterface((IAudioEncoderProperties*) this, ppv);    return CTransformFilter::NonDelegatingQueryInterface(riid, ppv);}//////////////////////////////////////////////////////////////////IVAudioEncSettings interface methods//////////////////////////////////////////////////////////////////// IAudioEncoderProperties//STDMETHODIMP CMpegAudEnc::get_PESOutputEnabled(DWORD *dwEnabled){    *dwEnabled = (DWORD)m_Encoder.IsPES();    DbgLog((LOG_TRACE, 1, TEXT("get_PESOutputEnabled -> %d"), *dwEnabled));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_PESOutputEnabled(DWORD dwEnabled){    m_Encoder.SetPES((BOOL)!!dwEnabled);    DbgLog((LOG_TRACE, 1, TEXT("set_PESOutputEnabled(%d)"), !!dwEnabled));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_MPEGLayer(DWORD *dwLayer){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwLayer = (DWORD)mec.lLayer;    DbgLog((LOG_TRACE, 1, TEXT("get_MPEGLayer -> %d"), *dwLayer));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_MPEGLayer(DWORD dwLayer){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    if (dwLayer == 2)        mec.lLayer = 2;    else if (dwLayer == 1)        mec.lLayer = 1;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_MPEGLayer(%d)"), dwLayer));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_Bitrate(DWORD *dwBitrate){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwBitrate = (DWORD)mec.dwBitrate;    DbgLog((LOG_TRACE, 1, TEXT("get_Bitrate -> %d"), *dwBitrate));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_Bitrate(DWORD dwBitrate){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.dwBitrate = dwBitrate;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_Bitrate(%d)"), dwBitrate));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_Variable(DWORD *dwVariable){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwVariable = (DWORD)(mec.vmVariable == vbr_off ? 0 : 1);    DbgLog((LOG_TRACE, 1, TEXT("get_Variable -> %d"), *dwVariable));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_Variable(DWORD dwVariable){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.vmVariable = dwVariable ? vbr_rh : vbr_off;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_Variable(%d)"), dwVariable));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_VariableMin(DWORD *dwMin){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwMin = (DWORD)mec.dwVariableMin;    DbgLog((LOG_TRACE, 1, TEXT("get_Variablemin -> %d"), *dwMin));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_VariableMin(DWORD dwMin){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.dwVariableMin = dwMin;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_Variablemin(%d)"), dwMin));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_VariableMax(DWORD *dwMax){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwMax = (DWORD)mec.dwVariableMax;    DbgLog((LOG_TRACE, 1, TEXT("get_Variablemax -> %d"), *dwMax));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_VariableMax(DWORD dwMax){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.dwVariableMax = dwMax;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_Variablemax(%d)"), dwMax));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_Quality(DWORD *dwQuality)             {    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwQuality=(DWORD)mec.dwQuality;    DbgLog((LOG_TRACE, 1, TEXT("get_Quality -> %d"), *dwQuality));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_Quality(DWORD dwQuality)             {    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.dwQuality = dwQuality;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_Quality(%d)"), dwQuality));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_VariableQ(DWORD *dwVBRq)             {    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwVBRq=(DWORD)mec.dwVBRq;    DbgLog((LOG_TRACE, 1, TEXT("get_VariableQ -> %d"), *dwVBRq));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_VariableQ(DWORD dwVBRq)             {    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.dwVBRq = dwVBRq;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_VariableQ(%d)"), dwVBRq));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_SourceSampleRate(DWORD *dwSampleRate){    *dwSampleRate = 0;    WAVEFORMATEX wf;    if(FAILED(m_Encoder.GetInputType(&wf)))        return E_FAIL;    *dwSampleRate = wf.nSamplesPerSec;    DbgLog((LOG_TRACE, 1, TEXT("get_SourceSampleRate -> %d"), *dwSampleRate));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_SourceChannels(DWORD *dwChannels){    WAVEFORMATEX wf;    if(FAILED(m_Encoder.GetInputType(&wf)))        return E_FAIL;    *dwChannels = wf.nChannels;    DbgLog((LOG_TRACE, 1, TEXT("get_SourceChannels -> %d"), *dwChannels));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_SampleRate(DWORD *dwSampleRate){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwSampleRate = mec.dwSampleRate;    DbgLog((LOG_TRACE, 1, TEXT("get_SampleRate -> %d"), *dwSampleRate));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_SampleRate(DWORD dwSampleRate){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    DWORD dwOldSampleRate = mec.dwSampleRate;    mec.dwSampleRate = dwSampleRate;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_SampleRate(%d)"), dwSampleRate));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_ChannelMode(DWORD *dwChannelMode){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwChannelMode = mec.ChMode;    DbgLog((LOG_TRACE, 1, TEXT("get_ChannelMode -> %d"), *dwChannelMode));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_ChannelMode(DWORD dwChannelMode){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    mec.ChMode = (MPEG_mode)dwChannelMode;    m_Encoder.SetOutputType(mec);    DbgLog((LOG_TRACE, 1, TEXT("set_ChannelMode(%d)"), dwChannelMode));    return S_OK;}STDMETHODIMP CMpegAudEnc::get_ForceMS(DWORD *dwFlag){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);    *dwFlag = mec.dwForceMS;    DbgLog((LOG_TRACE, 1, TEXT("get_ForceMS -> %d"), *dwFlag));    return S_OK;}STDMETHODIMP CMpegAudEnc::set_ForceMS(DWORD dwFlag){    MPEG_ENCODER_CONFIG mec;    m_Encoder.GetOutputType(&mec);

⌨️ 快捷键说明

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