Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksoid <aleksoid@users.sourceforge.net>2011-08-30 07:58:36 +0400
committerAleksoid <aleksoid@users.sourceforge.net>2011-08-30 07:58:36 +0400
commit218f8f84fd8be59b0df6d521fd6ad50bcda371d8 (patch)
tree60d68435eb9083ebfac7219c7c5387eb4e9cc117 /src/filters/parser/FLVSplitter/FLVSplitter.cpp
parentb217c7d144edb182751067fa2d18f53c5154e623 (diff)
Fix : FLV - support to decode ADPCM track with LAV Audio Decoder, ticket #404, #1699.
Fix : some C4081 warning. git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@3709 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/filters/parser/FLVSplitter/FLVSplitter.cpp')
-rw-r--r--src/filters/parser/FLVSplitter/FLVSplitter.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/filters/parser/FLVSplitter/FLVSplitter.cpp b/src/filters/parser/FLVSplitter/FLVSplitter.cpp
index 43b7b8e01..22c27425d 100644
--- a/src/filters/parser/FLVSplitter/FLVSplitter.cpp
+++ b/src/filters/parser/FLVSplitter/FLVSplitter.cpp
@@ -234,6 +234,7 @@ HRESULT CFLVSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
CStringW name;
CMediaType mt;
+ CMediaType ff_mtype;
mt.SetSampleSize(1);
mt.subtype = GUID_NULL;
@@ -258,15 +259,29 @@ HRESULT CFLVSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
memset(wfe, 0, sizeof(WAVEFORMATEX));
wfe->nSamplesPerSec = 44100*(1<<at.SoundRate)/8;
wfe->wBitsPerSample = 8*(at.SoundSize+1);
- wfe->nChannels = 1*(at.SoundType+1);
+ wfe->nChannels = at.SoundType+1;
switch(at.SoundFormat) {
case 0: // FLV_CODECID_PCM_BE
mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_PCM);
break;
- case 1: // FLV_CODECID_ADPCM
+ case 1: { // FLV_CODECID_ADPCM
mt.subtype = FOURCCMap(MAKEFOURCC('A','S','W','F'));
+
+ // Create special media type - to playback ADPCM with LAVAudio
+ ff_mtype.InitMediaType();
+ ff_mtype.SetSampleSize(256000);
+ ff_mtype.majortype = MEDIATYPE_Audio;
+ ff_mtype.subtype = MEDIASUBTYPE_FFMPEG_AUDIO;
+ ff_mtype.formattype = FORMAT_WaveFormatExFFMPEG;
+
+ WAVEFORMATEXFFMPEG* wfex_ff = (WAVEFORMATEXFFMPEG*)ff_mtype.AllocFormatBuffer(sizeof(WAVEFORMATEXFFMPEG));
+ memset(wfex_ff, 0, sizeof(WAVEFORMATEXFFMPEG));
+ memcpy(&wfex_ff->wfex, wfe, sizeof(WAVEFORMATEX));
+ wfex_ff->nCodecId = FF_CODEC_ID_ADPCM_SWF;
+
break;
+ }
case 2: // FLV_CODECID_MP3
mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MP3);
@@ -609,6 +624,9 @@ HRESULT CFLVSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
if(mt.subtype != GUID_NULL) {
CAtlArray<CMediaType> mts;
+ if(mt.subtype == FOURCCMap(MAKEFOURCC('A','S','W','F'))) {
+ mts.InsertAt(0, ff_mtype);
+ }
mts.Add(mt);
CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, name, this, this, &hr));
EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(t.TagType, pPinOut)));