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

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2013-01-06 03:21:42 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2013-01-06 03:26:23 +0400
commit5e7c2b81843ea08a9b32bc0c938be5b91d04b66a (patch)
tree4121fa1f0e305effbae362032be7a005a1f52f4f /decoder
parentadca76e49047df2b7c5e1c306a7622b11ddcbabf (diff)
Fallback to DTS Core bitstreaming if HD media type is denied.
Diffstat (limited to 'decoder')
-rw-r--r--decoder/LAVAudio/Bitstream.cpp45
-rw-r--r--decoder/LAVAudio/LAVAudio.cpp3
-rw-r--r--decoder/LAVAudio/LAVAudio.h3
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;