📄 mpegac.cpp
字号:
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 + -