Files
core/ASCMediaFormatSettings3/ASCMPEG3AudioFormat.h

425 lines
16 KiB
C++
Raw Blame History

// ASCMPEG3AudioFormat.h : Declaration of the CASCMPEG3AudioFormat
#pragma once
#include "resource.h" // main symbols
// IAVSMPEG3AudioFormat
[
object,
uuid("0BF215D8-5DD3-4EBF-B185-DC90F4FFF824"),
dual, helpstring("IAVSMPEG3AudioFormat Interface"),
pointer_default(unique)
]
__interface IAVSMPEG3AudioFormat : IAVSAudioFormat
{
[propget, id(113000 + 5)] HRESULT Preset([out, retval] long *pVal);
[propput, id(113000 + 5)] HRESULT Preset([in] long newVal);
[propget, id(113000 + 6)] HRESULT AltPreset([out, retval] long *pVal);
[propput, id(113000 + 6)] HRESULT AltPreset([in] long newVal);
[propget, id(113000 + 10)] HRESULT VBRBitrate([out, retval] long *pVal);
[propput, id(113000 + 10)] HRESULT VBRBitrate([in] long newVal);
[propget, id(113000 + 11)] HRESULT VBRQuality([out, retval] long *pVal);
[propput, id(113000 + 11)] HRESULT VBRQuality([in] long newVal);
[propget, id(113000 + 12)] HRESULT VBRCodingMethod([out, retval] long *pVal);
[propput, id(113000 + 12)] HRESULT VBRCodingMethod([in] long newVal);
[propget, id(113000 + 13)] HRESULT ABRBitrate([out, retval] long *pVal);
[propput, id(113000 + 13)] HRESULT ABRBitrate([in] long newVal);
[propget, id(113000 + 14)] HRESULT TypeStereo([out, retval] long *pVal);
[propput, id(113000 + 14)] HRESULT TypeStereo([in] long newVal);
[propget, id(113000 + 15)] HRESULT Quality([out, retval] long *pVal);
[propput, id(113000 + 15)] HRESULT Quality([in] long newVal);
[propget, id(113000 + 16)] HRESULT WritingVBRHeader([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 16)] HRESULT WritingVBRHeader([in] VARIANT_BOOL newVal);
[propget, id(113000 + 17)] HRESULT BitReservoir([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 17)] HRESULT BitReservoir([in] VARIANT_BOOL newVal);
[propget, id(113000 + 18)] HRESULT BlockTypeControl([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 18)] HRESULT BlockTypeControl([in] VARIANT_BOOL newVal);
[propget, id(113000 + 19)] HRESULT ShortBlocks([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 19)] HRESULT ShortBlocks([in] VARIANT_BOOL newVal);
[propget, id(113000 + 20)] HRESULT Emphasis([out, retval] long *pVal);
[propput, id(113000 + 20)] HRESULT Emphasis([in] long newVal);
[propget, id(113000 + 21)] HRESULT StrictISOCompliance([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 21)] HRESULT StrictISOCompliance([in] VARIANT_BOOL newVal);
[propget, id(113000 + 22)] HRESULT StrictlyEnforceMinBitrate([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 22)] HRESULT StrictlyEnforceMinBitrate([in] VARIANT_BOOL newVal);
[propget, id(113000 + 23)] HRESULT ATHControlMode([out, retval] long *pVal);
[propput, id(113000 + 23)] HRESULT ATHControlMode([in] long newVal);
[propget, id(113000 + 24)] HRESULT LowPassFrequency([out, retval] long *pVal);
[propput, id(113000 + 24)] HRESULT LowPassFrequency([in] long newVal);
[propget, id(113000 + 25)] HRESULT HighPassFrequency([out, retval] long *pVal);
[propput, id(113000 + 25)] HRESULT HighPassFrequency([in] long newVal);
[propget, id(113000 + 26)] HRESULT LowPassWidth([out, retval] long *pVal);
[propput, id(113000 + 26)] HRESULT LowPassWidth([in] long newVal);
[propget, id(113000 + 27)] HRESULT HighPassWidth([out, retval] long *pVal);
[propput, id(113000 + 27)] HRESULT HighPassWidth([in] long newVal);
[propget, id(113000 + 29)] HRESULT ErrorProtection([out, retval] VARIANT_BOOL *pVal);
[propput, id(113000 + 29)] HRESULT ErrorProtection([in] VARIANT_BOOL newVal);
};
// CAVSMPEG3AudioFormat
template <class CoT, class T>
class CAVSMPEG3AudioFormatImpl : public CAVSAudioFormatImpl<CoT, T>
{
public:
CAVSMPEG3AudioFormatImpl()
{
m_lMediaType = MEDIAFORMAT_MPEG3AUDIO;
SetDefaultProperties();
}
~CAVSMPEG3AudioFormatImpl()
{
}
STDMETHOD(CreateDuplicate)(IAVSMediaFormat** pMediaFormat)
{
CAVSAudioFormatImpl<CoT, T>::CreateDuplicate(pMediaFormat);
if (NULL==(*pMediaFormat))
return S_OK;
IAVSMPEG3AudioFormat* pAVSMPEG3Format=NULL;
(*pMediaFormat)->QueryInterface(__uuidof(IAVSMPEG3AudioFormat), (void**)&pAVSMPEG3Format);
if (NULL==pAVSMPEG3Format)
{
(*pMediaFormat)->Release();
*pMediaFormat = NULL;
return S_OK;
}
pAVSMPEG3Format->put_VBRBitrate(VBRBitrate);
pAVSMPEG3Format->put_Quality(Quality);
pAVSMPEG3Format->put_VBRQuality(VBRQuality);
pAVSMPEG3Format->put_VBRCodingMethod(VBRCodingMethod);
pAVSMPEG3Format->put_ABRBitrate(ABRBitrate);
pAVSMPEG3Format->put_ErrorProtection(ErrorProtection);
pAVSMPEG3Format->put_WritingVBRHeader(WritingVBRHeader);
pAVSMPEG3Format->put_BitReservoir(BitReservoir);
pAVSMPEG3Format->put_BlockTypeControl(BlockTypeControl);
pAVSMPEG3Format->put_ShortBlocks(ShortBlocks);
pAVSMPEG3Format->put_StrictISOCompliance(StrictISOCompliance);
pAVSMPEG3Format->put_StrictlyEnforceMinBitrate(StrictlyEnforceMinBitrate);
pAVSMPEG3Format->put_LowPassFrequency(LowPassFreq);
pAVSMPEG3Format->put_HighPassFrequency(HighPassFreq);
pAVSMPEG3Format->put_LowPassWidth(LowPassWidth);
pAVSMPEG3Format->put_HighPassWidth(HighPassWidth);
pAVSMPEG3Format->put_ATHControlMode(ATHControlMode);
pAVSMPEG3Format->put_Emphasis(Emphasis);
pAVSMPEG3Format->put_TypeStereo(TypeStereo);
pAVSMPEG3Format->Release();
return S_OK;
}
STDMETHOD(SetDefaultProperties)(void)
{
CAVSAudioFormatImpl<CoT, T>::SetDefaultProperties();
m_lFormatTag = WAVE_FORMAT_MPEGLAYER3;
m_lBitrate=128*1000;
m_lBitrate=128*1000;
VBRBitrate=192*1000;
Quality=5;
TypeStereo=1;
VBRQuality=7;
VBRCodingMethod=-1;
ABRBitrate=128*1000;
ErrorProtection=0;
WritingVBRHeader=VARIANT_TRUE;
BitReservoir=VARIANT_TRUE;
BlockTypeControl=0;
ShortBlocks=VARIANT_TRUE;
StrictISOCompliance=0;
StrictlyEnforceMinBitrate=0;
LowPassFreq=-1; //-1 - no ; 0 - LameChoose ;...
HighPassFreq=-1; //-1 - no ; 0 - LameChoose ;...
LowPassWidth=0; //0 - LameChoose (15%);...
HighPassWidth=0; //0 - LameChoose (15%);...
ATHControlMode=0; //0-default ; 1- only , 2 - disable ; 3- only for long blocks
Emphasis=0;
Preset=0;
TypeStereo=1;
return S_OK;
}
STDMETHOD(SetPropertiesByFormat)(IAVSMediaFormat* pMediaFormat)
{
CAVSAudioFormatImpl<CoT, T>::SetPropertiesByFormat(pMediaFormat);
if (pMediaFormat!=NULL)
{
IAVSMPEG3AudioFormat* pAVSMPEG3Format=NULL;
pMediaFormat->QueryInterface(__uuidof(IAVSMPEG3AudioFormat), (void**)&pAVSMPEG3Format);
if (pAVSMPEG3Format!=NULL)
{
pAVSMPEG3Format->get_VBRBitrate(&VBRBitrate);
pAVSMPEG3Format->get_Quality(&Quality);
pAVSMPEG3Format->get_VBRQuality(&VBRQuality);
pAVSMPEG3Format->get_VBRCodingMethod(&VBRCodingMethod);
pAVSMPEG3Format->get_ABRBitrate(&ABRBitrate);
pAVSMPEG3Format->get_ErrorProtection(&ErrorProtection);
pAVSMPEG3Format->get_WritingVBRHeader(&WritingVBRHeader);
pAVSMPEG3Format->get_BitReservoir(&BitReservoir);
pAVSMPEG3Format->get_BlockTypeControl(&BlockTypeControl);
pAVSMPEG3Format->get_ShortBlocks(&ShortBlocks);
pAVSMPEG3Format->get_StrictISOCompliance(&StrictISOCompliance);
pAVSMPEG3Format->get_StrictlyEnforceMinBitrate(&StrictlyEnforceMinBitrate);
pAVSMPEG3Format->get_LowPassFrequency(&LowPassFreq);
pAVSMPEG3Format->get_HighPassFrequency(&HighPassFreq);
pAVSMPEG3Format->get_LowPassWidth(&LowPassWidth);
pAVSMPEG3Format->get_HighPassWidth(&HighPassWidth);
pAVSMPEG3Format->get_ATHControlMode(&ATHControlMode);
pAVSMPEG3Format->get_Emphasis(&Emphasis);
pAVSMPEG3Format->get_TypeStereo(&TypeStereo);
RELEASEINTERFACE(pAVSMPEG3Format);
}
}
return S_OK;
}
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> AVSMPEG3AudioFormat
return CAVSAudioFormatImpl<CoT, T>::SetAdditionalParam(ParamName, ParamValue);
}
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> AVSMPEG3AudioFormat
return CAVSAudioFormatImpl<CoT, T>::GetAdditionalParam(ParamName, ParamValue);
}
STDMETHOD(GetFormatHeader)(BYTE** Data, long* Size)
{
*Data = NULL;
*Size = 0;
if (!m_lChannelsMask)
SetChannelsMaskPreset(m_lChannels, (DWORD&)m_lChannelsMask);
else
CheckChannelsMask(m_lChannels, (DWORD&)m_lChannelsMask);
long SpecificationLen=0;
char* Specification=NULL;
MPEGLAYER3WAVEFORMAT format;
format.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES;
format.wfx.wBitsPerSample = 0;
format.wfx.nBlockAlign = 1;
format.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3;
format.wfx.nChannels = (WORD)m_lChannels;
if (2 < format.wfx.nChannels)
format.wfx.nChannels = 2;
format.wfx.nSamplesPerSec = m_lSampleRate;
format.wfx.nAvgBytesPerSec = m_lBitrate/8;
format.fdwFlags = 34;//MPEGLAYER3_FLAG_PADDING_OFF;
format.nBlockSize = (short)(144*m_lBitrate/m_lSampleRate);
if (32000 > m_lSampleRate)
format.nBlockSize /= 2;
format.nCodecDelay = 0;//0x0571;
format.nFramesPerBlock = 1;
format.wID = MPEGLAYER3_ID_MPEG;
*Size=sizeof(WAVEFORMATEX) + MPEGLAYER3_WFX_EXTRA_BYTES;
*Data = (BYTE*)HeapAlloc(GetProcessHeap(), 0, *Size);
if (*Data)
{
memcpy(*Data, (BYTE*)&format, *Size);
}
return S_OK;
}
LINK_PROPERTY_LONG(VBRBitrate,VBRBitrate);
LINK_PROPERTY_LONG(Quality,Quality);
LINK_PROPERTY_LONG(VBRQuality,VBRQuality);
LINK_PROPERTY_LONG(VBRCodingMethod,VBRCodingMethod);
LINK_PROPERTY_LONG(ABRBitrate,ABRBitrate);
LINK_PROPERTY_BOOL(ErrorProtection,ErrorProtection);
LINK_PROPERTY_BOOL(WritingVBRHeader,WritingVBRHeader);
LINK_PROPERTY_BOOL(BitReservoir,BitReservoir);
LINK_PROPERTY_BOOL(BlockTypeControl,BlockTypeControl);
LINK_PROPERTY_BOOL(ShortBlocks,ShortBlocks);
LINK_PROPERTY_BOOL(StrictISOCompliance,StrictISOCompliance);
LINK_PROPERTY_BOOL(StrictlyEnforceMinBitrate,StrictlyEnforceMinBitrate);
LINK_PROPERTY_LONG(LowPassFrequency,LowPassFreq);
LINK_PROPERTY_LONG(HighPassFrequency,HighPassFreq);
LINK_PROPERTY_LONG(LowPassWidth,LowPassWidth);
LINK_PROPERTY_LONG(HighPassWidth,HighPassWidth);
LINK_PROPERTY_LONG(ATHControlMode,ATHControlMode);
LINK_PROPERTY_LONG(Emphasis,Emphasis);
LINK_PROPERTY_LONG(TypeStereo,TypeStereo);
STDMETHOD (get_Preset)(long *pVal)
{
if (Preset>99)*pVal=0;
else *pVal=Preset;
return S_OK;
}
STDMETHOD (put_Preset)(long newVal)
{
if (newVal>0)
SetParamFromPreset(newVal);
return S_OK;
}
STDMETHOD (get_AltPreset)(long *pVal)
{
if (Preset<100)*pVal=0;
else *pVal=Preset-100;
return S_OK;
}
STDMETHOD (put_AltPreset)(long newVal)
{
if (newVal>0)
SetParamFromPreset(newVal+100);
return S_OK;
}
protected:
long VBRBitrate;
long Quality;
long VBRQuality;
long VBRCodingMethod;
long ABRBitrate;
VARIANT_BOOL ErrorProtection;
VARIANT_BOOL WritingVBRHeader;
VARIANT_BOOL BitReservoir;
VARIANT_BOOL BlockTypeControl;
VARIANT_BOOL ShortBlocks;
VARIANT_BOOL StrictISOCompliance;
VARIANT_BOOL StrictlyEnforceMinBitrate;
long LowPassFreq;
long HighPassFreq;
long LowPassWidth;
long HighPassWidth;
long ATHControlMode;
long Emphasis;
long Preset;
long TypeStereo;
void SetParamFromPreset(long Preset)
{
switch(Preset){
case 1: //Phone
m_lSampleRate=8000; m_lChannels=1; m_lBitrate=8000;Quality=5;TypeStereo=1;
VBRCodingMethod=0; VBRBitrate=56000;VBRQuality=6;
LowPassFreq=3200; LowPassWidth=1000;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 2: //Sw
m_lSampleRate=11025; m_lChannels=1; m_lBitrate=8000;Quality=5;TypeStereo=1;
VBRCodingMethod=0; VBRBitrate=64000;VBRQuality=5;
LowPassFreq=4800; LowPassWidth=500;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 3: //Am
m_lSampleRate=16000; m_lChannels=1; m_lBitrate=24000;Quality=5;TypeStereo=1;
VBRCodingMethod=0; VBRBitrate=160000;VBRQuality=5;
LowPassFreq=7200; LowPassWidth=500;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 4: //Fm
m_lSampleRate=22050; m_lChannels=2; m_lBitrate=16000;Quality=5;TypeStereo=2;
VBRCodingMethod=0; VBRBitrate=128000;VBRQuality=5;
LowPassFreq=9950; LowPassWidth=880;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 5: //Voice
m_lSampleRate=32000; m_lChannels=1; m_lBitrate=32000;Quality=5;TypeStereo=2;
VBRCodingMethod=0; VBRBitrate=128000;VBRQuality=5;
LowPassFreq=12300; LowPassWidth=2000;
HighPassFreq=-1;HighPassWidth=0;ShortBlocks=0;Preset=0;
break;
case 6: //Radio
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=64000;Quality=5;TypeStereo=2;
VBRCodingMethod=0; VBRBitrate=256000;VBRQuality=4;
LowPassFreq=15000; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 7: //Tape
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=96000;Quality=5;TypeStereo=2;
VBRCodingMethod=0; VBRBitrate=320000;VBRQuality=4;
LowPassFreq=18500; LowPassWidth=2000;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 8: //HiFi
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=112000;Quality=2;TypeStereo=2;
VBRCodingMethod=0; VBRBitrate=320000;VBRQuality=3;
LowPassFreq=20240; LowPassWidth=2200;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 9: //CD
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=128000;Quality=2;TypeStereo=1;
VBRCodingMethod=0; VBRBitrate=320000;VBRQuality=2;
LowPassFreq=-1; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 10: //Studio
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=160000;Quality=2;TypeStereo=1;
VBRCodingMethod=0; VBRBitrate=320000;VBRQuality=0;
LowPassFreq=-1; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=0;
break;
case 11: //R3Mix
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=96000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_MTRH; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=19500; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=1;
break;
case 101: //FastStandart
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=128000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_NEW; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=19000; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=2;
break;
case 102: //Standart
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=128000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_OLD; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=19000; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=2;
break;
case 103: //FastExtreme
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=128000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_NEW; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=19500; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=3;
break;
case 104: //Extereme
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=128000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_OLD; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=19500; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=3;
break;
case 105: //Insane
m_lSampleRate=44100; m_lChannels=2; m_lBitrate=320000;Quality=2;TypeStereo=2;
VBRCodingMethod=VBR_OLD; VBRBitrate=320000;VBRQuality=1;
LowPassFreq=20500; LowPassWidth=0;
HighPassFreq=-1;HighPassWidth=0;Preset=4;
break;
case 0:
case 100:
default:
m_lBitrate=128000; VBRBitrate=128000; m_lChannels=2; Quality=5;
TypeStereo=1; VBRQuality=7;m_lSampleRate=44100;
VBRCodingMethod=-1; ABRBitrate=128000; ErrorProtection=0;WritingVBRHeader=0; BitReservoir=1;
BlockTypeControl=0; ShortBlocks=1; StrictISOCompliance=0;
StrictlyEnforceMinBitrate=0; LowPassFreq=-1; HighPassFreq=-1;
LowPassWidth=0; HighPassWidth=0; ATHControlMode=0; Emphasis=0;
Preset=0;
Preset=0;
break;
}
}
private:
};
[ coclass, uuid("E12FBC48-E7B8-4C0F-ABCC-16198088A1AF"), threading(apartment), vi_progid("AVSMediaFormatSettings3.AVSMPEG3AudioFo"), progid("AVSMediaFormatSettings3.AVSMPEG3Audio.1"), version(1.0)]
class ATL_NO_VTABLE CAVSMPEG3AudioFormat : public CAVSMPEG3AudioFormatImpl<CAVSMPEG3AudioFormat, IAVSMPEG3AudioFormat>
{
};