diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-01-06 03:21:42 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-01-06 03:26:23 +0400 |
commit | 5e7c2b81843ea08a9b32bc0c938be5b91d04b66a (patch) | |
tree | 4121fa1f0e305effbae362032be7a005a1f52f4f /decoder | |
parent | adca76e49047df2b7c5e1c306a7622b11ddcbabf (diff) |
Fallback to DTS Core bitstreaming if HD media type is denied.
Diffstat (limited to 'decoder')
-rw-r--r-- | decoder/LAVAudio/Bitstream.cpp | 45 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudio.cpp | 3 | ||||
-rw-r--r-- | decoder/LAVAudio/LAVAudio.h | 3 |
3 files changed, 35 insertions, 16 deletions
diff --git a/decoder/LAVAudio/Bitstream.cpp b/decoder/LAVAudio/Bitstream.cpp index e4b3768c..9e4a7c2d 100644 --- a/decoder/LAVAudio/Bitstream.cpp +++ b/decoder/LAVAudio/Bitstream.cpp @@ -113,7 +113,7 @@ HRESULT CLAVAudio::CreateBitstreamContext(AVCodecID codec, WAVEFORMATEX *wfe) m_avBSContext->oformat->flags |= AVFMT_NOFILE; // DTS-HD is by default off, unless explicitly asked for - if (m_settings.DTSHDFraming && m_settings.bBitstream[Bitstream_DTSHD]) { + if (m_settings.DTSHDFraming && m_settings.bBitstream[Bitstream_DTSHD] && !m_bForceDTSCore) { m_bDTSHD = TRUE; av_opt_set_int(m_avBSContext->priv_data, "dtshd_rate", LAV_BITSTREAM_DTS_HD_RATE, 0); } else { @@ -173,7 +173,7 @@ HRESULT CLAVAudio::UpdateBitstreamContext() // Configure DTS-HD setting if(m_avBSContext) { - if (m_settings.bBitstream[Bitstream_DTSHD] && m_settings.DTSHDFraming) { + if (m_settings.bBitstream[Bitstream_DTSHD] && m_settings.DTSHDFraming && !m_bForceDTSCore) { m_bDTSHD = TRUE; av_opt_set_int(m_avBSContext->priv_data, "dtshd_rate", LAV_BITSTREAM_DTS_HD_RATE, 0); } else { @@ -210,7 +210,7 @@ HRESULT CLAVAudio::FreeBitstreamContext() return S_OK; } -CMediaType CLAVAudio::CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRate) +CMediaType CLAVAudio::CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRate, BOOL bDTSHDOverride) { CMediaType mt; @@ -244,7 +244,7 @@ CMediaType CLAVAudio::CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRa subtype = KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP; break; case AV_CODEC_ID_DTS: - if (m_settings.bBitstream[Bitstream_DTSHD] && m_bDTSHD) { + if (m_settings.bBitstream[Bitstream_DTSHD] && m_bDTSHD && !bDTSHDOverride) { wfe->nSamplesPerSec = 192000; wfe->nChannels = 8; subtype = KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD; @@ -277,9 +277,19 @@ CMediaType CLAVAudio::CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRa void CLAVAudio::ActivateDTSHDMuxing() { - m_bDTSHD = TRUE; - av_opt_set_int(m_avBSContext->priv_data, "dtshd_rate", LAV_BITSTREAM_DTS_HD_RATE, 0); DbgLog((LOG_TRACE, 20, L"::ActivateDTSHDMuxing(): Found DTS-HD marker - switching to DTS-HD muxing mode")); + m_bDTSHD = TRUE; + + // Check if downstream actually accepts it.. + CMediaType &mt = CreateBitstreamMediaType(m_nCodecId, m_bsParser.m_dwSampleRate); + HRESULT hr = m_pOutput->GetConnected()->QueryAccept(&mt); + if (hr != S_OK) { + DbgLog((LOG_TRACE, 20, L"-> But downstream doesn't want DTS-HD, sticking to DTS core")); + m_bDTSHD = FALSE; + m_bForceDTSCore = TRUE; + } else { + av_opt_set_int(m_avBSContext->priv_data, "dtshd_rate", LAV_BITSTREAM_DTS_HD_RATE, 0); + } } HRESULT CLAVAudio::Bitstream(const BYTE *buffer, int buffsize, int &consumed, HRESULT *hrDeliver) @@ -333,7 +343,7 @@ HRESULT CLAVAudio::Bitstream(const BYTE *buffer, int buffsize, int &consumed, HR if (pOut_size > 0) { m_bsParser.Parse(m_nCodecId, pOut, pOut_size, m_pParser->priv_data); - if (m_nCodecId == AV_CODEC_ID_DTS && !m_bDTSHD && m_bsParser.m_bDTSHD && m_settings.bBitstream[Bitstream_DTSHD]) { + if (m_nCodecId == AV_CODEC_ID_DTS && !m_bDTSHD && !m_bForceDTSCore && m_bsParser.m_bDTSHD && m_settings.bBitstream[Bitstream_DTSHD]) { ActivateDTSHDMuxing(); } @@ -383,13 +393,6 @@ HRESULT CLAVAudio::DeliverBitstream(AVCodecID codec, const BYTE *buffer, DWORD d return E_FAIL; } - if(hr == S_OK) { - hr = m_pOutput->GetConnected()->QueryAccept(&mt); - DbgLog((LOG_TRACE, 1, L"Sending new Media Type (QueryAccept: %0#.8x)", hr)); - m_pOutput->SetMediaType(&mt); - pOut->SetMediaType(&mt); - } - REFERENCE_TIME rtStart = m_rtStart, rtStop = AV_NOPTS_VALUE; // TrueHD timings // Since the SPDIF muxer takes 24 frames and puts them into one IEC61937 frame, we use the cached timestamp from before. @@ -455,11 +458,25 @@ HRESULT CLAVAudio::DeliverBitstream(AVCodecID codec, const BYTE *buffer, DWORD d memcpy(pDataOut, buffer, dwSize); + if(hr == S_OK) { + hr = m_pOutput->GetConnected()->QueryAccept(&mt); + if (hr == S_FALSE && m_nCodecId == AV_CODEC_ID_DTS && m_bDTSHD) { + DbgLog((LOG_TRACE, 1, L"DTS-HD Media Type failed with %0#.8x, trying fallback to DTS core", hr)); + m_bForceDTSCore = TRUE; + UpdateBitstreamContext(); + goto done; + } + DbgLog((LOG_TRACE, 1, L"Sending new Media Type (QueryAccept: %0#.8x)", hr)); + m_pOutput->SetMediaType(&mt); + pOut->SetMediaType(&mt); + } + hr = m_pOutput->Deliver(pOut); if (FAILED(hr)) { DbgLog((LOG_ERROR, 10, L"::DeliverBitstream failed with code: %0#.8x", hr)); } +done: SafeRelease(&pOut); return hr; } diff --git a/decoder/LAVAudio/LAVAudio.cpp b/decoder/LAVAudio/LAVAudio.cpp index e1e4beb0..56b29164 100644 --- a/decoder/LAVAudio/LAVAudio.cpp +++ b/decoder/LAVAudio/LAVAudio.cpp @@ -100,6 +100,7 @@ CLAVAudio::CLAVAudio(LPUNKNOWN pUnk, HRESULT* phr) , m_MixingInputFormat(SampleFormat_None) , m_MixingInputLayout(0) , m_pTrayIcon(NULL) + , m_bForceDTSCore(FALSE) { StaticInit(TRUE, NULL); @@ -966,7 +967,7 @@ HRESULT CLAVAudio::GetMediaType(int iPosition, CMediaType *pMediaType) } if (m_avBSContext) { - *pMediaType = CreateBitstreamMediaType(m_nCodecId, m_pAVCtx->sample_rate); + *pMediaType = CreateBitstreamMediaType(m_nCodecId, m_pAVCtx->sample_rate, TRUE); } else { const int nSamplesPerSec = m_pAVCtx->sample_rate; int nChannels = m_pAVCtx->channels; diff --git a/decoder/LAVAudio/LAVAudio.h b/decoder/LAVAudio/LAVAudio.h index d8551642..39cab2ac 100644 --- a/decoder/LAVAudio/LAVAudio.h +++ b/decoder/LAVAudio/LAVAudio.h @@ -227,7 +227,7 @@ private: HRESULT Bitstream(const BYTE *p, int buffsize, int &consumed, HRESULT *hrDeliver); HRESULT DeliverBitstream(AVCodecID codec, const BYTE *buffer, DWORD dwSize, DWORD dwFrameSize, REFERENCE_TIME rtStartInput, REFERENCE_TIME rtStopInput); - CMediaType CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRate); + CMediaType CreateBitstreamMediaType(AVCodecID codec, DWORD dwSampleRate, BOOL bDTSHDOverride = FALSE); void ActivateDTSHDMuxing(); HRESULT InitDTSDecoder(); @@ -330,6 +330,7 @@ private: AVFormatContext *m_avBSContext; BOOL m_bDTSHD; + BOOL m_bForceDTSCore; CBitstreamParser m_bsParser; BOOL m_bFindDTSInPCM; |