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-12-03 16:00:36 +0400
committerAleksoid <aleksoid@users.sourceforge.net>2011-12-03 16:00:36 +0400
commit77ac6e1d1ded3bbb455dcb29cc7e045530ebb277 (patch)
treeb6ab34496f14561cca6d7da4d81d6d8954087382
parentdbafad790e361edc1d06ca8a3be84cdf11f03645 (diff)
Add : Support language info for Audio stream on .IFO play;
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@3875 10f7b99b-c216-0410-bff0-8a66a9350fd8
-rw-r--r--src/DeCSS/VobFile.cpp45
-rw-r--r--src/DeCSS/VobFile.h4
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.cpp13
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.h2
-rw-r--r--src/filters/reader/VTSReader/VTSReader.cpp48
-rw-r--r--src/filters/reader/VTSReader/VTSReader.h16
6 files changed, 127 insertions, 1 deletions
diff --git a/src/DeCSS/VobFile.cpp b/src/DeCSS/VobFile.cpp
index bb33c8953..e06a5e6df 100644
--- a/src/DeCSS/VobFile.cpp
+++ b/src/DeCSS/VobFile.cpp
@@ -5,6 +5,11 @@
#include "CSSscramble.h"
#include "udf.h"
+#include "../DSUtil/GolombBuffer.h"
+#include "../DSUtil/DSUtil.h"
+
+#define Audio_block_size 66
+
//
// CDVDSession
//
@@ -390,6 +395,38 @@ bool CVobFile::Open(CString fn, CAtlList<CString>& vobs)
return false;
}
+ // Audio streams ...
+ f.Seek(0x202, CFile::begin);
+ BYTE buffer[Audio_block_size];
+ f.Read(buffer, Audio_block_size);
+ CGolombBuffer gb(buffer, Audio_block_size);
+ int stream_count = gb.ReadShort();
+ for(int i = 0; i< min(stream_count,8); i++) {
+ byte Coding_mode = gb.BitRead(3);
+ gb.BitRead(5);// skip
+ int ToAdd=0;
+ switch(Coding_mode) {
+ case 0:
+ ToAdd=0x80;
+ break;
+ case 4:
+ ToAdd=0xA0;
+ break;
+ case 6:
+ ToAdd=0x88;
+ break;
+ default:
+ break;
+ }
+ gb.ReadByte();// skip
+ char lang[2];
+ gb.ReadBuffer((BYTE *)lang, 2);
+ gb.ReadDword();// skip
+ if(ToAdd) {
+ m_pStream_Lang[ToAdd + i] = ISO6391ToLanguage(lang);
+ }
+ }
+
f.Close();
int offset = -1;
@@ -631,3 +668,11 @@ bool CVobFile::Read(BYTE* buff)
return true;
}
+
+BSTR CVobFile::GetTrackName(UINT aTrackIdx)
+{
+ CString TrackName = _T("");
+ m_pStream_Lang.Lookup(aTrackIdx, TrackName);
+
+ return TrackName.AllocSysString();
+} \ No newline at end of file
diff --git a/src/DeCSS/VobFile.h b/src/DeCSS/VobFile.h
index 834226b99..81c4425e8 100644
--- a/src/DeCSS/VobFile.h
+++ b/src/DeCSS/VobFile.h
@@ -73,6 +73,8 @@ class CVobFile : public CDVDSession
// attribs
bool m_fDVD, m_fHasDiscKey, m_fHasTitleKey;
+ CAtlMap<DWORD, CString> m_pStream_Lang;
+
public:
CVobFile();
virtual ~CVobFile();
@@ -89,4 +91,6 @@ public:
int GetPosition();
int Seek(int pos);
bool Read(BYTE* buff);
+
+ BSTR GetTrackName(UINT aTrackIdx);
};
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.cpp b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
index 47f650fdc..0d5d7ff70 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.cpp
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
@@ -788,6 +788,12 @@ HRESULT CMpegSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
return hr;
}
+ if(m_pFile->m_type == CMpegSplitterFile::ps) {
+ if(m_pInput && m_pInput->IsConnected() && (GetCLSID(m_pInput->GetConnected()) == GUIDFromCString(_T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}")))){ // MPC VTS Reader
+ pTI = GetFilterFromPin(m_pInput->GetConnected());
+ }
+ }
+
CString cs_audioProgram = _T("");
CString cs_subpicProgram = _T("");
@@ -859,6 +865,8 @@ HRESULT CMpegSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
lang_name = ISO6392ToLanguage(ch);
}
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
if (!FormatDesc.IsEmpty()) {
@@ -944,6 +952,8 @@ HRESULT CMpegSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
lang_name = ISO6392ToLanguage(ch);
}
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
if (!FormatDesc.IsEmpty()) {
@@ -1351,7 +1361,6 @@ STDMETHODIMP CMpegSplitterFilter::Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD*
*ppUnk = NULL;
}
-
if(ppszName) {
CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
@@ -1381,6 +1390,8 @@ STDMETHODIMP CMpegSplitterFilter::Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD*
lang_name = ISO6392ToLanguage(ch);
}
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
if (!FormatDesc.IsEmpty()) {
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.h b/src/filters/parser/MpegSplitter/MpegSplitter.h
index 800599582..f3909b398 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.h
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.h
@@ -24,6 +24,7 @@
#include "../BaseSplitter/BaseSplitter.h"
#include "MpegSplitterFile.h"
#include "MpegSplitterSettingsWnd.h"
+#include <ITrackInfo.h>
#define PauseGraph \
CComQIPtr<IMediaControl> _pMC(m_pGraph); \
@@ -57,6 +58,7 @@ class __declspec(uuid("DC257063-045F-4BE2-BD5B-E12279C464F0"))
protected:
CAutoPtr<CMpegSplitterFile> m_pFile;
+ CComQIPtr<ITrackInfo> pTI;
HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
void ReadClipInfo(LPCOLESTR pszFileName);
diff --git a/src/filters/reader/VTSReader/VTSReader.cpp b/src/filters/reader/VTSReader/VTSReader.cpp
index 1089e6cd2..4a7bd0c3e 100644
--- a/src/filters/reader/VTSReader/VTSReader.cpp
+++ b/src/filters/reader/VTSReader/VTSReader.cpp
@@ -103,6 +103,7 @@ STDMETHODIMP CVTSReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
return
QI(IFileSourceFilter)
+ QI(ITrackInfo)
__super::NonDelegatingQueryInterface(riid, ppv);
}
@@ -154,6 +155,48 @@ STDMETHODIMP CVTSReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
return S_OK;
}
+// ITrackInfo
+
+STDMETHODIMP_(UINT) CVTSReader::GetTrackCount()
+{
+ return 0; // Not implemented yet
+}
+
+STDMETHODIMP_(BOOL) CVTSReader::GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill)
+{
+ return FALSE; // Not implemented yet
+}
+
+STDMETHODIMP_(BOOL) CVTSReader::GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill)
+{
+ return FALSE; // Not implemented yet
+}
+
+STDMETHODIMP_(BSTR) CVTSReader::GetTrackName(UINT aTrackIdx)
+{
+ return m_stream.GetTrackName(aTrackIdx); // return stream's language
+}
+
+STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecID(UINT aTrackIdx)
+{
+ return NULL; // Not implemented yet
+}
+
+STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecName(UINT aTrackIdx)
+{
+ return NULL; // Not implemented yet
+}
+
+STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecInfoURL(UINT aTrackIdx)
+{
+ return NULL; // Not implemented yet
+}
+
+STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecDownloadURL(UINT aTrackIdx)
+{
+ return NULL; // Not implemented yet
+}
+
// CVTSStream
CVTSStream::CVTSStream() : m_off(0)
@@ -236,3 +279,8 @@ void CVTSStream::Unlock()
{
m_csLock.Unlock();
}
+
+BSTR CVTSStream::GetTrackName(UINT aTrackIdx)
+{
+ return m_vob->GetTrackName(aTrackIdx);
+} \ No newline at end of file
diff --git a/src/filters/reader/VTSReader/VTSReader.h b/src/filters/reader/VTSReader/VTSReader.h
index 482fad3b3..265deabe6 100644
--- a/src/filters/reader/VTSReader/VTSReader.h
+++ b/src/filters/reader/VTSReader/VTSReader.h
@@ -25,6 +25,8 @@
#include "../AsyncReader/asyncio.h"
#include "../AsyncReader/asyncrdr.h"
+#include <ITrackInfo.h>
+
class CVobFile;
class CVTSStream : public CAsyncStream
@@ -47,12 +49,15 @@ public:
DWORD Alignment();
void Lock();
void Unlock();
+
+ BSTR GetTrackName(UINT aTrackIdx);
};
class __declspec(uuid("773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73"))
CVTSReader
: public CAsyncReader
, public IFileSourceFilter
+ , public ITrackInfo
{
CVTSStream m_stream;
CStringW m_fn;
@@ -71,4 +76,15 @@ public:
// IFileSourceFilter
STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+
+ // ITrackInfo
+
+ STDMETHODIMP_(UINT) GetTrackCount();
+ STDMETHODIMP_(BOOL) GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill);
+ STDMETHODIMP_(BOOL) GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill);
+ STDMETHODIMP_(BSTR) GetTrackName(UINT aTrackIdx);
+ STDMETHODIMP_(BSTR) GetTrackCodecID(UINT aTrackIdx);
+ STDMETHODIMP_(BSTR) GetTrackCodecName(UINT aTrackIdx);
+ STDMETHODIMP_(BSTR) GetTrackCodecInfoURL(UINT aTrackIdx);
+ STDMETHODIMP_(BSTR) GetTrackCodecDownloadURL(UINT aTrackIdx);
};