diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-21 23:42:06 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-21 23:42:06 +0000 |
commit | 937a031d525545f8cc39d2f968343450dd731c23 (patch) | |
tree | 4387ef37cd5d1f7c68901d1024c3f2c293c76282 /loader/dshow/DS_AudioDecoder.c | |
parent | bcdb01b14369a8554ab9f01e011ff0ce81d8a91f (diff) | |
download | mpv-937a031d525545f8cc39d2f968343450dd731c23.tar.bz2 mpv-937a031d525545f8cc39d2f968343450dd731c23.tar.xz |
imported from xine
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3060 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/dshow/DS_AudioDecoder.c')
-rw-r--r-- | loader/dshow/DS_AudioDecoder.c | 163 |
1 files changed, 91 insertions, 72 deletions
diff --git a/loader/dshow/DS_AudioDecoder.c b/loader/dshow/DS_AudioDecoder.c index 87e919c7c0..41944dd099 100644 --- a/loader/dshow/DS_AudioDecoder.c +++ b/loader/dshow/DS_AudioDecoder.c @@ -8,8 +8,7 @@ #include "DS_AudioDecoder.h" #include <string.h> #include <stdio.h> - -// using namespace std; +#include <stdlib.h> #define __MODULE__ "DirectShow audio decoder" const GUID FORMAT_WaveFormatEx = { @@ -27,58 +26,71 @@ const GUID MEDIASUBTYPE_PCM = { typedef long STDCALL (*GETCLASS) (GUID*, GUID*, void**); -DS_AudioDecoder::DS_AudioDecoder(const CodecInfo& info, const WAVEFORMATEX* wf) - : IAudioDecoder(info, wf), m_pDS_Filter(0), m_sVhdr(0), m_sVhdr2(0) +DS_AudioDecoder * DS_AudioDecoder_Create(const CodecInfo * info, const WAVEFORMATEX* wf) { - int sz = 18 + wf->cbSize; - m_sVhdr=new char[sz]; - memcpy(m_sVhdr, wf, sz); - m_sVhdr2=new char[sz]; - memcpy(m_sVhdr2, m_sVhdr, sz); - WAVEFORMATEX* pWF=(WAVEFORMATEX*)m_sVhdr2; - pWF->wFormatTag=1; - pWF->wBitsPerSample=16; - pWF->nBlockAlign=2*pWF->nChannels; - pWF->cbSize=0; - in_fmt=*wf; + DS_AudioDecoder *this; + int sz; + WAVEFORMATEX* pWF; + + this = malloc(sizeof(DS_AudioDecoder)); + + sz = 18 + wf->cbSize; + this->m_sVhdr = malloc(sz); + memcpy(this->m_sVhdr, wf, sz); + this->m_sVhdr2 = malloc(sz); + memcpy(this->m_sVhdr2, this->m_sVhdr, sz); + + pWF = (WAVEFORMATEX*)this->m_sVhdr2; + pWF->wFormatTag = 1; + pWF->wBitsPerSample = 16; + pWF->nBlockAlign = 2*pWF->nChannels; + pWF->cbSize = 0; + + memcpy(&this->in_fmt,wf,sizeof(WAVEFORMATEX)); - memset(&m_sOurType, 0, sizeof(m_sOurType)); - m_sOurType.majortype=MEDIATYPE_Audio; - m_sOurType.subtype=MEDIASUBTYPE_PCM; - m_sOurType.subtype.f1=wf->wFormatTag; - m_sOurType.formattype=FORMAT_WaveFormatEx; - m_sOurType.lSampleSize=wf->nBlockAlign; - m_sOurType.bFixedSizeSamples=true; - m_sOurType.bTemporalCompression=false; - m_sOurType.pUnk=0; - m_sOurType.cbFormat=sz; - m_sOurType.pbFormat=m_sVhdr; + memset(&this->m_sOurType, 0, sizeof(this->m_sOurType)); + this->m_sOurType.majortype=MEDIATYPE_Audio; + this->m_sOurType.subtype=MEDIASUBTYPE_PCM; + this->m_sOurType.subtype.f1=wf->wFormatTag; + this->m_sOurType.formattype=FORMAT_WaveFormatEx; + this->m_sOurType.lSampleSize=wf->nBlockAlign; + this->m_sOurType.bFixedSizeSamples=1; + this->m_sOurType.bTemporalCompression=0; + this->m_sOurType.pUnk=0; + this->m_sOurType.cbFormat=sz; + this->m_sOurType.pbFormat=this->m_sVhdr; - memset(&m_sDestType, 0, sizeof(m_sDestType)); - m_sDestType.majortype=MEDIATYPE_Audio; - m_sDestType.subtype=MEDIASUBTYPE_PCM; - m_sDestType.formattype=FORMAT_WaveFormatEx; - m_sDestType.bFixedSizeSamples=true; - m_sDestType.bTemporalCompression=false; - m_sDestType.lSampleSize=2*wf->nChannels; - m_sDestType.pUnk=0; - m_sDestType.cbFormat=pWF->cbSize; - m_sDestType.pbFormat=m_sVhdr2; + memset(&this->m_sDestType, 0, sizeof(this->m_sDestType)); + this->m_sDestType.majortype=MEDIATYPE_Audio; + this->m_sDestType.subtype=MEDIASUBTYPE_PCM; + this->m_sDestType.subtype.f1=pWF->wFormatTag; + this->m_sDestType.formattype=FORMAT_WaveFormatEx; + this->m_sDestType.bFixedSizeSamples=1; + this->m_sDestType.bTemporalCompression=0; + this->m_sDestType.lSampleSize=2*wf->nChannels; + this->m_sDestType.pUnk=0; + this->m_sDestType.cbFormat=pWF->cbSize; + this->m_sDestType.pbFormat=this->m_sVhdr2; - try + /*try*/ { - m_pDS_Filter = new DS_Filter(); - m_pDS_Filter->Create(info.dll, &info.guid, &m_sOurType, &m_sDestType); - m_pDS_Filter->Start(); + ALLOCATOR_PROPERTIES props, props1; + this->m_pDS_Filter = DS_Filter_Create((const char*)info->dll, &info->guid, &this->m_sOurType, &this->m_sDestType); + if( !this->m_pDS_Filter ) { + free(this); + return NULL; + } + + DS_Filter_Start(this->m_pDS_Filter); - ALLOCATOR_PROPERTIES props, props1; props.cBuffers=1; - props.cbBuffer=m_sOurType.lSampleSize; + props.cbBuffer=this->m_sOurType.lSampleSize; props.cbAlign=props.cbPrefix=0; - m_pDS_Filter->m_pAll->vt->SetProperties(m_pDS_Filter->m_pAll, &props, &props1); - m_pDS_Filter->m_pAll->vt->Commit(m_pDS_Filter->m_pAll); + this->m_pDS_Filter->m_pAll->vt->SetProperties(this->m_pDS_Filter->m_pAll, &props, &props1); + this->m_pDS_Filter->m_pAll->vt->Commit(this->m_pDS_Filter->m_pAll); } - catch (FatalError e) + /* + catch (FatalError& e) { e.PrintAll(); delete[] m_sVhdr; @@ -86,46 +98,52 @@ DS_AudioDecoder::DS_AudioDecoder(const CodecInfo& info, const WAVEFORMATEX* wf) delete m_pDS_Filter; throw; } + */ + return this; } -DS_AudioDecoder::~DS_AudioDecoder() +void DS_AudioDecoder_Destroy(DS_AudioDecoder *this) { - delete[] m_sVhdr; - delete[] m_sVhdr2; - delete m_pDS_Filter; + free(this->m_sVhdr); + free(this->m_sVhdr2); + DS_Filter_Destroy(this->m_pDS_Filter); + free(this); } -int DS_AudioDecoder::Convert(const void* in_data, uint_t in_size, - void* out_data, uint_t out_size, - uint_t* size_read, uint_t* size_written) +int DS_AudioDecoder_Convert(DS_AudioDecoder *this, const void* in_data, uint_t in_size, + void* out_data, uint_t out_size, + uint_t* size_read, uint_t* size_written) { + uint_t written = 0; + uint_t read = 0; + if (!in_data || !out_data) return -1; - uint_t written = 0; - uint_t read = 0; - in_size -= in_size%in_fmt.nBlockAlign; + in_size -= in_size%this->in_fmt.nBlockAlign; while (in_size>0) { - uint_t frame_size=0; + uint_t frame_size = 0; char* frame_pointer; -// m_pOurOutput->SetFramePointer(out_data+written); - m_pDS_Filter->m_pOurOutput->SetFramePointer(&frame_pointer); - m_pDS_Filter->m_pOurOutput->SetFrameSizePointer((long*)&frame_size); IMediaSample* sample=0; - m_pDS_Filter->m_pAll->vt->GetBuffer(m_pDS_Filter->m_pAll, &sample, 0, 0, 0); - if(!sample) + char* ptr; + int result; + +// this->m_pOurOutput->SetFramePointer(out_data+written); + COutputPin_SetFramePointer(this->m_pDS_Filter->m_pOurOutput,&frame_pointer); + COutputPin_SetFrameSizePointer(this->m_pDS_Filter->m_pOurOutput,(long*)&frame_size); + this->m_pDS_Filter->m_pAll->vt->GetBuffer(this->m_pDS_Filter->m_pAll, &sample, 0, 0, 0); + if (!sample) { Debug printf("DS_AudioDecoder::Convert() Error: null sample\n"); break; } - char* ptr; sample->vt->GetPointer(sample, (BYTE **)&ptr); - memcpy(ptr, (const uint8_t*)in_data + read, in_fmt.nBlockAlign); - sample->vt->SetActualDataLength(sample, in_fmt.nBlockAlign); - sample->vt->SetSyncPoint(sample, true); + memcpy(ptr, (const uint8_t*)in_data + read, this->in_fmt.nBlockAlign); + sample->vt->SetActualDataLength(sample, this->in_fmt.nBlockAlign); + sample->vt->SetSyncPoint(sample, 1); sample->vt->SetPreroll(sample, 0); - int result = m_pDS_Filter->m_pImp->vt->Receive(m_pDS_Filter->m_pImp, sample); + result = this->m_pDS_Filter->m_pImp->vt->Receive(this->m_pDS_Filter->m_pImp, sample); if (result) Debug printf("DS_AudioDecoder::Convert() Error: putting data into input pin %x\n", result); if ((written + frame_size) > out_size) @@ -135,7 +153,7 @@ int DS_AudioDecoder::Convert(const void* in_data, uint_t in_size, } memcpy((uint8_t*)out_data + written, frame_pointer, frame_size); sample->vt->Release((IUnknown*)sample); - read+=in_fmt.nBlockAlign; + read+=this->in_fmt.nBlockAlign; written+=frame_size; } if (size_read) @@ -145,12 +163,13 @@ int DS_AudioDecoder::Convert(const void* in_data, uint_t in_size, return 0; } -int DS_AudioDecoder::GetSrcSize(int dest_size) +int DS_AudioDecoder_GetSrcSize(DS_AudioDecoder *this, int dest_size) { - double efficiency = (double) in_fmt.nAvgBytesPerSec - / (in_fmt.nSamplesPerSec*in_fmt.nBlockAlign); - int frames = int(dest_size*efficiency); + double efficiency =(double) this->in_fmt.nAvgBytesPerSec + / (this->in_fmt.nSamplesPerSec*this->in_fmt.nBlockAlign); + int frames = (int)(dest_size*efficiency);; + if (frames < 1) frames = 1; - return frames * in_fmt.nBlockAlign; + return frames * this->in_fmt.nBlockAlign; } |